]> 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:32 +0000 (19:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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");
        }