From a72d613b4c91462d9405c4e1b05c42d33013c333 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 9 Aug 2023 08:56:05 +0900 Subject: [PATCH] Fix pg_dumpall with in-place tablespaces In-place tablespaces would be dumped with the path produced by pg_tablespace_location(), which is in this case a relative path built as pg_tblspc/OID, but this would fail to restore as such tablespaces need to use an empty string as location. In order to detect if an in-place tablespace is used, this commit checks if the path returned is relative and adapts the dump contents in consequence. Like the other changes related to in-place tablespaces, no backpatch is done as these are only intended for development purposes. Rui Zhao has fixed the code, while the test is from me. Author: Rui Zhao, Michael Paquier Discussion: https://postgr.es/m/80c80b4a-b87b-456f-bd46-1ae326601d79.xiyuan.zr@alibaba-inc.com --- src/bin/pg_dump/pg_dumpall.c | 11 ++++++++++- src/bin/pg_dump/t/002_pg_dump.pl | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 0ab52ca81d..e2a9733d34 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -1286,7 +1286,16 @@ dumpTablespaces(PGconn *conn) appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner)); appendPQExpBufferStr(buf, " LOCATION "); - appendStringLiteralConn(buf, spclocation, conn); + + /* + * In-place tablespaces use a relative path, and need to be dumped + * with an empty string as location. + */ + if (is_absolute_path(spclocation)) + appendStringLiteralConn(buf, spclocation, conn); + else + appendStringLiteralConn(buf, "", conn); + appendPQExpBufferStr(buf, ";\n"); if (spcoptions && spcoptions[0] != '\0') diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 0efeb3367d..6ad8310287 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -1907,6 +1907,22 @@ my %tests = ( }, }, + 'CREATE TABLESPACE regress_dump_tablespace' => { + create_order => 2, + create_sql => q( + SET allow_in_place_tablespaces = on; + CREATE TABLESPACE regress_dump_tablespace + OWNER regress_dump_test_role LOCATION ''), + regexp => + qr/^CREATE TABLESPACE regress_dump_tablespace OWNER regress_dump_test_role LOCATION '';/m, + like => { + pg_dumpall_dbprivs => 1, + pg_dumpall_exclude => 1, + pg_dumpall_globals => 1, + pg_dumpall_globals_clean => 1, + }, + }, + 'CREATE DATABASE regression_invalid...' => { create_order => 1, create_sql => q(