5cff0c8a2d
Add patches needed for compatibility with Postgresql 13, which are still under review upstream. Debug builds (BR2_ENABLE_DEBUG=y) fails because of warnings, so disable WARNINGS_AS_ERRORS. Signed-off-by: Maxim Kochetkov <fido_max@inbox.ru> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
474 lines
17 KiB
Diff
474 lines
17 KiB
Diff
From 259ff80eb29c2c70e6afb77d266ce49cccbef223 Mon Sep 17 00:00:00 2001
|
|
From: Sven Klemm <sven@timescale.com>
|
|
Date: Sat, 19 Sep 2020 22:20:34 +0200
|
|
Subject: [PATCH] Add support for PG13 List implementation
|
|
|
|
PG13 changes the List implementation from a linked list to an array
|
|
while most of the API functions did not change a few them have slightly
|
|
different signature in PG13, additionally the list_make5 functions
|
|
got removed.
|
|
|
|
https://github.com/postgres/postgres/commit/1cff1b95ab
|
|
|
|
Signed-off-by: Maxim Kochetkov <fido_max@inbox.ru>
|
|
Fetch from: https://github.com/timescale/timescaledb/commit/b1a9c3b7b7d44ee78456931292655d52c252930d.patch
|
|
---
|
|
.clang-format | 1 +
|
|
src/bgw/scheduler.c | 12 ++++++------
|
|
src/cache.c | 10 ++++++++--
|
|
src/chunk_append/chunk_append.c | 2 +-
|
|
src/chunk_append/exec.c | 4 ++--
|
|
src/compat.h | 16 ++++++++++++++++
|
|
src/import/planner.c | 2 +-
|
|
src/plan_agg_bookend.c | 7 ++++---
|
|
src/plan_expand_hypertable.c | 13 +++++++++----
|
|
test/src/bgw/test_job_refresh.c | 3 ++-
|
|
tsl/src/continuous_aggs/create.c | 2 +-
|
|
tsl/src/debug.c | 15 ++++++++++-----
|
|
tsl/src/fdw/deparse.c | 6 +++---
|
|
.../nodes/decompress_chunk/decompress_chunk.c | 6 +++---
|
|
tsl/src/nodes/decompress_chunk/exec.c | 3 ++-
|
|
tsl/src/nodes/gapfill/planner.c | 11 +++++++----
|
|
16 files changed, 76 insertions(+), 37 deletions(-)
|
|
|
|
diff --git a/.clang-format b/.clang-format
|
|
index 5bb275cd..9aac7ef4 100644
|
|
--- a/.clang-format
|
|
+++ b/.clang-format
|
|
@@ -60,6 +60,7 @@ ForEachMacros:
|
|
- foreach
|
|
- forboth
|
|
- for_each_cell
|
|
+ - for_each_cell_compat
|
|
- for_both_cell
|
|
- forthree
|
|
IncludeBlocks: Preserve # separate include blocks will not be merged
|
|
diff --git a/src/bgw/scheduler.c b/src/bgw/scheduler.c
|
|
index 7a7e360c..2630ff9f 100644
|
|
--- a/src/bgw/scheduler.c
|
|
+++ b/src/bgw/scheduler.c
|
|
@@ -456,7 +456,7 @@ ts_update_scheduled_jobs_list(List *cur_jobs_list, MemoryContext mctx)
|
|
*/
|
|
terminate_and_cleanup_job(cur_sjob);
|
|
|
|
- cur_ptr = lnext(cur_ptr);
|
|
+ cur_ptr = lnext_compat(cur_jobs_list, cur_ptr);
|
|
continue;
|
|
}
|
|
if (cur_sjob->job.fd.id == new_sjob->job.fd.id)
|
|
@@ -472,15 +472,15 @@ ts_update_scheduled_jobs_list(List *cur_jobs_list, MemoryContext mctx)
|
|
if (cur_sjob->state == JOB_STATE_SCHEDULED)
|
|
scheduled_bgw_job_transition_state_to(new_sjob, JOB_STATE_SCHEDULED);
|
|
|
|
- cur_ptr = lnext(cur_ptr);
|
|
- new_ptr = lnext(new_ptr);
|
|
+ cur_ptr = lnext_compat(cur_jobs_list, cur_ptr);
|
|
+ new_ptr = lnext_compat(new_jobs, new_ptr);
|
|
}
|
|
else if (cur_sjob->job.fd.id > new_sjob->job.fd.id)
|
|
{
|
|
scheduled_bgw_job_transition_state_to(new_sjob, JOB_STATE_SCHEDULED);
|
|
|
|
/* Advance the new_job list until we catch up to cur_list */
|
|
- new_ptr = lnext(new_ptr);
|
|
+ new_ptr = lnext_compat(new_jobs, new_ptr);
|
|
}
|
|
}
|
|
|
|
@@ -489,7 +489,7 @@ ts_update_scheduled_jobs_list(List *cur_jobs_list, MemoryContext mctx)
|
|
{
|
|
ListCell *ptr;
|
|
|
|
- for_each_cell (ptr, cur_ptr)
|
|
+ for_each_cell_compat (ptr, cur_jobs_list, cur_ptr)
|
|
terminate_and_cleanup_job(lfirst(ptr));
|
|
}
|
|
|
|
@@ -498,7 +498,7 @@ ts_update_scheduled_jobs_list(List *cur_jobs_list, MemoryContext mctx)
|
|
/* Then there are more new jobs. Initialize all of them. */
|
|
ListCell *ptr;
|
|
|
|
- for_each_cell (ptr, new_ptr)
|
|
+ for_each_cell_compat (ptr, new_jobs, new_ptr)
|
|
scheduled_bgw_job_transition_state_to(lfirst(ptr), JOB_STATE_SCHEDULED);
|
|
}
|
|
|
|
diff --git a/src/cache.c b/src/cache.c
|
|
index cc6b2d07..3b53485a 100644
|
|
--- a/src/cache.c
|
|
+++ b/src/cache.c
|
|
@@ -7,6 +7,7 @@
|
|
#include <access/xact.h>
|
|
|
|
#include "cache.h"
|
|
+#include "compat.h"
|
|
|
|
/* List of pinned caches. A cache occurs once in this list for every pin
|
|
* taken */
|
|
@@ -105,7 +106,10 @@ ts_cache_pin(Cache *cache)
|
|
static void
|
|
remove_pin(Cache *cache, SubTransactionId subtxnid)
|
|
{
|
|
- ListCell *lc, *prev = NULL;
|
|
+ ListCell *lc;
|
|
+#if PG13_LT
|
|
+ ListCell *prev = NULL;
|
|
+#endif
|
|
|
|
foreach (lc, pinned_caches)
|
|
{
|
|
@@ -113,12 +117,14 @@ remove_pin(Cache *cache, SubTransactionId subtxnid)
|
|
|
|
if (cp->cache == cache && cp->subtxnid == subtxnid)
|
|
{
|
|
- pinned_caches = list_delete_cell(pinned_caches, lc, prev);
|
|
+ pinned_caches = list_delete_cell_compat(pinned_caches, lc, prev);
|
|
pfree(cp);
|
|
return;
|
|
}
|
|
|
|
+#if PG13_LT
|
|
prev = lc;
|
|
+#endif
|
|
}
|
|
|
|
/* should never reach here: there should always be a pin to remove */
|
|
diff --git a/src/chunk_append/chunk_append.c b/src/chunk_append/chunk_append.c
|
|
index fb1c87ff..ed91ff39 100644
|
|
--- a/src/chunk_append/chunk_append.c
|
|
+++ b/src/chunk_append/chunk_append.c
|
|
@@ -209,7 +209,7 @@ ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht,
|
|
if (is_not_pruned)
|
|
{
|
|
merge_childs = lappend(merge_childs, child);
|
|
- flat = lnext(flat);
|
|
+ flat = lnext_compat(children, flat);
|
|
if (flat == NULL)
|
|
break;
|
|
}
|
|
diff --git a/src/chunk_append/exec.c b/src/chunk_append/exec.c
|
|
index 8f4dd5d6..84f79e23 100644
|
|
--- a/src/chunk_append/exec.c
|
|
+++ b/src/chunk_append/exec.c
|
|
@@ -344,8 +344,8 @@ initialize_runtime_exclusion(ChunkAppendState *state)
|
|
state->runtime_number_exclusions++;
|
|
}
|
|
|
|
- lc_clauses = lnext(lc_clauses);
|
|
- lc_constraints = lnext(lc_constraints);
|
|
+ lc_clauses = lnext_compat(state->filtered_ri_clauses, lc_clauses);
|
|
+ lc_constraints = lnext_compat(state->filtered_constraints, lc_constraints);
|
|
}
|
|
|
|
state->runtime_initialized = true;
|
|
diff --git a/src/compat.h b/src/compat.h
|
|
index d84f8754..51c1c181 100644
|
|
--- a/src/compat.h
|
|
+++ b/src/compat.h
|
|
@@ -358,4 +358,20 @@ get_vacuum_options(const VacuumStmt *stmt)
|
|
pg_b64_decode((src), (srclen), (dst), (dstlen))
|
|
#endif
|
|
|
|
+/* PG13 changes the List implementation from a linked list to an array
|
|
+ * while most of the API functions did not change a few them have slightly
|
|
+ * different signature in PG13, additionally the list_make5 functions
|
|
+ * got removed. */
|
|
+#if PG13_LT
|
|
+#define lnext_compat(l, lc) lnext((lc))
|
|
+#define list_delete_cell_compat(l, lc, prev) list_delete_cell((l), (lc), (prev))
|
|
+#define for_each_cell_compat(cell, list, initcell) for_each_cell ((cell), (initcell))
|
|
+#else
|
|
+#define lnext_compat(l, lc) lnext((l), (lc))
|
|
+#define list_delete_cell_compat(l, lc, prev) list_delete_cell((l), (lc))
|
|
+#define list_make5(x1, x2, x3, x4, x5) lappend(list_make4(x1, x2, x3, x4), x5)
|
|
+#define list_make5_oid(x1, x2, x3, x4, x5) lappend_oid(list_make4_oid(x1, x2, x3, x4), x5)
|
|
+#define for_each_cell_compat(cell, list, initcell) for_each_cell ((cell), (list), (initcell))
|
|
+#endif
|
|
+
|
|
#endif /* TIMESCALEDB_COMPAT_H */
|
|
diff --git a/src/import/planner.c b/src/import/planner.c
|
|
index 31a4889d..b907390d 100644
|
|
--- a/src/import/planner.c
|
|
+++ b/src/import/planner.c
|
|
@@ -196,7 +196,7 @@ ts_make_partial_grouping_target(struct PlannerInfo *root, PathTarget *grouping_t
|
|
struct List *non_group_cols;
|
|
struct List *non_group_exprs;
|
|
int i;
|
|
- struct ListCell *lc;
|
|
+ ListCell *lc;
|
|
|
|
partial_target = create_empty_pathtarget();
|
|
non_group_cols = NIL;
|
|
diff --git a/src/plan_agg_bookend.c b/src/plan_agg_bookend.c
|
|
index d4d06f5b..5394cf5d 100644
|
|
--- a/src/plan_agg_bookend.c
|
|
+++ b/src/plan_agg_bookend.c
|
|
@@ -696,13 +696,14 @@ build_first_last_path(PlannerInfo *root, FirstLastAggInfo *fl_info, Oid eqop, Oi
|
|
if (app->parent_reloid == rte->relid)
|
|
{
|
|
subroot->append_rel_list =
|
|
- list_delete_cell(subroot->append_rel_list, next, prev);
|
|
- next = prev != NULL ? prev->next : list_head(subroot->append_rel_list);
|
|
+ list_delete_cell_compat(subroot->append_rel_list, next, prev);
|
|
+ next = prev != NULL ? lnext_compat(subroot->append_rel_list, next) :
|
|
+ list_head(subroot->append_rel_list);
|
|
}
|
|
else
|
|
{
|
|
prev = next;
|
|
- next = next->next;
|
|
+ next = lnext_compat(subroot->append_rel_list, next);
|
|
}
|
|
}
|
|
}
|
|
diff --git a/src/plan_expand_hypertable.c b/src/plan_expand_hypertable.c
|
|
index 37282ce4..2b99c93b 100644
|
|
--- a/src/plan_expand_hypertable.c
|
|
+++ b/src/plan_expand_hypertable.c
|
|
@@ -581,7 +581,8 @@ process_quals(Node *quals, CollectQualCtx *ctx, bool is_outer_join)
|
|
ListCell *prev pg_attribute_unused() = NULL;
|
|
List *additional_quals = NIL;
|
|
|
|
- for (lc = list_head((List *) quals); lc != NULL; prev = lc, lc = lnext(lc))
|
|
+ for (lc = list_head((List *) quals); lc != NULL;
|
|
+ prev = lc, lc = lnext_compat((List *) quals, lc))
|
|
{
|
|
Expr *qual = lfirst(lc);
|
|
Relids relids = pull_varnos((Node *) qual);
|
|
@@ -611,7 +612,7 @@ process_quals(Node *quals, CollectQualCtx *ctx, bool is_outer_join)
|
|
* is called, so we can remove the functions from that directly
|
|
*/
|
|
#if PG12_LT
|
|
- quals = (Node *) list_delete_cell((List *) quals, lc, prev);
|
|
+ quals = (Node *) list_delete_cell_compat((List *) quals, lc, prev);
|
|
#endif
|
|
return quals;
|
|
}
|
|
@@ -663,7 +664,9 @@ process_quals(Node *quals, CollectQualCtx *ctx, bool is_outer_join)
|
|
static List *
|
|
remove_exclusion_fns(List *restrictinfo)
|
|
{
|
|
+#if PG13_LT
|
|
ListCell *prev = NULL;
|
|
+#endif
|
|
ListCell *lc = list_head(restrictinfo);
|
|
|
|
while (lc != NULL)
|
|
@@ -682,11 +685,13 @@ remove_exclusion_fns(List *restrictinfo)
|
|
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
|
|
errmsg("first parameter for chunks_in function needs to be record")));
|
|
|
|
- restrictinfo = list_delete_cell((List *) restrictinfo, lc, prev);
|
|
+ restrictinfo = list_delete_cell_compat((List *) restrictinfo, lc, prev);
|
|
return restrictinfo;
|
|
}
|
|
+#if PG13_LT
|
|
prev = lc;
|
|
- lc = lnext(lc);
|
|
+#endif
|
|
+ lc = lnext_compat(restrictinfo, lc);
|
|
}
|
|
return restrictinfo;
|
|
}
|
|
diff --git a/test/src/bgw/test_job_refresh.c b/test/src/bgw/test_job_refresh.c
|
|
index 51a3b0d7..d51415d4 100644
|
|
--- a/test/src/bgw/test_job_refresh.c
|
|
+++ b/test/src/bgw/test_job_refresh.c
|
|
@@ -13,6 +13,7 @@
|
|
#include <access/htup_details.h>
|
|
#include <utils/memutils.h>
|
|
|
|
+#include "compat.h"
|
|
#include "export.h"
|
|
#include "bgw/scheduler.h"
|
|
|
|
@@ -70,7 +71,7 @@ ts_test_job_refresh(PG_FUNCTION_ARGS)
|
|
memset(nulls, 0, sizeof(*nulls) * funcctx->tuple_desc->natts);
|
|
tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
|
|
|
|
- funcctx->user_fctx = lnext(lc);
|
|
+ funcctx->user_fctx = lnext_compat(cur_scheduled_jobs, lc);
|
|
SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
|
|
}
|
|
|
|
diff --git a/tsl/src/continuous_aggs/create.c b/tsl/src/continuous_aggs/create.c
|
|
index bdf4470a..f767dabb 100644
|
|
--- a/tsl/src/continuous_aggs/create.c
|
|
+++ b/tsl/src/continuous_aggs/create.c
|
|
@@ -1566,7 +1566,7 @@ fixup_userview_query_tlist(Query *userquery, List *tlist_aliases)
|
|
if (tle->resjunk)
|
|
continue;
|
|
tle->resname = pstrdup(strVal(lfirst(alist_item)));
|
|
- alist_item = lnext(alist_item);
|
|
+ alist_item = lnext_compat(tlist_aliases, alist_item);
|
|
if (alist_item == NULL)
|
|
break; /* done assigning aliases */
|
|
}
|
|
diff --git a/tsl/src/debug.c b/tsl/src/debug.c
|
|
index 697bfc0b..023097ee 100644
|
|
--- a/tsl/src/debug.c
|
|
+++ b/tsl/src/debug.c
|
|
@@ -168,7 +168,7 @@ append_func_expr(StringInfo buf, const Node *expr, const List *rtable)
|
|
foreach (l, e->args)
|
|
{
|
|
append_expr(buf, lfirst(l), rtable);
|
|
- if (lnext(l))
|
|
+ if (lnext_compat(e->args, l))
|
|
appendStringInfoString(buf, ", ");
|
|
}
|
|
appendStringInfoChar(buf, ')');
|
|
@@ -217,7 +217,7 @@ append_restrict_clauses(StringInfo buf, PlannerInfo *root, List *clauses)
|
|
RestrictInfo *c = lfirst(cell);
|
|
|
|
append_expr(buf, (Node *) c->clause, root->parse->rtable);
|
|
- if (lnext(cell))
|
|
+ if (lnext_compat(clauses, cell))
|
|
appendStringInfoString(buf, ", ");
|
|
}
|
|
}
|
|
@@ -270,7 +270,7 @@ append_pathkeys(StringInfo buf, const List *pathkeys, const List *rtable)
|
|
append_expr(buf, (Node *) mem->em_expr, rtable);
|
|
}
|
|
appendStringInfoChar(buf, ')');
|
|
- if (lnext(i))
|
|
+ if (lnext_compat(pathkeys, i))
|
|
appendStringInfoString(buf, ", ");
|
|
}
|
|
appendStringInfoChar(buf, ')');
|
|
@@ -601,7 +601,10 @@ tsl_debug_append_pruned_pathlist(StringInfo buf, PlannerInfo *root, RelOptInfo *
|
|
foreach (lc1, rel->pathlist)
|
|
{
|
|
Path *p1 = (Path *) lfirst(lc1);
|
|
- ListCell *lc2, *prev = NULL;
|
|
+ ListCell *lc2;
|
|
+#if PG13_LT
|
|
+ ListCell *prev = NULL;
|
|
+#endif
|
|
|
|
foreach (lc2, fdw_info->considered_paths)
|
|
{
|
|
@@ -610,11 +613,13 @@ tsl_debug_append_pruned_pathlist(StringInfo buf, PlannerInfo *root, RelOptInfo *
|
|
if (path_is_origin(p1, p2))
|
|
{
|
|
fdw_info->considered_paths =
|
|
- list_delete_cell(fdw_info->considered_paths, lc2, prev);
|
|
+ list_delete_cell_compat(fdw_info->considered_paths, lc2, prev);
|
|
fdw_utils_free_path(p2);
|
|
break;
|
|
}
|
|
+#if PG13_LT
|
|
prev = lc2;
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
diff --git a/tsl/src/fdw/deparse.c b/tsl/src/fdw/deparse.c
|
|
index d90636b5..efd7debb 100644
|
|
--- a/tsl/src/fdw/deparse.c
|
|
+++ b/tsl/src/fdw/deparse.c
|
|
@@ -2211,7 +2211,7 @@ deparseSubscriptingRef(SubscriptingRef *node, deparse_expr_cxt *context)
|
|
{
|
|
deparseExpr(lfirst(lowlist_item), context);
|
|
appendStringInfoChar(buf, ':');
|
|
- lowlist_item = lnext(lowlist_item);
|
|
+ lowlist_item = lnext_compat(node->reflowerindexpr, lowlist_item);
|
|
}
|
|
deparseExpr(lfirst(uplist_item), context);
|
|
appendStringInfoChar(buf, ']');
|
|
@@ -2273,7 +2273,7 @@ deparseFuncExpr(FuncExpr *node, deparse_expr_cxt *context)
|
|
{
|
|
if (!first)
|
|
appendStringInfoString(buf, ", ");
|
|
- if (use_variadic && lnext(arg) == NULL)
|
|
+ if (use_variadic && lnext_compat(node->args, arg) == NULL)
|
|
appendStringInfoString(buf, "VARIADIC ");
|
|
deparseExpr((Expr *) lfirst(arg), context);
|
|
first = false;
|
|
@@ -2601,7 +2601,7 @@ deparseAggref(Aggref *node, deparse_expr_cxt *context)
|
|
first = false;
|
|
|
|
/* Add VARIADIC */
|
|
- if (use_variadic && lnext(arg) == NULL)
|
|
+ if (use_variadic && lnext_compat(node->args, arg) == NULL)
|
|
appendStringInfoString(buf, "VARIADIC ");
|
|
|
|
deparseExpr((Expr *) n, context);
|
|
diff --git a/tsl/src/nodes/decompress_chunk/decompress_chunk.c b/tsl/src/nodes/decompress_chunk/decompress_chunk.c
|
|
index 90b6c7c3..1e36f5dc 100644
|
|
--- a/tsl/src/nodes/decompress_chunk/decompress_chunk.c
|
|
+++ b/tsl/src/nodes/decompress_chunk/decompress_chunk.c
|
|
@@ -182,7 +182,7 @@ build_compressed_scan_pathkeys(SortInfo *sort_info, PlannerInfo *root, List *chu
|
|
|
|
for (lc = list_head(chunk_pathkeys);
|
|
lc != NULL && bms_num_members(segmentby_columns) < info->num_segmentby_columns;
|
|
- lc = lnext(lc))
|
|
+ lc = lnext_compat(chunk_pathkeys, lc))
|
|
{
|
|
PathKey *pk = lfirst(lc);
|
|
var = (Var *) ts_find_em_expr_for_rel(pk->pk_eclass, info->chunk_rel);
|
|
@@ -1210,7 +1210,7 @@ build_sortinfo(RelOptInfo *chunk_rel, CompressionInfo *info, List *pathkeys)
|
|
* we keep looping even if we found all segmentby columns in case a
|
|
* columns appears both in baserestrictinfo and in ORDER BY clause
|
|
*/
|
|
- for (; lc != NULL; lc = lnext(lc))
|
|
+ for (; lc != NULL; lc = lnext_compat(pathkeys, lc))
|
|
{
|
|
Assert(bms_num_members(segmentby_columns) <= info->num_segmentby_columns);
|
|
pk = lfirst(lc);
|
|
@@ -1250,7 +1250,7 @@ build_sortinfo(RelOptInfo *chunk_rel, CompressionInfo *info, List *pathkeys)
|
|
* loop over the rest of pathkeys
|
|
* this needs to exactly match the configured compress_orderby
|
|
*/
|
|
- for (pk_index = 1; lc != NULL; lc = lnext(lc), pk_index++)
|
|
+ for (pk_index = 1; lc != NULL; lc = lnext_compat(pathkeys, lc), pk_index++)
|
|
{
|
|
bool reverse = false;
|
|
pk = lfirst(lc);
|
|
diff --git a/tsl/src/nodes/decompress_chunk/exec.c b/tsl/src/nodes/decompress_chunk/exec.c
|
|
index 035f2de4..f58e6f6c 100644
|
|
--- a/tsl/src/nodes/decompress_chunk/exec.c
|
|
+++ b/tsl/src/nodes/decompress_chunk/exec.c
|
|
@@ -121,7 +121,8 @@ initialize_column_state(DecompressChunkState *state)
|
|
|
|
state->columns = palloc0(state->num_columns * sizeof(DecompressChunkColumnState));
|
|
|
|
- for (i = 0, lc = list_head(state->varattno_map); i < state->num_columns; lc = lnext(lc), i++)
|
|
+ for (i = 0, lc = list_head(state->varattno_map); i < state->num_columns;
|
|
+ lc = lnext_compat(state->varattno_map, lc), i++)
|
|
{
|
|
DecompressChunkColumnState *column = &state->columns[i];
|
|
column->attno = lfirst_int(lc);
|
|
diff --git a/tsl/src/nodes/gapfill/planner.c b/tsl/src/nodes/gapfill/planner.c
|
|
index 56bdffd5..765a14ce 100644
|
|
--- a/tsl/src/nodes/gapfill/planner.c
|
|
+++ b/tsl/src/nodes/gapfill/planner.c
|
|
@@ -295,8 +295,10 @@ gapfill_build_pathtarget(PathTarget *pt_upper, PathTarget *pt_path, PathTarget *
|
|
/*
|
|
* check arguments past first argument dont have Vars
|
|
*/
|
|
- for (lc_arg = lnext(list_head(context.call.window->args)); lc_arg != NULL;
|
|
- lc_arg = lnext(lc_arg))
|
|
+ for (lc_arg = lnext_compat(context.call.window->args,
|
|
+ list_head(context.call.window->args));
|
|
+ lc_arg != NULL;
|
|
+ lc_arg = lnext_compat(context.call.window->args, lc_arg))
|
|
{
|
|
if (contain_var_clause(lfirst(lc_arg)))
|
|
ereport(ERROR,
|
|
@@ -553,9 +555,10 @@ gapfill_adjust_window_targetlist(PlannerInfo *root, RelOptInfo *input_rel, RelOp
|
|
/*
|
|
* check arguments past first argument dont have Vars
|
|
*/
|
|
- for (lc_arg = lnext(list_head(context.call.window->args));
|
|
+ for (lc_arg = lnext_compat(context.call.window->args,
|
|
+ list_head(context.call.window->args));
|
|
lc_arg != NULL;
|
|
- lc_arg = lnext(lc_arg))
|
|
+ lc_arg = lnext_compat(context.call.window->args, lc_arg))
|
|
{
|
|
if (contain_var_clause(lfirst(lc_arg)))
|
|
ereport(ERROR,
|
|
--
|
|
2.29.2
|
|
|