]> granicus.if.org Git - postgresql/commitdiff
For REASSIGN OWNED for foreign user mappings
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 11 Dec 2015 21:39:09 +0000 (18:39 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 11 Dec 2015 21:39:09 +0000 (18:39 -0300)
As reported in bug #13809 by Alexander Ashurkov, the code for REASSIGN
OWNED hadn't gotten word about user mappings.  Deal with them in the
same way default ACLs do, which is to ignore them altogether; they are
handled just fine by DROP OWNED.  The other foreign object cases are
already handled correctly by both commands.

Also add a REASSIGN OWNED statement to foreign_data test to exercise the
foreign data objects.  (The changes are just before the "cleanup" phase,
so it shouldn't remove any existing live test.)

Reported by Alexander Ashurkov, then independently by Jaime Casanova.

src/backend/catalog/pg_shdepend.c
src/test/regress/expected/foreign_data.out
src/test/regress/sql/foreign_data.sql

index 1c238e5392ed1c24953a8ec8d191226b70fe02fc..3ecace0986675470e25a41b89b7b26121efa820a 100644 (file)
@@ -43,6 +43,7 @@
 #include "catalog/pg_ts_config.h"
 #include "catalog/pg_ts_dict.h"
 #include "catalog/pg_type.h"
+#include "catalog/pg_user_mapping.h"
 #include "commands/alter.h"
 #include "commands/dbcommands.h"
 #include "commands/collationcmds.h"
@@ -1374,6 +1375,10 @@ shdepReassignOwned(List *roleids, Oid newrole)
                                         */
                                        break;
 
+                               case UserMappingRelationId:
+                                       /* ditto */
+                                       break;
+
                                case ForeignServerRelationId:
                                        AlterForeignServerOwner_oid(sdepForm->objid, newrole);
                                        break;
index 27d04d5151fd3a3bfd2fc6509f41b974185748ee..bef0bd353b8d836132a12a73e0c496da22a38ae8 100644 (file)
@@ -1164,6 +1164,14 @@ ERROR:  foreign table "no_table" does not exist
 DROP FOREIGN TABLE IF EXISTS no_table;
 NOTICE:  foreign table "no_table" does not exist, skipping
 DROP FOREIGN TABLE foreign_schema.foreign_table_1;
+-- REASSIGN OWNED/DROP OWNED of foreign objects
+REASSIGN OWNED BY regress_test_role TO regress_test_role2;
+DROP OWNED BY regress_test_role2;
+ERROR:  cannot drop desired object(s) because other objects depend on them
+DETAIL:  user mapping for regress_test_role on server s5 depends on server s5
+HINT:  Use DROP ... CASCADE to drop the dependent objects too.
+DROP OWNED BY regress_test_role2 CASCADE;
+NOTICE:  drop cascades to user mapping for regress_test_role on server s5
 -- Cleanup
 DROP SCHEMA foreign_schema CASCADE;
 DROP ROLE regress_test_role;                                -- ERROR
@@ -1171,14 +1179,8 @@ ERROR:  role "regress_test_role" cannot be dropped because some objects depend o
 DETAIL:  privileges for server s4
 privileges for foreign-data wrapper foo
 owner of user mapping for regress_test_role on server s6
-owner of user mapping for regress_test_role on server s5
-owner of server s5
-owner of server t2
-DROP SERVER s5 CASCADE;
-NOTICE:  drop cascades to user mapping for regress_test_role on server s5
 DROP SERVER t1 CASCADE;
 NOTICE:  drop cascades to user mapping for public on server t1
-DROP SERVER t2;
 DROP USER MAPPING FOR regress_test_role SERVER s6;
 -- This test causes some order dependent cascade detail output,
 -- so switch to terse mode for it.
index f819eb1b8eb3c9eed49533fd1c287b57fe8632d1..3dcbf0fbbc79cc155e3c750a1d853aa41f5dc2b1 100644 (file)
@@ -475,12 +475,15 @@ DROP FOREIGN TABLE no_table;                                    -- ERROR
 DROP FOREIGN TABLE IF EXISTS no_table;
 DROP FOREIGN TABLE foreign_schema.foreign_table_1;
 
+-- REASSIGN OWNED/DROP OWNED of foreign objects
+REASSIGN OWNED BY regress_test_role TO regress_test_role2;
+DROP OWNED BY regress_test_role2;
+DROP OWNED BY regress_test_role2 CASCADE;
+
 -- Cleanup
 DROP SCHEMA foreign_schema CASCADE;
 DROP ROLE regress_test_role;                                -- ERROR
-DROP SERVER s5 CASCADE;
 DROP SERVER t1 CASCADE;
-DROP SERVER t2;
 DROP USER MAPPING FOR regress_test_role SERVER s6;
 -- This test causes some order dependent cascade detail output,
 -- so switch to terse mode for it.