]> granicus.if.org Git - postgresql/commitdiff
Do not require 'public' to exist for pg_dump -c
authorStephen Frost <sfrost@snowman.net>
Wed, 28 Jun 2017 14:34:01 +0000 (10:34 -0400)
committerStephen Frost <sfrost@snowman.net>
Wed, 28 Jun 2017 14:34:01 +0000 (10:34 -0400)
Commit 330b84d8c4 didn't contemplate the case where the public schema
has been dropped and introduced a query which fails when there is no
public schema into pg_dump (when used with -c).

Adjust the query used by pg_dump to handle the case where the public
schema doesn't exist and add tests to check that such a case no longer
fails.

Back-patch the specific fix to 9.6, as the prior commit was.

Adding tests for this case involved adding support to the pg_dump
TAP tests to work with multiple databases, which, while not a large
change, is a bit much to back-patch, so that's only done in master.

Addresses bug #14650
Discussion: https://www.postgresql.org/message-id/20170512181801.1795.47483%40wrigleys.postgresql.org

src/bin/pg_dump/pg_dump.c

index 27a2a0c0a521c6abbca5ff24c6e183a1a74e7167..d1db3702beaff1b93e86af590f7019b924de5e6c 100644 (file)
@@ -3659,9 +3659,14 @@ getNamespaces(Archive *fout, int *numNamespaces)
                 * essentially a no-op because the new public schema won't have an
                 * entry in pg_init_privs anyway, as the entry will be removed when
                 * the public schema is dropped.
+                *
+                * Further, we have to handle the case where the public schema does
+                * not exist at all.
                 */
                if (dopt->outputClean)
-                       appendPQExpBuffer(query," AND pip.objoid <> 'public'::regnamespace");
+                       appendPQExpBuffer(query," AND pip.objoid <> "
+                                                                       "coalesce((select oid from pg_namespace "
+                                                                       "where nspname = 'public'),0)");
 
                appendPQExpBuffer(query,") ");