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  (Tom Lane <tgl@sss.pgh.pa.us>)
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:

Previous
From: Pavel Stehule
Date:
Subject: Re: unnest on multi-dimensional arrays
Next
From: Tom Lane
Date:
Subject: Re: unnest on multi-dimensional arrays