BUG #16107: string_agg looses first item

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

BUG #16107: string_agg looses first item

PG Bug reporting form
The following bug has been logged on the website:

Bug reference:      16107
Logged by:          Andrew Wheelwright
Email address:      [hidden email]
PostgreSQL version: 11.5
Operating system:   Linux
Description:        

I ran into a scenario where I found results getting dropped from string
aggregation.  Here's a basic example which reproduces the problem on three
different servers running PostgreSQL 9.6.6, 10.6, and 11.5, respectively.  I
don't have an instance running version 12.

with dataset as (
        select 'One' "Label", 1 "ID"
        union
        select 'Two' "Label", 2 "ID"
        union
        select 'Three' "Label", 3 "ID"
)
select
        string_agg(', ', "Label" order by "ID") "String Aggregated Labels",
        array_agg("Label" order by "ID") "Array Aggregated Labels"
from
        dataset
;

Which renders the following result:
String Aggregated Labels: `, Two, Three, `
Array Aggregated Labels: `{One,Two,Three}`

The value "One" is missing from the string aggregate result and there is a
dangling separator on both ends of the string.

Reply | Threaded
Open this post in threaded view
|

Re: BUG #16107: string_agg looses first item

Tom Lane-2
PG Bug reporting form <[hidden email]> writes:
> I ran into a scenario where I found results getting dropped from string
> aggregation.  Here's a basic example which reproduces the problem on three
> different servers running PostgreSQL 9.6.6, 10.6, and 11.5, respectively.  I
> don't have an instance running version 12.

> with dataset as (
> select 'One' "Label", 1 "ID"
> union
> select 'Two' "Label", 2 "ID"
> union
> select 'Three' "Label", 3 "ID"
> )
> select
> string_agg(', ', "Label" order by "ID") "String Aggregated Labels",
> array_agg("Label" order by "ID") "Array Aggregated Labels"
> from
> dataset
> ;

> Which renders the following result:
> String Aggregated Labels: `, Two, Three, `
> Array Aggregated Labels: `{One,Two,Three}`

I think you've got the string_agg parameters backwards, it should be

regression=# with dataset as (
select 'One' "Label", 1 "ID"
union
select 'Two' "Label", 2 "ID"
union
select 'Three' "Label", 3 "ID"
)
select
string_agg("Label", ', ' order by "ID") "String Aggregated Labels",
array_agg("Label" order by "ID") "Array Aggregated Labels"
from
dataset
;
 String Aggregated Labels | Array Aggregated Labels
--------------------------+-------------------------
 One, Two, Three          | {One,Two,Three}
(1 row)


                        regards, tom lane