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

Поиск
Список
Период
Сортировка
От Andrew Gierth
Тема Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable
Дата
Msg-id 87tyxfj8ll.fsf@news-spur.riddles.org.uk
обсуждение исходный текст
Ответ на Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable  (Pavel Stehule <pavel.stehule@gmail.com>)
Список pgsql-bugs
>>>>> "Pavel" == Pavel Stehule <pavel.stehule@gmail.com> writes:

 >> As discussed on the irc. I had a problem with a utility function
 >> that was being passed a NEW row and a null for the OLD row. The
 >> error was created when it tries to store the row variable in the
 >> local variables. RhodiumToad on the list provided this simple
 >> test.
 >>
 >> create type foo1 as (a integer, b text);
 >> CREATE TYPE
 >> create type foo2 as (c integer, d foo1);
 >> CREATE TYPE
 >>
 >> create function foo() returns foo2 language plpgsql as $f$ declare v foo2;
 >> begin v := null; return v; end; $f$;
 >> CREATE FUNCTION

 Pavel> 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
 as $f$ declare v foo1; begin v := null::foo1; return v; end; $f$;

create or replace function foo2() returns foo2 language plpgsql
 as $f$ declare v foo2; begin v := null::foo2; return v; end; $f$;

select foo1();
 foo1
------
 (,)
(1 row)

select foo2();
ERROR:  cannot assign non-composite value to a row variable
CONTEXT:  PL/pgSQL function "foo2" line 1 at assignment

Alternatively:

create or replace function foo1(r foo1) returns foo1 language plpgsql
  as $f$ declare v foo1; begin v := r; return v; end; $f$;
create or replace function foo2(r foo2) returns foo2 language plpgsql
  as $f$ declare v foo2; begin v := r; return v; end; $f$;

select foo1(null);
 foo1
------
 (,)
(1 row)

select foo2(null);
ERROR:  cannot assign non-composite value to a row variable
CONTEXT:  PL/pgSQL function "foo2" while storing call arguments into local variables

These calls should either both work or both fail.

--
Andrew (irc:RhodiumToad)

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

Предыдущее
От: "Jeff Janes"
Дата:
Сообщение: BUG #5157: Hash index not concurrency safe
Следующее
От: Craig Ringer
Дата:
Сообщение: Re: BUG #5149: Can't untar the src code file