Thread: BUG #7622: Incorrect aggregate level processing

BUG #7622: Incorrect aggregate level processing

From
andrew@tao11.riddles.org.uk
Date:
The following bug has been logged on the website:

Bug reference:      7622
Logged by:          Andrew Gierth
Email address:      andrew@tao11.riddles.org.uk
PostgreSQL version: 9.2.1
Operating system:   n/a
Description:        =


Tested on git-master, 9.2.1, various older versions.

select (select array_agg(random()*i) from (values (1),(2)) v(a)) from
generate_series(1,3) i;

Expected output is three rows each with a 2-element array; actual output
is:

ERROR:  more than one row returned by a subquery used as an expression

Looking at the explain, the aggregate is being pulled out of the subplan and
evaluated at the top query level. (This came up while doing some random data
generation, I've simplified it a bit.)

Re: BUG #7622: Incorrect aggregate level processing

From
Tom Lane
Date:
andrew@tao11.riddles.org.uk writes:
> select (select array_agg(random()*i) from (values (1),(2)) v(a)) from
> generate_series(1,3) i;

> Expected output is three rows each with a 2-element array; actual output
> is:

> ERROR:  more than one row returned by a subquery used as an expression

> Looking at the explain, the aggregate is being pulled out of the subplan and
> evaluated at the top query level. (This came up while doing some random data
> generation, I've simplified it a bit.)

This is not a bug, it's the behavior required by SQL standard.  An
aggregate belongs to the lowest query level supplying a variable to it
(except of course when it contains no variable at all).  So it's
effectively an outer-reference constant for that inner select.

            regards, tom lane