diff --git a/src/planner/CMakeLists.txt b/src/planner/CMakeLists.txt index 7e5558106..24ef283b2 100644 --- a/src/planner/CMakeLists.txt +++ b/src/planner/CMakeLists.txt @@ -3,6 +3,7 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/add_hashagg.c ${CMAKE_CURRENT_SOURCE_DIR}/agg_bookend.c ${CMAKE_CURRENT_SOURCE_DIR}/constify_now.c + ${CMAKE_CURRENT_SOURCE_DIR}/constraint_cleanup.c ${CMAKE_CURRENT_SOURCE_DIR}/expand_hypertable.c ${CMAKE_CURRENT_SOURCE_DIR}/partialize.c) target_sources(${PROJECT_NAME} PRIVATE ${SOURCES}) diff --git a/src/planner/constify_now.c b/src/planner/constify_now.c index cdc4d50af..cb1ace8a6 100644 --- a/src/planner/constify_now.c +++ b/src/planner/constify_now.c @@ -130,6 +130,7 @@ static OpExpr * constify_now_expr(PlannerInfo *root, OpExpr *op) { op = copyObject(op); + op->location = PLANNER_LOCATION_MAGIC; if (IsA(lsecond(op->args), FuncExpr)) { /* @@ -162,6 +163,7 @@ constify_now_expr(PlannerInfo *root, OpExpr *op) */ lsecond(op->args) = estimate_expression_value(root, (Node *) op_inner); Assert(IsA(lsecond(op->args), Const)); + op->location = PLANNER_LOCATION_MAGIC; return op; } } diff --git a/src/planner/constraint_cleanup.c b/src/planner/constraint_cleanup.c new file mode 100644 index 000000000..99c099b8c --- /dev/null +++ b/src/planner/constraint_cleanup.c @@ -0,0 +1,123 @@ +/* + * This file and its contents are licensed under the Apache License 2.0. + * Please see the included NOTICE for copyright information and + * LICENSE-APACHE for a copy of the license. + */ + +#include +#include + +#include "planner.h" + +/* + * This code deals with removing the intermediate constraints + * we added before planning to improve chunk exclusion. + */ + +static bool +restrictinfo_is_marked(RestrictInfo *ri) +{ + switch (nodeTag(ri->clause)) + { + case T_OpExpr: + return castNode(OpExpr, ri->clause)->location == PLANNER_LOCATION_MAGIC; + case T_ScalarArrayOpExpr: + return castNode(ScalarArrayOpExpr, ri->clause)->location == PLANNER_LOCATION_MAGIC; + default: + break; + } + return false; +} + +/* + * Remove marked constraints from RestrictInfo clause. + */ +static List * +restrictinfo_cleanup(List *restrictinfos, bool *pfiltered) +{ + List *filtered_ri = NIL; + ListCell *lc; + bool filtered = false; + if (!restrictinfos) + return NULL; + + foreach (lc, restrictinfos) + { + RestrictInfo *ri = (RestrictInfo *) lfirst(lc); + if (restrictinfo_is_marked(ri)) + { + filtered = true; + continue; + } + filtered_ri = lappend(filtered_ri, ri); + } + + if (pfiltered) + *pfiltered = filtered; + + return filtered ? filtered_ri : restrictinfos; +} + +/* + * Remove marked constraints from IndexPath. + */ +static void +indexpath_cleanup(IndexPath *path) +{ + ListCell *lc; + List *filtered_ic = NIL; + path->indexinfo->indrestrictinfo = restrictinfo_cleanup(path->indexinfo->indrestrictinfo, NULL); + + foreach (lc, path->indexclauses) + { + IndexClause *iclause = lfirst_node(IndexClause, lc); + if (restrictinfo_is_marked(iclause->rinfo)) + continue; + + filtered_ic = lappend(filtered_ic, iclause); + } + path->indexclauses = filtered_ic; +} + +void +ts_planner_constraint_cleanup(PlannerInfo *root, RelOptInfo *rel) +{ + ListCell *lc; + bool filtered = false; + if (rel->baserestrictinfo) + rel->baserestrictinfo = restrictinfo_cleanup(rel->baserestrictinfo, &filtered); + + /* + * If we added constraints those will be present in baserestrictinfo. + * If we did not remove anything from baserestrictinfo in the step + * above we can skip looking in the paths. + */ + if (filtered) + { + /* + * For seqscan cleaning up baserestrictinfo is enough but for + * BitmapHeapPath and IndexPath we need some extra steps. + */ + foreach (lc, rel->pathlist) + { + switch (nodeTag(lfirst(lc))) + { + case T_BitmapHeapPath: + { + BitmapHeapPath *path = lfirst_node(BitmapHeapPath, lc); + if (IsA(path->bitmapqual, IndexPath)) + indexpath_cleanup(castNode(IndexPath, path->bitmapqual)); + + break; + } + case T_IndexPath: + { + indexpath_cleanup(castNode(IndexPath, lfirst(lc))); + break; + } + default: + break; + } + } + } +} diff --git a/src/planner/planner.c b/src/planner/planner.c index bb8824662..60bd21376 100644 --- a/src/planner/planner.c +++ b/src/planner/planner.c @@ -1107,6 +1107,9 @@ timescaledb_set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, Index rti, Rang break; case TS_REL_CHUNK: case TS_REL_CHUNK_CHILD: + if (ts_guc_enable_optimizations) + ts_planner_constraint_cleanup(root, rel); + if (IS_UPDL_CMD(root->parse)) { BaserelInfoEntry *chunk_cache_entry = diff --git a/src/planner/planner.h b/src/planner/planner.h index 32e619940..79edf22da 100644 --- a/src/planner/planner.h +++ b/src/planner/planner.h @@ -16,6 +16,13 @@ #include "guc.h" #define CHUNK_EXCL_FUNC_NAME "chunks_in" +/* + * Constraints created during planning to improve chunk exclusion + * will be marked with this value as location so they can be easily + * identified and removed when they are no longer needed. + * Removal happens in timescaledb_set_rel_pathlist hook. + */ +#define PLANNER_LOCATION_MAGIC -29811 typedef struct Chunk Chunk; typedef struct TsFdwRelInfo TsFdwRelInfo; @@ -95,5 +102,6 @@ extern void ts_preprocess_first_last_aggregates(PlannerInfo *root, List *tlist); extern void ts_plan_expand_hypertable_chunks(Hypertable *ht, PlannerInfo *root, RelOptInfo *rel); extern void ts_plan_expand_timebucket_annotate(PlannerInfo *root, RelOptInfo *rel); extern Node *ts_constify_now(PlannerInfo *root, List *rtable, Node *node); +extern void ts_planner_constraint_cleanup(PlannerInfo *root, RelOptInfo *rel); #endif /* TIMESCALEDB_PLANNER_H */ diff --git a/tsl/test/shared/expected/constify_now-12.out b/tsl/test/shared/expected/constify_now-12.out index 026657d2f..7740c5af2 100644 --- a/tsl/test/shared/expected/constify_now-12.out +++ b/tsl/test/shared/expected/constify_now-12.out @@ -14,91 +14,111 @@ SET timescaledb.current_timestamp_mock TO '1990-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() - '24h'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() - '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) (7 rows) +-- test bitmapheapscan +SET enable_indexscan TO false; +:PREFIX SELECT FROM metrics WHERE time > now(); +QUERY PLAN + Append + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) +(13 rows) + +RESET enable_indexscan; -- test multiple constraints :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND device_id = 2; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND (device_id = 2 OR device_id = 3); QUERY PLAN Append -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) (10 rows) @@ -106,11 +126,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) (7 rows) -- variants we don't optimize @@ -233,11 +253,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX WITH q1 AS ( @@ -264,11 +284,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m2.time > now(); @@ -281,11 +301,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m1.time > now() AND m2.time > now(); @@ -293,19 +313,19 @@ QUERY PLAN Nested Loop -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- only top-level constraints in WHERE clause are constified @@ -339,11 +359,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- test UPDATE @@ -357,11 +377,11 @@ QUERY PLAN -> Seq Scan on metrics Filter: (("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone) AND ("time" > now())) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) -- test DELETE @@ -375,11 +395,11 @@ QUERY PLAN -> Seq Scan on metrics Filter: (("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone) AND ("time" > now())) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) -- test chunks actually get excluded @@ -396,7 +416,7 @@ SET timescaledb.current_timestamp_mock TO '2000-01-14'; :PREFIX SELECT FROM metrics WHERE time > now(); QUERY PLAN Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Fri Jan 14 00:00:00 2000 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (2 rows) CREATE TABLE const_now(time timestamptz, time2 timestamptz, value float); @@ -446,9 +466,9 @@ PREPARE p1 AS SELECT FROM prep_const_now WHERE time > now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; @@ -460,9 +480,9 @@ SET timescaledb.current_timestamp_mock TO '3002-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; diff --git a/tsl/test/shared/expected/constify_now-13.out b/tsl/test/shared/expected/constify_now-13.out index bd3b050db..ca4344280 100644 --- a/tsl/test/shared/expected/constify_now-13.out +++ b/tsl/test/shared/expected/constify_now-13.out @@ -14,91 +14,111 @@ SET timescaledb.current_timestamp_mock TO '1990-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() - '24h'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() - '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) (7 rows) +-- test bitmapheapscan +SET enable_indexscan TO false; +:PREFIX SELECT FROM metrics WHERE time > now(); +QUERY PLAN + Append + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) +(13 rows) + +RESET enable_indexscan; -- test multiple constraints :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND device_id = 2; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND (device_id = 2 OR device_id = 3); QUERY PLAN Append -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) (10 rows) @@ -106,11 +126,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) (7 rows) -- variants we don't optimize @@ -233,11 +253,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX WITH q1 AS ( @@ -264,11 +284,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m2.time > now(); @@ -281,11 +301,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m1.time > now() AND m2.time > now(); @@ -293,19 +313,19 @@ QUERY PLAN Nested Loop -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- only top-level constraints in WHERE clause are constified @@ -339,11 +359,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- test UPDATE @@ -357,11 +377,11 @@ QUERY PLAN -> Seq Scan on metrics Filter: (("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone) AND ("time" > now())) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) -- test DELETE @@ -375,11 +395,11 @@ QUERY PLAN -> Seq Scan on metrics Filter: (("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone) AND ("time" > now())) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) -- test chunks actually get excluded @@ -396,7 +416,7 @@ SET timescaledb.current_timestamp_mock TO '2000-01-14'; :PREFIX SELECT FROM metrics WHERE time > now(); QUERY PLAN Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Fri Jan 14 00:00:00 2000 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (2 rows) CREATE TABLE const_now(time timestamptz, time2 timestamptz, value float); @@ -446,9 +466,9 @@ PREPARE p1 AS SELECT FROM prep_const_now WHERE time > now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; @@ -460,9 +480,9 @@ SET timescaledb.current_timestamp_mock TO '3002-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; diff --git a/tsl/test/shared/expected/constify_now-14.out b/tsl/test/shared/expected/constify_now-14.out index fcd8276e7..9a05b4807 100644 --- a/tsl/test/shared/expected/constify_now-14.out +++ b/tsl/test/shared/expected/constify_now-14.out @@ -14,91 +14,111 @@ SET timescaledb.current_timestamp_mock TO '1990-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= now()) AND ("time" >= 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= now()) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() - '24h'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() - '@ 24 hours'::interval)) AND ("time" > 'Sun Dec 31 00:00:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() - '@ 24 hours'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time > now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > (now() + '@ 10 mins'::interval)) AND ("time" > 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > (now() + '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() - '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() - '@ 10 mins'::interval)) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) (7 rows) +-- test bitmapheapscan +SET enable_indexscan TO false; +:PREFIX SELECT FROM metrics WHERE time > now(); +QUERY PLAN + Append + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) + -> Bitmap Heap Scan on _hyper_X_X_chunk + Recheck Cond: ("time" > now()) + -> Bitmap Index Scan on _hyper_X_X_chunk_metrics_time_idx + Index Cond: ("time" > now()) +(13 rows) + +RESET enable_indexscan; -- test multiple constraints :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND device_id = 2; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_device_id_time_idx on _hyper_X_X_chunk - Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ((device_id = 2) AND ("time" >= (now() + '@ 10 mins'::interval))) (7 rows) :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND (device_id = 2 OR device_id = 3); QUERY PLAN Append -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" >= (now() + '@ 10 mins'::interval)) Filter: ((device_id = 2) OR (device_id = 3)) (10 rows) @@ -106,11 +126,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval)) AND ("time" >= 'Mon Jan 01 00:10:00 1990 PST'::timestamp with time zone) AND ("time" >= 'Sun Dec 31 23:50:00 1989 PST'::timestamp with time zone)) + Index Cond: (("time" >= (now() + '@ 10 mins'::interval)) AND ("time" >= (now() - '@ 10 mins'::interval))) (7 rows) -- variants we don't optimize @@ -233,11 +253,11 @@ QUERY PLAN QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (7 rows) :PREFIX WITH q1 AS ( @@ -264,11 +284,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m2.time > now(); @@ -281,11 +301,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) :PREFIX SELECT FROM metrics m1, metrics m2 WHERE m1.time > now() AND m2.time > now(); @@ -293,19 +313,19 @@ QUERY PLAN Nested Loop -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m1_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- only top-level constraints in WHERE clause are constified @@ -339,11 +359,11 @@ QUERY PLAN -> Materialize -> Append -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk m2_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (16 rows) -- test UPDATE @@ -357,11 +377,11 @@ QUERY PLAN -> Result -> Append -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (13 rows) -- test DELETE @@ -374,11 +394,11 @@ QUERY PLAN Delete on _hyper_X_X_chunk metrics_3 -> Append -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_1 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_2 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk metrics_3 - Index Cond: (("time" > now()) AND ("time" > 'Mon Jan 01 00:00:00 1990 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (12 rows) -- test chunks actually get excluded @@ -395,7 +415,7 @@ SET timescaledb.current_timestamp_mock TO '2000-01-14'; :PREFIX SELECT FROM metrics WHERE time > now(); QUERY PLAN Index Only Scan using _hyper_X_X_chunk_metrics_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Fri Jan 14 00:00:00 2000 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (2 rows) CREATE TABLE const_now(time timestamptz, time2 timestamptz, value float); @@ -445,9 +465,9 @@ PREPARE p1 AS SELECT FROM prep_const_now WHERE time > now(); QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; @@ -459,9 +479,9 @@ SET timescaledb.current_timestamp_mock TO '3002-01-01'; QUERY PLAN Append -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) -> Index Only Scan using _hyper_X_X_chunk_prep_const_now_time_idx on _hyper_X_X_chunk - Index Cond: (("time" > now()) AND ("time" > 'Thu Jan 01 00:00:00 3001 PST'::timestamp with time zone)) + Index Cond: ("time" > now()) (5 rows) EXECUTE p1; diff --git a/tsl/test/shared/sql/constify_now.sql.in b/tsl/test/shared/sql/constify_now.sql.in index 454e1eb5a..24ea8bbf0 100644 --- a/tsl/test/shared/sql/constify_now.sql.in +++ b/tsl/test/shared/sql/constify_now.sql.in @@ -20,6 +20,11 @@ SET timescaledb.current_timestamp_mock TO '1990-01-01'; :PREFIX SELECT FROM metrics WHERE time >= now() - '10m'::interval; :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval; +-- test bitmapheapscan +SET enable_indexscan TO false; +:PREFIX SELECT FROM metrics WHERE time > now(); +RESET enable_indexscan; + -- test multiple constraints :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND device_id = 2; :PREFIX SELECT FROM metrics WHERE time >= now() + '10m'::interval AND (device_id = 2 OR device_id = 3);