BUG #5857: pg_restore --clean dropping type too soon

Started by Stuart Bishopabout 15 years ago3 messagesbugs
Jump to latest
#1Stuart Bishop
stuart@stuartbishop.net

The following bug has been logged online:

Bug reference: 5857
Logged by: Stuart Bishop
Email address: stuart@stuartbishop.net
PostgreSQL version: 8.4.6
Operating system: Ubuntu 10.10
Description: pg_restore --clean dropping type too soon
Details:

"pg_restore --clean" appears to have an ordering problem, where a custom
type is being dropped before some functions that use that custom type as a
parameter, which fails.

$ psql -d foo -f /usr/share/postgresql/8.4/contrib/debversion.sql >
/dev/null
psql:/usr/share/postgresql/8.4/contrib/debversion.sql:28: NOTICE: return
type debversion is only a shell
psql:/usr/share/postgresql/8.4/contrib/debversion.sql:34: NOTICE: argument
type debversion is only a shell
psql:/usr/share/postgresql/8.4/contrib/debversion.sql:40: NOTICE: return
type debversion is only a shell
psql:/usr/share/postgresql/8.4/contrib/debversion.sql:46: NOTICE: argument
type debversion is only a shell

$ pg_dump --format=c foo | pg_restore --clean | grep debversion
[...]
DROP FUNCTION public.debversion(character);
DROP TYPE public.debversion CASCADE;
DROP FUNCTION public.debversionsend(debversion);
[...]

The relevant part of debversion.sql seems to be:

CREATE TYPE debversion;

CREATE OR REPLACE FUNCTION debversionin(cstring)
RETURNS debversion
AS 'textin'
LANGUAGE 'internal'
IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION debversionout(debversion)
RETURNS cstring
AS 'textout'
LANGUAGE 'internal'
IMMUTABLE STRICT;

CREATE OR REPLACE FUNCTION debversionrecv(internal)
RETURNS debversion
AS 'textrecv'
LANGUAGE 'internal'
STABLE STRICT;

CREATE OR REPLACE FUNCTION debversionsend(debversion)
RETURNS bytea
AS 'textsend'
LANGUAGE 'internal'
STABLE STRICT;

CREATE TYPE debversion (
LIKE = text,
INPUT = debversionin,
OUTPUT = debversionout,
RECEIVE = debversionrecv,
SEND = debversionsend,
-- make it a non-preferred member of string type category
CATEGORY = 'S',
PREFERRED = false
);

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Stuart Bishop (#1)
Re: BUG #5857: pg_restore --clean dropping type too soon

"Stuart Bishop" <stuart@stuartbishop.net> writes:

"pg_restore --clean" appears to have an ordering problem, where a custom
type is being dropped before some functions that use that custom type as a
parameter, which fails.

It's always worked that way, and is difficult to avoid because of the
circular dependencies between a type and its I/O functions. If we were
to suppress the DROP FUNCTION commands for the I/O functions, we could
have a non-cosmetic failure: suppose the functions have been created
in the target DB, but not the type itself? Then the DROP TYPE CASCADE
wouldn't remove the functions, and we'd have a conflict when the script
tries to create them again.

I don't think anyone's ever felt that it was essential for --clean to
not produce any "no such object" errors, since in general you'd get some
of those anyway unless the target DB exactly matches the source. Maybe
an appropriate response is to document that this is expected.

regards, tom lane

#3Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#2)
Re: BUG #5857: pg_restore --clean dropping type too soon

Tom Lane wrote:

"Stuart Bishop" <stuart@stuartbishop.net> writes:

"pg_restore --clean" appears to have an ordering problem, where a custom
type is being dropped before some functions that use that custom type as a
parameter, which fails.

It's always worked that way, and is difficult to avoid because of the
circular dependencies between a type and its I/O functions. If we were
to suppress the DROP FUNCTION commands for the I/O functions, we could
have a non-cosmetic failure: suppose the functions have been created
in the target DB, but not the type itself? Then the DROP TYPE CASCADE
wouldn't remove the functions, and we'd have a conflict when the script
tries to create them again.

I don't think anyone's ever felt that it was essential for --clean to
not produce any "no such object" errors, since in general you'd get some
of those anyway unless the target DB exactly matches the source. Maybe
an appropriate response is to document that this is expected.

Applied doc patch attached.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ It's impossible for everything to be true. +

Attachments:

/rtmp/restore.difftext/x-diffDownload+2-1