On Mon, May 21, 2018 at 5:54 AM, Alexey Dokuchaev <da...@nsu.ru> wrote:
> result := json_agg(_) FROM ( > SELECT foo, bar, baz ... > FROM t1, t2, t3 WHERE ...) AS _; -- this works fine > > GET DIAGNOSTICS retcode = ROW_COUNT; -- always returns 1 > > I'd expected `retcode' to contain the number of SELECT'ed rows, but it > is something else (always 1). Apparently, aggregation functions like > json_agg()/array_agg() mangle the ROW_COUNT from the inner SELECT (the > one I'm interested in). > > Is this expected and correct behavior? Yes, the query returned only one row, with a single json column. You wrote the equivalent of: SELECT json_agg(...) FROM ... INTO result; And you are getting the count of the top-most select (which is implied in the syntax that you used). > Is it possible to obtain the > first ROW_COUNT (after SELECT) without performing it twice? > Not directly, no. You should execute the inner query to a temporary table than perform your counting and json_agg from that. David J.