pg.ddx.io  pgsql-bugs@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: zeroimpl@gmail.com
Subject: BUG #15913: Could not open relation with oid on PL/pgSQL method referencing temporary table that got recreated
Date: Tue, 16 Jul 2019 17:49:14 +0000
Message-ID: <15913-a7e112e16dedcffc@postgresql.org> (raw)

The following bug has been logged on the website:

Bug reference:      15913
Logged by:          Daniel Fiori
Email address:      zeroimpl@gmail.com
PostgreSQL version: 11.4
Operating system:   Debian 11.4-1.pgdg90+1
Description:        

I have some SQL which works fine in 9.x and 10.x, but fails in 11.x and 12.x
(I tested on various Docker images).

One of the functions declares a variable whose type matches a temporary
table. If I drop and recreate that temporary table twice in the same
session, I get an error like: "ERROR:  could not open relation with OID
xxx". This occurs on the second call to the DoSomething() function after the
temporary table has been recreated. 

---

BEGIN;

CREATE OR REPLACE FUNCTION BeginTest( arg TEXT ) RETURNS VOID AS $$
BEGIN
    CREATE TEMPORARY TABLE TestVal AS SELECT arg;
END
$$ LANGUAGE PLPGSQL;

SELECT BeginTest( NULL );

CREATE OR REPLACE FUNCTION EndTest() RETURNS VOID AS $$
BEGIN
    DROP TABLE TestVal;
END
$$ LANGUAGE PLPGSQL;

CREATE OR REPLACE FUNCTION DoSomething() RETURNS VOID AS $$
DECLARE
    varname TestVal;
BEGIN
    SELECT * INTO varname FROM TestVal;
END
$$ LANGUAGE PLPGSQL;

SELECT EndTest();

COMMIT;

---

Then in a different session run:
---

BEGIN;

SELECT BeginTest( 'abc' );
SELECT DoSomething();
SELECT EndTest();

SELECT BeginTest( 'def' );
SELECT DoSomething();
SELECT EndTest();

COMMIT;

---

Note if the above SQL is all run in the same session, a slightly different
error is reported: "ERROR:  type with OID xxx does not exist"

Based on the PG 11 release notes, it sounds like it's related to this
change:

> Allow PL/pgSQL to handle changes to composite types (e.g. record, row)
that happen between the first and later function executions in the same
session (Tom Lane). Previously, such circumstances generated errors.



view thread (2+ messages)  latest in thread

Message-ID: <15913-a7e112e16dedcffc@postgresql.org>
Permalink:  ../15913-a7e112e16dedcffc@postgresql.org/
Also on:    postgresql.org/message-id/15913-a7e112e16dedcffc@postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-bugs@postgresql.org
  Cc: noreply@postgresql.org, pgsql-bugs@lists.postgresql.org, zeroimpl@gmail.com
  Subject: Re: BUG #15913: Could not open relation with oid on PL/pgSQL method referencing temporary table that got recreated
  In-Reply-To: <15913-a7e112e16dedcffc@postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox