mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-17 11:03:36 +08:00
Move int time_bucket functions with offset to C
This commit is contained in:
parent
92d4dbde9c
commit
f27c0a3f28
@ -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
|
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;
|
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
|
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;
|
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
|
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;
|
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
|
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;
|
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.
|
-- 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)
|
CREATE OR REPLACE FUNCTION time_bucket(bucket_width INTERVAL, ts TIMESTAMP, "offset" INTERVAL)
|
||||||
RETURNS TIMESTAMP LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS
|
RETURNS TIMESTAMP LANGUAGE SQL IMMUTABLE PARALLEL SAFE STRICT AS
|
||||||
@ -52,21 +59,3 @@ $BODY$
|
|||||||
SELECT (@extschema@.time_bucket(bucket_width, ts-"offset")+"offset")::date;
|
SELECT (@extschema@.time_bucket(bucket_width, ts-"offset")+"offset")::date;
|
||||||
$BODY$;
|
$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$;
|
|
||||||
|
|
||||||
|
@ -74,6 +74,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INTERVALOID, TIMESTAMPOID},
|
.arg_types = {INTERVALOID, TIMESTAMPOID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket
|
.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,
|
.extension_function = true,
|
||||||
.function_name = "time_bucket",
|
.function_name = "time_bucket",
|
||||||
@ -81,6 +88,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INTERVALOID, TIMESTAMPTZOID},
|
.arg_types = {INTERVALOID, TIMESTAMPTZOID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket,
|
.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,
|
.extension_function = true,
|
||||||
.function_name = "time_bucket",
|
.function_name = "time_bucket",
|
||||||
@ -88,6 +102,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INTERVALOID, DATEOID},
|
.arg_types = {INTERVALOID, DATEOID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket,
|
.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,
|
.extension_function = true,
|
||||||
.function_name = "time_bucket",
|
.function_name = "time_bucket",
|
||||||
@ -95,6 +116,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INT2OID, INT2OID},
|
.arg_types = {INT2OID, INT2OID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket,
|
.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,
|
.extension_function = true,
|
||||||
.function_name = "time_bucket",
|
.function_name = "time_bucket",
|
||||||
@ -102,6 +130,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INT4OID, INT4OID},
|
.arg_types = {INT4OID, INT4OID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket,
|
.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,
|
.extension_function = true,
|
||||||
.function_name = "time_bucket",
|
.function_name = "time_bucket",
|
||||||
@ -109,6 +144,13 @@ static CustomEstimateForFunctionInfo custom_estimate_func_info[] =
|
|||||||
.arg_types = {INT8OID, INT8OID},
|
.arg_types = {INT8OID, INT8OID},
|
||||||
.custom_group_estimate_func = custom_group_estimate_time_bucket,
|
.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",
|
.function_name = "date_trunc",
|
||||||
.nargs = 2,
|
.nargs = 2,
|
||||||
|
@ -48,6 +48,13 @@ transform_date_trunc(FuncExpr *func)
|
|||||||
return (Expr *) copyObject(second);
|
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 *
|
static Expr *
|
||||||
transform_time_bucket(FuncExpr *func)
|
transform_time_bucket(FuncExpr *func)
|
||||||
{
|
{
|
||||||
@ -59,7 +66,12 @@ transform_time_bucket(FuncExpr *func)
|
|||||||
*/
|
*/
|
||||||
Expr *second;
|
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;
|
return (Expr *) func;
|
||||||
|
|
||||||
second = sort_transform_expr(lsecond(func->args));
|
second = sort_transform_expr(lsecond(func->args));
|
||||||
|
@ -16,24 +16,38 @@
|
|||||||
#include <utils/fmgrprotos.h>
|
#include <utils/fmgrprotos.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TIME_BUCKET(period, timestamp, min, result) \
|
#define TIME_BUCKET(period, timestamp, offset, min, max, result) \
|
||||||
do \
|
do \
|
||||||
{ \
|
{ \
|
||||||
if (period <= 0) \
|
if (period <= 0) \
|
||||||
ereport(ERROR, \
|
ereport(ERROR, \
|
||||||
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), \
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), \
|
||||||
errmsg("period must be greater then 0"))); \
|
errmsg("period must be greater then 0"))); \
|
||||||
*(result) = (timestamp / period) * period; \
|
if (offset != 0) \
|
||||||
if (timestamp < 0) \
|
{ \
|
||||||
if (timestamp % period) \
|
/* We need to ensure that the timestamp is in range _after_ the */ \
|
||||||
{ \
|
/* offset is applied: when the offset is positive we need to make */ \
|
||||||
if (*(result) < min + period) \
|
/* sure the resultant time is at least min, and when negative that */ \
|
||||||
ereport(ERROR, \
|
/* it is less than the max. */ \
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), \
|
offset = offset % period; \
|
||||||
errmsg("timestamp out of range"))); \
|
if ((offset > 0 && timestamp < min + offset) || \
|
||||||
else \
|
(offset < 0 && timestamp > max + offset)) \
|
||||||
*(result) = *(result) - period; \
|
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)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
@ -42,8 +56,11 @@ Datum
|
|||||||
ts_int16_bucket(PG_FUNCTION_ARGS)
|
ts_int16_bucket(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int16 result;
|
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);
|
PG_RETURN_INT16(result);
|
||||||
}
|
}
|
||||||
@ -53,8 +70,11 @@ Datum
|
|||||||
ts_int32_bucket(PG_FUNCTION_ARGS)
|
ts_int32_bucket(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int32 result;
|
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);
|
PG_RETURN_INT32(result);
|
||||||
}
|
}
|
||||||
@ -64,8 +84,11 @@ Datum
|
|||||||
ts_int64_bucket(PG_FUNCTION_ARGS)
|
ts_int64_bucket(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int64 result;
|
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);
|
PG_RETURN_INT64(result);
|
||||||
}
|
}
|
||||||
|
@ -205,13 +205,13 @@ ORDER BY MetricMinuteTs DESC;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Sort
|
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
|
-> 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
|
-> Gather
|
||||||
Workers Planned: 2
|
Workers Planned: 2
|
||||||
-> Partial HashAggregate
|
-> 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
|
-> Result
|
||||||
-> Append
|
-> Append
|
||||||
-> Parallel Seq Scan on hyper
|
-> Parallel Seq Scan on hyper
|
||||||
@ -326,13 +326,13 @@ ORDER BY MetricMinuteTs DESC, metric.id;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Sort
|
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
|
-> 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
|
-> Gather
|
||||||
Workers Planned: 2
|
Workers Planned: 2
|
||||||
-> Partial HashAggregate
|
-> 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 Join
|
||||||
Hash Cond: (hyper.metricid = metric.id)
|
Hash Cond: (hyper.metricid = metric.id)
|
||||||
-> Append
|
-> Append
|
||||||
@ -354,9 +354,9 @@ ORDER BY MetricMinuteTs DESC, metric.id;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
GroupAggregate
|
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
|
||||||
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
|
-> Nested Loop
|
||||||
Join Filter: (regular.metricid = metric.id)
|
Join Filter: (regular.metricid = metric.id)
|
||||||
-> Seq Scan on regular
|
-> Seq Scan on regular
|
||||||
|
@ -177,9 +177,9 @@ ORDER BY MetricMinuteTs DESC;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Sort
|
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
|
-> 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
|
-> Result
|
||||||
-> Append
|
-> Append
|
||||||
-> Seq Scan on hyper
|
-> Seq Scan on hyper
|
||||||
@ -278,9 +278,9 @@ ORDER BY MetricMinuteTs DESC, metric.id;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Sort
|
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
|
-> 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 Join
|
||||||
Hash Cond: (hyper.metricid = metric.id)
|
Hash Cond: (hyper.metricid = metric.id)
|
||||||
-> Append
|
-> Append
|
||||||
@ -302,9 +302,9 @@ ORDER BY MetricMinuteTs DESC, metric.id;
|
|||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
GroupAggregate
|
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
|
||||||
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
|
-> Nested Loop
|
||||||
Join Filter: (regular.metricid = metric.id)
|
Join Filter: (regular.metricid = metric.id)
|
||||||
-> Seq Scan on regular
|
-> Seq Scan on regular
|
||||||
|
@ -405,10 +405,10 @@ FROM hyper_1_int GROUP BY t ORDER BY t DESC limit 2;
|
|||||||
----------------------------------------------------------------------------------------------
|
----------------------------------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
-> GroupAggregate
|
-> GroupAggregate
|
||||||
Group Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2))
|
Group Key: (time_bucket(10, hyper_1_int."time", 2))
|
||||||
-> Result
|
-> Result
|
||||||
-> Merge Append
|
-> 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 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_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
|
-> Index Scan using _hyper_3_4_chunk_time_plain_int on _hyper_3_4_chunk
|
||||||
|
@ -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)
|
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;
|
FROM hyper_1_int GROUP BY t ORDER BY t DESC limit 2;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
--------------------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
Limit
|
Limit
|
||||||
-> GroupAggregate
|
-> GroupAggregate
|
||||||
Group Key: ((time_bucket(10, (hyper_1_int."time" - 2)) + 2))
|
Group Key: (time_bucket(10, hyper_1_int."time", 2))
|
||||||
-> Sort
|
-> 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
|
-> Result
|
||||||
-> Append
|
-> Append
|
||||||
-> Seq Scan on hyper_1_int
|
-> Seq Scan on hyper_1_int
|
||||||
|
@ -264,12 +264,12 @@
|
|||||||
< QUERY PLAN
|
< QUERY PLAN
|
||||||
< ----------------------------------------------------------------------------------------------
|
< ----------------------------------------------------------------------------------------------
|
||||||
---
|
---
|
||||||
> QUERY PLAN
|
> QUERY PLAN
|
||||||
> --------------------------------------------------------------------------------
|
> -----------------------------------------------------------------------
|
||||||
409,416c421,429
|
409,416c421,429
|
||||||
< -> Result
|
< -> Result
|
||||||
< -> Merge Append
|
< -> 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 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_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
|
< -> Index Scan using _hyper_3_4_chunk_time_plain_int on _hyper_3_4_chunk
|
||||||
@ -277,7 +277,7 @@
|
|||||||
< (10 rows)
|
< (10 rows)
|
||||||
---
|
---
|
||||||
> -> Sort
|
> -> 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
|
> -> Result
|
||||||
> -> Append
|
> -> Append
|
||||||
> -> Seq Scan on hyper_1_int
|
> -> Seq Scan on hyper_1_int
|
||||||
|
@ -608,9 +608,12 @@ SELECT time_bucket(10::smallint, '-32768'::smallint);
|
|||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
SELECT time_bucket(10::smallint, '-32761'::smallint);
|
SELECT time_bucket(10::smallint, '-32761'::smallint);
|
||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
select time_bucket(10::smallint, '-32000'::smallint, 1000::smallint);
|
select time_bucket(10::smallint, '-32768'::smallint, 1000::smallint);
|
||||||
ERROR: smallint out of range
|
ERROR: timestamp out of range
|
||||||
CONTEXT: SQL function "time_bucket" statement 1
|
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
|
\set ON_ERROR_STOP 1
|
||||||
SELECT time, time_bucket(10::smallint, time)
|
SELECT time, time_bucket(10::smallint, time)
|
||||||
FROM unnest(ARRAY[
|
FROM unnest(ARRAY[
|
||||||
@ -630,9 +633,12 @@ SELECT time_bucket(10::int, '-2147483648'::int);
|
|||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
SELECT time_bucket(10::int, '-2147483641'::int);
|
SELECT time_bucket(10::int, '-2147483641'::int);
|
||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
SELECT time_bucket(10::int, '-2147483000'::int, 1000::int);
|
SELECT time_bucket(1000::int, '-2147483000'::int, 1::int);
|
||||||
ERROR: integer out of range
|
ERROR: timestamp out of range
|
||||||
CONTEXT: SQL function "time_bucket" statement 1
|
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
|
\set ON_ERROR_STOP 1
|
||||||
SELECT time, time_bucket(10::int, time)
|
SELECT time, time_bucket(10::int, time)
|
||||||
FROM unnest(ARRAY[
|
FROM unnest(ARRAY[
|
||||||
@ -652,9 +658,12 @@ SELECT time_bucket(10::bigint, '-9223372036854775808'::bigint);
|
|||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
SELECT time_bucket(10::bigint, '-9223372036854775801'::bigint);
|
SELECT time_bucket(10::bigint, '-9223372036854775801'::bigint);
|
||||||
ERROR: timestamp out of range
|
ERROR: timestamp out of range
|
||||||
SELECT time_bucket(10::bigint, '-9223372036854775000'::bigint, 1000::bigint);
|
SELECT time_bucket(1000::bigint, '-9223372036854775000'::bigint, 1::bigint);
|
||||||
ERROR: bigint out of range
|
ERROR: timestamp out of range
|
||||||
CONTEXT: SQL function "time_bucket" statement 1
|
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
|
\set ON_ERROR_STOP 1
|
||||||
SELECT time, time_bucket(10::bigint, time)
|
SELECT time, time_bucket(10::bigint, time)
|
||||||
FROM unnest(ARRAY[
|
FROM unnest(ARRAY[
|
||||||
|
@ -362,7 +362,9 @@ FROM unnest(ARRAY[
|
|||||||
\set ON_ERROR_STOP 0
|
\set ON_ERROR_STOP 0
|
||||||
SELECT time_bucket(10::smallint, '-32768'::smallint);
|
SELECT time_bucket(10::smallint, '-32768'::smallint);
|
||||||
SELECT time_bucket(10::smallint, '-32761'::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
|
\set ON_ERROR_STOP 1
|
||||||
|
|
||||||
SELECT time, time_bucket(10::smallint, time)
|
SELECT time, time_bucket(10::smallint, time)
|
||||||
@ -375,7 +377,9 @@ FROM unnest(ARRAY[
|
|||||||
\set ON_ERROR_STOP 0
|
\set ON_ERROR_STOP 0
|
||||||
SELECT time_bucket(10::int, '-2147483648'::int);
|
SELECT time_bucket(10::int, '-2147483648'::int);
|
||||||
SELECT time_bucket(10::int, '-2147483641'::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
|
\set ON_ERROR_STOP 1
|
||||||
|
|
||||||
SELECT time, time_bucket(10::int, time)
|
SELECT time, time_bucket(10::int, time)
|
||||||
@ -388,7 +392,9 @@ FROM unnest(ARRAY[
|
|||||||
\set ON_ERROR_STOP 0
|
\set ON_ERROR_STOP 0
|
||||||
SELECT time_bucket(10::bigint, '-9223372036854775808'::bigint);
|
SELECT time_bucket(10::bigint, '-9223372036854775808'::bigint);
|
||||||
SELECT time_bucket(10::bigint, '-9223372036854775801'::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
|
\set ON_ERROR_STOP 1
|
||||||
|
|
||||||
SELECT time, time_bucket(10::bigint, time)
|
SELECT time, time_bucket(10::bigint, time)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user