mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-01 19:45:33 +08:00
Fix pg_dump's handling of public schema with both -c and -C options.
Since -c plus -C requests dropping and recreating the target database
as a whole, not dropping individual objects in it, we should assume that
the public schema already exists and need not be created. The previous
coding considered only the state of the -c option, so it would emit
"CREATE SCHEMA public" anyway, leading to an unexpected error in restore.
Back-patch to 9.2. Older versions did not accept -c with -C so the
issue doesn't arise there. (The logic being patched here dates to 8.0,
cf commit 2193121fa
, so it's not really wrong that it didn't consider
the case at the time.)
Note that versions before 9.6 will still attempt to emit REVOKE/GRANT
on the public schema; but that happens without -c/-C too, and doesn't
seem to be the focus of this complaint. I considered extending this
stanza to also skip the public schema's ACL, but that would be a
misfeature, as it'd break cases where users intentionally changed that
ACL. The real fix for this aspect is Stephen Frost's work to not dump
built-in ACLs, and that's not going to get back-ported.
Per bugs #13804 and #14271. Solution found by David Johnston and later
rediscovered by me.
Report: <20151207163520.2628.95990@wrigleys.postgresql.org>
Report: <20160801021955.1430.47434@wrigleys.postgresql.org>
This commit is contained in:
parent
3ca359426c
commit
6693c9d7bf
@ -3008,15 +3008,22 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, RestoreOptions *ropt, bool isDat
|
||||
|
||||
/*
|
||||
* Avoid dumping the public schema, as it will already be created ...
|
||||
* unless we are using --clean mode, in which case it's been deleted and
|
||||
* we'd better recreate it. Likewise for its comment, if any.
|
||||
* unless we are using --clean mode (and *not* --create mode), in which
|
||||
* case we've previously issued a DROP for it so we'd better recreate it.
|
||||
*
|
||||
* Likewise for its comment, if any. (We could try issuing the COMMENT
|
||||
* command anyway; but it'd fail if the restore is done as non-super-user,
|
||||
* so let's not.)
|
||||
*
|
||||
* XXX it looks pretty ugly to hard-wire the public schema like this, but
|
||||
* it sits in a sort of no-mans-land between being a system object and a
|
||||
* user object, so it really is special in a way.
|
||||
*/
|
||||
if (!ropt->dropSchema)
|
||||
if (!(ropt->dropSchema && !ropt->createDB))
|
||||
{
|
||||
if (strcmp(te->desc, "SCHEMA") == 0 &&
|
||||
strcmp(te->tag, "public") == 0)
|
||||
return;
|
||||
/* The comment restore would require super-user privs, so avoid it. */
|
||||
if (strcmp(te->desc, "COMMENT") == 0 &&
|
||||
strcmp(te->tag, "SCHEMA public") == 0)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user