On Thu, Apr 30, 2015 at 5:04 PM, Tom Lane <t...@sss.pgh.pa.us> wrote: > > I think I'd have done many of these as > > + PlanState *outerPlan = outerPlanState(node); > > rather than finding assorted random places to initialize the variables. >
Agreed. Attached patch is revision along this line. Except for a few that delayed assignments does not look a random kludge, I moved most of others together with the declaration. Regards, Qingqing
diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c old mode 100644 new mode 100755 index 9ff0eff..fe3920e --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -2053,10 +2053,10 @@ void ExecReScanAgg(AggState *node) { ExprContext *econtext = node->ss.ps.ps_ExprContext; + PlanState *outerPlan = outerPlanState(node); int aggno; node->agg_done = false; - node->ss.ps.ps_TupFromTlist = false; if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED) @@ -2075,7 +2075,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 +2133,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 old mode 100644 new mode 100755 index 8ea8b9f..6502841 --- 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; + /* rescan to release any page pin */ heap_rescan(node->ss.ss_currentScanDesc, NULL); @@ -469,8 +471,9 @@ 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); + outerPlan = outerPlanState(node); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c old mode 100644 new mode 100755 index 83d562e..b0d5442 --- 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; + node->grp_done = FALSE; node->ss.ps.ps_TupFromTlist = false; /* must clear first tuple */ @@ -289,7 +291,7 @@ 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); + outerPlan = outerPlanState(node); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c old mode 100644 new mode 100755 index 1158825..8ff4352 --- 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 old mode 100644 new mode 100755 index a815cde..8bdffe7 --- 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 a06790d..520be66 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; ExprContext *econtext = node->ss.ps.ps_ExprContext; node->all_done = false; @@ -2082,8 +2083,9 @@ 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); + outerPlan = outerPlanState(node); + if (outerPlan->chgParam == NULL) + ExecReScan(outerPlan); } /*
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers