m3hm3t/pg18_pushdown_group_column
Mehmet Yilmaz 2025-06-25 14:06:38 +00:00
parent f49caf8aca
commit 128a259b15
1 changed files with 49 additions and 41 deletions

View File

@ -136,8 +136,7 @@ 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);
static bool static bool ExprMentionsPartitionColumn(Node *node, Query *query);
ExprMentionsPartitionColumn(Node *node, Query *query);
/* /*
@ -227,13 +226,14 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
Expr *targetExpression = targetEntry->expr; Expr *targetExpression = targetEntry->expr;
bool isPartitionColumn = ExprMentionsPartitionColumn((Node *) targetExpression, bool isPartitionColumn = ExprMentionsPartitionColumn((Node *) targetExpression,
query); query);
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=*/false);
/*skipOuterVars=*/ false);
Oid relationId = rte ? rte->relid : InvalidOid; Oid relationId = rte ? rte->relid : InvalidOid;
/* /*
@ -307,50 +307,58 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
static bool static bool
ExprMentionsPartitionColumn(Node *node, Query *query) ExprMentionsPartitionColumn(Node *node, Query *query)
{ {
if (node == NULL) if (node == NULL)
return false; {
return false;
}
if (IsA(node, Var)) if (IsA(node, Var))
{ {
Var *v = (Var *) node; Var *v = (Var *) node;
/* Follow OUTER_VAR → target-list indirection, if present */ /* Follow OUTER_VAR → target-list indirection, if present */
if (v->varno == OUTER_VAR) if (v->varno == OUTER_VAR)
{ {
TargetEntry *tle = get_tle_by_resno(query->targetList, v->varattno); TargetEntry *tle = get_tle_by_resno(query->targetList, v->varattno);
return tle && ExprMentionsPartitionColumn((Node *) tle->expr, query); return tle && ExprMentionsPartitionColumn((Node *) tle->expr, query);
} }
/* Sanity-check varno */ /* Sanity-check varno */
if (v->varno <= 0 || v->varno > list_length(query->rtable)) if (v->varno <= 0 || v->varno > list_length(query->rtable))
return false; {
return false;
}
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 >= 180000
/* Synthetic GROUP RTE examine its expressions instead */
if (rte->rtekind == RTE_GROUP && rte->groupexprs)
{
ListCell *lc;
foreach (lc, rte->groupexprs)
if (ExprMentionsPartitionColumn((Node *) lfirst(lc), query))
return true;
return false;
}
#endif
/* Real table? — compare against its dist key */
if (rte->rtekind == RTE_RELATION && HasDistributionKey(rte->relid))
{
Var *partcol = DistPartitionKey(rte->relid);
return partcol && partcol->varattno == v->varattno;
}
return false;
}
/* Recurse through any other node type */ /* Synthetic GROUP RTE examine its expressions instead */
return expression_tree_walker(node, if (rte->rtekind == RTE_GROUP && rte->groupexprs)
ExprMentionsPartitionColumn, {
(void *) query); ListCell *lc;
foreach(lc, rte->groupexprs)
if (ExprMentionsPartitionColumn((Node *) lfirst(lc), query))
{
return true;
}
return false;
}
#endif
/* Real table? — compare against its dist key */
if (rte->rtekind == RTE_RELATION && HasDistributionKey(rte->relid))
{
Var *partcol = DistPartitionKey(rte->relid);
return partcol && partcol->varattno == v->varattno;
}
return false;
}
/* Recurse through any other node type */
return expression_tree_walker(node,
ExprMentionsPartitionColumn,
(void *) query);
} }