Skip to content
Snippets Groups Projects
Commit e8d78d35 authored by Tom Lane's avatar Tom Lane
Browse files

ExecAgg() failed to finish running out set-returning functions in the last

aggregated tuple of a run.  Per report from Laurenz Albe.  This is a new
bug in 8.4, but only because prior versions rejected SRFs in an Agg plan
node altogether.
parent 5126826c
No related branches found
No related tags found
No related merge requests found
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.166 2009/04/02 20:59:10 momjian Exp $ * $PostgreSQL: pgsql/src/backend/executor/nodeAgg.c,v 1.167 2009/06/17 16:05:34 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -811,9 +811,6 @@ lookup_hash_entry(AggState *aggstate, TupleTableSlot *inputslot) ...@@ -811,9 +811,6 @@ lookup_hash_entry(AggState *aggstate, TupleTableSlot *inputslot)
TupleTableSlot * TupleTableSlot *
ExecAgg(AggState *node) ExecAgg(AggState *node)
{ {
if (node->agg_done)
return NULL;
/* /*
* Check to see if we're still projecting out tuples from a previous agg * Check to see if we're still projecting out tuples from a previous agg
* tuple (because there is a function-returning-set in the projection * tuple (because there is a function-returning-set in the projection
...@@ -831,6 +828,15 @@ ExecAgg(AggState *node) ...@@ -831,6 +828,15 @@ ExecAgg(AggState *node)
node->ss.ps.ps_TupFromTlist = false; node->ss.ps.ps_TupFromTlist = false;
} }
/*
* Exit if nothing left to do. (We must do the ps_TupFromTlist check
* first, because in some cases agg_done gets set before we emit the
* final aggregate tuple, and we have to finish running SRFs for it.)
*/
if (node->agg_done)
return NULL;
/* Dispatch based on strategy */
if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED) if (((Agg *) node->ss.ps.plan)->aggstrategy == AGG_HASHED)
{ {
if (!node->table_filled) if (!node->table_filled)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment