v1-0001-Fix-ordering-of-GRANTs-for-databases-in-pg_dump.patch

application/octet-stream

Filename: v1-0001-Fix-ordering-of-GRANTs-for-databases-in-pg_dump.patch
Type: application/octet-stream
Part: 0
Message: Re: BUG #15788: 'pg_dump --create' orders database GRANTs incorrectly

Patch

Format: format-patch
Series: patch v1-0001
Subject: Fix ordering of GRANTs for databases in pg_dump.
File+
src/bin/pg_dump/pg_dump.c 16 6
From 710647c541514ded39adbc8b100b53d0a0378407 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <bossartn@amazon.com>
Date: Wed, 1 May 2019 23:04:04 +0000
Subject: [PATCH v1 1/1] Fix ordering of GRANTs for databases in pg_dump.

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

diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index db8ca40a78..28e78756a8 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2672,13 +2672,23 @@ dumpDatabase(Archive *fout)
 						  "(%s datdba) AS dba, "
 						  "pg_encoding_to_char(encoding) AS encoding, "
 						  "datcollate, datctype, datfrozenxid, datminmxid, "
-						  "(SELECT array_agg(acl ORDER BY acl::text COLLATE \"C\") FROM ( "
-						  "  SELECT unnest(coalesce(datacl,acldefault('d',datdba))) AS acl "
-						  "  EXCEPT SELECT unnest(acldefault('d',datdba))) as datacls)"
+						  "(SELECT array_agg(acl ORDER BY row_n) FROM "
+						  "(SELECT acl, row_n FROM "
+						  "unnest(coalesce(datacl,acldefault('d',datdba))) "
+						  "WITH ORDINALITY AS perm(acl,row_n) "
+						  "WHERE NOT EXISTS ( "
+						  "SELECT 1 FROM "
+						  "unnest(acldefault('d',datdba)) "
+						  "AS init(init_acl) WHERE acl = init_acl)) as datacls)"
 						  " AS datacl, "
-						  "(SELECT array_agg(acl ORDER BY acl::text COLLATE \"C\") FROM ( "
-						  "  SELECT unnest(acldefault('d',datdba)) AS acl "
-						  "  EXCEPT SELECT unnest(coalesce(datacl,acldefault('d',datdba)))) as rdatacls)"
+						  "(SELECT array_agg(acl ORDER BY row_n) FROM "
+						  "(SELECT acl, row_n FROM "
+						  "unnest(acldefault('d',datdba)) "
+						  "WITH ORDINALITY AS initp(acl,row_n) "
+						  "WHERE NOT EXISTS ( "
+						  "SELECT 1 FROM "
+						  "unnest(coalesce(datacl,acldefault('d',datdba))) "
+						  "AS permp(orig_acl) WHERE acl = orig_acl)) as rdatacls)"
 						  " AS rdatacl, "
 						  "datistemplate, datconnlimit, "
 						  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
-- 
2.16.5