From d0d05efbee3f5cfba7decb6a3e16eae456bd6cf3 Mon Sep 17 00:00:00 2001 From: pgsql-guo Date: Thu, 14 Apr 2022 06:14:23 +0000 Subject: [PATCH v1] Use outerPlanState macro instead of referring to leffttree. --- src/backend/executor/nodeGather.c | 4 ++-- src/backend/executor/nodeGatherMerge.c | 4 ++-- src/backend/executor/nodeHash.c | 6 ++++-- src/backend/executor/nodeHashjoin.c | 6 ++++-- 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 ++++-- 11 files changed, 44 insertions(+), 26 deletions(-) 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..520e06c0d4 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -1290,6 +1290,8 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate, void ExecReScanHashJoin(HashJoinState *node) { + PlanState *outerPlan = outerPlanState(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 @@ -1368,8 +1370,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.25.1