diff --git a/src/backend/distributed/planner/relation_restriction_equivalence.c b/src/backend/distributed/planner/relation_restriction_equivalence.c index 84bf4d4f8..6b3c9e062 100644 --- a/src/backend/distributed/planner/relation_restriction_equivalence.c +++ b/src/backend/distributed/planner/relation_restriction_equivalence.c @@ -404,11 +404,6 @@ RestrictionEquivalenceForPartitionKeys(PlannerRestrictionContext * { RelationRestrictionContext *restrictionContext = plannerRestrictionContext->relationRestrictionContext; - JoinRestrictionContext *joinRestrictionContext = - plannerRestrictionContext->joinRestrictionContext; - - List *relationRestrictionAttributeEquivalenceList = NIL; - List *joinRestrictionAttributeEquivalenceList = NIL; List *allAttributeEquivalenceList = NIL; uint32 referenceRelationCount = ReferenceRelationCount(restrictionContext); @@ -433,20 +428,43 @@ RestrictionEquivalenceForPartitionKeys(PlannerRestrictionContext * return true; } + allAttributeEquivalenceList = + GenerateAllAttributeEquivalences(plannerRestrictionContext); + + return EquivalenceListContainsRelationsEquality(allAttributeEquivalenceList, + restrictionContext); +} + + +/* + * GenerateAllAttributeEquivalances gets the planner restriction context and returns + * the list of all attribute equivalences based on both join restrictions and relation + * restrictions. + */ +List * +GenerateAllAttributeEquivalences(PlannerRestrictionContext *plannerRestrictionContext) +{ + RelationRestrictionContext *relationRestrictionContext = + plannerRestrictionContext->relationRestrictionContext; + JoinRestrictionContext *joinRestrictionContext = + plannerRestrictionContext->joinRestrictionContext; + + List *relationRestrictionAttributeEquivalenceList = NIL; + List *joinRestrictionAttributeEquivalenceList = NIL; + List *allAttributeEquivalenceList = NIL; + /* reset the equivalence id counter per call to prevent overflows */ attributeEquivalenceId = 1; relationRestrictionAttributeEquivalenceList = - GenerateAttributeEquivalencesForRelationRestrictions(restrictionContext); + GenerateAttributeEquivalencesForRelationRestrictions(relationRestrictionContext); joinRestrictionAttributeEquivalenceList = GenerateAttributeEquivalencesForJoinRestrictions(joinRestrictionContext); - allAttributeEquivalenceList = - list_concat(relationRestrictionAttributeEquivalenceList, - joinRestrictionAttributeEquivalenceList); + allAttributeEquivalenceList = list_concat(relationRestrictionAttributeEquivalenceList, + joinRestrictionAttributeEquivalenceList); - return EquivalenceListContainsRelationsEquality(allAttributeEquivalenceList, - restrictionContext); + return allAttributeEquivalenceList; } diff --git a/src/include/distributed/relation_restriction_equivalence.h b/src/include/distributed/relation_restriction_equivalence.h index 9dd0b8c90..41721dd32 100644 --- a/src/include/distributed/relation_restriction_equivalence.h +++ b/src/include/distributed/relation_restriction_equivalence.h @@ -18,6 +18,8 @@ extern bool ContainsUnionSubquery(Query *queryTree); extern bool RestrictionEquivalenceForPartitionKeys(PlannerRestrictionContext * plannerRestrictionContext); +extern List * GenerateAllAttributeEquivalences(PlannerRestrictionContext * + plannerRestrictionContext); extern uint32 ReferenceRelationCount(RelationRestrictionContext *restrictionContext); extern bool SafeToPushdownUnionSubquery( PlannerRestrictionContext *plannerRestrictionContext);