2016-08-24 17:08 GMT+02:00 Tom Lane <t...@sss.pgh.pa.us>:

> Andrew Gierth <and...@tao11.riddles.org.uk> writes:
> > Something is wrong with the way chgParam is being handled in Agg nodes.
> > The code in ExecReScanAgg seems to assume that if the lefttree doesn't
> > have any parameter changes then it suffices to re-project the data from
> > the existing hashtable; but of course this is nonsense if the parameter
> > is in an input to an aggregate function.
>
> It looks like it's sufficient to do this:
>
> diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/
> nodeAgg.c
> index 1ec2515..f468fad 100644
> *** a/src/backend/executor/nodeAgg.c
> --- b/src/backend/executor/nodeAgg.c
> *************** ExecReScanAgg(AggState *node)
> *** 3425,3435 ****
>                         return;
>
>                 /*
> !                * If we do have the hash table and the subplan does not
> have any
> !                * parameter changes, then we can just rescan the existing
> hash table;
> !                * no need to build it again.
>                  */
> !               if (outerPlan->chgParam == NULL)
>                 {
>                         ResetTupleHashIterator(node->hashtable,
> &node->hashiter);
>                         return;
> --- 3425,3436 ----
>                         return;
>
>                 /*
> !                * If we do have the hash table and there are no relevant
> parameter
> !                * changes, then we can just rescan the existing hash
> table; no need
> !                * to build it again.
>                  */
> !               if (node->ss.ps.chgParam == NULL &&
> !                       outerPlan->chgParam == NULL)
>                 {
>                         ResetTupleHashIterator(node->hashtable,
> &node->hashiter);
>                         return;
>
>
> I'm not sure if it's worth trying to distinguish whether the Param is
> inside any aggregate calls or not.  The existing code gets the right
> answer for
>
> select array(select x+sum(y) from generate_series(1,3) y group by y)
>   from generate_series(1,3) x;
>
> and we'd be losing some efficiency for cases like that if we fix
> it as above.  But is it worth the trouble?
>
>
The result should not depend on GUC - hashagg on/off changing output - it
is error.

Regards

Pavel


>                         regards, tom lane
>
>
> --
> Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-hackers
>

Reply via email to