From 3cc7717e64a48b5f07d324b6ca38f03af4f755ac Mon Sep 17 00:00:00 2001 From: Sait Talha Nisanci Date: Mon, 1 Jun 2020 11:17:45 +0300 Subject: [PATCH] Fill new join fields for PG>=13 For joins 3 new fields are added, joinleftcols, joinrightcols, and joinmergedcols. We are not interested in joinmergedcols because we always expand the column used in joins. There joinmergedcols is always 0 in our case. For filling joinleftcols and joinrightcols we basically construct the lists with sequences so either list is of the form: [1 2 3 4 .... n] Ruleutils is not completed synced with postgres ruleutils and the most important part is identify_join_columns function change, which now uses joinleftcols and joinrightcols. Commit on postgres side: 9ce77d75c5ab094637cc4a446296dc3be6e3c221 A useful email thread: https://www.postgresql.org/message-id/flat/7115.1577986646%40sss.pgh.pa.us#0ae1d66feeb400013fbaa67a7cccd6ca --- .../distributed/deparser/ruleutils_13.c | 34 ++++++------- .../planner/multi_physical_planner.c | 50 +++++++++---------- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/backend/distributed/deparser/ruleutils_13.c b/src/backend/distributed/deparser/ruleutils_13.c index 2919f64ae..bdd9e7f8e 100644 --- a/src/backend/distributed/deparser/ruleutils_13.c +++ b/src/backend/distributed/deparser/ruleutils_13.c @@ -1561,7 +1561,7 @@ identify_join_columns(JoinExpr *j, RangeTblEntry *jrte, colinfo->leftattnos = (int *) palloc0(numjoincols * sizeof(int)); colinfo->rightattnos = (int *) palloc0(numjoincols * sizeof(int)); - /* + /* * Deconstruct RTE's joinleftcols/joinrightcols into desired format. * Recall that the column(s) merged due to USING are the first column(s) * of the join output. We need not do anything special while scanning @@ -3552,16 +3552,16 @@ get_variable(Var *var, int levelsup, bool istoplevel, deparse_context *context) * backwards compatibility than anything else. But it does have the * advantage of making plans more explicit.) */ - if (var->varnosyn > 0 && dpns->plan == NULL) - { - varno = var->varnosyn; - varattno = var->varattnosyn; - } - else - { + // if (var->varnosyn > 0 && dpns->plan == NULL) + // { + // varno = var->varnosyn; + // varattno = var->varattnosyn; + // } + // else + // { varno = var->varno; varattno = var->varattno; - } + // } /* * Try to find the relevant RTE in this rtable. In a plan tree, it's @@ -3965,16 +3965,16 @@ get_name_for_var_field(Var *var, int fieldno, * parse tree, prefer to use the syntactic referent. Otherwise, fall back * on the semantic referent. (See comments in get_variable().) */ - if (var->varnosyn > 0 && dpns->plan == NULL) - { - varno = var->varnosyn; - varattno = var->varattnosyn; - } - else - { + // if (var->varnosyn > 0 && dpns->plan == NULL) + // { + // varno = var->varnosyn; + // varattno = var->varattnosyn; + // } + // else + // { varno = var->varno; varattno = var->varattno; - } + // } /* * Try to find the relevant RTE in this rtable. In a plan tree, it's * likely that varno is OUTER_VAR or INNER_VAR, in which case we must dig diff --git a/src/backend/distributed/planner/multi_physical_planner.c b/src/backend/distributed/planner/multi_physical_planner.c index c82239db8..874b69bba 100644 --- a/src/backend/distributed/planner/multi_physical_planner.c +++ b/src/backend/distributed/planner/multi_physical_planner.c @@ -130,8 +130,8 @@ static List * QuerySelectClauseList(MultiNode *multiNode); static List * QueryFromList(List *rangeTableList); static Node * QueryJoinTree(MultiNode *multiNode, List *dependentJobList, List **rangeTableList); -static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, int joinMergedCols, - List *leftColumnVars, List *rightColumnVars); +static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, + List *l_colnames, List *r_colnames, List* leftColVars, List* rightColVars); static RangeTblEntry * JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTableList); static int ExtractRangeTableId(Node *node); @@ -1077,11 +1077,6 @@ QueryJoinTree(MultiNode *multiNode, List *dependentJobList, List **rangeTableLis joinExpr->jointype = JOIN_LEFT; } - RangeTblEntry *rangeTableEntry = JoinRangeTableEntry(joinExpr, - dependentJobList, - *rangeTableList); - *rangeTableList = lappend(*rangeTableList, rangeTableEntry); - /* fix the column attributes in ON (...) clauses */ List *columnList = pull_var_clause_default((Node *) joinNode->joinClauseList); foreach(columnCell, columnList) @@ -1097,6 +1092,11 @@ QueryJoinTree(MultiNode *multiNode, List *dependentJobList, List **rangeTableLis /* make AND clauses explicit after fixing them */ joinExpr->quals = (Node *) make_ands_explicit(joinNode->joinClauseList); + RangeTblEntry *rangeTableEntry = JoinRangeTableEntry(joinExpr, + dependentJobList, + *rangeTableList); + *rangeTableList = lappend(*rangeTableList, rangeTableEntry); + return (Node *) joinExpr; } @@ -1230,10 +1230,10 @@ static RangeTblEntry * JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTableList) { RangeTblEntry *rangeTableEntry = makeNode(RangeTblEntry); - List *joinedColumnNames = NIL; - List *joinedColumnVars = NIL; List *leftColumnNames = NIL; List *leftColumnVars = NIL; + List *joinedColumnNames = NIL; + List *joinedColumnVars = NIL; int leftRangeTableId = ExtractRangeTableId(joinExpr->larg); RangeTblEntry *leftRTE = rt_fetch(leftRangeTableId, rangeTableList); List *rightColumnNames = NIL; @@ -1253,40 +1253,38 @@ JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTable &leftColumnNames, &leftColumnVars); ExtractColumns(rightRTE, rightRangeTableId, dependentJobList, &rightColumnNames, &rightColumnVars); - joinedColumnNames = list_concat(joinedColumnNames, leftColumnNames); - joinedColumnVars = list_concat(joinedColumnVars, leftColumnVars); joinedColumnNames = list_concat(joinedColumnNames, rightColumnNames); + joinedColumnVars = list_concat(joinedColumnVars, leftColumnVars); joinedColumnVars = list_concat(joinedColumnVars, rightColumnVars); rangeTableEntry->eref->colnames = joinedColumnNames; rangeTableEntry->joinaliasvars = joinedColumnVars; - SetJoinRelatedColumnsCompat(rangeTableEntry, list_length(joinExpr->usingClause), - leftColumnVars, rightColumnVars); + SetJoinRelatedColumnsCompat(rangeTableEntry, + leftColumnNames, rightColumnNames, leftColumnVars, rightColumnVars); return rangeTableEntry; } -static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, int joinMergedCols, - List *leftColumnVars, List *rightColumnVars) { +static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, + List *leftColumnNames, List *rightColumnNames, List* leftColumnVars, List* rightColumnVars) { + #if PG_VERSION_NUM >= PG_VERSION_13 - rangeTableEntry->joinmergedcols = joinMergedCols; - + /* We don't have any merged columns so set it to 0 */ + rangeTableEntry->joinmergedcols = 0; Var* var = NULL; - List* joinleftcols = NIL; + int varId = 1; foreach_ptr(var, leftColumnVars) { - joinleftcols = lappend_int(joinleftcols, var->varno); - } - - List* joinrightcols = NIL; + rangeTableEntry->joinleftcols = lappend_int(rangeTableEntry->joinleftcols, varId); + varId++; + } + varId = 1; foreach_ptr(var, rightColumnVars) { - joinrightcols = lappend_int(joinrightcols, var->varno); + rangeTableEntry->joinrightcols = lappend_int(rangeTableEntry->joinrightcols, varId); + varId++; } - - rangeTableEntry->joinleftcols = joinleftcols; - rangeTableEntry->joinrightcols = joinrightcols; #endif }