diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py index a46a4884c..2e0a7558f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/row_security_policies/__init__.py @@ -61,15 +61,14 @@ class RowSecurityModule(CollectionNodeModule): self.min_ver = 90500 self.max_ver = None - def get_nodes(self, gid, sid, did, scid, **kwargs): + def get_nodes(self, **kwargs): """ Generate the collection node - :param gid: group id - :param sid: server id - :param did: database id - :param scid: Schema ID """ - yield self.generate_browser_collection_node(did) + assert ('tid' in kwargs or 'vid' in kwargs) + yield self.generate_browser_collection_node( + kwargs['tid'] if 'tid' in kwargs else kwargs['vid'] + ) @property def node_inode(self): diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql index 503307a87..ac215eefd 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/10_plus/search.sql @@ -449,6 +449,37 @@ FROM ( JOIN pg_namespace n ON n.oid=c.collnamespace WHERE {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + WHEN t.relkind in ('r', 't', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, t.relkind, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, rel.relkind, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select CASE WHEN relkind = 'p' THEN path ELSE ':table.' || t.oid || ':/' || t.relname END AS path + from table_path_data order by height desc limit 1 + ) + end + ||'/:row_security_policy.'|| pl.oid ||':/'|| pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} ) sn where lower(sn.obj_name) like '%{{ search_text }}%' diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql index ebae55a68..4e07ff079 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/11_plus/search.sql @@ -466,6 +466,37 @@ FROM ( JOIN pg_namespace n ON n.oid=c.collnamespace WHERE {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + WHEN t.relkind in ('r', 't', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, t.relkind, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, rel.relkind, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select CASE WHEN relkind = 'p' THEN path ELSE ':table.' || t.oid || ':/' || t.relname END AS path + from table_path_data order by height desc limit 1 + ) + end + ||'/:row_security_policy.'|| pl.oid ||':/'|| pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} ) sn where lower(sn.obj_name) like '%{{ search_text }}%' diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql index 9e365c8b7..6551fa3fe 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/pg/default/search.sql @@ -357,6 +357,19 @@ FROM ( JOIN pg_namespace n ON n.oid=c.collnamespace WHERE {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'|| n.oid || ':/' || n.nspname || + '/:table.'|| t.oid ||':/' || t.relname || '/:row_security_policy.'|| pl.oid ||':/' || pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} ) sn where lower(sn.obj_name) like '%{{ search_text }}%' diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql index 97604a794..a41a375eb 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/10_plus/search.sql @@ -525,6 +525,38 @@ FROM ( WHERE {{ CATALOGS.DB_SUPPORT('p') }} AND {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + WHEN t.relkind in ('r', 't', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, t.relkind, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, rel.relkind, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select CASE WHEN relkind = 'p' THEN path ELSE ':table.' || t.oid || ':/' || t.relname END AS path + from table_path_data order by height desc limit 1 + ) + end + ||'/:row_security_policy.'|| pl.oid ||':/'|| pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + ) sn where lower(sn.obj_name) like '%{{ search_text }}%' {% if not show_system_objects %} diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql index e567ce496..796fc30b8 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/12_plus/search.sql @@ -534,6 +534,38 @@ FROM ( AND {{ CATALOGS.DB_SUPPORT('p') }} AND {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'||n.oid||':/' || n.nspname|| '/' || + case + WHEN t.relkind in ('r', 't', 'p') THEN + ( + WITH RECURSIVE table_path_data as ( + select t.oid as oid, 0 as height, t.relkind, + CASE t.relispartition WHEN true THEN ':partition.' ELSE ':table.' END || t.oid || ':/' || t.relname as path + union + select rel.oid, pt.height+1 as height, rel.relkind, + CASE rel.relispartition WHEN true THEN ':partition.' ELSE ':table.' END + || rel.oid || ':/' || rel.relname || '/' || pt.path as path + from pg_class rel JOIN pg_namespace nsp ON rel.relnamespace = nsp.oid + join pg_inherits inh ON inh.inhparent = rel.oid + join table_path_data pt ON inh.inhrelid = pt.oid + ) + select CASE WHEN relkind = 'p' THEN path ELSE ':table.' || t.oid || ':/' || t.relname END AS path + from table_path_data order by height desc limit 1 + ) + end + ||'/:row_security_policy.'|| pl.oid ||':/'|| pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + ) sn where lower(sn.obj_name) like '%{{ search_text }}%' {% if not show_system_objects %} diff --git a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql index ae1b12512..1389d546b 100644 --- a/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql +++ b/web/pgadmin/tools/search_objects/templates/search_objects/sql/ppas/default/search.sql @@ -432,6 +432,20 @@ FROM ( WHERE {{ CATALOGS.DB_SUPPORT('p') }} AND {{ CATALOGS.DB_SUPPORT('n') }} {% endif %} +{% if all_obj %} + UNION +{% endif %} +{% if all_obj or obj_type in ['row_security_policy'] %} + select 'row_security_policy'::text AS obj_type, pl.polname AS obj_name, ':schema.'|| n.oid || ':/' || n.nspname || + '/:table.'|| t.oid ||':/' || t.relname || '/:row_security_policy.'|| pl.oid ||':/' || pl.polname AS obj_path, n.nspname AS schema_name, + {{ show_node_prefs['row_security_policy'] }} AS show_node, NULL AS other_info + FROM pg_policy pl + JOIN pg_class t on pl.polrelid = t.oid and t.relkind in ('r','t','p') + JOIN pg_policies rw ON (pl.polname=rw.policyname AND t.relname=rw.tablename) + JOIN pg_namespace n on t.relnamespace = n.oid + where {{ CATALOGS.DB_SUPPORT('n') }} +{% endif %} + ) sn where lower(sn.obj_name) like '%{{ search_text }}%' {% if not show_system_objects %} diff --git a/web/pgadmin/tools/search_objects/utils.py b/web/pgadmin/tools/search_objects/utils.py index 26240f090..a56e1322f 100644 --- a/web/pgadmin/tools/search_objects/utils.py +++ b/web/pgadmin/tools/search_objects/utils.py @@ -43,7 +43,7 @@ class SearchObjectsHelper: 'trigger_function', 'fts_template', 'collation', 'view', 'mview', 'fts_configuration', 'extension', 'language', 'event_trigger', 'foreign_server', 'user_mapping', - 'foreign_data_wrapper' + 'foreign_data_wrapper', 'row_security_policy' ] if node_types is None else node_types @property