Fix an oversight in two different recent patches: nodes that support SRFs
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Oct 2008 15:29:23 +0000 (15:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 23 Oct 2008 15:29:23 +0000 (15:29 +0000)
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
src/backend/executor/nodeCtescan.c
src/backend/executor/nodeGroup.c
src/backend/executor/nodeWorktablescan.c

index 15fe98bba10e99366c8082ec62086b045b27400b..daade5c1e11862bd46d167d36f4fdd872776c859 100644 (file)
@@ -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)
        {
                /*
index fdcb6f4700a0627d8bc0601de578c5ac0b842b14..80de4db699f89642358632057c4a7dee990df3b3 100644 (file)
@@ -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)
        {
index c77f6bf0c53aacd992eba19003446a877516362f..20671083fb1f3e084c4d772a816ebdd17c386f82 100644 (file)
@@ -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);
 
index adedd83b2fa79e55e4359752a07920e4c96c27f1..4bed9ee0e34bfb260ecb974e7e675acbdb16ce0c 100644 (file)
@@ -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);