Apply feedback - add fastPath field to plan

pull/3332/head
Onder Kalaci 2019-12-23 18:44:29 +01:00 committed by Jelte Fennema
parent 13a9b55695
commit 5a1e752726
5 changed files with 19 additions and 12 deletions

View File

@ -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);
}

View File

@ -189,6 +189,9 @@ CreateRouterPlan(Query *originalQuery, Query *query,
plannerRestrictionContext);
}
distributedPlan->fastPathRouterPlan =
plannerRestrictionContext->fastPathRestrictionContext->fastPathRouterQuery;
return distributedPlan;
}

View File

@ -195,6 +195,7 @@ OutDistributedPlan(OUTFUNC_ARGS)
WRITE_NODE_FIELD(subPlanList);
WRITE_NODE_FIELD(usedSubPlanNodeList);
WRITE_BOOL_FIELD(fastPathRouterPlan);
WRITE_NODE_FIELD(planningError);
}

View File

@ -223,6 +223,7 @@ ReadDistributedPlan(READFUNC_ARGS)
READ_NODE_FIELD(subPlanList);
READ_NODE_FIELD(usedSubPlanNodeList);
READ_BOOL_FIELD(fastPathRouterPlan);
READ_NODE_FIELD(planningError);

View File

@ -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,