remove join restructions

remove_join_rest
Onder Kalaci 2020-10-21 11:02:18 +02:00
parent 5c4c9304ba
commit d7e1cf9e7b
1 changed files with 2 additions and 98 deletions

View File

@ -110,8 +110,6 @@ static void AddRteRelationToAttributeEquivalenceClass(AttributeEquivalenceClass
static Var * GetVarFromAssignedParam(List *outerPlanParamsList, Param *plannerParam,
PlannerInfo **rootContainingVar);
static Var * SearchPlannerParamList(List *plannerParamList, Param *plannerParam);
static List * GenerateAttributeEquivalencesForJoinRestrictions(JoinRestrictionContext
*joinRestrictionContext);
static bool AttributeClassContainsAttributeClassMember(AttributeEquivalenceClassMember *
inputMember,
AttributeEquivalenceClass *
@ -340,12 +338,8 @@ SafeToPushdownUnionSubquery(PlannerRestrictionContext *plannerRestrictionContext
*/
List *relationRestrictionAttributeEquivalenceList =
GenerateAttributeEquivalencesForRelationRestrictions(restrictionContext);
List *joinRestrictionAttributeEquivalenceList =
GenerateAttributeEquivalencesForJoinRestrictions(joinRestrictionContext);
List *allAttributeEquivalenceList =
list_concat(relationRestrictionAttributeEquivalenceList,
joinRestrictionAttributeEquivalenceList);
List *allAttributeEquivalenceList =relationRestrictionAttributeEquivalenceList;
allAttributeEquivalenceList = lappend(allAttributeEquivalenceList,
attributeEquivalence);
@ -576,14 +570,9 @@ GenerateAllAttributeEquivalences(PlannerRestrictionContext *plannerRestrictionCo
List *relationRestrictionAttributeEquivalenceList =
GenerateAttributeEquivalencesForRelationRestrictions(relationRestrictionContext);
List *joinRestrictionAttributeEquivalenceList =
GenerateAttributeEquivalencesForJoinRestrictions(joinRestrictionContext);
List *allAttributeEquivalenceList = list_concat(
relationRestrictionAttributeEquivalenceList,
joinRestrictionAttributeEquivalenceList);
return allAttributeEquivalenceList;
return relationRestrictionAttributeEquivalenceList;
}
@ -1070,91 +1059,6 @@ ListConcatUniqueAttributeClassMemberLists(AttributeEquivalenceClass **firstClass
}
/*
* GenerateAttributeEquivalencesForJoinRestrictions gets a join restriction
* context and returns a list of AttrributeEquivalenceClass.
*
* The algorithm followed can be summarized as below:
*
* - Per join restriction
* - Per RestrictInfo of the join restriction
* - Check whether the join restriction is in the form of (Var1 = Var2)
* - Create an AttributeEquivalenceClass
* - Add both Var1 and Var2 to the AttributeEquivalenceClass
*/
static List *
GenerateAttributeEquivalencesForJoinRestrictions(JoinRestrictionContext *
joinRestrictionContext)
{
List *attributeEquivalenceList = NIL;
ListCell *joinRestrictionCell = NULL;
if (joinRestrictionContext == NULL)
{
return attributeEquivalenceList;
}
foreach(joinRestrictionCell, joinRestrictionContext->joinRestrictionList)
{
JoinRestriction *joinRestriction =
(JoinRestriction *) lfirst(joinRestrictionCell);
ListCell *restrictionInfoList = NULL;
foreach(restrictionInfoList, joinRestriction->joinRestrictInfoList)
{
RestrictInfo *rinfo = (RestrictInfo *) lfirst(restrictionInfoList);
Expr *restrictionClause = rinfo->clause;
if (!IsA(restrictionClause, OpExpr))
{
continue;
}
OpExpr *restrictionOpExpr = (OpExpr *) restrictionClause;
if (list_length(restrictionOpExpr->args) != 2)
{
continue;
}
if (!OperatorImplementsEquality(restrictionOpExpr->opno))
{
continue;
}
Node *leftNode = linitial(restrictionOpExpr->args);
Node *rightNode = lsecond(restrictionOpExpr->args);
/* we also don't want implicit coercions */
Expr *strippedLeftExpr = (Expr *) strip_implicit_coercions((Node *) leftNode);
Expr *strippedRightExpr = (Expr *) strip_implicit_coercions(
(Node *) rightNode);
if (!(IsA(strippedLeftExpr, Var) && IsA(strippedRightExpr, Var)))
{
continue;
}
Var *leftVar = (Var *) strippedLeftExpr;
Var *rightVar = (Var *) strippedRightExpr;
AttributeEquivalenceClass *attributeEquivalence = palloc0(
sizeof(AttributeEquivalenceClass));
attributeEquivalence->equivalenceId = attributeEquivalenceId++;
AddToAttributeEquivalenceClass(&attributeEquivalence,
joinRestriction->plannerInfo, leftVar);
AddToAttributeEquivalenceClass(&attributeEquivalence,
joinRestriction->plannerInfo, rightVar);
attributeEquivalenceList =
AddAttributeClassToAttributeClassList(attributeEquivalenceList,
attributeEquivalence);
}
}
return attributeEquivalenceList;
}
/*
* AddToAttributeEquivalenceClass is a key function for building the attribute