Commit 1127f0e3 authored by Michael Paquier's avatar Michael Paquier

Preserve pg_index.indisreplident across REINDEX CONCURRENTLY

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.GK89559@paquier.xyz
Backpatch-through: 12
parent a9632830
...@@ -1538,6 +1538,10 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) ...@@ -1538,6 +1538,10 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName)
newIndexForm->indimmediate = oldIndexForm->indimmediate; newIndexForm->indimmediate = oldIndexForm->indimmediate;
oldIndexForm->indimmediate = true; oldIndexForm->indimmediate = true;
/* Preserve indisreplident in the new index */
newIndexForm->indisreplident = oldIndexForm->indisreplident;
oldIndexForm->indisreplident = false;
/* Preserve indisclustered in the new index */ /* Preserve indisclustered in the new index */
newIndexForm->indisclustered = oldIndexForm->indisclustered; newIndexForm->indisclustered = oldIndexForm->indisclustered;
......
...@@ -2141,6 +2141,27 @@ SELECT indexrelid::regclass, indisclustered FROM pg_index ...@@ -2141,6 +2141,27 @@ SELECT indexrelid::regclass, indisclustered FROM pg_index
(1 row) (1 row)
DROP TABLE concur_clustered; 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 -- Partitions
-- Create some partitioned tables -- Create some partitioned tables
CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1);
......
...@@ -866,6 +866,17 @@ REINDEX TABLE CONCURRENTLY concur_clustered; ...@@ -866,6 +866,17 @@ REINDEX TABLE CONCURRENTLY concur_clustered;
SELECT indexrelid::regclass, indisclustered FROM pg_index SELECT indexrelid::regclass, indisclustered FROM pg_index
WHERE indrelid = 'concur_clustered'::regclass; WHERE indrelid = 'concur_clustered'::regclass;
DROP TABLE concur_clustered; 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 -- Partitions
-- Create some partitioned tables -- Create some partitioned tables
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment