mirror of
https://github.com/postgres/postgres.git
synced 2025-06-23 14:01:44 +03: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:
@ -3268,15 +3268,22 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Avoid dumping the public schema, as it will already be created ...
|
* 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
|
* unless we are using --clean mode (and *not* --create mode), in which
|
||||||
* we'd better recreate it. Likewise for its comment, if any.
|
* 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 &&
|
if (strcmp(te->desc, "SCHEMA") == 0 &&
|
||||||
strcmp(te->tag, "public") == 0)
|
strcmp(te->tag, "public") == 0)
|
||||||
return;
|
return;
|
||||||
/* The comment restore would require super-user privs, so avoid it. */
|
|
||||||
if (strcmp(te->desc, "COMMENT") == 0 &&
|
if (strcmp(te->desc, "COMMENT") == 0 &&
|
||||||
strcmp(te->tag, "SCHEMA public") == 0)
|
strcmp(te->tag, "SCHEMA public") == 0)
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user