From 40f42d2a34329b0b71a1287d6fd2554298dbb713 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 4 May 2015 16:13:07 -0400 Subject: [PATCH] Use outerPlanState macro instead of referring to leffttree. This makes the executor code more consistent. It also removes an apparently superfluous NULL test in nodeGroup.c. Qingqing Zhou, reviewed by Tom Lane, and further revised by me. --- src/backend/executor/nodeAgg.c | 7 ++++--- src/backend/executor/nodeBitmapHeapscan.c | 6 ++++-- src/backend/executor/nodeGroup.c | 7 ++++--- src/backend/executor/nodeMaterial.c | 12 +++++++----- src/backend/executor/nodeSort.c | 8 +++++--- src/backend/executor/nodeWindowAgg.c | 5 +++-- 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 9ff0eff6d7..4a8af7b3a7 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -2053,6 +2053,7 @@ void ExecReScanAgg(AggState *node) { ExprContext *econtext = node->ss.ps.ps_ExprContext; + PlanState *outerPlan = outerPlanState(node); int aggno; node->agg_done = false; @@ -2075,7 +2076,7 @@ ExecReScanAgg(AggState *node) * parameter changes, then we can just rescan the existing hash table; * no need to build it again. */ - if (node->ss.ps.lefttree->chgParam == NULL) + if (outerPlan->chgParam == NULL) { ResetTupleHashIterator(node->hashtable, &node->hashiter); return; @@ -2133,8 +2134,8 @@ ExecReScanAgg(AggState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 8ea8b9f16b..40a06f163a 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -449,6 +449,8 @@ ExecBitmapHeapScan(BitmapHeapScanState *node) void ExecReScanBitmapHeapScan(BitmapHeapScanState *node) { + PlanState *outerPlan = outerPlanState(node); + /* rescan to release any page pin */ heap_rescan(node->ss.ss_currentScanDesc, NULL); @@ -469,8 +471,8 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index 83d562e511..3f87716b8f 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -280,6 +280,8 @@ ExecEndGroup(GroupState *node) void ExecReScanGroup(GroupState *node) { + PlanState *outerPlan = outerPlanState(node); + node->grp_done = FALSE; node->ss.ps.ps_TupFromTlist = false; /* must clear first tuple */ @@ -289,7 +291,6 @@ ExecReScanGroup(GroupState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree && - node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 1158825869..8ff4352a66 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -317,6 +317,8 @@ ExecMaterialRestrPos(MaterialState *node) void ExecReScanMaterial(MaterialState *node) { + PlanState *outerPlan = outerPlanState(node); + ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); if (node->eflags != 0) @@ -339,13 +341,13 @@ ExecReScanMaterial(MaterialState *node) * Otherwise we can just rewind and rescan the stored output. The * state of the subnode does not change. */ - if (node->ss.ps.lefttree->chgParam != NULL || + if (outerPlan->chgParam != NULL || (node->eflags & EXEC_FLAG_REWIND) == 0) { tuplestore_end(node->tuplestorestate); node->tuplestorestate = NULL; - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); node->eof_underlying = false; } else @@ -359,8 +361,8 @@ ExecReScanMaterial(MaterialState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); node->eof_underlying = false; } } diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index a815cde2cc..732f3c38db 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -290,6 +290,8 @@ ExecSortRestrPos(SortState *node) void ExecReScanSort(SortState *node) { + PlanState *outerPlan = outerPlanState(node); + /* * If we haven't sorted yet, just return. If outerplan's chgParam is not * NULL then it will be re-scanned by ExecProcNode, else no reason to @@ -308,7 +310,7 @@ ExecReScanSort(SortState *node) * * Otherwise we can just rewind and rescan the sorted output. */ - if (node->ss.ps.lefttree->chgParam != NULL || + if (outerPlan->chgParam != NULL || node->bounded != node->bounded_Done || node->bound != node->bound_Done || !node->randomAccess) @@ -321,8 +323,8 @@ ExecReScanSort(SortState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } else tuplesort_rescan((Tuplesortstate *) node->tuplesortstate); diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index a06790d94a..bf0c98d878 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -2057,6 +2057,7 @@ ExecEndWindowAgg(WindowAggState *node) void ExecReScanWindowAgg(WindowAggState *node) { + PlanState *outerPlan = outerPlanState(node); ExprContext *econtext = node->ss.ps.ps_ExprContext; node->all_done = false; @@ -2082,8 +2083,8 @@ ExecReScanWindowAgg(WindowAggState *node) * if chgParam of subnode is not null then plan will be re-scanned by * first ExecProcNode. */ - if (node->ss.ps.lefttree->chgParam == NULL) - ExecReScan(node->ss.ps.lefttree); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } /*