pg_dump: Fix some schema issues when dumping sequences
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 24 Jan 2017 22:03:56 +0000 (17:03 -0500)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 24 Jan 2017 22:19:55 +0000 (17:19 -0500)
In the new code for selecting sequence data from pg_sequence, set the
schema to pg_catalog instead of the sequences own schema, and refer to
the sequence by OID instead of name, which was missing a schema
qualification.

Reported-by: Stephen Frost <sfrost@snowman.net>
src/bin/pg_dump/pg_dump.c

index e3cca62bf7280b53844af99dc87228b60a5f3f9e..a6de9d7bc21602a374272148c133e89eb748c06a 100644 (file)
@@ -15873,14 +15873,14 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
    PQExpBuffer delqry = createPQExpBuffer();
    PQExpBuffer labelq = createPQExpBuffer();
 
-   /* Make sure we are in proper schema */
-   selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
-
    snprintf(bufm, sizeof(bufm), INT64_FORMAT, PG_INT64_MIN);
    snprintf(bufx, sizeof(bufx), INT64_FORMAT, PG_INT64_MAX);
 
    if (fout->remoteVersion >= 100000)
    {
+       /* Make sure we are in proper schema */
+       selectSourceSchema(fout, "pg_catalog");
+
        appendPQExpBuffer(query,
                          "SELECT seqstart, seqincrement, "
                          "CASE WHEN seqincrement > 0 AND seqmax = %s THEN NULL "
@@ -15894,12 +15894,20 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
                          "seqcache, seqcycle "
                          "FROM pg_class c "
                          "JOIN pg_sequence s ON (s.seqrelid = c.oid) "
-                         "WHERE relname = ",
-                         bufx, bufm);
-       appendStringLiteralAH(query, tbinfo->dobj.name, fout);
+                         "WHERE c.oid = '%u'::oid",
+                         bufx, bufm,
+                         tbinfo->dobj.catId.oid);
    }
    else if (fout->remoteVersion >= 80400)
    {
+       /*
+        * Before PostgreSQL 10, sequence metadata is in the sequence itself,
+        * so switch to the sequence's schema instead of pg_catalog.
+        */
+
+       /* Make sure we are in proper schema */
+       selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
+
        appendPQExpBuffer(query,
                          "SELECT start_value, increment_by, "
                   "CASE WHEN increment_by > 0 AND max_value = %s THEN NULL "
@@ -15916,6 +15924,9 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
    }
    else
    {
+       /* Make sure we are in proper schema */
+       selectSourceSchema(fout, tbinfo->dobj.namespace->dobj.name);
+
        appendPQExpBuffer(query,
                          "SELECT 0 AS start_value, increment_by, "
                   "CASE WHEN increment_by > 0 AND max_value = %s THEN NULL "