]> granicus.if.org Git - postgresql/commitdiff
Fix incorrect dumping of database LOCATION from 7.0.* servers.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 22 Jan 2004 19:09:48 +0000 (19:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 22 Jan 2004 19:09:48 +0000 (19:09 +0000)
Per report from Mattias Kregert.

src/bin/pg_dump/pg_dump.c
src/bin/pg_dump/pg_dumpall.c

index 686102f85674c7aa691fee815b6847ff0af289b1..3b9133ed6ad0fd11f4b729a70c3bdee899946644 100644 (file)
@@ -12,7 +12,7 @@
  *     by PostgreSQL
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.355.2.1 2003/12/19 14:21:43 petere Exp $
+ *       $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.355.2.2 2004/01/22 19:09:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1144,11 +1144,33 @@ dumpDatabase(Archive *AH)
        selectSourceSchema("pg_catalog");
 
        /* Get the database owner and parameters from pg_database */
-       appendPQExpBuffer(dbQry, "select (select usename from pg_user where usesysid = datdba) as dba,"
-                                         " pg_encoding_to_char(encoding) as encoding,"
-                                         " datpath from pg_database"
-                                         " where datname = ");
-       appendStringLiteral(dbQry, datname, true);
+       if (g_fout->remoteVersion >= 70100)
+       {
+               appendPQExpBuffer(dbQry, "SELECT "
+                                                 "(SELECT usename FROM pg_user WHERE usesysid = datdba) as dba, "
+                                                 "pg_encoding_to_char(encoding) as encoding, "
+                                                 "datpath "
+                                                 "FROM pg_database "
+                                                 "WHERE datname = ");
+               appendStringLiteral(dbQry, datname, true);
+       }
+       else
+       {
+               /*
+                * In 7.0, datpath is either the same as datname, or the user-given
+                * location with "/" and the datname appended.  We must strip this
+                * junk off to produce a correct LOCATION value.
+                */
+               appendPQExpBuffer(dbQry, "SELECT "
+                                                 "(SELECT usename FROM pg_user WHERE usesysid = datdba) as dba, "
+                                                 "pg_encoding_to_char(encoding) as encoding, "
+                                                 "CASE WHEN length(datpath) > length(datname) THEN "
+                                                 "substr(datpath,1,length(datpath)-length(datname)-1) "
+                                                 "ELSE '' END as datpath "
+                                                 "FROM pg_database "
+                                                 "WHERE datname = ");
+               appendStringLiteral(dbQry, datname, true);
+       }
 
        res = PQexec(g_conn, dbQry->data);
        if (!res ||
index e0853690f87a5d1d940585de0732d6769e7b0d79..760db0ac4d8030315f361fea5f5b4ee16bd8e2fa 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.28 2003/09/23 22:48:53 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.28.2.1 2004/01/22 19:09:48 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -430,6 +430,10 @@ dumpCreateDB(PGconn *conn)
        else
        {
                /*
+                * In 7.0, datpath is either the same as datname, or the user-given
+                * location with "/" and the datname appended.  We must strip this
+                * junk off to produce a correct LOCATION value.
+                *
                 * Note: 7.0 fails to cope with sub-select in COALESCE, so just
                 * deal with getting a NULL by not printing any OWNER clause.
                 */
@@ -437,7 +441,11 @@ dumpCreateDB(PGconn *conn)
                                                   "SELECT datname, "
                                "(select usename from pg_shadow where usesysid=datdba), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "'f' as datistemplate, datpath, '' as datacl "
+                                                  "'f' as datistemplate, "
+                                                  "CASE WHEN length(datpath) > length(datname) THEN "
+                                                  "substr(datpath,1,length(datpath)-length(datname)-1) "
+                                                  "ELSE '' END as datpath, "
+                                                  "'' as datacl "
                                                   "FROM pg_database d "
                                                   "ORDER BY 1");
        }