From 5ad7d65da4499f82b9820c80fa12b6b9fe61d293 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Thu, 22 Jan 2004 19:09:32 +0000 Subject: [PATCH] Fix incorrect dumping of database LOCATION from 7.0.* servers. Per report from Mattias Kregert. --- src/bin/pg_dump/pg_dump.c | 11 +++++++++-- src/bin/pg_dump/pg_dumpall.c | 12 ++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 81473bfa084..a6c8997c394 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -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); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 4ee77b844f2..f15ddc206dc 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -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"); } -- GitLab