diff --git a/scripts-available/CDB_FederatedServerTables.sql b/scripts-available/CDB_FederatedServerTables.sql index 913fe32..3b02ac9 100644 --- a/scripts-available/CDB_FederatedServerTables.sql +++ b/scripts-available/CDB_FederatedServerTables.sql @@ -185,8 +185,39 @@ DECLARE local_schema name := @extschema@.__CDB_FS_Create_Schema(server_internal, remote_schema); BEGIN EXECUTE FORMAT ('DROP FOREIGN TABLE %I.%I CASCADE;', local_schema, remote_table); - +END +$$ +LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; +CREATE OR REPLACE FUNCTION @extschema@.CDB_Federated_Server_List_Registered_Tables( + server TEXT, + remote_schema TEXT + ) +RETURNS TABLE(remote_name TEXT, local_name TEXT) +AS $$ +DECLARE + server_internal name := @extschema@.__CDB_FS_Generate_Server_Name(input_name := server, check_existence := false); + local_schema name := @extschema@.__CDB_FS_Create_Schema(server_internal, remote_schema); +BEGIN + RETURN QUERY SELECT + source_table::text as remote_table, + format('%I.%I', dependent_schema, dependent_view)::text as local_view + FROM + ( + SELECT DISTINCT + dependent_ns.nspname as dependent_schema, + dependent_view.relname as dependent_view, + source_table.relname as source_table + FROM pg_depend + JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid + JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid + JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid + JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace + JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace + WHERE + source_ns.nspname = local_schema + ORDER BY 1,2 + ) _aux; END $$ LANGUAGE PLPGSQL VOLATILE PARALLEL UNSAFE; diff --git a/test/CDB_FederatedServerTables.sql b/test/CDB_FederatedServerTables.sql index 42afbb0..1072f47 100644 --- a/test/CDB_FederatedServerTables.sql +++ b/test/CDB_FederatedServerTables.sql @@ -65,6 +65,11 @@ SELECT 'R1', cartodb.CDB_Federated_Table_Register( SELECT 'V1', pg_get_viewdef('remote_geom'); SELECT 'S1', cartodb_id, ST_AsText(the_geom), another_field FROM remote_geom; +Select 'list_remotes1', CDB_Federated_Server_List_Registered_Tables( + server => 'loopback', + remote_schema => 'remote_schema' +); + SELECT 'R2', cartodb.CDB_Federated_Table_Register( server => 'loopback', remote_schema => 'remote_schema', @@ -78,6 +83,11 @@ SELECT 'R2', cartodb.CDB_Federated_Table_Register( SELECT 'V2', pg_get_viewdef('"myFullTable"'); SELECT 'S2', cartodb_id, ST_AsText(the_geom_webmercator), another_field FROM "myFullTable"; +Select 'list_remotes2', CDB_Federated_Server_List_Registered_Tables( + server => 'loopback', + remote_schema => 'remote_schema' +); + SELECT 'U1', CDB_Federated_Table_Unregister( server => 'loopback', remote_schema => 'remote_schema', @@ -86,7 +96,10 @@ SELECT 'U1', CDB_Federated_Table_Unregister( -- Selecting from the created view should fail now SELECT 'UCheck1', cartodb_id, ST_AsText(the_geom), another_field FROM remote_geom; - +Select 'list_remotes3', CDB_Federated_Server_List_Registered_Tables( + server => 'loopback', + remote_schema => 'remote_schema' +); -- =================================================================== -- Cleanup diff --git a/test/CDB_FederatedServerTables_expect b/test/CDB_FederatedServerTables_expect index a8fdf78..0d0f175 100644 --- a/test/CDB_FederatedServerTables_expect +++ b/test/CDB_FederatedServerTables_expect @@ -7,6 +7,7 @@ V1| SELECT t.id AS cartodb_id, FROM cdb_fs_schema_b904664b5208433cd85a1693ba4f7570.remote_geom t; S1|1|POINT(1 1)|patata S1|2|POINT(2 2)|patata2 +list_remotes1|(remote_geom,public.remote_geom) R2| V2| SELECT t.id AS cartodb_id, t.geom AS the_geom, @@ -14,6 +15,9 @@ V2| SELECT t.id AS cartodb_id, t.another_field FROM cdb_fs_schema_b904664b5208433cd85a1693ba4f7570.remote_geom2 t; S2|3|POINT(3 3)|patata +list_remotes2|(remote_geom2,"public.""myFullTable""") +list_remotes2|(remote_geom,public.remote_geom) U1| ERROR: relation "remote_geom" does not exist at character 71 +list_remotes3|(remote_geom2,"public.""myFullTable""") D1|