diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml
index b1de6d0674..91fee3f7ec 100644
--- a/doc/src/sgml/catalogs.sgml
+++ b/doc/src/sgml/catalogs.sgml
@@ -9337,6 +9337,16 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
       <entry>materialized views</entry>
      </row>
 
+     <row>
+      <entry><link linkend="view-pg-ownerships"><structname>pg_ownerships</structname></link></entry>
+      <entry>ownerships</entry>
+     </row>
+
+     <row>
+      <entry><link linkend="view-pg-permissions"><structname>pg_permissions</structname></link></entry>
+      <entry>permissions</entry>
+     </row>
+
      <row>
       <entry><link linkend="view-pg-policies"><structname>pg_policies</structname></link></entry>
       <entry>policies</entry>
@@ -10855,6 +10865,189 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx
 
  </sect1>
 
+ <sect1 id="view-pg-ownerships">
+  <title><structname>pg_ownerships</structname></title>
+
+  <indexterm zone="view-pg-ownerships">
+   <primary>pg_ownerships</primary>
+  </indexterm>
+
+  <para>
+   The view <structname>pg_ownerships</structname> provides access to information about object ownerships.
+  </para>
+
+  <table>
+   <title><structname>pg_ownerships</structname> Columns</title>
+   <tgroup cols="1">
+    <thead>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       Column Type
+      </para>
+      <para>
+       Description
+      </para></entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+        <structfield>classid</structfield> <type>regclass</type>
+        (references <link linkend="catalog-pg-class"><structname>pg_class</structname></link>.<structfield>oid</structfield>)
+      </para>
+      <para>
+        The <type>regclass</type> OID of the system catalog the owned object is in
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+        <structfield>objid</structfield> <type>oid</type>
+        (references any OID column)
+      </para>
+      <para>
+        The OID of the specific owned object
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>objdesc</structfield> <type>text</type>
+      </para>
+      <para>
+       Textual description of the owned object
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>owner</structfield> <type>regrole</type>
+       (references <link linkend="catalog-pg-authid"><structname>pg_authid</structname></link>.<structfield>rolname</structfield>)
+      </para>
+      <para>
+       Owner of the object
+      </para></entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </sect1>
+
+ <sect1 id="view-pg-permissions">
+  <title><structname>pg_permissions</structname></title>
+
+  <indexterm zone="view-pg-permissions">
+   <primary>pg_permissions</primary>
+  </indexterm>
+
+  <para>
+   The view <structname>pg_permissions</structname> provides access to information about explicitly granted privileges on database objects.
+   The special <structname>grantee</structname> value <literal>-</literal> means the privilege is granted to <literal>PUBLIC</literal>.
+  </para>
+
+  <table>
+   <title><structname>pg_permissions</structname> Columns</title>
+   <tgroup cols="1">
+    <thead>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       Column Type
+      </para>
+      <para>
+       Description
+      </para></entry>
+     </row>
+    </thead>
+
+    <tbody>
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+        <structfield>classid</structfield> <type>regclass</type>
+        (references <link linkend="catalog-pg-class"><structname>pg_class</structname></link>.<structfield>oid</structfield>)
+      </para>
+      <para>
+        The <type>regclass</type> OID of the system catalog the granted object is in
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+        <structfield>objid</structfield> <type>oid</type>
+        (references any OID column)
+      </para>
+      <para>
+        The OID of the specific granted object
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>objsubid</structfield> <type>int4</type>
+      </para>
+      <para>
+       For a table column, this is the column number (the
+       <structfield>objid</structfield> and <structfield>classid</structfield> refer to the
+       table itself).  For all other object types, this column is
+       zero.
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>objdesc</structfield> <type>text</type>
+      </para>
+      <para>
+       Textual description of the object
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>grantor</structfield> <type>regrole</type>
+       (references <link linkend="catalog-pg-authid"><structname>pg_authid</structname></link>.<structfield>rolname</structfield>)
+      </para>
+      <para>
+       Role that granted this permission
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>grantee</structfield> <type>regrole</type>
+       (references <link linkend="catalog-pg-authid"><structname>pg_authid</structname></link>.<structfield>rolname</structfield>)
+      </para>
+      <para>
+       Role to whom permission is granted
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>privilege_type</structfield> <type>text</type>
+      </para>
+      <para>
+       Type of the privilege: <literal>SELECT</literal>,
+       <literal>INSERT</literal>, <literal>UPDATE</literal>, or
+       <literal>REFERENCES</literal>
+      </para></entry>
+     </row>
+
+     <row>
+      <entry role="catalog_table_entry"><para role="column_definition">
+       <structfield>is_grantable</structfield> <type>boolean</type>
+      </para>
+      <para>
+       <literal>true</literal> if the privilege is grantable, <literal>false</literal> if not
+      </para></entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+
+ </sect1>
+
  <sect1 id="view-pg-policies">
   <title><structname>pg_policies</structname></title>
 
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql
index 0dca65dc7b..260137fe91 100644
--- a/src/backend/catalog/system_views.sql
+++ b/src/backend/catalog/system_views.sql
@@ -510,6 +510,447 @@ FROM
     pg_shseclabel l
     JOIN pg_authid rol ON l.classoid = rol.tableoid AND l.objoid = rol.oid;
 
+CREATE VIEW pg_permissions AS
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_class'::regclass AS classid,
+    aa.attrelid AS objid,
+    aa.attnum AS objsubid,
+    pg_describe_object('pg_class'::regclass,aa.attrelid,aa.attnum) AS objdesc,
+    (aclexplode(aa.attacl)).*
+  FROM pg_catalog.pg_attribute AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_class'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_class'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.relacl)).*
+  FROM pg_catalog.pg_class AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_database'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_database'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.datacl)).*
+  FROM pg_catalog.pg_database AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_default_acl'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_default_acl'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.defaclacl)).*
+  FROM pg_catalog.pg_default_acl AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_foreign_data_wrapper'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_foreign_data_wrapper'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.fdwacl)).*
+  FROM pg_catalog.pg_foreign_data_wrapper AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_foreign_server'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_foreign_server'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.srvacl)).*
+  FROM pg_catalog.pg_foreign_server AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    aa.classoid::regclass AS classid,
+    aa.objoid AS objid,
+    aa.objsubid AS objsubid,
+    pg_describe_object(aa.classoid,aa.objoid,aa.objsubid) AS objdesc,
+    (aclexplode(aa.initprivs)).*
+  FROM pg_catalog.pg_init_privs AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_language'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_language'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.lanacl)).*
+  FROM pg_catalog.pg_language AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_largeobject_metadata'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_largeobject_metadata'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.lomacl)).*
+  FROM pg_catalog.pg_largeobject_metadata AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_namespace'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_namespace'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.nspacl)).*
+  FROM pg_catalog.pg_namespace AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_proc'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_proc'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.proacl)).*
+  FROM pg_catalog.pg_proc AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_tablespace'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_tablespace'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.spcacl)).*
+  FROM pg_catalog.pg_tablespace AS aa
+) AS a
+UNION ALL
+SELECT
+  a.classid,
+  a.objid,
+  a.objsubid,a.objdesc,
+  a.grantor::regrole,
+  a.grantee::regrole,
+  a.privilege_type,
+  a.is_grantable
+FROM
+(
+  SELECT
+    'pg_type'::regclass AS classid,
+    aa.oid AS objid,
+    0 AS objsubid,
+    pg_describe_object('pg_type'::regclass,aa.oid,0) AS objdesc,
+    (aclexplode(aa.typacl)).*
+  FROM pg_catalog.pg_type AS aa
+) AS a;
+
+CREATE VIEW pg_ownerships AS
+  SELECT
+    'pg_class'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_class'::regclass,a.oid,0)
+    AS objdesc,
+    a.relowner::regrole AS owner
+  FROM pg_catalog.pg_class AS a
+UNION ALL
+  SELECT
+    'pg_collation'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_collation'::regclass,a.oid,0)
+    AS objdesc,
+    a.collowner::regrole AS owner
+  FROM pg_catalog.pg_collation AS a
+UNION ALL
+  SELECT
+    'pg_conversion'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_conversion'::regclass,a.oid,0)
+    AS objdesc,
+    a.conowner::regrole AS owner
+  FROM pg_catalog.pg_conversion AS a
+UNION ALL
+  SELECT
+    'pg_database'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_database'::regclass,a.oid,0)
+    AS objdesc,
+    a.datdba::regrole AS owner
+  FROM pg_catalog.pg_database AS a
+UNION ALL
+  SELECT
+    'pg_default_acl'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_default_acl'::regclass,a.oid,0)
+    AS objdesc,
+    a.defaclrole::regrole AS owner
+  FROM pg_catalog.pg_default_acl AS a
+UNION ALL
+  SELECT
+    'pg_event_trigger'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_event_trigger'::regclass,a.oid,0)
+    AS objdesc,
+    a.evtowner::regrole AS owner
+  FROM pg_catalog.pg_event_trigger AS a
+UNION ALL
+  SELECT
+    'pg_extension'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_extension'::regclass,a.oid,0)
+    AS objdesc,
+    a.extowner::regrole AS owner
+  FROM pg_catalog.pg_extension AS a
+UNION ALL
+  SELECT
+    'pg_foreign_data_wrapper'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_foreign_data_wrapper'::regclass,a.oid,0)
+    AS objdesc,
+    a.fdwowner::regrole AS owner
+  FROM pg_catalog.pg_foreign_data_wrapper AS a
+UNION ALL
+  SELECT
+    'pg_foreign_server'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_foreign_server'::regclass,a.oid,0)
+    AS objdesc,
+    a.srvowner::regrole AS owner
+  FROM pg_catalog.pg_foreign_server AS a
+UNION ALL
+  SELECT
+    'pg_language'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_language'::regclass,a.oid,0)
+    AS objdesc,
+    a.lanowner::regrole AS owner
+  FROM pg_catalog.pg_language AS a
+UNION ALL
+  SELECT
+    'pg_largeobject_metadata'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_largeobject_metadata'::regclass,a.oid,0)
+    AS objdesc,
+    a.lomowner::regrole AS owner
+  FROM pg_catalog.pg_largeobject_metadata AS a
+UNION ALL
+  SELECT
+    'pg_namespace'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_namespace'::regclass,a.oid,0)
+    AS objdesc,
+    a.nspowner::regrole AS owner
+  FROM pg_catalog.pg_namespace AS a
+UNION ALL
+  SELECT
+    'pg_opclass'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_opclass'::regclass,a.oid,0)
+    AS objdesc,
+    a.opcowner::regrole AS owner
+  FROM pg_catalog.pg_opclass AS a
+UNION ALL
+  SELECT
+    'pg_operator'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_operator'::regclass,a.oid,0)
+    AS objdesc,
+    a.oprowner::regrole AS owner
+  FROM pg_catalog.pg_operator AS a
+UNION ALL
+  SELECT
+    'pg_opfamily'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_opfamily'::regclass,a.oid,0)
+    AS objdesc,
+    a.opfowner::regrole AS owner
+  FROM pg_catalog.pg_opfamily AS a
+UNION ALL
+  SELECT
+    'pg_policy'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_policy'::regclass,a.oid,0)
+    AS objdesc,
+    unnest(a.polroles)::regrole AS owner
+  FROM pg_catalog.pg_policy AS a
+UNION ALL
+  SELECT
+    'pg_proc'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_proc'::regclass,a.oid,0)
+    AS objdesc,
+    a.proowner::regrole AS owner
+  FROM pg_catalog.pg_proc AS a
+UNION ALL
+  SELECT
+    'pg_publication'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_publication'::regclass,a.oid,0)
+    AS objdesc,
+    a.pubowner::regrole AS owner
+  FROM pg_catalog.pg_publication AS a
+UNION ALL
+  SELECT
+    'pg_statistic_ext'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_statistic_ext'::regclass,a.oid,0)
+    AS objdesc,
+    a.stxowner::regrole AS owner
+  FROM pg_catalog.pg_statistic_ext AS a
+UNION ALL
+  SELECT
+    'pg_subscription'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_subscription'::regclass,a.oid,0)
+    AS objdesc,
+    a.subowner::regrole AS owner
+  FROM pg_catalog.pg_subscription AS a
+UNION ALL
+  SELECT
+    'pg_tablespace'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_tablespace'::regclass,a.oid,0)
+    AS objdesc,
+    a.spcowner::regrole AS owner
+  FROM pg_catalog.pg_tablespace AS a
+UNION ALL
+  SELECT
+    'pg_ts_config'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_ts_config'::regclass,a.oid,0)
+    AS objdesc,
+    a.cfgowner::regrole AS owner
+  FROM pg_catalog.pg_ts_config AS a
+UNION ALL
+  SELECT
+    'pg_ts_dict'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_ts_dict'::regclass,a.oid,0)
+    AS objdesc,
+    a.dictowner::regrole AS owner
+  FROM pg_catalog.pg_ts_dict AS a
+UNION ALL
+  SELECT
+    'pg_type'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object('pg_type'::regclass,a.oid,0)
+    AS objdesc,
+    a.typowner::regrole AS owner
+  FROM pg_catalog.pg_type AS a;
+
 CREATE VIEW pg_settings AS
     SELECT * FROM pg_show_all_settings() AS A;
 
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 9b12cc122a..390ca4ab84 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1408,6 +1408,382 @@ pg_matviews| SELECT n.nspname AS schemaname,
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
      LEFT JOIN pg_tablespace t ON ((t.oid = c.reltablespace)))
   WHERE (c.relkind = 'm'::"char");
+pg_ownerships| SELECT 'pg_class'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_class'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.relowner)::regrole AS owner
+   FROM pg_class a
+UNION ALL
+ SELECT 'pg_collation'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_collation'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.collowner)::regrole AS owner
+   FROM pg_collation a
+UNION ALL
+ SELECT 'pg_conversion'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_conversion'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.conowner)::regrole AS owner
+   FROM pg_conversion a
+UNION ALL
+ SELECT 'pg_database'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_database'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.datdba)::regrole AS owner
+   FROM pg_database a
+UNION ALL
+ SELECT 'pg_default_acl'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_default_acl'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.defaclrole)::regrole AS owner
+   FROM pg_default_acl a
+UNION ALL
+ SELECT 'pg_event_trigger'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_event_trigger'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.evtowner)::regrole AS owner
+   FROM pg_event_trigger a
+UNION ALL
+ SELECT 'pg_extension'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_extension'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.extowner)::regrole AS owner
+   FROM pg_extension a
+UNION ALL
+ SELECT 'pg_foreign_data_wrapper'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_foreign_data_wrapper'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.fdwowner)::regrole AS owner
+   FROM pg_foreign_data_wrapper a
+UNION ALL
+ SELECT 'pg_foreign_server'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_foreign_server'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.srvowner)::regrole AS owner
+   FROM pg_foreign_server a
+UNION ALL
+ SELECT 'pg_language'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_language'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.lanowner)::regrole AS owner
+   FROM pg_language a
+UNION ALL
+ SELECT 'pg_largeobject_metadata'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_largeobject_metadata'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.lomowner)::regrole AS owner
+   FROM pg_largeobject_metadata a
+UNION ALL
+ SELECT 'pg_namespace'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_namespace'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.nspowner)::regrole AS owner
+   FROM pg_namespace a
+UNION ALL
+ SELECT 'pg_opclass'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_opclass'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.opcowner)::regrole AS owner
+   FROM pg_opclass a
+UNION ALL
+ SELECT 'pg_operator'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_operator'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.oprowner)::regrole AS owner
+   FROM pg_operator a
+UNION ALL
+ SELECT 'pg_opfamily'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_opfamily'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.opfowner)::regrole AS owner
+   FROM pg_opfamily a
+UNION ALL
+ SELECT 'pg_policy'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_policy'::regclass)::oid, a.oid, 0) AS objdesc,
+    (unnest(a.polroles))::regrole AS owner
+   FROM pg_policy a
+UNION ALL
+ SELECT 'pg_proc'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_proc'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.proowner)::regrole AS owner
+   FROM pg_proc a
+UNION ALL
+ SELECT 'pg_publication'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_publication'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.pubowner)::regrole AS owner
+   FROM pg_publication a
+UNION ALL
+ SELECT 'pg_statistic_ext'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_statistic_ext'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.stxowner)::regrole AS owner
+   FROM pg_statistic_ext a
+UNION ALL
+ SELECT 'pg_subscription'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_subscription'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.subowner)::regrole AS owner
+   FROM pg_subscription a
+UNION ALL
+ SELECT 'pg_tablespace'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_tablespace'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.spcowner)::regrole AS owner
+   FROM pg_tablespace a
+UNION ALL
+ SELECT 'pg_ts_config'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_ts_config'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.cfgowner)::regrole AS owner
+   FROM pg_ts_config a
+UNION ALL
+ SELECT 'pg_ts_dict'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_ts_dict'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.dictowner)::regrole AS owner
+   FROM pg_ts_dict a
+UNION ALL
+ SELECT 'pg_type'::regclass AS classid,
+    a.oid AS objid,
+    pg_describe_object(('pg_type'::regclass)::oid, a.oid, 0) AS objdesc,
+    (a.typowner)::regrole AS owner
+   FROM pg_type a;
+pg_permissions| SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_class'::regclass AS classid,
+            aa.attrelid AS objid,
+            aa.attnum AS objsubid,
+            pg_describe_object(('pg_class'::regclass)::oid, aa.attrelid, (aa.attnum)::integer) AS objdesc,
+            (aclexplode(aa.attacl)).grantor AS grantor,
+            (aclexplode(aa.attacl)).grantee AS grantee,
+            (aclexplode(aa.attacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.attacl)).is_grantable AS is_grantable
+           FROM pg_attribute aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_class'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_class'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.relacl)).grantor AS grantor,
+            (aclexplode(aa.relacl)).grantee AS grantee,
+            (aclexplode(aa.relacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.relacl)).is_grantable AS is_grantable
+           FROM pg_class aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_database'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_database'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.datacl)).grantor AS grantor,
+            (aclexplode(aa.datacl)).grantee AS grantee,
+            (aclexplode(aa.datacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.datacl)).is_grantable AS is_grantable
+           FROM pg_database aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_default_acl'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_default_acl'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.defaclacl)).grantor AS grantor,
+            (aclexplode(aa.defaclacl)).grantee AS grantee,
+            (aclexplode(aa.defaclacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.defaclacl)).is_grantable AS is_grantable
+           FROM pg_default_acl aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_foreign_data_wrapper'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_foreign_data_wrapper'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.fdwacl)).grantor AS grantor,
+            (aclexplode(aa.fdwacl)).grantee AS grantee,
+            (aclexplode(aa.fdwacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.fdwacl)).is_grantable AS is_grantable
+           FROM pg_foreign_data_wrapper aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_foreign_server'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_foreign_server'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.srvacl)).grantor AS grantor,
+            (aclexplode(aa.srvacl)).grantee AS grantee,
+            (aclexplode(aa.srvacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.srvacl)).is_grantable AS is_grantable
+           FROM pg_foreign_server aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT (aa.classoid)::regclass AS classid,
+            aa.objoid AS objid,
+            aa.objsubid,
+            pg_describe_object(aa.classoid, aa.objoid, aa.objsubid) AS objdesc,
+            (aclexplode(aa.initprivs)).grantor AS grantor,
+            (aclexplode(aa.initprivs)).grantee AS grantee,
+            (aclexplode(aa.initprivs)).privilege_type AS privilege_type,
+            (aclexplode(aa.initprivs)).is_grantable AS is_grantable
+           FROM pg_init_privs aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_language'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_language'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.lanacl)).grantor AS grantor,
+            (aclexplode(aa.lanacl)).grantee AS grantee,
+            (aclexplode(aa.lanacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.lanacl)).is_grantable AS is_grantable
+           FROM pg_language aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_largeobject_metadata'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_largeobject_metadata'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.lomacl)).grantor AS grantor,
+            (aclexplode(aa.lomacl)).grantee AS grantee,
+            (aclexplode(aa.lomacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.lomacl)).is_grantable AS is_grantable
+           FROM pg_largeobject_metadata aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_namespace'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_namespace'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.nspacl)).grantor AS grantor,
+            (aclexplode(aa.nspacl)).grantee AS grantee,
+            (aclexplode(aa.nspacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.nspacl)).is_grantable AS is_grantable
+           FROM pg_namespace aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_proc'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_proc'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.proacl)).grantor AS grantor,
+            (aclexplode(aa.proacl)).grantee AS grantee,
+            (aclexplode(aa.proacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.proacl)).is_grantable AS is_grantable
+           FROM pg_proc aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_tablespace'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_tablespace'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.spcacl)).grantor AS grantor,
+            (aclexplode(aa.spcacl)).grantee AS grantee,
+            (aclexplode(aa.spcacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.spcacl)).is_grantable AS is_grantable
+           FROM pg_tablespace aa) a
+UNION ALL
+ SELECT a.classid,
+    a.objid,
+    a.objsubid,
+    a.objdesc,
+    (a.grantor)::regrole AS grantor,
+    (a.grantee)::regrole AS grantee,
+    a.privilege_type,
+    a.is_grantable
+   FROM ( SELECT 'pg_type'::regclass AS classid,
+            aa.oid AS objid,
+            0 AS objsubid,
+            pg_describe_object(('pg_type'::regclass)::oid, aa.oid, 0) AS objdesc,
+            (aclexplode(aa.typacl)).grantor AS grantor,
+            (aclexplode(aa.typacl)).grantee AS grantee,
+            (aclexplode(aa.typacl)).privilege_type AS privilege_type,
+            (aclexplode(aa.typacl)).is_grantable AS is_grantable
+           FROM pg_type aa) a;
 pg_policies| SELECT n.nspname AS schemaname,
     c.relname AS tablename,
     pol.polname AS policyname,
