From 36b4b07ab0b1b7d268891aa139611de9155be15f Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 23 Oct 2008 15:29:23 +0000 Subject: [PATCH] Fix an oversight in two different recent patches: nodes that support SRFs in their targetlists had better reset ps_TupFromTlist during ReScan calls. There's no need to back-patch here since nodeAgg and nodeGroup didn't even pretend to support SRFs in prior releases. --- src/backend/executor/nodeAgg.c | 4 ++++ src/backend/executor/nodeCtescan.c | 5 ++--- src/backend/executor/nodeGroup.c | 3 +++ src/backend/executor/nodeWorktablescan.c | 2 ++ 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 15fe98bba1..daade5c1e1 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -1284,6 +1284,8 @@ ExecInitAgg(Agg *node, EState *estate, int eflags) ExecAssignResultTypeFromTL(&aggstate->ss.ps); ExecAssignProjectionInfo(&aggstate->ss.ps, NULL); + aggstate->ss.ps.ps_TupFromTlist = false; + /* * get the count of aggregates in targetlist and quals */ @@ -1647,6 +1649,8 @@ ExecReScanAgg(AggState *node, ExprContext *exprCtxt) node->agg_done = false; + node->ss.ps.ps_TupFromTlist = false; + if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED) { /* diff --git a/src/backend/executor/nodeCtescan.c b/src/backend/executor/nodeCtescan.c index fdcb6f4700..80de4db699 100644 --- a/src/backend/executor/nodeCtescan.c +++ b/src/backend/executor/nodeCtescan.c @@ -303,11 +303,10 @@ ExecEndCteScan(CteScanState *node) void ExecCteScanReScan(CteScanState *node, ExprContext *exprCtxt) { - Tuplestorestate *tuplestorestate; - - tuplestorestate = node->leader->cte_table; + Tuplestorestate *tuplestorestate = node->leader->cte_table; ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); + node->ss.ps.ps_TupFromTlist = false; if (node->leader == node) { diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index c77f6bf0c5..20671083fb 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -247,6 +247,8 @@ ExecInitGroup(Group *node, EState *estate, int eflags) ExecAssignResultTypeFromTL(&grpstate->ss.ps); ExecAssignProjectionInfo(&grpstate->ss.ps, NULL); + grpstate->ss.ps.ps_TupFromTlist = false; + /* * Precompute fmgr lookup data for inner loop */ @@ -286,6 +288,7 @@ void ExecReScanGroup(GroupState *node, ExprContext *exprCtxt) { node->grp_done = FALSE; + node->ss.ps.ps_TupFromTlist = false; /* must clear first tuple */ ExecClearTuple(node->ss.ss_ScanTupleSlot); diff --git a/src/backend/executor/nodeWorktablescan.c b/src/backend/executor/nodeWorktablescan.c index adedd83b2f..4bed9ee0e3 100644 --- a/src/backend/executor/nodeWorktablescan.c +++ b/src/backend/executor/nodeWorktablescan.c @@ -204,6 +204,8 @@ void ExecWorkTableScanReScan(WorkTableScanState *node, ExprContext *exprCtxt) { ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); + node->ss.ps.ps_TupFromTlist = false; + /* No need (or way) to rescan if ExecWorkTableScan not called yet */ if (node->rustate) tuplestore_rescan(node->rustate->working_table); -- 2.39.5