On Thu, Sep 3, 2015 at 01:03:30PM +0200, Andres Freund wrote: > Hi Bruce, > > Are you actually waiting for review in this thread? Or is the CF entry > more of a reminder?
Oh, I have a commit-fest entry for this? Well, whoever did that was doing the right thing so things are not forgotten. Yeah! :-) Anyway, I was going to work on this once I had read my email backlog, but because of the commit-fest entry, I worked on it today instead. I have developed the attached patch which fixes the pg_upgrade problem, and the pg_dumpall problem with postgres and template1 in non-default tablespaces. I modified the pg_dumpall patch with the following changes: * It is a general pg_dumpall bug, not specific to binary upgrade mode, so the new code will be used in non-binary upgrade mode too. * I hard-coded the "connect template1" string, as it is a constant (no need for %s and fmtId()). * You can't mix fprintf() and appendPQExpBuffer() and get the output in the specified order, i.e. fprintf will come out first. Now, in your case, it didn't matter, but it isn't clean either. * I wanted the original database connection to be restored right after the switch. The new output looks like this: \connect postgres ALTER DATABASE template1 SET TABLESPACE tt; \connect template1 Based on our previous policy, these are both bugs and cause either errors or inaccurate restores, so I plan to apply the attached patch to all back branches. -- Bruce Momjian <br...@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com + Everyone has their own god. +
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c new file mode 100644 index c4b6ae8..a597304 *** a/src/bin/pg_dump/pg_dumpall.c --- b/src/bin/pg_dump/pg_dumpall.c *************** dumpCreateDB(PGconn *conn) *** 1412,1417 **** --- 1412,1435 ---- appendPQExpBufferStr(buf, ";\n"); } + else if (strcmp(dbtablespace, "pg_default") != 0 && !no_tablespaces) + { + /* + * Cannot change tablespace of the database we're connected to. + * To move "postgres" to another tablespace, we connect to + * "template1" and vice versa. + */ + if (strcmp(dbname, "postgres") == 0) + appendPQExpBuffer(buf, "\\connect template1\n"); + else + appendPQExpBuffer(buf, "\\connect postgres\n"); + + appendPQExpBuffer(buf, "ALTER DATABASE %s SET TABLESPACE %s;\n", + fdbname, fmtId(dbtablespace)); + + /* connect to original database */ + appendPQExpBuffer(buf, "\\connect %s\n", fdbname); + } if (binary_upgrade) { diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c new file mode 100644 index e158c9f..390fc62 *** a/src/bin/pg_upgrade/info.c --- b/src/bin/pg_upgrade/info.c *************** create_rel_filename_map(const char *old_ *** 140,145 **** --- 140,146 ---- const RelInfo *old_rel, const RelInfo *new_rel, FileNameMap *map) { + /* Someday the old/new tablespaces might not match, so handle it. */ if (strlen(old_rel->tablespace) == 0) { /* *************** create_rel_filename_map(const char *old_ *** 147,162 **** * exist in the data directories. */ map->old_tablespace = old_data; - map->new_tablespace = new_data; map->old_tablespace_suffix = "/base"; - map->new_tablespace_suffix = "/base"; } else { /* relation belongs to a tablespace, so use the tablespace location */ map->old_tablespace = old_rel->tablespace; - map->new_tablespace = new_rel->tablespace; map->old_tablespace_suffix = old_cluster.tablespace_suffix; map->new_tablespace_suffix = new_cluster.tablespace_suffix; } --- 148,171 ---- * exist in the data directories. */ map->old_tablespace = old_data; map->old_tablespace_suffix = "/base"; } else { /* relation belongs to a tablespace, so use the tablespace location */ map->old_tablespace = old_rel->tablespace; map->old_tablespace_suffix = old_cluster.tablespace_suffix; + } + + /* Do the same for new tablespaces */ + if (strlen(new_rel->tablespace) == 0) + { + map->new_tablespace = new_data; + map->new_tablespace_suffix = "/base"; + } + else + { + map->new_tablespace = new_rel->tablespace; map->new_tablespace_suffix = new_cluster.tablespace_suffix; }
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers