PG16 compatibility - one more outer join check (#7126)

PG16 compatibility - part 11

Check out part 1 42d956888d
part 2 0d503dd5ac
part 3 907d72e60d
part 4 7c6b4ce103
part 5 6056cb2c29
part 6 b36c431abb
part 7 ee3153fe50
part 8 2c50b5f7ff
part 9 b2291374b4
part 10 a2315fdc67
part 11 9fa72545e2

This commit is in the series of PG16 compatibility commits.
We already took care of the majority of necessary outer join checks
in part 4 7c6b4ce103
However, In RelationInfoContainsOnlyRecurringTuples,
we need to add one more check of whether we are dealing
with an outer join RTE using IsRelOptOuterJoin function.
This prevents an outer join crash in sqlancer_failures.sql test.

We expect one more commit of PG compatibility with Citus's current
features are regression tests sanity.
marcocitus/distributed-data-dump
Naisila Puka 2023-08-17 19:07:18 +03:00 committed by GitHub
parent b10320be6f
commit 2d6cf8e79a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 9 deletions

View File

@ -1414,6 +1414,12 @@ RelationInfoContainsOnlyRecurringTuples(PlannerInfo *plannerInfo, Relids relids)
while ((relationId = bms_next_member(relids, relationId)) >= 0)
{
/* outer join RTE check in PG16 */
if (IsRelOptOuterJoin(plannerInfo, relationId))
{
continue;
}
RangeTblEntry *rangeTableEntry = plannerInfo->simple_rte_array[relationId];
if (FindNodeMatchingCheckFunctionInRangeTableList(list_make1(rangeTableEntry),

View File

@ -171,8 +171,6 @@ static bool FindQueryContainingRTEIdentityInternal(Node *node,
static int ParentCountPriorToAppendRel(List *appendRelList, AppendRelInfo *appendRelInfo);
static bool IsVarRelOptOuterJoin(PlannerInfo *root, Var *varToBeAdded);
/*
* AllDistributionKeysInQueryAreEqual returns true if either
@ -1241,7 +1239,7 @@ AddToAttributeEquivalenceClass(AttributeEquivalenceClass *attributeEquivalenceCl
}
/* outer join checks in PG16 */
if (IsVarRelOptOuterJoin(root, varToBeAdded))
if (IsRelOptOuterJoin(root, varToBeAdded->varno))
{
return;
}
@ -1388,19 +1386,19 @@ GetTargetSubquery(PlannerInfo *root, RangeTblEntry *rangeTableEntry, Var *varToB
/*
* IsVarRelOptOuterJoin returns true if the Var to be added
* is an outer join, false otherwise.
* IsRelOptOuterJoin returns true if the RelOpt referenced
* by varNo is an outer join, false otherwise.
*/
static bool
IsVarRelOptOuterJoin(PlannerInfo *root, Var *varToBeAdded)
bool
IsRelOptOuterJoin(PlannerInfo *root, int varNo)
{
#if PG_VERSION_NUM >= PG_VERSION_16
if (root->simple_rel_array_size <= varToBeAdded->varno)
if (root->simple_rel_array_size <= varNo)
{
return true;
}
RelOptInfo *rel = root->simple_rel_array[varToBeAdded->varno];
RelOptInfo *rel = root->simple_rel_array[varNo];
if (rel == NULL)
{
/* must be an outer join */

View File

@ -20,6 +20,7 @@
extern bool AllDistributionKeysInQueryAreEqual(Query *originalQuery,
PlannerRestrictionContext *
plannerRestrictionContext);
extern bool IsRelOptOuterJoin(PlannerInfo *root, int varNo);
extern bool SafeToPushdownUnionSubquery(Query *originalQuery, PlannerRestrictionContext *
plannerRestrictionContext);
extern bool ContainsUnionSubquery(Query *queryTree);