Fix pg_dumpall to do the right thing with "postgres" database, per
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jun 2005 15:22:18 +0000 (15:22 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Jun 2005 15:22:18 +0000 (15:22 +0000)
Dave Page.  Also, cause it to emit rather than ignore any ACL and
datconfig options that may be set for these two databases.

src/bin/pg_dump/pg_dumpall.c

index 0ed8b921b892858e1ea4541cebab642cec4507dd..75158a58bfaa556f50159476c5a153986a87ed89 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.60 2005/06/21 04:02:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.61 2005/06/21 15:22:18 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -303,7 +303,7 @@ main(int argc, char *argv[])
    if (verbose)
        dumpTimestamp("Started on");
 
-   printf("\\connect \"postgres\"\n\n");
+   printf("\\connect postgres\n\n");
 
    if (!data_only)
    {
@@ -661,40 +661,43 @@ dumpCreateDB(PGconn *conn)
        char       *dbtablespace = PQgetvalue(res, i, 5);
        char       *fdbname;
 
-       if (strcmp(dbname, "template1") == 0)
-           continue;
-
        buf = createPQExpBuffer();
-
-       /* needed for buildACLCommands() */
        fdbname = strdup(fmtId(dbname));
 
-       if (output_clean)
-           appendPQExpBuffer(buf, "DROP DATABASE %s;\n", fdbname);
-
-       appendPQExpBuffer(buf, "CREATE DATABASE %s", fdbname);
+       /*
+        * Skip the CREATE DATABASE commands for "template1" and "postgres",
+        * since they are presumably already there in the destination cluster.
+        * We do want to emit their ACLs and config options if any, however.
+        */
+       if (strcmp(dbname, "template1") != 0 &&
+           strcmp(dbname, "postgres") != 0)
+       {
+           if (output_clean)
+               appendPQExpBuffer(buf, "DROP DATABASE %s;\n", fdbname);
 
-       appendPQExpBuffer(buf, " WITH TEMPLATE = template0");
+           appendPQExpBuffer(buf, "CREATE DATABASE %s", fdbname);
 
-       if (strlen(dbowner) != 0)
-           appendPQExpBuffer(buf, " OWNER = %s",
-                             fmtId(dbowner));
+           appendPQExpBuffer(buf, " WITH TEMPLATE = template0");
 
-       appendPQExpBuffer(buf, " ENCODING = ");
-       appendStringLiteral(buf, dbencoding, true);
+           if (strlen(dbowner) != 0)
+               appendPQExpBuffer(buf, " OWNER = %s", fmtId(dbowner));
 
-       /* Output tablespace if it isn't default */
-       if (strcmp(dbtablespace, "pg_default") != 0)
-           appendPQExpBuffer(buf, " TABLESPACE = %s",
-                             fmtId(dbtablespace));
+           appendPQExpBuffer(buf, " ENCODING = ");
+           appendStringLiteral(buf, dbencoding, true);
 
-       appendPQExpBuffer(buf, ";\n");
+           /* Output tablespace if it isn't default */
+           if (strcmp(dbtablespace, "pg_default") != 0)
+               appendPQExpBuffer(buf, " TABLESPACE = %s",
+                                 fmtId(dbtablespace));
 
-       if (strcmp(dbistemplate, "t") == 0)
-       {
-           appendPQExpBuffer(buf, "UPDATE pg_database SET datistemplate = 't' WHERE datname = ");
-           appendStringLiteral(buf, dbname, true);
            appendPQExpBuffer(buf, ";\n");
+
+           if (strcmp(dbistemplate, "t") == 0)
+           {
+               appendPQExpBuffer(buf, "UPDATE pg_database SET datistemplate = 't' WHERE datname = ");
+               appendStringLiteral(buf, dbname, true);
+               appendPQExpBuffer(buf, ";\n");
+           }
        }
 
        if (!skip_acls &&
@@ -708,11 +711,12 @@ dumpCreateDB(PGconn *conn)
        }
 
        printf("%s", buf->data);
-       destroyPQExpBuffer(buf);
-       free(fdbname);
 
        if (server_version >= 70300)
            dumpDatabaseConfig(conn, dbname);
+
+       destroyPQExpBuffer(buf);
+       free(fdbname);
    }
 
    PQclear(res);