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.
TupleTableSlot *
ExecAgg(AggState *node)
{
- if (node->agg_done)
- return NULL;
-
/*
* 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
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 (!node->table_filled)