From: | John Sidney-Woollett <johnsw(at)wardbrook(dot)com> |
---|---|
To: | Phil Endecott <spam_from_postgresql_general(at)chezphil(dot)org>, postgres general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Function caches wrong OID of temporary table? |
Date: | 2004-09-08 13:10:00 |
Message-ID: | 413F04A8.708@wardbrook.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Phil Endecott wrote:
> Dear PostgreSQL experts,
>
> I have encountered a problem with temporary tables inside plpgsql
> functions. I suspect that this is a known issue; if someone could
> confirm and suggest a workaround I'd be grateful.
>
> My function creates a couple of temporary tables, uses them, and drops
> them before returning:
>
>
> create temporary table s as select 123 as id;
> create temporary table t ( id integer );
> ....
> insert into t (select id from s);
> ....
> drop table s;
> drop table t;
> return;
>
>
> When I run this the first time it works as expected. When I run it a
> second time I get this message:
>
> ERROR: relation with OID 590209 does not exist
> CONTEXT: PL/pgSQL function "f" line 18 at SQL statement
>
> (Line 18 is the insert-select statement.)
>
> I imagine that it has cached that one of the tables is object 590209,
> but has not noticed that the table has been dropped and recreated before
> the second invokation of the function.
Your analysis is correct - Using execute is the work workaround.
While I'm all for function caching, this *feature* in the scenario above
is verging on a bug as far as I am concerned. I think that this item
should move from a "nice to have / to do" item to the bug list.
Other database systems that I have used are able to detect when a
procedure/function need recompiling and do it on the fly. If postgres
implemented this it would have another benefit. You could create objects
that reference other objects that don't yet exist (or are not yet
created) for example when applying a schema build script.
The first time the object is "used/called" it is compiled and all the
dependencies are resolved then (this is what Oracle is able to do).
Not forcing SQL developers to use DB-specific workarounds would be a
benefit too! :)
John Sidney-Woollett
From | Date | Subject | |
---|---|---|---|
Next Message | Sebastian Davancens | 2004-09-08 13:27:13 | Heritage |
Previous Message | Tore Halset | 2004-09-08 13:02:31 | Re: ERROR: canceling query due to user request |