Fix incorrect dumping of database LOCATION from 7.0.* servers.
authorTom Lane
Thu, 22 Jan 2004 19:09:32 +0000 (19:09 +0000)
committerTom Lane
Thu, 22 Jan 2004 19:09:32 +0000 (19:09 +0000)
Per report from Mattias Kregert.

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

index 81473bfa0846f897cbebc7e104e6b264855961b6..a6c8997c3943c7e59cf27d217670148352f5b370 100644 (file)
@@ -12,7 +12,7 @@
  * by PostgreSQL
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.362 2004/01/07 00:44:21 tgl Exp $
+ *   $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.363 2004/01/22 19:09:32 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1149,12 +1149,19 @@ dumpDatabase(Archive *AH)
    }
    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 oid FROM pg_class WHERE relname = 'pg_database') AS tableoid, "
                          "oid, "
                          "(SELECT usename FROM pg_user WHERE usesysid = datdba) as dba, "
                          "pg_encoding_to_char(encoding) as encoding, "
-                         "datpath "
+                         "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);
index 4ee77b844f2abb4b8990690b7dc65e751d012188..f15ddc206dcfc25d25ee3ac0546b3d2844693e6a 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.29 2003/11/29 19:52:05 pgsql Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.30 2004/01/22 19:09:32 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");
    }