Preserve pg_index.indisreplident across REINDEX CONCURRENTLY
authorMichael Paquier
Fri, 5 Jun 2020 01:29:27 +0000 (10:29 +0900)
committerMichael Paquier
Fri, 5 Jun 2020 01:29:27 +0000 (10:29 +0900)
If the flag value is lost, logical decoding would work the same way as
REPLICA IDENTITY NOTHING, meaning that no old tuple values would be
included in the changes anymore produced by logical decoding.

Author: Michael Paquier
Reviewed-by: Euler Taveira
Discussion: https://postgr.es/m/20200603065340[email protected]
Backpatch-through: 12

src/backend/catalog/index.c
src/test/regress/expected/create_index.out
src/test/regress/sql/create_index.sql

index 579b14c1f322680eaa3b77b0572939f18676feee..d290c7e980e8c7cfc73e92bf7e0523318500962b 100644 (file)
@@ -1527,6 +1527,10 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName)
    newIndexForm->indimmediate = oldIndexForm->indimmediate;
    oldIndexForm->indimmediate = true;
 
+   /* Preserve indisreplident in the new index */
+   newIndexForm->indisreplident = oldIndexForm->indisreplident;
+   oldIndexForm->indisreplident = false;
+
    /* Preserve indisclustered in the new index */
    newIndexForm->indisclustered = oldIndexForm->indisclustered;
 
index a649957f758d3a9bd0a34ae96458a0ddc7e33ff7..c3bf910e023c19f93866a6d4a44a6a0708d16a9d 100644 (file)
@@ -2128,6 +2128,27 @@ SELECT indexrelid::regclass, indisclustered FROM pg_index
 (1 row)
 
 DROP TABLE concur_clustered;
+-- Check that indisreplident updates are preserved.
+CREATE TABLE concur_replident(i int NOT NULL);
+CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i);
+ALTER TABLE concur_replident REPLICA IDENTITY
+  USING INDEX concur_replident_i_idx;
+SELECT indexrelid::regclass, indisreplident FROM pg_index
+  WHERE indrelid = 'concur_replident'::regclass;
+       indexrelid       | indisreplident 
+------------------------+----------------
+ concur_replident_i_idx | t
+(1 row)
+
+REINDEX TABLE CONCURRENTLY concur_replident;
+SELECT indexrelid::regclass, indisreplident FROM pg_index
+  WHERE indrelid = 'concur_replident'::regclass;
+       indexrelid       | indisreplident 
+------------------------+----------------
+ concur_replident_i_idx | t
+(1 row)
+
+DROP TABLE concur_replident;
 -- Partitions
 -- Create some partitioned tables
 CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1);
index fb7da725ff0cfdf6879c8864dd8c734c687109d9..56887526b82278cd18ebc4f10dc2f7cda827cfe1 100644 (file)
@@ -860,6 +860,17 @@ REINDEX TABLE CONCURRENTLY concur_clustered;
 SELECT indexrelid::regclass, indisclustered FROM pg_index
   WHERE indrelid = 'concur_clustered'::regclass;
 DROP TABLE concur_clustered;
+-- Check that indisreplident updates are preserved.
+CREATE TABLE concur_replident(i int NOT NULL);
+CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i);
+ALTER TABLE concur_replident REPLICA IDENTITY
+  USING INDEX concur_replident_i_idx;
+SELECT indexrelid::regclass, indisreplident FROM pg_index
+  WHERE indrelid = 'concur_replident'::regclass;
+REINDEX TABLE CONCURRENTLY concur_replident;
+SELECT indexrelid::regclass, indisreplident FROM pg_index
+  WHERE indrelid = 'concur_replident'::regclass;
+DROP TABLE concur_replident;
 
 -- Partitions
 -- Create some partitioned tables