From 88210542106de5b26fe6aa088d1811b68502d224 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 7 Jul 2022 11:23:40 -0400 Subject: [PATCH] Remove stray references to lefttree/righttree in the executor. The general convention in the executor is to refer to child plans and planstates via the outerPlan[State] and innerPlan[State] macros, but a few places didn't do it like that. For consistency and readability, convert all the stragglers to use the macros. (See also commit 40f42d2a3, which did some similar cleanup a few years ago, but missed these cases.) Richard Guo Discussion: https://postgr.es/m/CAMbWs4-vYhh1xsa_veah4PUed2Xq=Ed_YH3=Mqt5A3Y=EgfCEg@mail.gmail.com --- src/backend/executor/execAmi.c | 10 +++++----- src/backend/executor/execCurrent.c | 2 +- src/backend/executor/nodeAgg.c | 2 +- src/backend/executor/nodeGather.c | 4 ++-- src/backend/executor/nodeGatherMerge.c | 4 ++-- src/backend/executor/nodeHash.c | 6 ++++-- src/backend/executor/nodeHashjoin.c | 15 +++++++++------ src/backend/executor/nodeLimit.c | 6 ++++-- src/backend/executor/nodeLockRows.c | 6 ++++-- src/backend/executor/nodeMergejoin.c | 11 +++++++---- src/backend/executor/nodeProjectSet.c | 6 ++++-- src/backend/executor/nodeResult.c | 7 ++++--- src/backend/executor/nodeSetOp.c | 8 +++++--- src/backend/executor/nodeUnique.c | 6 ++++-- 14 files changed, 56 insertions(+), 37 deletions(-) diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index b6245994f0..44b2e0b82d 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -117,11 +117,11 @@ ExecReScan(PlanState *node) if (splan->plan->extParam != NULL) UpdateChangedParamSet(splan, node->chgParam); } - /* Well. Now set chgParam for left/right trees. */ - if (node->lefttree != NULL) - UpdateChangedParamSet(node->lefttree, node->chgParam); - if (node->righttree != NULL) - UpdateChangedParamSet(node->righttree, node->chgParam); + /* Well. Now set chgParam for child trees. */ + if (outerPlanState(node) != NULL) + UpdateChangedParamSet(outerPlanState(node), node->chgParam); + if (innerPlanState(node) != NULL) + UpdateChangedParamSet(innerPlanState(node), node->chgParam); } /* Call expression callbacks */ diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c index b34b180bc4..487107d7b9 100644 --- a/src/backend/executor/execCurrent.c +++ b/src/backend/executor/execCurrent.c @@ -396,7 +396,7 @@ search_plan_tree(PlanState *node, Oid table_oid, */ case T_ResultState: case T_LimitState: - result = search_plan_tree(node->lefttree, + result = search_plan_tree(outerPlanState(node), table_oid, pending_rescan); break; diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 139b2bd5f9..2fc606cf29 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -3388,7 +3388,7 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) if (phaseidx > 0) { aggnode = list_nth_node(Agg, node->chain, phaseidx - 1); - sortnode = castNode(Sort, aggnode->plan.lefttree); + sortnode = castNode(Sort, outerPlan(aggnode)); } else { diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index 4f8a17df7d..1283d5b737 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -168,13 +168,13 @@ ExecGather(PlanState *pstate) /* Initialize, or re-initialize, shared state needed by workers. */ if (!node->pei) - node->pei = ExecInitParallelPlan(node->ps.lefttree, + node->pei = ExecInitParallelPlan(outerPlanState(node), estate, gather->initParam, gather->num_workers, node->tuples_needed); else - ExecParallelReinitialize(node->ps.lefttree, + ExecParallelReinitialize(outerPlanState(node), node->pei, gather->initParam); diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c index a488cc6d8b..3b1007f352 100644 --- a/src/backend/executor/nodeGatherMerge.c +++ b/src/backend/executor/nodeGatherMerge.c @@ -212,13 +212,13 @@ ExecGatherMerge(PlanState *pstate) /* Initialize, or re-initialize, shared state needed by workers. */ if (!node->pei) - node->pei = ExecInitParallelPlan(node->ps.lefttree, + node->pei = ExecInitParallelPlan(outerPlanState(node), estate, gm->initParam, gm->num_workers, node->tuples_needed); else - ExecParallelReinitialize(node->ps.lefttree, + ExecParallelReinitialize(outerPlanState(node), node->pei, gm->initParam); diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 3510a4247c..123079c16c 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -2212,12 +2212,14 @@ ExecHashTableResetMatchFlags(HashJoinTable hashtable) void ExecReScanHash(HashState *node) { + PlanState *outerPlan = outerPlanState(node); + /* * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 88b870655e..87403e2478 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -1290,6 +1290,9 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate, void ExecReScanHashJoin(HashJoinState *node) { + PlanState *outerPlan = outerPlanState(node); + PlanState *innerPlan = innerPlanState(node); + /* * In a multi-batch join, we currently have to do rescans the hard way, * primarily because batch temp files may have already been released. But @@ -1300,7 +1303,7 @@ ExecReScanHashJoin(HashJoinState *node) if (node->hj_HashTable != NULL) { if (node->hj_HashTable->nbatch == 1 && - node->js.ps.righttree->chgParam == NULL) + innerPlan->chgParam == NULL) { /* * Okay to reuse the hash table; needn't rescan inner, either. @@ -1328,7 +1331,7 @@ ExecReScanHashJoin(HashJoinState *node) else { /* must destroy and rebuild hash table */ - HashState *hashNode = castNode(HashState, innerPlanState(node)); + HashState *hashNode = castNode(HashState, innerPlan); Assert(hashNode->hashtable == node->hj_HashTable); /* accumulate stats from old hash table, if wanted */ @@ -1350,8 +1353,8 @@ ExecReScanHashJoin(HashJoinState *node) * if chgParam of subnode is not null then plan will be re-scanned * by first ExecProcNode. */ - if (node->js.ps.righttree->chgParam == NULL) - ExecReScan(node->js.ps.righttree); + if (innerPlan->chgParam == NULL) + ExecReScan(innerPlan); } } @@ -1368,8 +1371,8 @@ ExecReScanHashJoin(HashJoinState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->js.ps.lefttree->chgParam == NULL) - ExecReScan(node->js.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } void diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 1b91b123fa..75e4302b94 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -542,6 +542,8 @@ ExecEndLimit(LimitState *node) void ExecReScanLimit(LimitState *node) { + PlanState *outerPlan = outerPlanState(node); + /* * Recompute limit/offset in case parameters changed, and reset the state * machine. We must do this before rescanning our child node, in case @@ -553,6 +555,6 @@ ExecReScanLimit(LimitState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c index 1a9dab25dd..a74813c7aa 100644 --- a/src/backend/executor/nodeLockRows.c +++ b/src/backend/executor/nodeLockRows.c @@ -394,10 +394,12 @@ ExecEndLockRows(LockRowsState *node) void ExecReScanLockRows(LockRowsState *node) { + PlanState *outerPlan = outerPlanState(node); + /* * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 864e3baf86..fed345eae5 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -1658,6 +1658,9 @@ ExecEndMergeJoin(MergeJoinState *node) void ExecReScanMergeJoin(MergeJoinState *node) { + PlanState *outerPlan = outerPlanState(node); + PlanState *innerPlan = innerPlanState(node); + ExecClearTuple(node->mj_MarkedTupleSlot); node->mj_JoinState = EXEC_MJ_INITIALIZE_OUTER; @@ -1670,8 +1673,8 @@ ExecReScanMergeJoin(MergeJoinState *node) * if chgParam of subnodes is not null then plans will be re-scanned by * first ExecProcNode. */ - if (node->js.ps.lefttree->chgParam == NULL) - ExecReScan(node->js.ps.lefttree); - if (node->js.ps.righttree->chgParam == NULL) - ExecReScan(node->js.ps.righttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); + if (innerPlan->chgParam == NULL) + ExecReScan(innerPlan); } diff --git a/src/backend/executor/nodeProjectSet.c b/src/backend/executor/nodeProjectSet.c index ea40d61b0b..adabfa2882 100644 --- a/src/backend/executor/nodeProjectSet.c +++ b/src/backend/executor/nodeProjectSet.c @@ -339,6 +339,8 @@ ExecEndProjectSet(ProjectSetState *node) void ExecReScanProjectSet(ProjectSetState *node) { + PlanState *outerPlan = outerPlanState(node); + /* Forget any incompletely-evaluated SRFs */ node->pending_srf_tuples = false; @@ -346,6 +348,6 @@ ExecReScanProjectSet(ProjectSetState *node) * If chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c index d0413e05de..78a744ba85 100644 --- a/src/backend/executor/nodeResult.c +++ b/src/backend/executor/nodeResult.c @@ -259,6 +259,8 @@ ExecEndResult(ResultState *node) void ExecReScanResult(ResultState *node) { + PlanState *outerPlan = outerPlanState(node); + node->rs_done = false; node->rs_checkqual = (node->resconstantqual != NULL); @@ -266,7 +268,6 @@ ExecReScanResult(ResultState *node) * If chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree && - node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan && outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c index 4b428cfa39..8af12f96e7 100644 --- a/src/backend/executor/nodeSetOp.c +++ b/src/backend/executor/nodeSetOp.c @@ -597,6 +597,8 @@ ExecEndSetOp(SetOpState *node) void ExecReScanSetOp(SetOpState *node) { + PlanState *outerPlan = outerPlanState(node); + ExecClearTuple(node->ps.ps_ResultTupleSlot); node->setop_done = false; node->numOutput = 0; @@ -617,7 +619,7 @@ ExecReScanSetOp(SetOpState *node) * parameter changes, then we can just rescan the existing hash table; * no need to build it again. */ - if (node->ps.lefttree->chgParam == NULL) + if (outerPlan->chgParam == NULL) { ResetTupleHashIterator(node->hashtable, &node->hashiter); return; @@ -646,6 +648,6 @@ ExecReScanSetOp(SetOpState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c index 6c99d13a39..d1399feabb 100644 --- a/src/backend/executor/nodeUnique.c +++ b/src/backend/executor/nodeUnique.c @@ -180,6 +180,8 @@ ExecEndUnique(UniqueState *node) void ExecReScanUnique(UniqueState *node) { + PlanState *outerPlan = outerPlanState(node); + /* must clear result tuple so first input tuple is returned */ ExecClearTuple(node->ps.ps_ResultTupleSlot); @@ -187,6 +189,6 @@ ExecReScanUnique(UniqueState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ps.lefttree->chgParam == NULL) - ExecReScan(node->ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } -- 2.39.5