From b5e70f56ab1044c3629ca0b64a4853f4197c5e4d Mon Sep 17 00:00:00 2001 From: Colm Date: Mon, 22 Sep 2025 09:06:39 +0100 Subject: [PATCH] Postgres 18: Fix regress tests caused by GROUP RTE. (#8206) The change in `merge_planner.c` fixes _unrecognized range table entry_ diffs in merge regress tests (category 2 diffs in #7992), the change in `multi_router_planner.c` fixes _column reference ... is ambiguous_ diffs in `multi_insert_select` and `multi_insert_select_window` (category 3 diffs in #7992). Edit to `common.py` enables standalone regress tests with pg18 (e..g `citus_tests/run_test.py merge`). --- .../distributed/planner/merge_planner.c | 11 +++++++---- .../planner/multi_router_planner.c | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/backend/distributed/planner/merge_planner.c b/src/backend/distributed/planner/merge_planner.c index b1c441f92..e848141bc 100644 --- a/src/backend/distributed/planner/merge_planner.c +++ b/src/backend/distributed/planner/merge_planner.c @@ -422,10 +422,13 @@ ErrorIfMergeHasUnsupportedTables(Oid targetRelationId, List *rangeTableList) case RTE_VALUES: case RTE_JOIN: case RTE_CTE: - { - /* Skip them as base table(s) will be checked */ - continue; - } +#if PG_VERSION_NUM >= PG_VERSION_18 + case RTE_GROUP: +#endif + { + /* Skip them as base table(s) will be checked */ + continue; + } /* * RTE_NAMEDTUPLESTORE is typically used in ephmeral named relations, diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 43f79f30b..d67dd6885 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -372,6 +372,25 @@ AddPartitionKeyNotNullFilterToSelect(Query *subqery) /* we should have found target partition column */ Assert(targetPartitionColumnVar != NULL); +#if PG_VERSION_NUM >= PG_VERSION_18 + if (subqery->hasGroupRTE) + { + /* if the partition column is a grouped column, we need to flatten it + * to ensure query deparsing works correctly. We choose to do this here + * instead of in ruletils.c because we want to keep the flattening logic + * close to the NOT NULL filter injection. + */ + RangeTblEntry *partitionRTE = rt_fetch(targetPartitionColumnVar->varno, + subqery->rtable); + if (partitionRTE->rtekind == RTE_GROUP) + { + targetPartitionColumnVar = (Var *) flatten_group_exprs(NULL, subqery, + (Node *) + targetPartitionColumnVar); + } + } +#endif + /* create expression for partition_column IS NOT NULL */ NullTest *nullTest = makeNode(NullTest); nullTest->nulltesttype = IS_NOT_NULL;