diff --git a/src/backend/distributed/planner/query_pushdown_planning.c b/src/backend/distributed/planner/query_pushdown_planning.c index 200509974..e18a0036b 100644 --- a/src/backend/distributed/planner/query_pushdown_planning.c +++ b/src/backend/distributed/planner/query_pushdown_planning.c @@ -1416,6 +1416,14 @@ RelationInfoContainsOnlyRecurringTuples(PlannerInfo *plannerInfo, Relids relids) { RangeTblEntry *rangeTableEntry = plannerInfo->simple_rte_array[relationId]; + if (IsRelOptOuterJoin(plannerInfo, relationId)) + { + /* + * TODO: add comment + */ + continue; + } + if (FindNodeMatchingCheckFunctionInRangeTableList(list_make1(rangeTableEntry), IsDistributedTableRTE)) { diff --git a/src/backend/distributed/planner/relation_restriction_equivalence.c b/src/backend/distributed/planner/relation_restriction_equivalence.c index af2443b19..add61d99f 100644 --- a/src/backend/distributed/planner/relation_restriction_equivalence.c +++ b/src/backend/distributed/planner/relation_restriction_equivalence.c @@ -171,7 +171,6 @@ static bool FindQueryContainingRTEIdentityInternal(Node *node, static int ParentCountPriorToAppendRel(List *appendRelList, AppendRelInfo *appendRelInfo); -static bool IsVarRelOptOuterJoin(PlannerInfo *root, Var *varToBeAdded); /* @@ -1241,7 +1240,7 @@ AddToAttributeEquivalenceClass(AttributeEquivalenceClass *attributeEquivalenceCl } /* outer join checks in PG16 */ - if (IsVarRelOptOuterJoin(root, varToBeAdded)) + if (IsRelOptOuterJoin(root, varToBeAdded->varno)) { return; } @@ -1391,16 +1390,16 @@ GetTargetSubquery(PlannerInfo *root, RangeTblEntry *rangeTableEntry, Var *varToB * IsVarRelOptOuterJoin returns true if the Var to be added * 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 */ diff --git a/src/include/distributed/relation_restriction_equivalence.h b/src/include/distributed/relation_restriction_equivalence.h index 42b2b801f..f3a7e2b94 100644 --- a/src/include/distributed/relation_restriction_equivalence.h +++ b/src/include/distributed/relation_restriction_equivalence.h @@ -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);