mirror of https://github.com/citusdata/citus.git
Use path object to recreate range table entry etc
parent
285f1b1d1e
commit
00083afeaa
|
@ -23,7 +23,7 @@ static Plan * CreateDistributedUnionPlan(PlannerInfo *root, RelOptInfo *rel, str
|
||||||
static List * ReparameterizeDistributedUnion(PlannerInfo *root, List *custom_private, RelOptInfo *child_rel);
|
static List * ReparameterizeDistributedUnion(PlannerInfo *root, List *custom_private, RelOptInfo *child_rel);
|
||||||
static CustomPath * WrapTableAccessWithDistributedUnion(Path *originalPath, RangeTblEntry *rte);
|
static CustomPath * WrapTableAccessWithDistributedUnion(Path *originalPath, RangeTblEntry *rte);
|
||||||
static Index VarnoFromFirstTargetEntry(List *tlist);
|
static Index VarnoFromFirstTargetEntry(List *tlist);
|
||||||
static Query * GetQueryFromPath(List *tlist, RangeTblEntry *rte, List *clauses);
|
static Query * GetQueryFromPath(PlannerInfo *root, Path *path, List *tlist, List *clauses);
|
||||||
|
|
||||||
static bool IsDistributedUnion(Path *path);
|
static bool IsDistributedUnion(Path *path);
|
||||||
static uint32 ColocationGroupForDistributedUnion(Path *path);
|
static uint32 ColocationGroupForDistributedUnion(Path *path);
|
||||||
|
@ -73,7 +73,7 @@ CreateDistributedUnionPlan(PlannerInfo *root,
|
||||||
List* shardIntervalList = LoadShardIntervalList(rte->relid);
|
List* shardIntervalList = LoadShardIntervalList(rte->relid);
|
||||||
ShardInterval *shardInterval = NULL;
|
ShardInterval *shardInterval = NULL;
|
||||||
|
|
||||||
Query *q = GetQueryFromPath(tlist, rte, clauses);
|
Query *q = GetQueryFromPath(root, originalPath, tlist, clauses);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_ptr(shardInterval, shardIntervalList)
|
||||||
|
@ -174,23 +174,27 @@ PathBasedPlannerRelationHook(PlannerInfo *root, RelOptInfo *relOptInfo, Index re
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* varno_mapping is an array where the index is the varno in the original query, or 0 if
|
||||||
|
* no mapping is required.
|
||||||
|
*/
|
||||||
static Node *
|
static Node *
|
||||||
VarNoMutator(Node *expr, Index *varno)
|
VarNoMutator(Node *expr, Index *varno_mapping)
|
||||||
{
|
{
|
||||||
switch (nodeTag(expr))
|
switch (nodeTag(expr))
|
||||||
{
|
{
|
||||||
case T_Var:
|
case T_Var:
|
||||||
{
|
{
|
||||||
Var *var = castNode(Var, expr);
|
Var *var = castNode(Var, expr);
|
||||||
if (var->varno == *varno)
|
Index newVarNo = varno_mapping[var->varno];
|
||||||
|
if (newVarNo == 0)
|
||||||
{
|
{
|
||||||
/*nothing to change */
|
/* no mapping required */
|
||||||
return (Node *) var;
|
return (Node *) var;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (Node *) makeVar(
|
return (Node *) makeVar(
|
||||||
*varno,
|
newVarNo,
|
||||||
var->varattno,
|
var->varattno,
|
||||||
var->vartype,
|
var->vartype,
|
||||||
var->vartypmod,
|
var->vartypmod,
|
||||||
|
@ -201,27 +205,34 @@ VarNoMutator(Node *expr, Index *varno)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
return expression_tree_mutator(expr, (void*) VarNoMutator, varno);
|
return expression_tree_mutator(expr, (void*) VarNoMutator, varno_mapping);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Query *
|
static Query *
|
||||||
GetQueryFromPath(List *tlist, RangeTblEntry *rte, List *clauses)
|
GetQueryFromPath(PlannerInfo *root, Path *path, List *tlist, List *clauses)
|
||||||
{
|
{
|
||||||
|
Index scan_relid = path->parent->relid;
|
||||||
|
RangeTblEntry *rte = root->simple_rte_array[scan_relid];
|
||||||
|
|
||||||
Query *q = makeNode(Query);
|
Query *q = makeNode(Query);
|
||||||
q->commandType = CMD_SELECT;
|
q->commandType = CMD_SELECT;
|
||||||
q->rtable = list_make1(rte);
|
q->rtable = list_make1(rte);
|
||||||
|
|
||||||
List *newTargetList = NIL;
|
List *newTargetList = NIL;
|
||||||
TargetEntry *target = NULL;
|
TargetEntry *target = NULL;
|
||||||
foreach_ptr(target, tlist)
|
|
||||||
{
|
Index *varno_mapping = palloc0(sizeof(Index) * root->simple_rel_array_size);
|
||||||
Index varno = 1;
|
/*
|
||||||
TargetEntry *newTarget = (TargetEntry *) VarNoMutator((Node *)target, &varno);
|
* map the rte index of the table we are scanning to the range table entry as we have
|
||||||
newTargetList = lappend(newTargetList, newTarget);
|
* added it to the query
|
||||||
}
|
*/
|
||||||
|
varno_mapping[scan_relid] = 1;
|
||||||
|
|
||||||
|
/* copy the target list with mapped varno values to reflect the tables we are selecting */
|
||||||
|
newTargetList = (List *) VarNoMutator((Node *) tlist, varno_mapping);
|
||||||
|
|
||||||
q->targetList = newTargetList;
|
q->targetList = newTargetList;
|
||||||
q->jointree = makeNode(FromExpr);
|
q->jointree = makeNode(FromExpr);
|
||||||
|
@ -235,8 +246,7 @@ GetQueryFromPath(List *tlist, RangeTblEntry *rte, List *clauses)
|
||||||
foreach_ptr(rinfo, clauses)
|
foreach_ptr(rinfo, clauses)
|
||||||
{
|
{
|
||||||
Node *clause = (Node *) rinfo->clause;
|
Node *clause = (Node *) rinfo->clause;
|
||||||
Index varno = 1;
|
clause = VarNoMutator(clause, varno_mapping);
|
||||||
clause = VarNoMutator(clause, &varno);
|
|
||||||
quals = lappend(quals, clause);
|
quals = lappend(quals, clause);
|
||||||
}
|
}
|
||||||
q->jointree->quals = (Node *) quals;
|
q->jointree->quals = (Node *) quals;
|
||||||
|
|
Loading…
Reference in New Issue