Bug #913: plpgsql function fails on second call

Lists: Postg토토 사이트 순위SQL : Postg토토 사이트 순위SQL 메일 링리스트 : 2003-03-18 이후 PGSQL-BUGS 17:26
From: pgsql-bugs(at)postgresql(dot)org
To: pgsql-bugs(at)postgresql(dot)org
Subject: Bug #913: plpgsql function fails on second call
Date: 2003-03-18 17:26:49
Message-ID: 20030318172649.BD71A476305@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg토토 사이트 순위SQL : Postg토토 사이트 순위SQL 메일 링리스트 : 2003-03-18 이후 PGSQL-BUGS 17:26

John Duffy (jbduffy(at)ntlworld(dot)com) reports a bug with a severity of 1
The lower the number the more severe it is.

Short Description
plpgsql function fails on second call

Long Description
A function containing a left outer join declared to return a set works correctly when first called. A second call to the function terminates with an error. If the function is recreated the function then works correctly for the first call and then fails on the second.

Sample Code
createdb test

create table a (id integer, value integer)
create table b (id integer, value integer)

insert into a (id, value) values (1,1)
insert into a (id, value) values (2,2)
insert into a (id, value) values (3,3)
insert into b (id, value) values (1,1)
insert into b (id, value) values (2,2)
insert into b (id, value) values (3,3)

create type ab as (a integer, b integer)

createlang plpgsql test

create or replace function test() returns setof ab as '
declare
row ab%ROWTYPE;
begin
create temp table ab as
select a.value as a_value, b.value as b_value
from a left outer join b
on a.id = b.id;

for row in select * from ab loop
return next row;
end loop;

drop table ab;

return;
end;
' language 'plpgsql';

test=# \i test-func.sql
CREATE FUNCTION

test=# select * from test();
a | b
---+---
1 | 1
2 | 2
3 | 3
(3 rows)

test=# select * from test();
WARNING: Error occurred while executing PL/pgSQL function test
WARNING: line 9 at for over select rows
ERROR: pg_class_aclcheck: relation 3759490 not found

No file was uploaded with this report


From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: jbduffy(at)ntlworld(dot)com, pgsql-bugs(at)postgresql(dot)org
Subject: Re: Bug #913: plpgsql function fails on second call
Date: 2003-03-18 17:31:04
Message-ID: 200303181731.h2IHV4F07054@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: Postg메이저 토토 사이트SQL : Postg메이저 토토 사이트SQL 메일 링리스트 : 2003-03-18 이후 PGSQL-BUGS 17:31


You have to use EXECUTE when creating a temp table in a function --- see
FAQ on it.

---------------------------------------------------------------------------

pgsql-bugs(at)postgresql(dot)org wrote:
> John Duffy (jbduffy(at)ntlworld(dot)com) reports a bug with a severity of 1
> The lower the number the more severe it is.
>
> Short Description
> plpgsql function fails on second call
>
> Long Description
> A function containing a left outer join declared to return a set works correctly when first called. A second call to the function terminates with an error. If the function is recreated the function then works correctly for the first call and then fails on the second.
>
> Sample Code
> createdb test
>
> create table a (id integer, value integer)
> create table b (id integer, value integer)
>
> insert into a (id, value) values (1,1)
> insert into a (id, value) values (2,2)
> insert into a (id, value) values (3,3)
> insert into b (id, value) values (1,1)
> insert into b (id, value) values (2,2)
> insert into b (id, value) values (3,3)
>
> create type ab as (a integer, b integer)
>
> createlang plpgsql test
>
> create or replace function test() returns setof ab as '
> declare
> row ab%ROWTYPE;
> begin
> create temp table ab as
> select a.value as a_value, b.value as b_value
> from a left outer join b
> on a.id = b.id;
>
> for row in select * from ab loop
> return next row;
> end loop;
>
> drop table ab;
>
> return;
> end;
> ' language 'plpgsql';
>
> test=# \i test-func.sql
> CREATE FUNCTION
>
> test=# select * from test();
> a | b
> ---+---
> 1 | 1
> 2 | 2
> 3 | 3
> (3 rows)
>
> test=# select * from test();
> WARNING: Error occurred while executing PL/pgSQL function test
> WARNING: line 9 at for over select rows
> ERROR: pg_class_aclcheck: relation 3759490 not found
>
>
> No file was uploaded with this report
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073


From: Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com>
To: <jbduffy(at)ntlworld(dot)com>, <pgsql-bugs(at)postgresql(dot)org>
Subject: Re: Bug #913: plpgsql function fails on second call
Date: 2003-03-18 18:30:09
Message-ID: 20030318102844.U40313-100000@megazone23.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-bugs


On Tue, 18 Mar 2003 pgsql-bugs(at)postgresql(dot)org wrote:

> create temp table ab as
> select a.value as a_value, b.value as b_value
> from a left outer join b
> on a.id = b.id;
>
> for row in select * from ab loop
> return next row;
> end loop;
>
> drop table ab;

If you're going to be doing create/drop table, you need to use
EXECUTE on the queries relating to the table, otherwise it'll cache
the plan which is invalid on the second pass since the table being
referenced is gone (replaced by a new ab table).