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

From: Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk>
To: pavel(dot)stehule(at)gmail(dot)com (Pavel Stehule), Jeff Shanab <jshanab(at)earthlink(dot)net>, pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #5154: ERROR: cannot assign non-composite value to a row variable
Date: 2009-11-01 02:17:48
Message-ID: 87tyxfj8ll.fsf@news-spur.riddles.org.uk
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

>>>>> "Pavel" == Pavel Stehule <pavel(dot)stehule(at)gmail(dot)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)

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Craig Ringer 2009-11-01 06:31:56 Re: BUG #5149: Can't untar the src code file
Previous Message Jeff Janes 2009-10-31 23:41:40 BUG #5157: Hash index not concurrency safe