Re: pl/pgsql errors when multi-dimensional arrays are used

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: Rafal Dabrowa <fatwildcat(at)gmail(dot)com>
Cc: KraSer <kraser(at)gmail(dot)com>, Pg Docs <pgsql-docs(at)lists(dot)postgresql(dot)org>
Subject: Re: pl/pgsql errors when multi-dimensional arrays are used
Date: 2021-04-29 10:56:38
Message-ID: CAFj8pRB9764QhP_t6D2S9aE8gkPJi=frdGT6JNiheBEt1fgRug@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-docs

Hi

čt 29. 4. 2021 v 12:33 odesílatel Rafal Dabrowa <fatwildcat(at)gmail(dot)com>
napsal:

> This also returns ERROR: invalid input syntax for type integer:
> "[221,222,223,224]"
>
> On 4/29/2021 9:48 AM, KraSer wrote:
> > try:
> > a.fld1[1] = '[221,222,223,224]';
> >
> > чт, 29 апр. 2021 г. в 10:35, PG Doc comments form
> > <noreply(at)postgresql(dot)org <mailto:noreply(at)postgresql(dot)org>>:
> >
> > The following documentation comment has been logged on the website:
> >
> > Page: https://www.postgresql.org/docs/13/arrays.html
> > Description:
> >
> > I have PostgreSQL 13. Let's declare the type below, then use it in
> > pl/pgsql:
> >
> > create type typ1 as (
> > fld1 int[][]
> > );
> >
> > do $$
> > declare
> > a typ1;
> > begin
> > a.fld1 = '{{121,122,123,124}}'; -- OK
> > (1)
> > a.fld1[1] = '{221,222,223,224}'; -- fails
> > (2)
> > a.fld1[1][1] = 321; -- OK
> > (3)
> > a.fld1[1][2] = 322; -- OK unless line (1)
> > is removed
> > end;
> > $$;
> >
> > In line (2) the plql reports ERROR: invalid input syntax for type
> > integer:
> > "{221,222,223,224}"
> > When lines (1) and (2) are removed, psql reports ERROR: array
> > subscript out
> > of range
> >
> > Is this expected behavior? Why?
> >
> > Rafal
> >
>

Postgres's arrays don't allow any modification that creates some gap in
the array. Next - Postgres's arrays are multidimensional arrays, and these
arrays are not an arrays or arrays.

So your line (1) cannot work.

You can write

a.fld1[1][1:4] := '{221,222,223,224}';

Case (3) fails, because this operation on empty array creates gap on
position 1,1.

you can use an function array_fill

DO
postgres=# do $$
declare a int[];
begin
a := array_fill(null::int, array[2,2]);
a[1][2] := 322;

raise notice 'a=%', a;
end;
$$;
NOTICE: a={{NULL,322},{NULL,NULL}}

Regards

Pavel

In response to

Browse pgsql-docs by date

  From Date Subject
Next Message PG Doc comments form 2021-04-29 12:07:38 Foreign Keys being able to reference same table not spelled out in documentation
Previous Message Rafal Dabrowa 2021-04-29 07:57:06 Re: pl/pgsql errors when multi-dimensional arrays are used