From cac0d6922f88a368dd1afa3b0933512f32d1a977 Mon Sep 17 00:00:00 2001
From: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date: Tue, 15 May 2007 20:20:29 +0000
Subject: [PATCH] Avoid emitting empty role names in the GRANTED BY clause of
 GRANT ROLE when the grantor has been dropped.  This is a workaround for the
 fact that we don't track the grantor as a shared dependency.

---
 src/bin/pg_dump/pg_dumpall.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index bd94e19cd1f..e1d5a775572 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.69.2.1 2006/04/07 21:26:42 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.69.2.2 2007/05/15 20:20:29 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -555,8 +555,8 @@ dumpRoleMembership(PGconn *conn)
 
 	res = executeQuery(conn, "SELECT ur.rolname AS roleid, "
 					   "um.rolname AS member, "
-					   "ug.rolname AS grantor, "
-					   "a.admin_option "
+					   "a.admin_option, "
+					   "ug.rolname AS grantor "
 					   "FROM pg_auth_members a "
 					   "LEFT JOIN pg_authid ur on ur.oid = a.roleid "
 					   "LEFT JOIN pg_authid um on um.oid = a.member "
@@ -570,14 +570,24 @@ dumpRoleMembership(PGconn *conn)
 	{
 		char	   *roleid = PQgetvalue(res, i, 0);
 		char	   *member = PQgetvalue(res, i, 1);
-		char	   *grantor = PQgetvalue(res, i, 2);
-		char	   *option = PQgetvalue(res, i, 3);
+		char	   *option = PQgetvalue(res, i, 2);
 
 		printf("GRANT %s", fmtId(roleid));
 		printf(" TO %s", fmtId(member));
 		if (*option == 't')
 			printf(" WITH ADMIN OPTION");
-		printf(" GRANTED BY %s;\n", fmtId(grantor));
+
+		/*
+		 * We don't track the grantor very carefully in the backend, so cope
+		 * with the possibility that it has been dropped.
+		 */
+		if (!PQgetisnull(res, i, 3))
+		{
+			char	*grantor = PQgetvalue(res, i, 3);
+
+			printf(" GRANTED BY %s", fmtId(grantor));
+		}
+		printf(";\n");
 	}
 
 	PQclear(res);