From 27b33245a5f505794a0e8dd4cdb9342f8cf2cc0a Mon Sep 17 00:00:00 2001
From: Kevin Grittner <kgrittn@postgresql.org>
Date: Sat, 30 Nov 2013 11:33:54 -0600
Subject: [PATCH] Fix pg_dumpall to work for databases flagged as read-only.

pg_dumpall's charter is to be able to recreate a database cluster's
contents in a virgin installation, but it was failing to honor that
contract if the cluster had any ALTER DATABASE SET
default_transaction_read_only settings.  By including a SET command
for the connection for each connection opened by pg_dumpall output,
errors are avoided and the source cluster is successfully
recreated.

There was discussion of whether to also set this for the connection
applying pg_dump output, but it was felt that it was both less
appropriate in that context, and far easier to work around.

Backpatch to all supported branches.
---
 src/bin/pg_dump/pg_dumpall.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index 5ed8ca1339c..8dd17f70fae 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -448,6 +448,9 @@ main(int argc, char *argv[])
 	 * database we're connected to at the moment is fine.
 	 */
 
+	/* Restore will need to write to the target cluster */
+	fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
 	/* Replicate encoding and std_strings in output */
 	fprintf(OPF, "SET client_encoding = '%s';\n",
 			pg_encoding_to_char(encoding));
@@ -1586,6 +1589,17 @@ dumpDatabases(PGconn *conn)
 
 		fprintf(OPF, "\\connect %s\n\n", fmtId(dbname));
 
+		/*
+		 * Restore will need to write to the target cluster.  This connection
+		 * setting is emitted for pg_dumpall rather than in the code also used
+		 * by pg_dump, so that a cluster with databases or users which have
+		 * this flag turned on can still be replicated through pg_dumpall
+		 * without editing the file or stream.  With pg_dump there are many
+		 * other ways to allow the file to be used, and leaving it out allows
+		 * users to protect databases from being accidental restore targets.
+		 */
+		fprintf(OPF, "SET default_transaction_read_only = off;\n\n");
+
 		if (filename)
 			fclose(OPF);
 
-- 
GitLab