From 5a1e7527260f79df7ff8a8492c42be18e08d7448 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Mon, 23 Dec 2019 18:44:29 +0100 Subject: [PATCH] Apply feedback - add fastPath field to plan --- .../distributed/planner/distributed_planner.c | 20 ++++++++----------- .../planner/multi_router_planner.c | 3 +++ .../distributed/utils/citus_outfuncs.c | 1 + .../distributed/utils/citus_readfuncs.c | 1 + .../distributed/multi_physical_planner.h | 6 ++++++ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/backend/distributed/planner/distributed_planner.c b/src/backend/distributed/planner/distributed_planner.c index ff9305010..7d3752e96 100644 --- a/src/backend/distributed/planner/distributed_planner.c +++ b/src/backend/distributed/planner/distributed_planner.c @@ -79,8 +79,7 @@ static DistributedPlan * CreateDistributedPlan(uint64 planId, Query *originalQue bool hasUnresolvedParams, PlannerRestrictionContext * plannerRestrictionContext); -static void FinalizeDistributedPlan(DistributedPlan *plan, Query *originalQuery, - bool fastPathRouterQuery); +static void FinalizeDistributedPlan(DistributedPlan *plan, Query *originalQuery); static void RecordSubPlansUsedInPlan(DistributedPlan *plan, Query *originalQuery); static DeferredErrorMessage * DeferErrorIfPartitionTableNotSingleReplicated(Oid relationId); @@ -685,8 +684,6 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi { DistributedPlan *distributedPlan = NULL; bool hasCtes = originalQuery->cteList != NIL; - bool fastPathRouterQuery = - plannerRestrictionContext->fastPathRestrictionContext->fastPathRouterQuery; if (IsModifyCommand(originalQuery)) { @@ -722,7 +719,7 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi if (distributedPlan->planningError == NULL) { - FinalizeDistributedPlan(distributedPlan, originalQuery, fastPathRouterQuery); + FinalizeDistributedPlan(distributedPlan, originalQuery); return distributedPlan; } @@ -744,7 +741,7 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi plannerRestrictionContext); if (distributedPlan->planningError == NULL) { - FinalizeDistributedPlan(distributedPlan, originalQuery, fastPathRouterQuery); + FinalizeDistributedPlan(distributedPlan, originalQuery); return distributedPlan; } @@ -838,7 +835,7 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi plannerRestrictionContext); distributedPlan->subPlanList = subPlanList; - FinalizeDistributedPlan(distributedPlan, originalQuery, fastPathRouterQuery); + FinalizeDistributedPlan(distributedPlan, originalQuery); return distributedPlan; } @@ -850,7 +847,7 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi */ if (IsModifyCommand(originalQuery)) { - FinalizeDistributedPlan(distributedPlan, originalQuery, fastPathRouterQuery); + FinalizeDistributedPlan(distributedPlan, originalQuery); return distributedPlan; } @@ -883,7 +880,7 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi /* distributed plan currently should always succeed or error out */ Assert(distributedPlan && distributedPlan->planningError == NULL); - FinalizeDistributedPlan(distributedPlan, originalQuery, fastPathRouterQuery); + FinalizeDistributedPlan(distributedPlan, originalQuery); return distributedPlan; } @@ -894,14 +891,13 @@ CreateDistributedPlan(uint64 planId, Query *originalQuery, Query *query, ParamLi * currently only implements some optimizations for intermediate result(s) pruning. */ static void -FinalizeDistributedPlan(DistributedPlan *plan, Query *originalQuery, - bool fastPathRouterQuery) +FinalizeDistributedPlan(DistributedPlan *plan, Query *originalQuery) { /* * Fast path queries, we cannot have any subplans by their definition, * so skip expensive traversals. */ - if (!fastPathRouterQuery) + if (!plan->fastPathRouterPlan) { RecordSubPlansUsedInPlan(plan, originalQuery); } diff --git a/src/backend/distributed/planner/multi_router_planner.c b/src/backend/distributed/planner/multi_router_planner.c index 26d4c2438..a31320d62 100644 --- a/src/backend/distributed/planner/multi_router_planner.c +++ b/src/backend/distributed/planner/multi_router_planner.c @@ -189,6 +189,9 @@ CreateRouterPlan(Query *originalQuery, Query *query, plannerRestrictionContext); } + distributedPlan->fastPathRouterPlan = + plannerRestrictionContext->fastPathRestrictionContext->fastPathRouterQuery; + return distributedPlan; } diff --git a/src/backend/distributed/utils/citus_outfuncs.c b/src/backend/distributed/utils/citus_outfuncs.c index 6cf21078e..942852a78 100644 --- a/src/backend/distributed/utils/citus_outfuncs.c +++ b/src/backend/distributed/utils/citus_outfuncs.c @@ -195,6 +195,7 @@ OutDistributedPlan(OUTFUNC_ARGS) WRITE_NODE_FIELD(subPlanList); WRITE_NODE_FIELD(usedSubPlanNodeList); + WRITE_BOOL_FIELD(fastPathRouterPlan); WRITE_NODE_FIELD(planningError); } diff --git a/src/backend/distributed/utils/citus_readfuncs.c b/src/backend/distributed/utils/citus_readfuncs.c index f3ceef7ac..d5661427b 100644 --- a/src/backend/distributed/utils/citus_readfuncs.c +++ b/src/backend/distributed/utils/citus_readfuncs.c @@ -223,6 +223,7 @@ ReadDistributedPlan(READFUNC_ARGS) READ_NODE_FIELD(subPlanList); READ_NODE_FIELD(usedSubPlanNodeList); + READ_BOOL_FIELD(fastPathRouterPlan); READ_NODE_FIELD(planningError); diff --git a/src/include/distributed/multi_physical_planner.h b/src/include/distributed/multi_physical_planner.h index 9862121bb..344fbb315 100644 --- a/src/include/distributed/multi_physical_planner.h +++ b/src/include/distributed/multi_physical_planner.h @@ -310,6 +310,12 @@ typedef struct DistributedPlan */ List *usedSubPlanNodeList; + /* + * When the query is very simple such that we don't need to call + * standard_planner(). See FastPathRouterQuery() for the definition. + */ + bool fastPathRouterPlan; + /* * NULL if this a valid plan, an error description otherwise. This will * e.g. be set if SQL features are present that a planner doesn't support,