union_all_join
Onder Kalaci 2021-02-15 18:50:59 +01:00
parent 6c903cd6f7
commit 68bda043c9
2 changed files with 7 additions and 85 deletions

View File

@ -110,7 +110,6 @@ struct RecursivePlanningContextInternal
int level;
uint64 planId;
bool allDistributionKeysInQueryAreEqual; /* used for some optimizations */
bool setOperationJoinWithAnyRTE;
List *subPlanList;
PlannerRestrictionContext *plannerRestrictionContext;
};
@ -142,7 +141,6 @@ typedef struct VarLevelsUpWalkerContext
static DeferredErrorMessage * RecursivelyPlanSubqueriesAndCTEs(Query *query,
RecursivePlanningContext *
context);
static bool ContainsSetOperationJoinRTE(JoinRestrictionContext *joinRestrictionContext);
static bool ShouldRecursivelyPlanNonColocatedSubqueries(Query *subquery,
RecursivePlanningContext *
context);
@ -222,10 +220,6 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
context.subPlanList = NIL;
context.plannerRestrictionContext = plannerRestrictionContext;
context.setOperationJoinWithAnyRTE =
ContainsSetOperationJoinRTE(plannerRestrictionContext->joinRestrictionContext);
/*
* Calculating the distribution key equality upfront is a trade-off for us.
*
@ -238,12 +232,8 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
* calculating this wouldn't help us at all, we should individually check
* each each subquery and subquery joins among subqueries.
*/
if (!context.setOperationJoinWithAnyRTE)
{
context.allDistributionKeysInQueryAreEqual =
AllDistributionKeysInQueryAreEqual(originalQuery, plannerRestrictionContext);
}
context.allDistributionKeysInQueryAreEqual =
AllDistributionKeysInQueryAreEqual(originalQuery, plannerRestrictionContext);
DeferredErrorMessage *error = RecursivelyPlanSubqueriesAndCTEs(originalQuery,
&context);
@ -269,74 +259,6 @@ GenerateSubplansForSubqueriesAndCTEs(uint64 planId, Query *originalQuery,
}
static bool
ContainsSetOperationJoinRTE(JoinRestrictionContext *joinRestrictionContext)
{
List *attributeEquivalenceList = NIL;
ListCell *joinRestrictionCell = NULL;
if (joinRestrictionContext == NULL)
{
return false;
}
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;
}
PlannerInfo *root = joinRestriction->plannerInfo;
Var *leftVar = (Var *) strippedLeftExpr;
RangeTblEntry *leftRangeTblEntry = root->simple_rte_array[leftVar->varno];
Var *rightVar = (Var *) strippedRightExpr;
RangeTblEntry *rightRangeTblEntry = root->simple_rte_array[rightVar->varno];
if (leftRangeTblEntry->inh || rightRangeTblEntry->inh)
{
return true;
}
}
}
return false;
}
/*
* RecursivelyPlanSubqueriesAndCTEs finds subqueries and CTEs that cannot be pushed down to
* workers directly and instead plans them by recursively calling the planner and
@ -1088,11 +1010,6 @@ ShouldRecursivelyPlanSetOperation(Query *query, RecursivePlanningContext *contex
return true;
}
if (context->setOperationJoinWithAnyRTE)
{
return true;
}
if (DeferErrorIfUnsupportedUnionQuery(query) != NULL)
{
/*

View File

@ -1362,6 +1362,11 @@ AddUnionAllSetOperationsToAttributeEquivalenceClass(AttributeEquivalenceClass **
List *appendRelList = root->append_rel_list;
ListCell *appendRelCell = NULL;
if (root->simple_rel_array_size != 1)
{
return;
}
/* iterate on the queries that are part of UNION ALL subqueries */
foreach(appendRelCell, appendRelList)
{