mirror of https://github.com/citusdata/citus.git
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#0ae1d66feeb400013fbaa67a7cccd6capull/3900/head
parent
bc20920252
commit
3cc7717e64
|
@ -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
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
varId = 1;
|
||||||
List* joinrightcols = NIL;
|
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue