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
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
rangeTableEntry->joinleftcols = lappend_int(rangeTableEntry->joinleftcols, varId);
|
||||
varId++;
|
||||
}
|
||||
|
||||
List* joinrightcols = NIL;
|
||||
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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue