On Mon, Feb 07, 2011 at 02:31:49PM +0100, Dimitri Fontaine wrote:
> strk <s...@keybit.net> writes:
> > Do you have an idea on how to further debug this ?
> 
> That usually goes with providing a self-contained test case… that is a
> minimum script that creates the function(s) and calls them.

I've finally completed the debugging phase and have
a minimal self-contained testcase showing the problem.

It has to do with INITIALLY DEFERRED constraints.

The testcase is attached.

--strk;

  ()   Free GIS & Flash consultant/developer
  /\   http://strk.keybit.net/services.html
-- {
CREATE OR REPLACE FUNCTION makeTopo()
RETURNS void AS $$
BEGIN

    CREATE SCHEMA topo;
    CREATE TABLE topo.edge (
        id int4 PRIMARY KEY,
        ref int4,
        FOREIGN KEY(ref) REFERENCES topo.edge(id)
            DEFERRABLE INITIALLY DEFERRED);

    -- NOTE: returning here "fixes" the bug
    --RETURN;

    INSERT INTO topo.edge VALUES (1,1);

END
$$ language 'plpgsql' VOLATILE STRICT;
-- }


DROP SCHEMA IF EXISTS topo CASCADE;

BEGIN;

 SELECT makeTopo();

 SELECT 'topo.edge'::regclass::oid;

 -- NOTE: this fixes it!
 -- SET CONSTRAINTS ALL IMMEDIATE;

 -- ERROR:  could not open relation with OID XXXXXXX
 -- NOTE: XXXXX is 'topo.edge'::regclass::oid
 DROP TABLE topo.edge CASCADE;

COMMIT;

-- NOTE: doing it here is fine
--DROP TABLE topo.edge CASCADE;


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to