Re: unnest on multi-dimensional arrays - Mailing list pgsql-general
From | Zev Benjamin |
---|---|
Subject | Re: unnest on multi-dimensional arrays |
Date | |
Msg-id | 529CD38B.3040409@strangersgate.com Whole thread Raw |
In response to | Re: unnest on multi-dimensional arrays (Pavel Stehule <pavel.stehule@gmail.com>) |
Responses |
Re: unnest on multi-dimensional arrays
|
List | pgsql-general |
This actually looks to mostly be a parser limitation: foreach_slice : { $$ = 0; } | K_SLICE ICONST { $$ = $2; } ; Everything after that just treats the slice number as a variable. Is there any underlying grammar ambiguity that prevents it from being an expression? Zev On 12/02/2013 01:24 PM, Pavel Stehule wrote: > > > > 2013/12/2 Zev Benjamin <zev-pgsql@strangersgate.com > <mailto:zev-pgsql@strangersgate.com>> > > Hrm. Conceptually, I think you actually want something like: > > > CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray) > RETURNS SETOF anyarray > LANGUAGE plpgsql > AS $function$ > DECLARE > s $1%type; > d int; > BEGIN > d := array_ndims($1) - 1; > FOREACH s SLICE d IN ARRAY $1 LOOP > > RETURN NEXT s; > END LOOP; > RETURN; > END; > $function$; > > Otherwise, > select * from reduce_dim(ARRAY[[1], [2], [3]]) > and > select * from reduce_dim(ARRAY[[[1], [2], [3]]); > > produce the same results. Unfortunately, it looks like the SLICE > keyword only accepts a constant. > > > yes, it accept only constant - it is unpleasant, but it is necessary due > plpgsql internals :( > > Regards > > Pavel Stěhule > > > > Zev > > > On 11/28/2013 02:28 AM, Pavel Stehule wrote: > > Hello > > postgres=# CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray) > RETURNS SETOF anyarray > LANGUAGE plpgsql > AS $function$ > DECLARE s $1%type; > BEGIN > FOREACH s SLICE 1 IN ARRAY $1 LOOP > RETURN NEXT s; > END LOOP; > RETURN; > END; > $function$; > CREATE FUNCTION > > postgres=# select reduce_dim(array[array[1, 2], array[2, 3]]); > reduce_dim > ------------ > {1,2} > {2,3} > (2 rows) > > Regards > > Pavel Stehule > > 2013/11/28 Zev Benjamin <zev-pgsql@strangersgate.com > <mailto:zev-pgsql@strangersgate.com> > <mailto:zev-pgsql@__strangersgate.com > <mailto:zev-pgsql@strangersgate.com>>> > > > It appears that unnest, when called on a multi-dimensional > array, > effectively flattens the array first. For example: > > => select * from unnest(array[array[1, 2], array[2, 3]]); > unnest > -------- > 1 > 2 > 2 > 3 > (4 rows) > > while I would have expect something like the following: > > => select * from unnest(array[array[1, 2], array[2, 3]]); > unnest > -------- > {1, 2} > {2, 3} > (2 rows) > > Is there any way to get the latter behavior? > > > Zev > > > > -- > Sent via pgsql-general mailing list > (pgsql-general@postgresql.org <mailto:pgsql-general@postgresql.org> > <mailto:pgsql-general@__postgresql.org > <mailto:pgsql-general@postgresql.org>>) > > To make changes to your subscription: > http://www.postgresql.org/____mailpref/pgsql-general > <http://www.postgresql.org/__mailpref/pgsql-general> > <http://www.postgresql.org/__mailpref/pgsql-general > <http://www.postgresql.org/mailpref/pgsql-general>> > > > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org > <mailto:pgsql-general@postgresql.org>) > To make changes to your subscription: > http://www.postgresql.org/__mailpref/pgsql-general > <http://www.postgresql.org/mailpref/pgsql-general> > >
pgsql-general by date: