From 4457284d040c3733507bc02456aa671d52142be7 Mon Sep 17 00:00:00 2001 From: Mehmet Yilmaz Date: Wed, 25 Jun 2025 14:43:42 +0000 Subject: [PATCH] Enhance partition column handling in TargetListOnPartitionColumn for PostgreSQL 18 compatibility --- .../planner/multi_logical_planner.c | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/backend/distributed/planner/multi_logical_planner.c b/src/backend/distributed/planner/multi_logical_planner.c index a3595c92f..55f1eec2a 100644 --- a/src/backend/distributed/planner/multi_logical_planner.c +++ b/src/backend/distributed/planner/multi_logical_planner.c @@ -136,7 +136,9 @@ static MultiNode * ApplyCartesianProductReferenceJoin(MultiNode *leftNode, static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode, List *partitionColumnList, JoinType joinType, List *joinClauses); +#if PG_VERSION_NUM >= PG_VERSION_18 static bool ExprMentionsPartitionColumn(Node *node, Query *query); +#endif /* @@ -225,15 +227,26 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList) TargetEntry *targetEntry = (TargetEntry *) lfirst(targetEntryCell); Expr *targetExpression = targetEntry->expr; - bool isPartitionColumn = ExprMentionsPartitionColumn((Node *) targetExpression, - query); + bool isPartitionColumn; + bool skipOuterVars = false; + +#if PG_VERSION_NUM >= PG_VERSION_18 + isPartitionColumn = + ExprMentionsPartitionColumn((Node *) targetExpression, query); +#else + { + skipOuterVars = true; + isPartitionColumn = + IsPartitionColumn(targetExpression, query, skipOuterVars); + } +#endif + Var *column = NULL; RangeTblEntry *rte = NULL; FindReferencedTableColumn(targetExpression, NIL, query, &column, &rte, - - /*skipOuterVars=*/ false); + skipOuterVars); Oid relationId = rte ? rte->relid : InvalidOid; /* @@ -294,6 +307,8 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList) } +#if PG_VERSION_NUM >= PG_VERSION_18 + /* * ExprMentionsPartitionColumn * @@ -331,7 +346,7 @@ ExprMentionsPartitionColumn(Node *node, Query *query) RangeTblEntry *rte = rt_fetch(v->varno, query->rtable); -#if PG_VERSION_NUM >= 180000 +#if PG_VERSION_NUM >= PG_VERSION_18 /* Synthetic GROUP RTE – examine its expressions instead */ if (rte->rtekind == RTE_GROUP && rte->groupexprs) @@ -362,6 +377,9 @@ ExprMentionsPartitionColumn(Node *node, Query *query) } +#endif + + /* * FindNodeMatchingCheckFunctionInRangeTableList finds a node for which the checker * function returns true.