From 68bda043c909200fc672860827b56f37135fac8a Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Mon, 15 Feb 2021 18:50:59 +0100 Subject: [PATCH] WIP --- .../distributed/planner/recursive_planning.c | 87 +------------------ .../relation_restriction_equivalence.c | 5 ++ 2 files changed, 7 insertions(+), 85 deletions(-) diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index 63aeb3a37..bb8591a8c 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -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) { /* diff --git a/src/backend/distributed/planner/relation_restriction_equivalence.c b/src/backend/distributed/planner/relation_restriction_equivalence.c index 0633f709f..2c32135c1 100644 --- a/src/backend/distributed/planner/relation_restriction_equivalence.c +++ b/src/backend/distributed/planner/relation_restriction_equivalence.c @@ -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) {