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
pull/3900/head
Sait Talha Nisanci 2020-06-01 11:17:45 +03:00
parent bc20920252
commit 3cc7717e64
2 changed files with 41 additions and 43 deletions

View File

@ -1561,7 +1561,7 @@ identify_join_columns(JoinExpr *j, RangeTblEntry *jrte,
colinfo->leftattnos = (int *) palloc0(numjoincols * sizeof(int)); colinfo->leftattnos = (int *) palloc0(numjoincols * sizeof(int));
colinfo->rightattnos = (int *) palloc0(numjoincols * sizeof(int)); colinfo->rightattnos = (int *) palloc0(numjoincols * sizeof(int));
/* /*
* Deconstruct RTE's joinleftcols/joinrightcols into desired format. * Deconstruct RTE's joinleftcols/joinrightcols into desired format.
* Recall that the column(s) merged due to USING are the first column(s) * 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 * 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 * backwards compatibility than anything else. But it does have the
* advantage of making plans more explicit.) * advantage of making plans more explicit.)
*/ */
if (var->varnosyn > 0 && dpns->plan == NULL) // if (var->varnosyn > 0 && dpns->plan == NULL)
{ // {
varno = var->varnosyn; // varno = var->varnosyn;
varattno = var->varattnosyn; // varattno = var->varattnosyn;
} // }
else // else
{ // {
varno = var->varno; varno = var->varno;
varattno = var->varattno; varattno = var->varattno;
} // }
/* /*
* Try to find the relevant RTE in this rtable. In a plan tree, it's * 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 * parse tree, prefer to use the syntactic referent. Otherwise, fall back
* on the semantic referent. (See comments in get_variable().) * on the semantic referent. (See comments in get_variable().)
*/ */
if (var->varnosyn > 0 && dpns->plan == NULL) // if (var->varnosyn > 0 && dpns->plan == NULL)
{ // {
varno = var->varnosyn; // varno = var->varnosyn;
varattno = var->varattnosyn; // varattno = var->varattnosyn;
} // }
else // else
{ // {
varno = var->varno; varno = var->varno;
varattno = var->varattno; varattno = var->varattno;
} // }
/* /*
* Try to find the relevant RTE in this rtable. In a plan tree, it's * 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 * likely that varno is OUTER_VAR or INNER_VAR, in which case we must dig

View File

@ -130,8 +130,8 @@ static List * QuerySelectClauseList(MultiNode *multiNode);
static List * QueryFromList(List *rangeTableList); static List * QueryFromList(List *rangeTableList);
static Node * QueryJoinTree(MultiNode *multiNode, List *dependentJobList, static Node * QueryJoinTree(MultiNode *multiNode, List *dependentJobList,
List **rangeTableList); List **rangeTableList);
static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, int joinMergedCols, static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry,
List *leftColumnVars, List *rightColumnVars); List *l_colnames, List *r_colnames, List* leftColVars, List* rightColVars);
static RangeTblEntry * JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, static RangeTblEntry * JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList,
List *rangeTableList); List *rangeTableList);
static int ExtractRangeTableId(Node *node); static int ExtractRangeTableId(Node *node);
@ -1077,11 +1077,6 @@ QueryJoinTree(MultiNode *multiNode, List *dependentJobList, List **rangeTableLis
joinExpr->jointype = JOIN_LEFT; joinExpr->jointype = JOIN_LEFT;
} }
RangeTblEntry *rangeTableEntry = JoinRangeTableEntry(joinExpr,
dependentJobList,
*rangeTableList);
*rangeTableList = lappend(*rangeTableList, rangeTableEntry);
/* fix the column attributes in ON (...) clauses */ /* fix the column attributes in ON (...) clauses */
List *columnList = pull_var_clause_default((Node *) joinNode->joinClauseList); List *columnList = pull_var_clause_default((Node *) joinNode->joinClauseList);
foreach(columnCell, columnList) foreach(columnCell, columnList)
@ -1097,6 +1092,11 @@ QueryJoinTree(MultiNode *multiNode, List *dependentJobList, List **rangeTableLis
/* make AND clauses explicit after fixing them */ /* make AND clauses explicit after fixing them */
joinExpr->quals = (Node *) make_ands_explicit(joinNode->joinClauseList); joinExpr->quals = (Node *) make_ands_explicit(joinNode->joinClauseList);
RangeTblEntry *rangeTableEntry = JoinRangeTableEntry(joinExpr,
dependentJobList,
*rangeTableList);
*rangeTableList = lappend(*rangeTableList, rangeTableEntry);
return (Node *) joinExpr; return (Node *) joinExpr;
} }
@ -1230,10 +1230,10 @@ static RangeTblEntry *
JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTableList) JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTableList)
{ {
RangeTblEntry *rangeTableEntry = makeNode(RangeTblEntry); RangeTblEntry *rangeTableEntry = makeNode(RangeTblEntry);
List *joinedColumnNames = NIL;
List *joinedColumnVars = NIL;
List *leftColumnNames = NIL; List *leftColumnNames = NIL;
List *leftColumnVars = NIL; List *leftColumnVars = NIL;
List *joinedColumnNames = NIL;
List *joinedColumnVars = NIL;
int leftRangeTableId = ExtractRangeTableId(joinExpr->larg); int leftRangeTableId = ExtractRangeTableId(joinExpr->larg);
RangeTblEntry *leftRTE = rt_fetch(leftRangeTableId, rangeTableList); RangeTblEntry *leftRTE = rt_fetch(leftRangeTableId, rangeTableList);
List *rightColumnNames = NIL; List *rightColumnNames = NIL;
@ -1253,40 +1253,38 @@ JoinRangeTableEntry(JoinExpr *joinExpr, List *dependentJobList, List *rangeTable
&leftColumnNames, &leftColumnVars); &leftColumnNames, &leftColumnVars);
ExtractColumns(rightRTE, rightRangeTableId, dependentJobList, ExtractColumns(rightRTE, rightRangeTableId, dependentJobList,
&rightColumnNames, &rightColumnVars); &rightColumnNames, &rightColumnVars);
joinedColumnNames = list_concat(joinedColumnNames, leftColumnNames); joinedColumnNames = list_concat(joinedColumnNames, leftColumnNames);
joinedColumnVars = list_concat(joinedColumnVars, leftColumnVars);
joinedColumnNames = list_concat(joinedColumnNames, rightColumnNames); joinedColumnNames = list_concat(joinedColumnNames, rightColumnNames);
joinedColumnVars = list_concat(joinedColumnVars, leftColumnVars);
joinedColumnVars = list_concat(joinedColumnVars, rightColumnVars); joinedColumnVars = list_concat(joinedColumnVars, rightColumnVars);
rangeTableEntry->eref->colnames = joinedColumnNames; rangeTableEntry->eref->colnames = joinedColumnNames;
rangeTableEntry->joinaliasvars = joinedColumnVars; rangeTableEntry->joinaliasvars = joinedColumnVars;
SetJoinRelatedColumnsCompat(rangeTableEntry, list_length(joinExpr->usingClause), SetJoinRelatedColumnsCompat(rangeTableEntry,
leftColumnVars, rightColumnVars); leftColumnNames, rightColumnNames, leftColumnVars, rightColumnVars);
return rangeTableEntry; return rangeTableEntry;
} }
static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry, int joinMergedCols, static void SetJoinRelatedColumnsCompat(RangeTblEntry *rangeTableEntry,
List *leftColumnVars, List *rightColumnVars) { List *leftColumnNames, List *rightColumnNames, List* leftColumnVars, List* rightColumnVars) {
#if PG_VERSION_NUM >= PG_VERSION_13 #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; Var* var = NULL;
List* joinleftcols = NIL; int varId = 1;
foreach_ptr(var, leftColumnVars) { foreach_ptr(var, leftColumnVars) {
joinleftcols = lappend_int(joinleftcols, var->varno); rangeTableEntry->joinleftcols = lappend_int(rangeTableEntry->joinleftcols, varId);
} varId++;
}
List* joinrightcols = NIL; varId = 1;
foreach_ptr(var, rightColumnVars) { 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 #endif
} }