Refactor equivalance generation related codes

This commit changes the APIs for restriction generation to make future
changes simpler.
pull/1989/head
Onder Kalaci 2018-01-31 08:51:33 +02:00
parent 2f2d350924
commit c228d8ff3d
2 changed files with 31 additions and 11 deletions

View File

@ -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,
allAttributeEquivalenceList = list_concat(relationRestrictionAttributeEquivalenceList,
joinRestrictionAttributeEquivalenceList);
return EquivalenceListContainsRelationsEquality(allAttributeEquivalenceList,
restrictionContext);
return allAttributeEquivalenceList;
}

View File

@ -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);