From 42097594aa45ed1012e710adcc895b84c4b13407 Mon Sep 17 00:00:00 2001
From: Shigeru Hanada <hanada@metrosystems.co.jp>
Date: Mon, 4 Apr 2011 19:32:02 +0900
Subject: [PATCH 4/5] Fix pg_dump to dump COMMENT ON USER MAPPING statements.

---
 src/bin/pg_dump/pg_dump.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 90cb9ab..925c4c0 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -11197,16 +11197,21 @@ dumpUserMappings(Archive *fout,
 	PQExpBuffer delq;
 	PQExpBuffer query;
 	PQExpBuffer tag;
+	PQExpBuffer label;
 	PGresult   *res;
 	int			ntups;
+	int			i_tableoid;
+	int			i_umid;
 	int			i_usename;
 	int			i_umoptions;
 	int			i;
+	CatalogId	catId;
 
 	q = createPQExpBuffer();
 	tag = createPQExpBuffer();
 	delq = createPQExpBuffer();
 	query = createPQExpBuffer();
+	label = createPQExpBuffer();
 
 	/*
 	 * We read from the publicly accessible view pg_user_mappings, so as not
@@ -11218,8 +11223,11 @@ dumpUserMappings(Archive *fout,
 	 */
 	selectSourceSchema("pg_catalog");
 
+	resetPQExpBuffer(query);
 	appendPQExpBuffer(query,
-					  "SELECT usename, "
+					  "SELECT 'pg_catalog.pg_user_mapping'::pg_catalog.regclass::oid AS tableoid, "
+					  "umid, "
+					  "usename, "
 					  "array_to_string(ARRAY(SELECT option_name || ' ' || quote_literal(option_value) FROM pg_options_to_table(umoptions)), ', ') AS umoptions\n"
 					  "FROM pg_user_mappings "
 					  "WHERE srvid = %u",
@@ -11229,6 +11237,8 @@ dumpUserMappings(Archive *fout,
 	check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK);
 
 	ntups = PQntuples(res);
+	i_tableoid = PQfnumber(res, "tableoid");
+	i_umid = PQfnumber(res, "umid");
 	i_usename = PQfnumber(res, "usename");
 	i_umoptions = PQfnumber(res, "umoptions");
 
@@ -11237,12 +11247,17 @@ dumpUserMappings(Archive *fout,
 		char	   *usename;
 		char	   *umoptions;
 
+		catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
+		catId.oid = atooid(PQgetvalue(res, i, i_umid));
 		usename = PQgetvalue(res, i, i_usename);
 		umoptions = PQgetvalue(res, i, i_umoptions);
 
+		resetPQExpBuffer(label);
+		appendPQExpBuffer(label, "USER MAPPING FOR %s", fmtId(usename));
+		appendPQExpBuffer(label, " SERVER %s", fmtId(servername));
+
 		resetPQExpBuffer(q);
-		appendPQExpBuffer(q, "CREATE USER MAPPING FOR %s", fmtId(usename));
-		appendPQExpBuffer(q, " SERVER %s", fmtId(servername));
+		appendPQExpBuffer(q, "CREATE %s", label->data);
 
 		if (umoptions && strlen(umoptions) > 0)
 			appendPQExpBuffer(q, " OPTIONS (%s)", umoptions);
@@ -11250,8 +11265,7 @@ dumpUserMappings(Archive *fout,
 		appendPQExpBuffer(q, ";\n");
 
 		resetPQExpBuffer(delq);
-		appendPQExpBuffer(delq, "DROP USER MAPPING FOR %s", fmtId(usename));
-		appendPQExpBuffer(delq, " SERVER %s;\n", fmtId(servername));
+		appendPQExpBuffer(delq, "DROP %s", label->data);
 
 		resetPQExpBuffer(tag);
 		appendPQExpBuffer(tag, "USER MAPPING %s SERVER %s",
@@ -11266,10 +11280,14 @@ dumpUserMappings(Archive *fout,
 					 q->data, delq->data, NULL,
 					 &dumpId, 1,
 					 NULL, NULL);
+
+		/* Dump User Mapping Comments */
+		dumpComment(fout, label->data, NULL, owner, catId, 0, dumpId);
 	}
 
 	PQclear(res);
 
+	destroyPQExpBuffer(label);
 	destroyPQExpBuffer(query);
 	destroyPQExpBuffer(delq);
 	destroyPQExpBuffer(q);
-- 
1.7.3

