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 по дате отправления: