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.

Reply via email to