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

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: pl/pgsql errors when multi-dimensional arrays are used
Дата
Msg-id CAFj8pRB9764QhP_t6D2S9aE8gkPJi=frdGT6JNiheBEt1fgRug@mail.gmail.com
обсуждение исходный текст
Ответ на Re: pl/pgsql errors when multi-dimensional arrays are used  (Rafal Dabrowa <fatwildcat@gmail.com>)
Список pgsql-docs
Hi

čt 29. 4. 2021 v 12:33 odesílatel Rafal Dabrowa <fatwildcat@gmail.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@postgresql.org <mailto:noreply@postgresql.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

В списке pgsql-docs по дате отправления:

Предыдущее
От: Rafal Dabrowa
Дата:
Сообщение: Re: pl/pgsql errors when multi-dimensional arrays are used
Следующее
От: PG Doc comments form
Дата:
Сообщение: Foreign Keys being able to reference same table not spelled out in documentation