More complex joins

prototype_de_correlate_subqueries
Onder Kalaci 2018-05-29 10:34:19 +03:00
parent 21bfb7cf1d
commit 684d34134f
1 changed files with 19 additions and 11 deletions

View File

@ -740,6 +740,7 @@ ExamineSublinks(Query *query, Node *node, RecursivePlanningContext *context)
} }
correlatedVar = linitial(correlatedVarList); correlatedVar = linitial(correlatedVarList);
int varNoOfCorrelatedVar = correlatedVar->varno;
correlationExpr = correlationExpr =
ColumnMatchExpressionAtTopLevelConjunction( ColumnMatchExpressionAtTopLevelConjunction(
@ -800,6 +801,7 @@ ExamineSublinks(Query *query, Node *node, RecursivePlanningContext *context)
rteSubquery->rtekind = RTE_SUBQUERY; rteSubquery->rtekind = RTE_SUBQUERY;
rteSubquery->subquery = subselect; rteSubquery->subquery = subselect;
rteSubquery->lateral = false; rteSubquery->lateral = false;
rteSubquery->inFromCl = true;
rteSubquery->alias = makeAlias("new_sub_1", list_make2(makeString("Onder_col"), makeString("onder_2_col"))); rteSubquery->alias = makeAlias("new_sub_1", list_make2(makeString("Onder_col"), makeString("onder_2_col")));
rteSubquery->eref = makeAlias("new_sub_1",list_make2(makeString("Onder_col"), makeString("onder_2_col"))); rteSubquery->eref = makeAlias("new_sub_1",list_make2(makeString("Onder_col"), makeString("onder_2_col")));
@ -847,18 +849,22 @@ ExamineSublinks(Query *query, Node *node, RecursivePlanningContext *context)
result->rarg = subqueryRteRef; result->rarg = subqueryRteRef;
if (list_length(query->jointree->fromlist) == 1) RangeTblRef *otherRef = makeNode(RangeTblRef);
otherRef->rtindex = varNoOfCorrelatedVar;
result->larg = otherRef;
//if (list_length(query->jointree->fromlist) == 1)
{ {
result->larg = (Node *) linitial(query->jointree->fromlist); //result->larg = (Node *) linitial(query->jointree->fromlist);
} }
else //else
{ {
result->larg = (Node *) query->jointree; //result->larg = (Node *) query->jointree;
} }
result->usingClause = NIL; result->usingClause = NIL;
result->quals = equaltyOp; //result->quals = equaltyOp;
TargetEntry *existingAggrageteColumn = copyObject(list_nth(subselect->targetList, 0)); TargetEntry *existingAggrageteColumn = copyObject(list_nth(subselect->targetList, 0));
@ -874,17 +880,18 @@ ExamineSublinks(Query *query, Node *node, RecursivePlanningContext *context)
existingGroupByColumn->vartypmod = ((Var *)addedGroupByTargetEntry->expr)->vartypmod; existingGroupByColumn->vartypmod = ((Var *)addedGroupByTargetEntry->expr)->vartypmod;
existingGroupByColumn->varcollid = ((Var *)addedGroupByTargetEntry->expr)->varcollid; existingGroupByColumn->varcollid = ((Var *)addedGroupByTargetEntry->expr)->varcollid;
OpExpr *otherOperator = MakeOpExpressionEquality(topLevelOpClaueVar, existingGroupByColumn, OperatorBtreeStrategy(topLevelOpExpr->opno)); OpExpr *otherOperator = MakeOpExpressionEquality(topLevelOpClaueVar, existingGroupByColumn, OperatorBtreeStrategy(topLevelOpExpr->opno));
result->quals = make_and_qual(result->quals, otherOperator); //result->quals = make_and_qual(result->quals, otherOperator);
result->alias = NULL; result->alias = NULL;
result->rtindex = list_length(query->rtable) + 1; result->rtindex = list_length(query->rtable) + 1;
query->jointree = makeFromExpr(list_make1(result), NULL); List *fromList = lappend(query->jointree->fromlist, subqueryRteRef);
query->jointree = makeFromExpr(fromList, make_and_qual(make_and_qual(equaltyOp, otherOperator), query->jointree->quals));
expandRTE(linitial(query->rtable), 1, 0, -1, false, elog(INFO, "%s", nodeToString(query->jointree ));
expandRTE(rt_fetch(varNoOfCorrelatedVar, query->rtable), varNoOfCorrelatedVar, 0, -1, false,
&leftColumnNames, &leftColumnVars); &leftColumnNames, &leftColumnVars);
joinedColumnNames = list_concat(joinedColumnNames, leftColumnNames); joinedColumnNames = list_concat(joinedColumnNames, leftColumnNames);
@ -902,11 +909,12 @@ ExamineSublinks(Query *query, Node *node, RecursivePlanningContext *context)
rteJoin->subquery = NULL; rteJoin->subquery = NULL;
rteJoin->jointype = JOIN_INNER; rteJoin->jointype = JOIN_INNER;
rteJoin->joinaliasvars = joinedColumnVars; rteJoin->joinaliasvars = joinedColumnVars;
rteJoin->inFromCl = true;
rteJoin->eref = makeAlias("unnamed_citus_join", joinedColumnNames); rteJoin->eref = makeAlias("unnamed_citus_join", joinedColumnNames);
rteJoin->alias = makeAlias("unnamed_citus_join", joinedColumnNames); rteJoin->alias = makeAlias("unnamed_citus_join", joinedColumnNames);
query->rtable = lappend(query->rtable, rteJoin); //query->rtable = lappend(query->rtable, rteJoin);
StringInfo str = makeStringInfo(); StringInfo str = makeStringInfo();