Enhance partition column handling in TargetListOnPartitionColumn for PostgreSQL 18 compatibility

m3hm3t/pg18_pushdown_group_column
Mehmet Yilmaz 2025-06-25 14:43:42 +00:00
parent 128a259b15
commit 4457284d04
1 changed files with 23 additions and 5 deletions

View File

@ -136,7 +136,9 @@ static MultiNode * ApplyCartesianProductReferenceJoin(MultiNode *leftNode,
static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode, static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode,
List *partitionColumnList, JoinType joinType, List *partitionColumnList, JoinType joinType,
List *joinClauses); List *joinClauses);
#if PG_VERSION_NUM >= PG_VERSION_18
static bool ExprMentionsPartitionColumn(Node *node, Query *query); static bool ExprMentionsPartitionColumn(Node *node, Query *query);
#endif
/* /*
@ -225,15 +227,26 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
TargetEntry *targetEntry = (TargetEntry *) lfirst(targetEntryCell); TargetEntry *targetEntry = (TargetEntry *) lfirst(targetEntryCell);
Expr *targetExpression = targetEntry->expr; Expr *targetExpression = targetEntry->expr;
bool isPartitionColumn = ExprMentionsPartitionColumn((Node *) targetExpression, bool isPartitionColumn;
query); 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; Var *column = NULL;
RangeTblEntry *rte = NULL; RangeTblEntry *rte = NULL;
FindReferencedTableColumn(targetExpression, NIL, query, &column, &rte, FindReferencedTableColumn(targetExpression, NIL, query, &column, &rte,
skipOuterVars);
/*skipOuterVars=*/ false);
Oid relationId = rte ? rte->relid : InvalidOid; Oid relationId = rte ? rte->relid : InvalidOid;
/* /*
@ -294,6 +307,8 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
} }
#if PG_VERSION_NUM >= PG_VERSION_18
/* /*
* ExprMentionsPartitionColumn * ExprMentionsPartitionColumn
* *
@ -331,7 +346,7 @@ ExprMentionsPartitionColumn(Node *node, Query *query)
RangeTblEntry *rte = rt_fetch(v->varno, query->rtable); 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 */ /* Synthetic GROUP RTE examine its expressions instead */
if (rte->rtekind == RTE_GROUP && rte->groupexprs) 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 * FindNodeMatchingCheckFunctionInRangeTableList finds a node for which the checker
* function returns true. * function returns true.