| -- |
| -- Check that system tables can be reindexed. |
| -- |
| -- Note that this test currently is not included in the default |
| -- schedules, as currently reindexing catalog tables can cause |
| -- deadlocks: |
| -- |
| -- * The lock upgrade between the ShareLock acquired for the reindex |
| -- and RowExclusiveLock needed for pg_class/pg_index locks can |
| -- trigger deadlocks. |
| -- |
| -- * The uniqueness checks performed when reindexing a unique/primary |
| -- key index possibly need to wait for the transaction of a |
| -- about-to-deleted row in pg_class to commit. That can cause |
| -- deadlocks because, in contrast to user tables, locks on catalog |
| -- tables are routinely released before commit - therefore the lock |
| -- held for reindexing doesn't guarantee that no running transaction |
| -- performed modifications in the table underlying the index. |
| -- |
| -- This is particularly problematic as such conflicts can be |
| -- triggered even when run in isolation, as a previous session's |
| -- temporary table cleanup might still be running (even when the |
| -- session ended from a client perspective). |
| |
| |
| -- Check reindexing of whole tables |
| REINDEX TABLE pg_class; -- mapped, non-shared, critical |
| REINDEX TABLE pg_index; -- non-mapped, non-shared, critical |
| REINDEX TABLE pg_operator; -- non-mapped, non-shared, critical |
| REINDEX TABLE pg_database; -- mapped, shared, critical |
| REINDEX TABLE pg_shdescription; -- mapped, shared non-critical |
| |
| -- Check that individual system indexes can be reindexed. That's a bit |
| -- different from the entire-table case because reindex_relation |
| -- treats e.g. pg_class special. |
| REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical |
| REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical |
| REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical |
| REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical |
| REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical |
| REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical |
| |
| -- Check the same REINDEX INDEX statements under parallelism. |
| BEGIN; |
| SET min_parallel_table_scan_size = 0; |
| REINDEX INDEX pg_class_oid_index; -- mapped, non-shared, critical |
| REINDEX INDEX pg_class_relname_nsp_index; -- mapped, non-shared, non-critical |
| REINDEX INDEX pg_index_indexrelid_index; -- non-mapped, non-shared, critical |
| REINDEX INDEX pg_index_indrelid_index; -- non-mapped, non-shared, non-critical |
| REINDEX INDEX pg_database_oid_index; -- mapped, shared, critical |
| REINDEX INDEX pg_shdescription_o_c_index; -- mapped, shared, non-critical |
| ROLLBACK; |