From 3d81d088ef3a4b7f90734f4f08122156a4e78a7b Mon Sep 17 00:00:00 2001 From: pgsql-guo Date: Thu, 7 Jul 2022 06:34:49 +0000 Subject: [PATCH v2] Use outerPlanState/innerPlanState macro --- 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 ++++-- 11 files changed, 49 insertions(+), 30 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..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.25.1