> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cockroachlabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# pg_catalog

export const InternalLink = ({version, path = "", children, ...props}) => {
  let detectedVersion = version || "stable";
  if (typeof window !== 'undefined' && !version) {
    const match = window.location.pathname.match(/\/docs\/([^/]+)/);
    if (match) {
      detectedVersion = match[1];
    }
  }
  const normalizedPath = path.startsWith("/") ? path.slice(1) : path;
  return <a href={`/docs/${detectedVersion}/${normalizedPath}`} {...props}>
      {children}
    </a>;
};

For PostgreSQL compatibility, CockroachDB includes a <InternalLink path="system-catalogs">system catalog</InternalLink> called `pg_catalog`. The tables in the `pg_catalog` schema roughly correspond to the [system catalogs in PostgreSQL](https://www.postgresql.org/docs/18/catalogs.html). `pg_catalog` tables are read-only.

## Data exposed by `pg_catalog`

The tables in CockroachDB's `pg_catalog` schema correspond to the virtual tables and views that make up the PostgreSQL system catalogs. Some of the `pg_catalog` tables are empty. See the following table for a detailed comparison between PostgreSQL 18 system catalogs and `pg_catalog` tables.

| PostgreSQL 18 system catalog | `pg_catalog` table |
| - | - |
| `pg_aggregate` | `pg_aggregate` |
| `pg_aios` | `pg_aios` (empty) |
| `pg_am` | `pg_am` |
| `pg_amop` | `pg_amop` (empty) |
| `pg_amproc` | `pg_amproc` (empty) |
| `pg_attrdef` | `pg_attrdef` |
| `pg_attribute` | `pg_attribute` |
| `pg_auth_members` | `pg_auth_members` |
| `pg_authid` | `pg_authid` |
| `pg_available_extension_versions` | `pg_available_extension_versions` (empty) |
| `pg_available_extensions` | `pg_available_extensions` (empty) |
| `pg_backend_memory_contexts` | `pg_backend_memory_contexts` (empty) |
| `pg_cast` | `pg_cast` |
| `pg_class` | `pg_class` |
| `pg_collation` | `pg_collation` |
| `pg_config` | `pg_config` (empty) |
| `pg_constraint` | `pg_constraint` |
| `pg_conversion` | `pg_conversion` (empty) |
| <InternalLink path="cursors#view-all-open-cursors">`pg_cursors`</InternalLink> | `pg_cursors` |
| `pg_database` | `pg_database` |
| `pg_db_role_setting` | `pg_db_role_setting` |
| `pg_default_acl` | `pg_default_acl` |
| `pg_depend` | `pg_depend` |
| `pg_description` | `pg_description` |
| `pg_enum` | `pg_enum` |
| `pg_event_trigger` | `pg_event_trigger` (empty) |
| `pg_extension` | `pg_extension` (empty) |
| `pg_file_settings` | `pg_file_settings` (empty) |
| `pg_foreign_data_wrapper` | `pg_foreign_data_wrapper` (empty) |
| `pg_foreign_server` | `pg_foreign_server` (empty) |
| `pg_foreign_table` | `pg_foreign_table` (empty) |
| `pg_group` | `pg_group` (empty) |
| `pg_hba_file_rules` | `pg_hba_file_rules` (empty) |
| `pg_ident_file_mappings` | `pg_ident_file_mappings` (empty) |
| `pg_index` | `pg_index` |
| `pg_indexes` | `pg_indexes` |
| `pg_inherits` | `pg_inherits` (empty) |
| `pg_init_privs` | `pg_init_privs` (empty) |
| `pg_language` | `pg_language` |
| `pg_largeobject` | `pg_largeobject` (empty) |
| `pg_largeobject_metadata` | `pg_largeobject_metadata` (empty) |
| `pg_locks` | `pg_locks` (reports advisory locks only) |
| `pg_matviews` | `pg_matviews` |
| `pg_namespace` | `pg_namespace` |
| `pg_opclass` | `pg_opclass` (empty) |
| `pg_operator` | `pg_operator` |
| `pg_opfamily` | `pg_opfamily` (empty) |
| `pg_parameter_acl` | `pg_parameter_acl` (empty) |
| `pg_partitioned_table` | `pg_partitioned_table` (empty) |
| `pg_policies` | `pg_policies` |
| `pg_policy` | `pg_policy` |
| `pg_prepared_statements` | `pg_prepared_statements` |
| `pg_prepared_xacts` | `pg_prepared_xacts` |
| `pg_proc` | `pg_proc` |
| `pg_publication` | `pg_publication` (empty) |
| `pg_publication_namespace` | `pg_publication_namespace` (empty) |
| `pg_publication_rel` | `pg_publication_rel` (empty) |
| `pg_publication_tables` | `pg_publication_tables` (empty) |
| `pg_range` | `pg_range` (empty) |
| `pg_replication_origin` | `pg_replication_origin` (empty) |
| `pg_replication_origin_status` | `pg_replication_origin_status` (empty) |
| `pg_replication_slots` | `pg_replication_slots` (empty) |
| `pg_rewrite` | `pg_rewrite` |
| `pg_roles` | `pg_roles` |
| `pg_rules` | `pg_rules` (empty) |
| `pg_seclabel` | `pg_seclabel` (empty) |
| `pg_seclabels` | `pg_seclabels` (empty) |
| `pg_sequence` | `pg_sequence` |
| `pg_sequences` | `pg_sequences` |
| `pg_settings` | `pg_settings` |
| `pg_shadow` | `pg_shadow` |
| `pg_shdepend` | `pg_shdepend` |
| `pg_shdescription` | `pg_shdescription` |
| `pg_shmem_allocations` | `pg_shmem_allocations` (empty) |
| `pg_shmem_allocations_numa` | `pg_shmem_allocations_numa` (empty) |
| `pg_shseclabel` | `pg_shseclabel` (empty) |
| `pg_stat_activity` | `pg_stat_activity` (empty) |
| `pg_stat_all_indexes` | `pg_stat_all_indexes` (empty) |
| `pg_stat_all_tables` | `pg_stat_all_tables` (empty) |
| `pg_stat_archiver` | `pg_stat_archiver` (empty) |
| `pg_stat_bgwriter` | `pg_stat_bgwriter` (empty) |
| `pg_stat_checkpointer` | `pg_stat_checkpointer` (empty) |
| `pg_stat_database` | `pg_stat_database` (empty) |
| `pg_stat_database_conflicts` | `pg_stat_database_conflicts` (empty) |
| `pg_stat_gssapi` | `pg_stat_gssapi` (empty) |
| `pg_stat_io` | `pg_stat_io` (empty) |
| `pg_stat_progress_analyze` | `pg_stat_progress_analyze` (empty) |
| `pg_stat_progress_basebackup` | `pg_stat_progress_basebackup` (empty) |
| `pg_stat_progress_cluster` | `pg_stat_progress_cluster` (empty) |
| `pg_stat_progress_copy` | `pg_stat_progress_copy` (empty) |
| `pg_stat_progress_create_index` | `pg_stat_progress_create_index` (empty) |
| `pg_stat_progress_vacuum` | `pg_stat_progress_vacuum` (empty) |
| `pg_stat_recovery_prefetch` | `pg_stat_recovery_prefetch` (empty) |
| `pg_stat_replication` | `pg_stat_replication` (empty) |
| `pg_stat_replication_slots` | `pg_stat_replication_slots` (empty) |
| `pg_stat_slru` | `pg_stat_slru` (empty) |
| `pg_stat_ssl` | `pg_stat_ssl` (empty) |
| `pg_stat_subscription` | `pg_stat_subscription` (empty) |
| `pg_stat_subscription_stats` | `pg_stat_subscription_stats` (empty) |
| `pg_stat_sys_indexes` | `pg_stat_sys_indexes` (empty) |
| `pg_stat_sys_tables` | `pg_stat_sys_tables` (empty) |
| `pg_stat_user_functions` | `pg_stat_user_functions` (empty) |
| `pg_stat_user_indexes` | `pg_stat_user_indexes` (empty) |
| `pg_stat_user_tables` | `pg_stat_user_tables` (empty) |
| `pg_stat_wal` | `pg_stat_wal` (empty) |
| `pg_stat_wal_receiver` | `pg_stat_wal_receiver` (empty) |
| `pg_stat_xact_all_tables` | `pg_stat_xact_all_tables` (empty) |
| `pg_stat_xact_sys_tables` | `pg_stat_xact_sys_tables` (empty) |
| `pg_stat_xact_user_functions` | `pg_stat_xact_user_functions` (empty) |
| `pg_stat_xact_user_tables` | `pg_stat_xact_user_tables` (empty) |
| `pg_statio_all_indexes` | `pg_statio_all_indexes` (empty) |
| `pg_statio_all_sequences` | `pg_statio_all_sequences` (empty) |
| `pg_statio_all_tables` | `pg_statio_all_tables` (empty) |
| `pg_statio_sys_indexes` | `pg_statio_sys_indexes` (empty) |
| `pg_statio_sys_sequences` | `pg_statio_sys_sequences` (empty) |
| `pg_statio_sys_tables` | `pg_statio_sys_tables` (empty) |
| `pg_statio_user_indexes` | `pg_statio_user_indexes` (empty) |
| `pg_statio_user_sequences` | `pg_statio_user_sequences` (empty) |
| `pg_statio_user_tables` | `pg_statio_user_tables` (empty) |
| `pg_statistic` | `pg_statistic` (empty) |
| `pg_statistic_ext` | `pg_statistic_ext` |
| `pg_statistic_ext_data` | `pg_statistic_ext_data` (empty) |
| `pg_stats` | `pg_stats` (empty) |
| `pg_stats_ext` | `pg_stats_ext` (empty) |
| `pg_stats_ext_exprs` | `pg_stats_ext_exprs` (empty) |
| `pg_subscription` | `pg_subscription` (empty) |
| `pg_subscription_rel` | `pg_subscription_rel` (empty) |
| `pg_tables` | `pg_tables` |
| `pg_tablespace` | `pg_tablespace` |
| `pg_timezone_abbrevs` | `pg_timezone_abbrevs` |
| `pg_timezone_names` | `pg_timezone_names` |
| `pg_transform` | `pg_transform` (empty) |
| `pg_trigger` | `pg_trigger` |
| `pg_ts_config` | `pg_ts_config` (empty) |
| `pg_ts_config_map` | `pg_ts_config_map` (empty) |
| `pg_ts_dict` | `pg_ts_dict` (empty) |
| `pg_ts_parser` | `pg_ts_parser` (empty) |
| `pg_ts_template` | `pg_ts_template` (empty) |
| `pg_type` | `pg_type` |
| `pg_user` | `pg_user` |
| `pg_user_mapping` | `pg_user_mapping` (empty) |
| `pg_user_mappings` | `pg_user_mappings` (empty) |
| `pg_views` | `pg_views` |
| `pg_wait_events` | `pg_wait_events` (empty) |

To list the tables in `pg_catalog` for the <InternalLink path="sql-name-resolution#current-database">current database</InternalLink>, use the following <InternalLink path="show-tables">`SHOW TABLES`</InternalLink> statement:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SHOW TABLES FROM pg_catalog;
```

```
  schema_name |       table_name        | type  | owner | estimated_row_count
--------------+-------------------------+-------+-------+----------------------
  pg_catalog  | pg_aggregate            | table | NULL  |                NULL
  pg_catalog  | pg_am                   | table | NULL  |                NULL
  ...
```

<Note>
  To prohibit queries against empty tables, set the `stub_catalog_tables` <InternalLink path="set-vars">session variable</InternalLink> to `off`.
</Note>

## Query `pg_catalog` tables

You can run <InternalLink path="selection-queries">`SELECT` queries</InternalLink> on the tables in `pg_catalog`.

<Tip>
  To ensure that you can view all of the tables in `pg_catalog`, query the tables as a user with <InternalLink path="security-reference/authorization#admin-role">`admin` privileges</InternalLink>.
</Tip>

<Note>
  Unless specified otherwise, queries to `pg_catalog` assume the <InternalLink path="sql-name-resolution#current-database">current database</InternalLink>.
</Note>

For example, to return the `pg_catalog` table with additional information about indexes in <InternalLink path="movr">`movr` database</InternalLink>, you can query the `pg_catalog.pg_indexes` table:

```sql theme={"theme":{"light":"catppuccin-mocha","dark":"catppuccin-mocha"}}
> SELECT * FROM movr.pg_catalog.pg_indexes;
```

```
   crdb_oid  | schemaname |         tablename          |                   indexname                   | tablespace |                                                            indexdef
-------------+------------+----------------------------+-----------------------------------------------+------------+---------------------------------------------------------------------------------------------------------------------------------
  2055313241 | public     | users                      | users_pkey                                    | NULL       | CREATE UNIQUE INDEX users_pkey ON movr.public.users USING btree (city ASC, id ASC)
  1795576970 | public     | vehicles                   | vehicles_pkey                                 | NULL       | CREATE UNIQUE INDEX vehicles_pkey ON movr.public.vehicles USING btree (city ASC, id ASC)
  1795576969 | public     | vehicles                   | vehicles_auto_index_fk_city_ref_users         | NULL       | CREATE INDEX vehicles_auto_index_fk_city_ref_users ON movr.public.vehicles USING btree (city ASC, owner_id ASC)
   450499963 | public     | rides                      | rides_pkey                                    | NULL       | CREATE UNIQUE INDEX rides_pkey ON movr.public.rides USING btree (city ASC, id ASC)
   450499960 | public     | rides                      | rides_auto_index_fk_city_ref_users            | NULL       | CREATE INDEX rides_auto_index_fk_city_ref_users ON movr.public.rides USING btree (city ASC, rider_id ASC)
   450499961 | public     | rides                      | rides_auto_index_fk_vehicle_city_ref_vehicles | NULL       | CREATE INDEX rides_auto_index_fk_vehicle_city_ref_vehicles ON movr.public.rides USING btree (vehicle_city ASC, vehicle_id ASC)
  2315049508 | public     | vehicle_location_histories | vehicle_location_histories_pkey               | NULL       | CREATE UNIQUE vehicle_location_histories_pkey ON movr.public.vehicle_location_histories USING btree (city ASC, ride_id ASC, "timestamp" ASC)
   969972501 | public     | promo_codes                | promo_codes_pkey                              | NULL       | CREATE UNIQUE INDEX promo_codes_pkey ON movr.public.promo_codes USING btree (code ASC)
   710236230 | public     | user_promo_codes           | user_promo_codes_pkey                         | NULL       | CREATE UNIQUE INDEX user_promo_codes_pkey ON movr.public.user_promo_codes USING btree (city ASC, user_id ASC, code ASC)
(9 rows)
```

## See also

* <InternalLink path="show-vars">`SHOW`</InternalLink>
* <InternalLink path="show-databases">`SHOW DATABASES`</InternalLink>
* <InternalLink path="show-schemas">`SHOW SCHEMAS`</InternalLink>
* <InternalLink path="show-tables">`SHOW TABLES`</InternalLink>
* <InternalLink path="sql-name-resolution">SQL Name Resolution</InternalLink>
* <InternalLink path="system-catalogs">System Catalogs</InternalLink>
