From 1bcb60119f8de5f63165e5de51289156747041c2 Mon Sep 17 00:00:00 2001 From: "Andrey V. Lepikhov" Date: Sun, 27 Jun 2021 22:29:40 +0300 Subject: [PATCH] Back-patch of 83158f7 for PG9_6 --- src/backend/catalog/index.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index f1fe529981..35c44fa26a 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -3281,18 +3281,10 @@ validate_index_heapscan(Relation heapRelation, * index_set_state_flags - adjust pg_index state flags * * This is used during CREATE/DROP INDEX CONCURRENTLY to adjust the pg_index - * flags that denote the index's state. Because the update is not - * transactional and will not roll back on error, this must only be used as - * the last step in a transaction that has not made any transactional catalog - * updates! + * flags that denote the index's state. * - * Note that heap_inplace_update does send a cache inval message for the + * Note that CatalogTupleUpdate() sends a cache invalidation message for the * tuple, so other sessions will hear about the update as soon as we commit. - * - * NB: In releases prior to PostgreSQL 9.4, the use of a non-transactional - * update here would have been unsafe; now that MVCC rules apply even for - * system catalog scans, we could potentially use a transactional update here - * instead. */ void index_set_state_flags(Oid indexId, IndexStateFlagsAction action) @@ -3300,9 +3292,7 @@ index_set_state_flags(Oid indexId, IndexStateFlagsAction action) Relation pg_index; HeapTuple indexTuple; Form_pg_index indexForm; - - /* Assert that current xact hasn't done any transactional updates */ - Assert(GetTopTransactionIdIfAny() == InvalidTransactionId); + CatalogIndexState indstate; /* Open pg_index and fetch a writable copy of the index's tuple */ pg_index = heap_open(IndexRelationId, RowExclusiveLock); @@ -3362,8 +3352,11 @@ index_set_state_flags(Oid indexId, IndexStateFlagsAction action) break; } - /* ... and write it back in-place */ - heap_inplace_update(pg_index, indexTuple); + /* ... and update it */ + indstate = CatalogOpenIndexes(pg_index); + simple_heap_update(pg_index, &indexTuple->t_self, indexTuple); + CatalogIndexInsert(indstate, indexTuple); + CatalogCloseIndexes(indstate); heap_close(pg_index, RowExclusiveLock); } -- 2.31.1