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");
    }