mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Rework handling of invalid indexes with REINDEX CONCURRENTLY
Per discussion with others, allowing REINDEX INDEX CONCURRENTLY to work for invalid indexes when working directly on them can have a lot of value to unlock situations with invalid indexes without having to use a dance involving DROP INDEX followed by an extra CREATE INDEX CONCURRENTLY (which would not work for indexes with constraint dependency anyway). This also does not create extra bloat on the relation involved as this works on individual indexes, so let's enable it. Note that REINDEX TABLE CONCURRENTLY still bypasses invalid indexes as we don't want to bloat the number of indexes defined on a relation in the event of multiple and successive failures of REINDEX CONCURRENTLY. More regression tests are added to cover those behaviors, using an invalid index created with CREATE INDEX CONCURRENTLY. Reported-by: Dagfinn Ilmari Mannsåker, Álvaro Herrera Author: Michael Paquier Reviewed-by: Peter Eisentraut, Dagfinn Ilmari Mannsåker Discussion: https://postgr.es/m/20190411134947.GA22043@alvherre.pgsql
This commit is contained in:
@ -2118,6 +2118,53 @@ Referenced by:
|
||||
|
||||
DROP MATERIALIZED VIEW concur_reindex_matview;
|
||||
DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3;
|
||||
-- Check handling of invalid indexes
|
||||
CREATE TABLE concur_reindex_tab4 (c1 int);
|
||||
INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2);
|
||||
-- This trick creates an invalid index.
|
||||
CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1);
|
||||
ERROR: could not create unique index "concur_reindex_ind5"
|
||||
DETAIL: Key (c1)=(1) is duplicated.
|
||||
-- Reindexing concurrently this index fails with the same failure.
|
||||
-- The extra index created is itself invalid, and can be dropped.
|
||||
REINDEX INDEX CONCURRENTLY concur_reindex_ind5;
|
||||
ERROR: could not create unique index "concur_reindex_ind5_ccnew"
|
||||
DETAIL: Key (c1)=(1) is duplicated.
|
||||
\d concur_reindex_tab4
|
||||
Table "public.concur_reindex_tab4"
|
||||
Column | Type | Collation | Nullable | Default
|
||||
--------+---------+-----------+----------+---------
|
||||
c1 | integer | | |
|
||||
Indexes:
|
||||
"concur_reindex_ind5" UNIQUE, btree (c1) INVALID
|
||||
"concur_reindex_ind5_ccnew" UNIQUE, btree (c1) INVALID
|
||||
|
||||
DROP INDEX concur_reindex_ind5_ccnew;
|
||||
-- This makes the previous failure go away, so the index can become valid.
|
||||
DELETE FROM concur_reindex_tab4 WHERE c1 = 1;
|
||||
-- The invalid index is not processed when running REINDEX TABLE.
|
||||
REINDEX TABLE CONCURRENTLY concur_reindex_tab4;
|
||||
WARNING: cannot reindex concurrently invalid index "public.concur_reindex_ind5", skipping
|
||||
NOTICE: table "concur_reindex_tab4" has no indexes
|
||||
\d concur_reindex_tab4
|
||||
Table "public.concur_reindex_tab4"
|
||||
Column | Type | Collation | Nullable | Default
|
||||
--------+---------+-----------+----------+---------
|
||||
c1 | integer | | |
|
||||
Indexes:
|
||||
"concur_reindex_ind5" UNIQUE, btree (c1) INVALID
|
||||
|
||||
-- But it is fixed with REINDEX INDEX.
|
||||
REINDEX INDEX CONCURRENTLY concur_reindex_ind5;
|
||||
\d concur_reindex_tab4
|
||||
Table "public.concur_reindex_tab4"
|
||||
Column | Type | Collation | Nullable | Default
|
||||
--------+---------+-----------+----------+---------
|
||||
c1 | integer | | |
|
||||
Indexes:
|
||||
"concur_reindex_ind5" UNIQUE, btree (c1)
|
||||
|
||||
DROP TABLE concur_reindex_tab4;
|
||||
--
|
||||
-- REINDEX SCHEMA
|
||||
--
|
||||
|
@ -849,6 +849,26 @@ REINDEX SCHEMA CONCURRENTLY pg_catalog;
|
||||
DROP MATERIALIZED VIEW concur_reindex_matview;
|
||||
DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3;
|
||||
|
||||
-- Check handling of invalid indexes
|
||||
CREATE TABLE concur_reindex_tab4 (c1 int);
|
||||
INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2);
|
||||
-- This trick creates an invalid index.
|
||||
CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1);
|
||||
-- Reindexing concurrently this index fails with the same failure.
|
||||
-- The extra index created is itself invalid, and can be dropped.
|
||||
REINDEX INDEX CONCURRENTLY concur_reindex_ind5;
|
||||
\d concur_reindex_tab4
|
||||
DROP INDEX concur_reindex_ind5_ccnew;
|
||||
-- This makes the previous failure go away, so the index can become valid.
|
||||
DELETE FROM concur_reindex_tab4 WHERE c1 = 1;
|
||||
-- The invalid index is not processed when running REINDEX TABLE.
|
||||
REINDEX TABLE CONCURRENTLY concur_reindex_tab4;
|
||||
\d concur_reindex_tab4
|
||||
-- But it is fixed with REINDEX INDEX.
|
||||
REINDEX INDEX CONCURRENTLY concur_reindex_ind5;
|
||||
\d concur_reindex_tab4
|
||||
DROP TABLE concur_reindex_tab4;
|
||||
|
||||
--
|
||||
-- REINDEX SCHEMA
|
||||
--
|
||||
|
Reference in New Issue
Block a user