mirror of https://github.com/citusdata/citus.git
indent
parent
f49caf8aca
commit
128a259b15
|
@ -136,8 +136,7 @@ static MultiNode * ApplyCartesianProductReferenceJoin(MultiNode *leftNode,
|
|||
static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode,
|
||||
List *partitionColumnList, JoinType joinType,
|
||||
List *joinClauses);
|
||||
static bool
|
||||
ExprMentionsPartitionColumn(Node *node, Query *query);
|
||||
static bool ExprMentionsPartitionColumn(Node *node, Query *query);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -227,13 +226,14 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
|
|||
Expr *targetExpression = targetEntry->expr;
|
||||
|
||||
bool isPartitionColumn = ExprMentionsPartitionColumn((Node *) targetExpression,
|
||||
query);
|
||||
query);
|
||||
|
||||
Var *column = NULL;
|
||||
RangeTblEntry *rte = NULL;
|
||||
|
||||
FindReferencedTableColumn(targetExpression, NIL, query, &column, &rte,
|
||||
/*skipOuterVars=*/false);
|
||||
|
||||
/*skipOuterVars=*/ false);
|
||||
Oid relationId = rte ? rte->relid : InvalidOid;
|
||||
|
||||
/*
|
||||
|
@ -307,50 +307,58 @@ TargetListOnPartitionColumn(Query *query, List *targetEntryList)
|
|||
static bool
|
||||
ExprMentionsPartitionColumn(Node *node, Query *query)
|
||||
{
|
||||
if (node == NULL)
|
||||
return false;
|
||||
if (node == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IsA(node, Var))
|
||||
{
|
||||
Var *v = (Var *) node;
|
||||
if (IsA(node, Var))
|
||||
{
|
||||
Var *v = (Var *) node;
|
||||
|
||||
/* Follow OUTER_VAR → target-list indirection, if present */
|
||||
if (v->varno == OUTER_VAR)
|
||||
{
|
||||
TargetEntry *tle = get_tle_by_resno(query->targetList, v->varattno);
|
||||
return tle && ExprMentionsPartitionColumn((Node *) tle->expr, query);
|
||||
}
|
||||
/* Follow OUTER_VAR → target-list indirection, if present */
|
||||
if (v->varno == OUTER_VAR)
|
||||
{
|
||||
TargetEntry *tle = get_tle_by_resno(query->targetList, v->varattno);
|
||||
return tle && ExprMentionsPartitionColumn((Node *) tle->expr, query);
|
||||
}
|
||||
|
||||
/* Sanity-check varno */
|
||||
if (v->varno <= 0 || v->varno > list_length(query->rtable))
|
||||
return false;
|
||||
/* Sanity-check varno */
|
||||
if (v->varno <= 0 || v->varno > list_length(query->rtable))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
RangeTblEntry *rte = rt_fetch(v->varno, query->rtable);
|
||||
RangeTblEntry *rte = rt_fetch(v->varno, query->rtable);
|
||||
|
||||
#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 */
|
||||
return expression_tree_walker(node,
|
||||
ExprMentionsPartitionColumn,
|
||||
(void *) query);
|
||||
/* 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 */
|
||||
return expression_tree_walker(node,
|
||||
ExprMentionsPartitionColumn,
|
||||
(void *) query);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue