Обсуждение: BUG #7622: Incorrect aggregate level processing
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.)
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