Fix propagation of indimmediate flag in index_create_copy()

index_create_copy is used to create copy definitions of existing indexes.
Currently, it passes 0 as constr_flags to index_create(), which results
in the copied index to always be created as immediate (indimmediate set
to true).  For deferrable unique constraints, it means that the
transient index used during the phase 2 of REINDEX CONCURRENTLY forces
immediate constraint checks on concurrent inserts, which can cause
unexpected constraint violations based on the definition of the parent
table, inconsistently set in the copied index.

To fix this without violating the contract of constr_flags (which should
only be used when creating constraints) and without relaxing the strict
assertion in index_create(), this introduces a new index creation flag:
INDEX_CREATE_DEFERRABLE.  If set, a copied index's indimmediate is set
to false, meaning that unique constraints are not enforced immediately
on insertion, but at transaction commit time.

An isolation test for REINDEX CONCURRENTLY is added, based on an
injection point waiting after phase 1 of the operation, where an index
copy has been built and is able to accept DMLs for its validation in
phase 2.  The test is tentatively backpatched down to v17.
INJECTION_POINT() is outside a transaction context, which should be fine
on HEAD since 8daeaa9b642c but I suspect may cause issues in v19 and
older branches due to the wait facility depending on condition variables
and a DSM setup, but let's see what the buildfarm tells.

Author: Nitin Motiani <[email protected]>
Discussion: 
https://postgr.es/m/cah5hc97jmjppgiqoqw9xm8qxhniu7zz1qh+ffheesjudv69...@mail.gmail.com
Backpatch-through: 14

Branch
------
REL_17_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/28269fed661afce4ba9a9fd0bf6ce8c2f778f12f

Modified Files
--------------
src/backend/catalog/index.c                        | 20 +++++++--
src/backend/commands/indexcmds.c                   |  2 +
src/include/catalog/index.h                        |  1 +
src/test/modules/injection_points/Makefile         |  1 +
.../expected/reindex_concurrently_deferred.out     | 41 ++++++++++++++++++
src/test/modules/injection_points/meson.build      |  1 +
.../specs/reindex_concurrently_deferred.spec       | 50 ++++++++++++++++++++++
7 files changed, 113 insertions(+), 3 deletions(-)

Reply via email to