From f27c0a3f28302743dd9c92dd402deccb9dc8f4c7 Mon Sep 17 00:00:00 2001 From: Sven Klemm Date: Sat, 3 Nov 2018 13:27:26 +0100 Subject: [PATCH] Move int time_bucket functions with offset to C --- sql/time_bucket.sql | 29 ++++------ src/plan_add_hashagg.c | 42 +++++++++++++++ src/sort_transform.c | 14 ++++- src/time_bucket.c | 53 +++++++++++++------ test/expected/plan_hashagg_optimized-10.out | 16 +++--- test/expected/plan_hashagg_optimized-9.6.out | 12 ++--- test/expected/sql_query_results_optimized.out | 4 +- .../sql_query_results_unoptimized.out | 8 +-- test/expected/sql_query_results_x_diff.out | 8 +-- test/expected/timestamp.out | 27 ++++++---- test/sql/timestamp.sql | 12 +++-- 11 files changed, 153 insertions(+), 72 deletions(-) diff --git a/sql/time_bucket.sql b/sql/time_bucket.sql index 1755cbba3..249330733 100644 --- a/sql/time_bucket.sql +++ b/sql/time_bucket.sql @@ -24,15 +24,22 @@ CREATE OR REPLACE FUNCTION time_bucket(bucket_width INTERVAL, ts TIMESTAMPTZ, or CREATE OR REPLACE FUNCTION time_bucket(bucket_width INTERVAL, ts DATE, origin DATE) RETURNS DATE AS '@MODULE_PATHNAME@', 'ts_date_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; +-- bucketing of int CREATE OR REPLACE FUNCTION time_bucket(bucket_width SMALLINT, ts SMALLINT) RETURNS SMALLINT AS '@MODULE_PATHNAME@', 'ts_int16_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; - CREATE OR REPLACE FUNCTION time_bucket(bucket_width INT, ts INT) RETURNS INT AS '@MODULE_PATHNAME@', 'ts_int32_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; - CREATE OR REPLACE FUNCTION time_bucket(bucket_width BIGINT, ts BIGINT) RETURNS BIGINT AS '@MODULE_PATHNAME@', 'ts_int64_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; +-- bucketing of int with offset +CREATE OR REPLACE FUNCTION time_bucket(bucket_width SMALLINT, ts SMALLINT, "offset" SMALLINT) RETURNS SMALLINT + AS '@MODULE_PATHNAME@', 'ts_int16_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; +CREATE OR REPLACE FUNCTION time_bucket(bucket_width INT, ts INT, "offset" INT) RETURNS INT + AS '@MODULE_PATHNAME@', 'ts_int32_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; +CREATE OR REPLACE FUNCTION time_bucket(bucket_width BIGINT, ts BIGINT, "offset" BIGINT) RETURNS BIGINT + AS '@MODULE_PATHNAME@', 'ts_int64_bucket' LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT; + -- If an interval is given as the third argument, the bucket alignment is offset by the interval. CREATE OR REPLACE FUNCTION time_bucket(bucket_width INTERVAL, ts TIMESTAMP, "offset" INTERVAL) RETURNS TIMESTAMP LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS @@ -52,21 +59,3 @@ $BODY$ SELECT (@extschema@.time_bucket(bucket_width, ts-"offset")+"offset")::date; $BODY$; -CREATE OR REPLACE FUNCTION time_bucket(bucket_width SMALLINT, ts SMALLINT, "offset" SMALLINT) - RETURNS SMALLINT LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS -$BODY$ - SELECT @extschema@.time_bucket(bucket_width, ts-"offset")+"offset"; -$BODY$; - -CREATE OR REPLACE FUNCTION time_bucket(bucket_width INT, ts INT, "offset" INT) - RETURNS INT LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS -$BODY$ - SELECT @extschema@.time_bucket(bucket_width, ts-"offset")+"offset"; -$BODY$; - -CREATE OR REPLACE FUNCTION time_bucket(bucket_width BIGINT, ts BIGINT, "offset" BIGINT) - RETURNS BIGINT LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS -$BODY$ - SELECT @extschema@.time_bucket(bucket_width, ts-"offset")+"offset"; -$BODY$; - diff --git a/src/plan_add_hashagg.c b/src/plan_add_hashagg.c index 8395f2d24..f085aca2c 100644 --- a/src/plan_add_hashagg.c +++ b/src/plan_add_hashagg.c @@ -74,6 +74,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INTERVALOID, TIMESTAMPOID}, .custom_group_estimate_func = custom_group_estimate_time_bucket }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INTERVALOID, TIMESTAMPOID, TIMESTAMPOID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket + }, { .extension_function = true, .function_name = "time_bucket", @@ -81,6 +88,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INTERVALOID, TIMESTAMPTZOID}, .custom_group_estimate_func = custom_group_estimate_time_bucket, }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INTERVALOID, TIMESTAMPTZOID, TIMESTAMPTZOID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket, + }, { .extension_function = true, .function_name = "time_bucket", @@ -88,6 +102,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INTERVALOID, DATEOID}, .custom_group_estimate_func = custom_group_estimate_time_bucket, }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INTERVALOID, DATEOID, DATEOID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket, + }, { .extension_function = true, .function_name = "time_bucket", @@ -95,6 +116,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INT2OID, INT2OID}, .custom_group_estimate_func = custom_group_estimate_time_bucket, }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INT2OID, INT2OID, INT2OID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket, + }, { .extension_function = true, .function_name = "time_bucket", @@ -102,6 +130,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INT4OID, INT4OID}, .custom_group_estimate_func = custom_group_estimate_time_bucket, }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INT4OID, INT4OID, INT4OID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket, + }, { .extension_function = true, .function_name = "time_bucket", @@ -109,6 +144,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] = .arg_types = {INT8OID, INT8OID}, .custom_group_estimate_func = custom_group_estimate_time_bucket, }, + { + .extension_function = true, + .function_name = "time_bucket", + .nargs = 3, + .arg_types = {INT8OID, INT8OID, INT8OID}, + .custom_group_estimate_func = custom_group_estimate_time_bucket, + }, { .function_name = "date_trunc", .nargs = 2, diff --git a/src/sort_transform.c b/src/sort_transform.c index 2f12f9d32..6f8936d01 100644 --- a/src/sort_transform.c +++ b/src/sort_transform.c @@ -48,6 +48,13 @@ transform_date_trunc(FuncExpr *func) return (Expr *) copyObject(second); } +/* + * Check that time_bucket period is Const and if an offset is supplied + * that it is Const aswell + */ +#define time_bucket_has_const_period_and_offset(func) \ + (IsA(linitial((func)->args), Const) && (list_length((func)->args) == 2 || IsA(lthird((func)->args), Const))) + static Expr * transform_time_bucket(FuncExpr *func) { @@ -59,7 +66,12 @@ transform_time_bucket(FuncExpr *func) */ Expr *second; - if (list_length(func->args) != 2 || !IsA(linitial(func->args), Const)) + Assert(list_length(func->args) >= 2); + + /* + * If period and offset are not constants we must not do the optimization + */ + if (!time_bucket_has_const_period_and_offset(func)) return (Expr *) func; second = sort_transform_expr(lsecond(func->args)); diff --git a/src/time_bucket.c b/src/time_bucket.c index f3ac3cea3..ab99d8f8b 100644 --- a/src/time_bucket.c +++ b/src/time_bucket.c @@ -16,24 +16,38 @@ #include #endif -#define TIME_BUCKET(period, timestamp, min, result) \ +#define TIME_BUCKET(period, timestamp, offset, min, max, result) \ do \ { \ if (period <= 0) \ ereport(ERROR, \ (errcode(ERRCODE_INVALID_PARAMETER_VALUE), \ errmsg("period must be greater then 0"))); \ - *(result) = (timestamp / period) * period; \ - if (timestamp < 0) \ - if (timestamp % period) \ - { \ - if (*(result) < min + period) \ - ereport(ERROR, \ - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \ - errmsg("timestamp out of range"))); \ - else \ - *(result) = *(result) - period; \ - } \ + if (offset != 0) \ + { \ + /* We need to ensure that the timestamp is in range _after_ the */ \ + /* offset is applied: when the offset is positive we need to make */ \ + /* sure the resultant time is at least min, and when negative that */ \ + /* it is less than the max. */ \ + offset = offset % period; \ + if ((offset > 0 && timestamp < min + offset) || \ + (offset < 0 && timestamp > max + offset)) \ + ereport(ERROR, \ + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \ + errmsg("timestamp out of range"))); \ + timestamp -= offset; \ + } \ + result = (timestamp / period) * period; \ + if (timestamp < 0 && timestamp % period) \ + { \ + if (result < min + period) \ + ereport(ERROR, \ + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \ + errmsg("timestamp out of range"))); \ + else \ + result = result - period; \ + } \ + result += offset; \ } while (0) @@ -42,8 +56,11 @@ Datum ts_int16_bucket(PG_FUNCTION_ARGS) { int16 result; + int16 period = PG_GETARG_INT16(0); + int16 timestamp = PG_GETARG_INT16(1); + int16 offset = PG_NARGS() > 2 ? PG_GETARG_INT16(2) : 0; - TIME_BUCKET(PG_GETARG_INT16(0), PG_GETARG_INT16(1), PG_INT16_MIN, &result); + TIME_BUCKET(period, timestamp, offset, PG_INT16_MIN, PG_INT16_MAX, result); PG_RETURN_INT16(result); } @@ -53,8 +70,11 @@ Datum ts_int32_bucket(PG_FUNCTION_ARGS) { int32 result; + int32 period = PG_GETARG_INT32(0); + int32 timestamp = PG_GETARG_INT32(1); + int32 offset = PG_NARGS() > 2 ? PG_GETARG_INT32(2) : 0; - TIME_BUCKET(PG_GETARG_INT32(0), PG_GETARG_INT32(1), PG_INT32_MIN, &result); + TIME_BUCKET(period, timestamp, offset, PG_INT32_MIN, PG_INT32_MAX, result); PG_RETURN_INT32(result); } @@ -64,8 +84,11 @@ Datum ts_int64_bucket(PG_FUNCTION_ARGS) { int64 result; + int64 period = PG_GETARG_INT64(0); + int64 timestamp = PG_GETARG_INT64(1); + int64 offset = PG_NARGS() > 2 ? PG_GETARG_INT64(2) : 0; - TIME_BUCKET(PG_GETARG_INT64(0), PG_GETARG_INT64(1), PG_INT64_MIN, &result); + TIME_BUCKET(period, timestamp, offset, PG_INT64_MIN, PG_INT64_MAX, result); PG_RETURN_INT64(result); } diff --git a/test/expected/plan_hashagg_optimized-10.out b/test/expected/plan_hashagg_optimized-10.out index 910c6ae2d..ce6d3a1ce 100644 --- a/test/expected/plan_hashagg_optimized-10.out +++ b/test/expected/plan_hashagg_optimized-10.out @@ -205,13 +205,13 @@ ORDER BY MetricMinuteTs DESC; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort - Sort Key: ((time_bucket('60'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)) DESC + Sort Key: (time_bucket('60'::bigint, hyper.time_int, '10'::bigint)) DESC -> Finalize HashAggregate - Group Key: ((time_bucket('60'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)) + Group Key: (time_bucket('60'::bigint, hyper.time_int, '10'::bigint)) -> Gather Workers Planned: 2 -> Partial HashAggregate - Group Key: (time_bucket('60'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint) + Group Key: time_bucket('60'::bigint, hyper.time_int, '10'::bigint) -> Result -> Append -> Parallel Seq Scan on hyper @@ -326,13 +326,13 @@ ORDER BY MetricMinuteTs DESC, metric.id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort - Sort Key: ((time_bucket('3600'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)) DESC, metric.id + Sort Key: (time_bucket('3600'::bigint, hyper.time_int, '10'::bigint)) DESC, metric.id -> Finalize HashAggregate - Group Key: ((time_bucket('3600'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)), metric.id + Group Key: (time_bucket('3600'::bigint, hyper.time_int, '10'::bigint)), metric.id -> Gather Workers Planned: 2 -> Partial HashAggregate - Group Key: (time_bucket('3600'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint), metric.id + Group Key: time_bucket('3600'::bigint, hyper.time_int, '10'::bigint), metric.id -> Hash Join Hash Cond: (hyper.metricid = metric.id) -> Append @@ -354,9 +354,9 @@ ORDER BY MetricMinuteTs DESC, metric.id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate - Group Key: ((time_bucket('3600'::bigint, (regular.time_int - '10'::bigint)) + '10'::bigint)), metric.id + Group Key: (time_bucket('3600'::bigint, regular.time_int, '10'::bigint)), metric.id -> Sort - Sort Key: ((time_bucket('3600'::bigint, (regular.time_int - '10'::bigint)) + '10'::bigint)) DESC, metric.id + Sort Key: (time_bucket('3600'::bigint, regular.time_int, '10'::bigint)) DESC, metric.id -> Nested Loop Join Filter: (regular.metricid = metric.id) -> Seq Scan on regular diff --git a/test/expected/plan_hashagg_optimized-9.6.out b/test/expected/plan_hashagg_optimized-9.6.out index 68e8e756e..a2c218527 100644 --- a/test/expected/plan_hashagg_optimized-9.6.out +++ b/test/expected/plan_hashagg_optimized-9.6.out @@ -177,9 +177,9 @@ ORDER BY MetricMinuteTs DESC; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort - Sort Key: ((time_bucket('60'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)) DESC + Sort Key: (time_bucket('60'::bigint, hyper.time_int, '10'::bigint)) DESC -> HashAggregate - Group Key: (time_bucket('60'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint) + Group Key: time_bucket('60'::bigint, hyper.time_int, '10'::bigint) -> Result -> Append -> Seq Scan on hyper @@ -278,9 +278,9 @@ ORDER BY MetricMinuteTs DESC, metric.id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Sort - Sort Key: ((time_bucket('3600'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint)) DESC, metric.id + Sort Key: (time_bucket('3600'::bigint, hyper.time_int, '10'::bigint)) DESC, metric.id -> HashAggregate - Group Key: (time_bucket('3600'::bigint, (hyper.time_int - '10'::bigint)) + '10'::bigint), metric.id + Group Key: time_bucket('3600'::bigint, hyper.time_int, '10'::bigint), metric.id -> Hash Join Hash Cond: (hyper.metricid = metric.id) -> Append @@ -302,9 +302,9 @@ ORDER BY MetricMinuteTs DESC, metric.id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- GroupAggregate - Group Key: ((time_bucket('3600'::bigint, (regular.time_int - '10'::bigint)) + '10'::bigint)), metric.id + Group Key: (time_bucket('3600'::bigint, regular.time_int, '10'::bigint)), metric.id -> Sort - Sort Key: ((time_bucket('3600'::bigint, (regular.time_int - '10'::bigint)) + '10'::bigint)) DESC, metric.id + Sort Key: (time_bucket('3600'::bigint, regular.time_int, '10'::bigint)) DESC, metric.id -> Nested Loop Join Filter: (regular.metricid = metric.id) -> Seq Scan on regular diff --git a/test/expected/sql_query_results_optimized.out b/test/expected/sql_query_results_optimized.out index f9cc691c5..5a42bb550 100644 --- a/test/expected/sql_query_results_optimized.out +++ b/test/expected/sql_query_results_optimized.out @@ -405,10 +405,10 @@ FROM hyper_1_int GROUP BY t ORDER BY t DESC limit 2; ---------------------------------------------------------------------------------------------- Limit -> GroupAggregate - Group Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) + Group Key: (time_bucket(10, hyper_1_int."time", 2)) -> Result -> Merge Append - Sort Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) DESC + Sort Key: (time_bucket(10, hyper_1_int."time", 2)) DESC -> Index Scan using time_plain_int on hyper_1_int -> Index Scan using _hyper_3_3_chunk_time_plain_int on _hyper_3_3_chunk -> Index Scan using _hyper_3_4_chunk_time_plain_int on _hyper_3_4_chunk diff --git a/test/expected/sql_query_results_unoptimized.out b/test/expected/sql_query_results_unoptimized.out index e56386334..4b7a68434 100644 --- a/test/expected/sql_query_results_unoptimized.out +++ b/test/expected/sql_query_results_unoptimized.out @@ -413,13 +413,13 @@ FROM hyper_1_int GROUP BY t ORDER BY t DESC limit 2; EXPLAIN (costs off) SELECT time_bucket(10, time, 2) t, avg(series_0), min(series_1), avg(series_2) FROM hyper_1_int GROUP BY t ORDER BY t DESC limit 2; - QUERY PLAN --------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------- Limit -> GroupAggregate - Group Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) + Group Key: (time_bucket(10, hyper_1_int."time", 2)) -> Sort - Sort Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) DESC + Sort Key: (time_bucket(10, hyper_1_int."time", 2)) DESC -> Result -> Append -> Seq Scan on hyper_1_int diff --git a/test/expected/sql_query_results_x_diff.out b/test/expected/sql_query_results_x_diff.out index 978bd10a4..48935c01b 100644 --- a/test/expected/sql_query_results_x_diff.out +++ b/test/expected/sql_query_results_x_diff.out @@ -264,12 +264,12 @@ < QUERY PLAN < ---------------------------------------------------------------------------------------------- --- -> QUERY PLAN -> -------------------------------------------------------------------------------- +> QUERY PLAN +> ----------------------------------------------------------------------- 409,416c421,429 < -> Result < -> Merge Append -< Sort Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) DESC +< Sort Key: (time_bucket(10, hyper_1_int."time", 2)) DESC < -> Index Scan using time_plain_int on hyper_1_int < -> Index Scan using _hyper_3_3_chunk_time_plain_int on _hyper_3_3_chunk < -> Index Scan using _hyper_3_4_chunk_time_plain_int on _hyper_3_4_chunk @@ -277,7 +277,7 @@ < (10 rows) --- > -> Sort -> Sort Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2)) DESC +> Sort Key: (time_bucket(10, hyper_1_int."time", 2)) DESC > -> Result > -> Append > -> Seq Scan on hyper_1_int diff --git a/test/expected/timestamp.out b/test/expected/timestamp.out index 3c635a8cc..ac7a9cf47 100644 --- a/test/expected/timestamp.out +++ b/test/expected/timestamp.out @@ -608,9 +608,12 @@ SELECT time_bucket(10::smallint, '-32768'::smallint); ERROR: timestamp out of range SELECT time_bucket(10::smallint, '-32761'::smallint); ERROR: timestamp out of range -select time_bucket(10::smallint, '-32000'::smallint, 1000::smallint); -ERROR: smallint out of range -CONTEXT: SQL function "time_bucket" statement 1 +select time_bucket(10::smallint, '-32768'::smallint, 1000::smallint); +ERROR: timestamp out of range +select time_bucket(10::smallint, '-32768'::smallint, '32767'::smallint); +ERROR: timestamp out of range +select time_bucket(10::smallint, '32767'::smallint, '-32768'::smallint); +ERROR: timestamp out of range \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::smallint, time) FROM unnest(ARRAY[ @@ -630,9 +633,12 @@ SELECT time_bucket(10::int, '-2147483648'::int); ERROR: timestamp out of range SELECT time_bucket(10::int, '-2147483641'::int); ERROR: timestamp out of range -SELECT time_bucket(10::int, '-2147483000'::int, 1000::int); -ERROR: integer out of range -CONTEXT: SQL function "time_bucket" statement 1 +SELECT time_bucket(1000::int, '-2147483000'::int, 1::int); +ERROR: timestamp out of range +SELECT time_bucket(1000::int, '-2147483648'::int, '2147483647'::int); +ERROR: timestamp out of range +SELECT time_bucket(1000::int, '2147483647'::int, '-2147483648'::int); +ERROR: timestamp out of range \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::int, time) FROM unnest(ARRAY[ @@ -652,9 +658,12 @@ SELECT time_bucket(10::bigint, '-9223372036854775808'::bigint); ERROR: timestamp out of range SELECT time_bucket(10::bigint, '-9223372036854775801'::bigint); ERROR: timestamp out of range -SELECT time_bucket(10::bigint, '-9223372036854775000'::bigint, 1000::bigint); -ERROR: bigint out of range -CONTEXT: SQL function "time_bucket" statement 1 +SELECT time_bucket(1000::bigint, '-9223372036854775000'::bigint, 1::bigint); +ERROR: timestamp out of range +SELECT time_bucket(1000::bigint, '-9223372036854775808'::bigint, '9223372036854775807'::bigint); +ERROR: timestamp out of range +SELECT time_bucket(1000::bigint, '9223372036854775807'::bigint, '-9223372036854775808'::bigint); +ERROR: timestamp out of range \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::bigint, time) FROM unnest(ARRAY[ diff --git a/test/sql/timestamp.sql b/test/sql/timestamp.sql index cd36d1f68..13d9a0e9c 100644 --- a/test/sql/timestamp.sql +++ b/test/sql/timestamp.sql @@ -362,7 +362,9 @@ FROM unnest(ARRAY[ \set ON_ERROR_STOP 0 SELECT time_bucket(10::smallint, '-32768'::smallint); SELECT time_bucket(10::smallint, '-32761'::smallint); -select time_bucket(10::smallint, '-32000'::smallint, 1000::smallint); +select time_bucket(10::smallint, '-32768'::smallint, 1000::smallint); +select time_bucket(10::smallint, '-32768'::smallint, '32767'::smallint); +select time_bucket(10::smallint, '32767'::smallint, '-32768'::smallint); \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::smallint, time) @@ -375,7 +377,9 @@ FROM unnest(ARRAY[ \set ON_ERROR_STOP 0 SELECT time_bucket(10::int, '-2147483648'::int); SELECT time_bucket(10::int, '-2147483641'::int); -SELECT time_bucket(10::int, '-2147483000'::int, 1000::int); +SELECT time_bucket(1000::int, '-2147483000'::int, 1::int); +SELECT time_bucket(1000::int, '-2147483648'::int, '2147483647'::int); +SELECT time_bucket(1000::int, '2147483647'::int, '-2147483648'::int); \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::int, time) @@ -388,7 +392,9 @@ FROM unnest(ARRAY[ \set ON_ERROR_STOP 0 SELECT time_bucket(10::bigint, '-9223372036854775808'::bigint); SELECT time_bucket(10::bigint, '-9223372036854775801'::bigint); -SELECT time_bucket(10::bigint, '-9223372036854775000'::bigint, 1000::bigint); +SELECT time_bucket(1000::bigint, '-9223372036854775000'::bigint, 1::bigint); +SELECT time_bucket(1000::bigint, '-9223372036854775808'::bigint, '9223372036854775807'::bigint); +SELECT time_bucket(1000::bigint, '9223372036854775807'::bigint, '-9223372036854775808'::bigint); \set ON_ERROR_STOP 1 SELECT time, time_bucket(10::bigint, time)