From ff4f3b2f3cadf76056e10d157a6b601e7c6eaa70 Mon Sep 17 00:00:00 2001 From: Sait Talha Nisanci Date: Tue, 1 Dec 2020 18:53:07 +0300 Subject: [PATCH] Use PlannerRestrictionContext instead of RecursivePlannerContext --- .../planner/local_distributed_join_planner.c | 44 ++++++++----------- .../planner/multi_router_planner.c | 9 ++-- .../distributed/planner/recursive_planning.c | 3 +- 3 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/backend/distributed/planner/local_distributed_join_planner.c b/src/backend/distributed/planner/local_distributed_join_planner.c index c5206d0a8..a9c4b64e6 100644 --- a/src/backend/distributed/planner/local_distributed_join_planner.c +++ b/src/backend/distributed/planner/local_distributed_join_planner.c @@ -71,27 +71,22 @@ typedef struct ConversionCandidates static Oid GetResultRelationId(Query *query); static bool ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList, Oid resultRelationId, - RecursivePlanningContext *context); + PlannerRestrictionContext *plannerRestrictionContext); static bool HasUniqueFilter(RangeTblEntry *distRTE, List *distRTERestrictionList, List *requiredAttrNumbersForDistRTE); static bool ShouldConvertDistributedTable(FromExpr *joinTree, RangeTableEntryDetails *distRTEContext); static List * RequiredAttrNumbersForRelation(RangeTblEntry *relationRte, - RecursivePlanningContext *planningContext); + PlannerRestrictionContext *plannerRestrictionContext); static ConversionCandidates * CreateConversionCandidates( - RecursivePlanningContext *context, + PlannerRestrictionContext *plannerRestrictionContext, List *rangeTableList, Oid resultRelationId); static void GetAllUniqueIndexes(Form_pg_index indexForm, List **uniqueIndexes); static RangeTableEntryDetails * GetNextRTEToConvertToSubquery(FromExpr *joinTree, - ConversionCandidates - * - conversionCandidates, - PlannerRestrictionContext - * - plannerRestrictionContext, - Oid - resultRelationId); + ConversionCandidates *conversionCandidates, + PlannerRestrictionContext* plannerRestrictionContext, + Oid resultRelationId); static void GetRangeTableEntriesFromJoinTree(Node *joinNode, List *rangeTableList, List **joinRangeTableEntries); static void RemoveFromConversionCandidates(ConversionCandidates *conversionCandidates, Oid @@ -106,13 +101,18 @@ void ConvertUnplannableTableJoinsToSubqueries(Query *query, RecursivePlanningContext *context) { + PlannerRestrictionContext* plannerRestrictionContext = context->plannerRestrictionContext; + List *rangeTableList = NIL; GetRangeTableEntriesFromJoinTree((Node *) query->jointree, query->rtable, &rangeTableList); Oid resultRelationId = GetResultRelationId(query); + if (!ShouldConvertLocalTableJoinsToSubqueries(query, rangeTableList, resultRelationId, plannerRestrictionContext)) { + return; + } ConversionCandidates *conversionCandidates = - CreateConversionCandidates(context, rangeTableList, resultRelationId); + CreateConversionCandidates(plannerRestrictionContext, rangeTableList, resultRelationId); RangeTableEntryDetails *rangeTableEntryDetails = GetNextRTEToConvertToSubquery(query->jointree, conversionCandidates, @@ -120,7 +120,7 @@ ConvertUnplannableTableJoinsToSubqueries(Query *query, resultRelationId); while (ShouldConvertLocalTableJoinsToSubqueries(query, rangeTableList, - resultRelationId, context)) + resultRelationId, plannerRestrictionContext)) { ReplaceRTERelationWithRteSubquery( rangeTableEntryDetails->rangeTableEntry, @@ -289,7 +289,7 @@ RemoveFromConversionCandidates(ConversionCandidates *conversionCandidates, Oid r static bool ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList, Oid resultRelationId, - RecursivePlanningContext *context) + PlannerRestrictionContext *plannerRestrictionContext) { if (LocalTableJoinPolicy == LOCAL_JOIN_POLICY_NEVER) { @@ -301,8 +301,7 @@ ShouldConvertLocalTableJoinsToSubqueries(Query *query, List *rangeTableList, return false; } - PlannerRestrictionContext *plannerRestrictionContext = - FilterPlannerRestrictionForQuery(context->plannerRestrictionContext, query); + plannerRestrictionContext = FilterPlannerRestrictionForQuery(plannerRestrictionContext, query); if (IsRouterPlannable(query, plannerRestrictionContext)) { return false; @@ -403,11 +402,8 @@ GetAllUniqueIndexes(Form_pg_index indexForm, List **uniqueIndexes) */ static List * RequiredAttrNumbersForRelation(RangeTblEntry *relationRte, - RecursivePlanningContext *planningContext) + PlannerRestrictionContext *plannerRestrictionContext) { - PlannerRestrictionContext *plannerRestrictionContext = - planningContext->plannerRestrictionContext; - /* TODO: Get rid of this hack, find relation restriction information directly */ PlannerRestrictionContext *filteredPlannerRestrictionContext = FilterPlannerRestrictionForQuery(plannerRestrictionContext, @@ -454,7 +450,7 @@ RequiredAttrNumbersForRelation(RangeTblEntry *relationRte, * be converted to a subquery so that citus planners can work. */ static ConversionCandidates * -CreateConversionCandidates(RecursivePlanningContext *context, +CreateConversionCandidates(PlannerRestrictionContext *plannerRestrictionContext, List *rangeTableList, Oid resultRelationId) { ConversionCandidates *conversionCandidates = palloc0( @@ -488,11 +484,9 @@ CreateConversionCandidates(RecursivePlanningContext *context, rangeTableEntryDetails->rangeTableEntry = rangeTableEntry; rangeTableEntryDetails->rteIndex = rteIndex; rangeTableEntryDetails->restrictionList = GetRestrictInfoListForRelation( - rangeTableEntry, - context-> - plannerRestrictionContext, 1); + rangeTableEntry, plannerRestrictionContext, 1); rangeTableEntryDetails->requiredAttributeNumbers = RequiredAttrNumbersForRelation( - rangeTableEntry, context); + rangeTableEntry, plannerRestrictionContext); if (referenceOrDistributedTable) { diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index c8d71619e..406333f8e 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -221,8 +221,9 @@ CreateModifyPlan(Query *originalQuery, Query *query, distributedPlan->modLevel = RowModifyLevelForQuery(query); distributedPlan->planningError = ModifyQuerySupported(query, originalQuery, - multiShardQuery, - plannerRestrictionContext); + multiShardQuery, + plannerRestrictionContext); + if (distributedPlan->planningError != NULL) { return distributedPlan; @@ -550,10 +551,6 @@ ModifyPartialQuerySupported(Query *queryTree, bool multiShardQuery, Oid resultRelationId = ModifyQueryResultRelationId(queryTree); *distributedTableIdOutput = resultRelationId; - if (ContainsTableToBeConvertedToSubquery(queryTree->rtable, resultRelationId)) - { - return deferredError; - } Var *partitionColumn = NULL; diff --git a/src/backend/distributed/planner/recursive_planning.c b/src/backend/distributed/planner/recursive_planning.c index 63c9d85e0..bd372d01b 100644 --- a/src/backend/distributed/planner/recursive_planning.c +++ b/src/backend/distributed/planner/recursive_planning.c @@ -1542,8 +1542,7 @@ ContainsLocalTableSubqueryJoin(List *rangeTableList, Oid resultRelationId) continue; } - if (!IsCitusTable(rangeTableEntry->relid) && rangeTableEntry->relid != - resultRelationId) + if (!IsCitusTable(rangeTableEntry->relid) && rangeTableEntry->relid != resultRelationId) { containsLocalTable = true; }