diff --git a/scripts-available/CDB_ForeignTable.sql b/scripts-available/CDB_ForeignTable.sql index b66fa8c..ae3a5ea 100644 --- a/scripts-available/CDB_ForeignTable.sql +++ b/scripts-available/CDB_ForeignTable.sql @@ -266,18 +266,26 @@ $$ LANGUAGE plpgsql VOLATILE PARALLEL UNSAFE; -- SELECT cartodb.CDB_Drop_User_PG_FDW_Server('amazon') -- -- Note: if there's any dependent object (i.e. foreign table) this call will fail -CREATE OR REPLACE FUNCTION @extschema@._CDB_Drop_User_PG_FDW_Server(fdw_input_name NAME) +CREATE OR REPLACE FUNCTION @extschema@._CDB_Drop_User_PG_FDW_Server(fdw_input_name NAME, force boolean = false) RETURNS void AS $$ DECLARE fdw_objects_name NAME := @extschema@.__CDB_User_FDW_Object_Names(fdw_input_name); + cascade_clause NAME; BEGIN - EXECUTE FORMAT ('DROP SCHEMA %I', fdw_objects_name); + CASE force + WHEN true THEN + cascade_clause := 'CASCADE'; + ELSE + cascade_clause := 'RESTRICT'; + END CASE; + + EXECUTE FORMAT ('DROP SCHEMA %I %s', fdw_objects_name, cascade_clause); RAISE NOTICE 'Dropped schema %', fdw_objects_name; EXECUTE FORMAT ('DROP USER MAPPING FOR public SERVER %I', fdw_objects_name); RAISE NOTICE 'Dropped user mapping for server %', fdw_objects_name; - EXECUTE FORMAT ('DROP SERVER %I', fdw_objects_name); + EXECUTE FORMAT ('DROP SERVER %I %s', fdw_objects_name, cascade_clause); RAISE NOTICE 'Dropped foreign server %', fdw_objects_name; - EXECUTE FORMAT ('REVOKE USAGE ON FOREIGN DATA WRAPPER postgres_fdw FROM %I', fdw_objects_name); + EXECUTE FORMAT ('REVOKE USAGE ON FOREIGN DATA WRAPPER postgres_fdw FROM %I %s', fdw_objects_name, cascade_clause); RAISE NOTICE 'Revoked usage on postgres_fdw from %', fdw_objects_name; EXECUTE FORMAT ('DROP ROLE %I', fdw_objects_name); RAISE NOTICE 'Dropped role %', fdw_objects_name; diff --git a/test/extension/test.sh b/test/extension/test.sh index d506a91..73491ec 100755 --- a/test/extension/test.sh +++ b/test/extension/test.sh @@ -645,6 +645,12 @@ EOF sql cdb_testmember_1 'DROP FOREIGN TABLE "cdb_fdw_user-defined-test".foo;' sql postgres "SELECT cartodb._CDB_Drop_User_PG_FDW_Server('user-defined-test')" + # But if there are, we can set the force flag to true to drop everything (defaults to false) + sql postgres "SELECT cartodb._CDB_SetUp_User_PG_FDW_Server('another_user_defined_test', '$ufdw_config');" + sql postgres 'GRANT cdb_fdw_another_user_defined_test TO cdb_testmember_1 WITH ADMIN OPTION;' + sql cdb_testmember_1 "SELECT cartodb.CDB_SetUp_User_PG_FDW_Table('another_user_defined_test', 'test_fdw', 'foo');" + sql postgres "SELECT cartodb._CDB_Drop_User_PG_FDW_Server('another_user_defined_test', /* force = */ true)" + # Teardown DATABASE=fdw_target sql postgres 'REVOKE USAGE ON SCHEMA test_fdw FROM fdw_user;'