Hello.

Why pg_dump dumps CONSTRAINT ... CHECK together with CREATE TABLE queries,
but NOT at the end of dump file (as FOREIGN KEY)?
Sometimes it causes the generation of invalid dumps which cannot be
restored. Details follow.


1. I use database-dedicated search_path:

ALTER DATABASE d SET search_path TO nsp, public, pg_catalog;


2. I have a CHECK on table1 which calls a stored function:

CREATE TABLE table1 (
    i integer,
    CONSTRAINT table1_chk CHECK ((a(i) = true))
);


3. The function a() calls any OTHER function b() from OTHER namespace (or
uses operators from other namespaces), but does not specify the schema name,
because it is in database search_path:

CREATE FUNCTION a(i integer) RETURNS boolean  AS $$
BEGIN
    PERFORM b(); -- b() is is from "nsp" schema
    RETURN true;
END;$$ LANGUAGE plpgsql IMMUTABLE;


4. If I dump such schema using pg_dump, later this dump cannot be restored.
Look the following piece of generated dump:

SET search_path = public, pg_catalog;

COPY table1 (i) FROM stdin;
1
\.

You see, when COPY is executed, data is inserted, and CHECK is called. So,
function a() is called with "public, pg_catalog" search_path.
It is errorous!


Possible solutions:

1. When generating CREATE TABLE dump query, DO NOT include CONSTRAINT ...
CHECK clauses in it. Instead, use ALTER TABLE to add all checks AT THE END
of dump, the same as it is done for foreign keys. I have already offered
this above. Additionally, seems to me it will speed up the dump restoration.

2. Replace "SET search_path = public, pg_catalog" to "SET search_path =
public, pg_catalog, <all other database-dedicated search_pathes>". It's a
worse way, kind a hack.

Reply via email to