From ff15d79c97d89dea945310ab1da60554f96915c2 Mon Sep 17 00:00:00 2001 From: Murat Tuncer Date: Mon, 27 Mar 2017 17:33:30 +0300 Subject: [PATCH] Added true clauses to join expressions with no qualifiers --- .../planner/multi_logical_planner.c | 77 ++++++++++++++----- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/src/backend/distributed/planner/multi_logical_planner.c b/src/backend/distributed/planner/multi_logical_planner.c index 141f5f6bc..648fda16e 100644 --- a/src/backend/distributed/planner/multi_logical_planner.c +++ b/src/backend/distributed/planner/multi_logical_planner.c @@ -105,7 +105,7 @@ static MultiNode * ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNo * Local functions forward declarations for subquery pushdown. Note that these * functions will be removed with upcoming subqery changes. */ -static FromExpr * CollapseJoinTree(FromExpr *fromExpr); +static Node * SubqueryJoinTreeFixup(Node *fromExpr); static MultiNode * SubqueryPushdownMultiPlanTree(Query *queryTree, List *subqueryEntryList); static void ErrorIfSubqueryJoin(Query *queryTree); @@ -2044,29 +2044,67 @@ ApplyCartesianProduct(MultiNode *leftNode, MultiNode *rightNode, } -static FromExpr * -CollapseJoinTree(FromExpr *fromExpr) +static Node * +SubqueryJoinTreeFixup(Node *expr) { - FromExpr *result = fromExpr; - - if (list_length(fromExpr->fromlist) == 1) + Node *currentExpr = expr; + if (IsA(currentExpr, FromExpr)) { - Node *firstItem = linitial(fromExpr->fromlist); - if (IsA(firstItem, FromExpr)) + FromExpr *fromExpr = (FromExpr *) expr; + + if (list_length(fromExpr->fromlist) == 1) { - result = CollapseJoinTree((FromExpr *) firstItem); + Node *firstItem = linitial(fromExpr->fromlist); + if (IsA(firstItem, FromExpr)) + { + currentExpr = SubqueryJoinTreeFixup((Node *) firstItem); + } + } + + if (currentExpr != NULL && IsA(currentExpr, FromExpr)) + { + fromExpr = (FromExpr *) currentExpr; + } + + if (fromExpr != NULL && IsA(fromExpr->fromlist, List)) + { + List *fromList = (List *) fromExpr->fromlist; + List *newFromList = NIL; + ListCell *fromListCell = NULL; + + foreach(fromListCell, fromList) + { + Node *fromItem = (Node *) lfirst(fromListCell); + Node *nextItem = fromItem; + nextItem = SubqueryJoinTreeFixup(fromItem); + newFromList = lappend(newFromList, nextItem); + } + fromExpr->fromlist = newFromList; + if (fromExpr->quals != NULL && IsA(fromExpr->quals, List)) + { + fromExpr->quals = (Node *) make_ands_explicit((List *) fromExpr->quals); + } + } + + currentExpr = (Node *) fromExpr; + } + + if (IsA(currentExpr, JoinExpr)) + { + JoinExpr *joinExpr = (JoinExpr *) currentExpr; + joinExpr->larg = SubqueryJoinTreeFixup(joinExpr->larg); + joinExpr->rarg = SubqueryJoinTreeFixup(joinExpr->rarg); + if (joinExpr->quals == NULL) + { + joinExpr->quals = makeBoolConst(true, false); + } + else if (IsA(joinExpr->quals, List)) + { + joinExpr->quals = (Node *) make_ands_explicit((List *) joinExpr->quals); } } - if (result->quals != NULL) - { - if (IsA(result->quals, List)) - { - List *qualsList = (List *) result->quals; - result->quals = (Node *) make_ands_explicit(qualsList); - } - } - return result; + return currentExpr; } @@ -2159,7 +2197,8 @@ SubqueryPushdownMultiPlanTree(Query *queryTree, List *subqueryEntryList) column->varattno = targetNo; } - queryCopy->jointree = CollapseJoinTree(queryCopy->jointree); + queryCopy->jointree = (FromExpr *) SubqueryJoinTreeFixup( + (Node *) queryCopy->jointree); queryCopy->targetList = subqueryTargetEntryList;