Re: Aggregate functions with FROM clause and ROW_COUNT diagnostics

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: Alexey Dokuchaev <danfe(at)nsu(dot)ru>, pgsql-general(at)postgresql(dot)org
Subject: Re: Aggregate functions with FROM clause and ROW_COUNT diagnostics
Date: 2018-05-21 14:35:06
Message-ID: 43a358da-a0a2-9965-c3c6-02a19e0a3561@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 05/21/2018 05:54 AM, Alexey Dokuchaev wrote:
> Hi,
>
> I'm seeing somewhat confusing results here with 9.6.8, and cannot find
> the answer in the docs or google.
>
> I'm returning JSON array (or any array, it does not make a difference)
> from my plpgsql function like this:
>
> OUT retcode int,
> OUT result json)
> . . .
> 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? Is it possible to obtain the
> first ROW_COUNT (after SELECT) without performing it twice? Thanks,

Off the top of my head:

SELECT count(*) as ct, foo, bar, baz ...

retcode = result ->'ct'

>
> ./danfe
>
>

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2018-05-21 14:45:27 Re: Aggregate functions with FROM clause and ROW_COUNT diagnostics
Previous Message David G. Johnston 2018-05-21 14:30:44 Re: Aggregate functions with FROM clause and ROW_COUNT diagnostics