Re: BUG #1204: user-defined function in transaction - Mailing list pgsql-bugs

From Gaetano Mendola
Subject Re: BUG #1204: user-defined function in transaction
Date
Msg-id 4110FB41.6020906@bigfoot.com
Whole thread Raw
In response to BUG #1204: user-defined function in transaction  ("PostgreSQL Bugs List" <pgsql-bugs@postgresql.org>)
List pgsql-bugs
PostgreSQL Bugs List wrote:

> The following bug has been logged online:
>
> Bug reference:      1204
> Logged by:          Golkin Stanislav
>
> Email address:      stas@intercom.ru
>
> PostgreSQL version: 7.4
>
> Operating system:   FREBSD 4.3
>
> Description:        user-defined function in transaction
>
> Details:
>
> User-defined function is called inside transaction block (begin end) in php
> script. There is loop in php script where this PL/pgsql functon is invoked
> several times. On first iteration it cause no mistake, on second it cause
> mistake like this:
>
> ERROR:  relation with OID 165645734 does not exist
> CONTEXT:  PL/pgSQL function "session_recount_time_sec" line 35 at select
> into variables
> ERROR:  current transaction is aborted, commands ignored until end of
> transaction block
>
>
> And it doesn't depend on input data. On first loop it's always OK and then
> it's always error

Mmm, I bet you are using temporary table in this fashion:

CREATE OR REPLACE FUNCTION sp_test (  )
RETURNS INTEGER AS'
DECLARE
   my_value        integer;
BEGIN
   CREATE TEMP TABLE test ( a integer );
   select a INTO my_value from test limit 1;
   drop table test;
   return 0;
END;
' LANGUAGE 'plpgsql';


regression=# select sp_test();
  sp_test
---------
        0
(1 row)

regression=# select sp_test();
ERROR:  relation with OID 89367289 does not exist
CONTEXT:  PL/pgSQL function "sp_test" line 7 at select into variables

As you can see I got the same error.




I don't know if this is the cleaneast way but you can solve in this way:

CREATE OR REPLACE FUNCTION sp_test (  )
RETURNS INTEGER AS'
DECLARE
   my_value        integer;
BEGIN

   PERFORM * FROM pg_tables
   WHERE schemaname = ''pg_temp_1'' AND
         tablename = ''test'';

   IF NOT FOUND THEN
     CREATE TEMP TABLE test ( a integer ) ON COMMIT DELETE ROWS;
   END IF;

   select a INTO my_value from test limit 1;

   return 0;


END;
' LANGUAGE 'plpgsql'
VOLATILE;




regression=# select sp_test();
  sp_test
---------
        0
(1 row)

regression=# select sp_test();
  sp_test
---------
        0
(1 row)




Regards
Gaetano Mendola

pgsql-bugs by date:

Previous
From: Stephan Szabo
Date:
Subject: Re: BUG #1204: user-defined function in transaction
Next
From: "PostgreSQL Bugs List"
Date:
Subject: BUG #1205: psql toggles