Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable
Дата
Msg-id 162867790910312354v6473aba4i81e35323c4671746@mail.gmail.com
обсуждение исходный текст
Ответ на Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable  (Andrew Gierth <andrew@tao11.riddles.org.uk>)
Список pgsql-bugs
2009/11/1 Andrew Gierth <andrew@tao11.riddles.org.uk>:
>>>>>> "Pavel" =3D=3D Pavel Stehule <pavel.stehule@gmail.com> writes:
>
> =C2=A0>> As discussed on the irc. I had a problem with a utility function
> =C2=A0>> that was being passed a NEW row and a null for the OLD row. The
> =C2=A0>> error was created when it tries to store the row variable in the
> =C2=A0>> local variables. RhodiumToad on the list provided this simple
> =C2=A0>> test.
> =C2=A0>>
> =C2=A0>> create type foo1 as (a integer, b text);
> =C2=A0>> CREATE TYPE
> =C2=A0>> create type foo2 as (c integer, d foo1);
> =C2=A0>> CREATE TYPE
> =C2=A0>>
> =C2=A0>> create function foo() returns foo2 language plpgsql as $f$ decla=
re v foo2;
> =C2=A0>> begin v :=3D null; return v; end; $f$;
> =C2=A0>> CREATE FUNCTION
>
> =C2=A0Pavel> This isn't bug - it is just feature.
>
> No, it's a bug.
>
> Here's a clearer testcase:
>
> create type foo1 as (a integer, b text);
> create type foo2 as (c integer, d foo1);
>
> create or replace function foo1() returns foo1 language plpgsql
> =C2=A0as $f$ declare v foo1; begin v :=3D null::foo1; return v; end; $f$;
>
> create or replace function foo2() returns foo2 language plpgsql
> =C2=A0as $f$ declare v foo2; begin v :=3D null::foo2; return v; end; $f$;
>
> select foo1();
> =C2=A0foo1
> ------
> =C2=A0(,)
> (1 row)
>
> select foo2();
> ERROR: =C2=A0cannot assign non-composite value to a row variable
> CONTEXT: =C2=A0PL/pgSQL function "foo2" line 1 at assignment
>
> Alternatively:
>
> create or replace function foo1(r foo1) returns foo1 language plpgsql
> =C2=A0as $f$ declare v foo1; begin v :=3D r; return v; end; $f$;
> create or replace function foo2(r foo2) returns foo2 language plpgsql
> =C2=A0as $f$ declare v foo2; begin v :=3D r; return v; end; $f$;
>
> select foo1(null);
> =C2=A0foo1
> ------
> =C2=A0(,)
> (1 row)
>
> select foo2(null);
> ERROR: =C2=A0cannot assign non-composite value to a row variable
> CONTEXT: =C2=A0PL/pgSQL function "foo2" while storing call arguments into=
 local variables
>
> These calls should either both work or both fail.
>

ok - it is bug. PL/pgSQL doesn't assign values well over nested
composite types. I am not sure, maybe this behave isn't limited by
NULL value.

Regards
Pavel Stehule


> --
> Andrew (irc:RhodiumToad)
>

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

Предыдущее
От: Craig Ringer
Дата:
Сообщение: Re: BUG #5149: Can't untar the src code file
Следующее
От: Mark Kirkwood
Дата:
Сообщение: Re: BUG #5150: math bug