postgresql/src/backend/catalog
Andres Freund 3dbb317d32 Fix potential assertion failure when reindexing a pg_class index.
When reindexing individual indexes on pg_class it was possible to
either trigger an assertion failure:
TRAP: FailedAssertion("!(!ReindexIsProcessingIndex(((index)->rd_id)))

That's because reindex_index() called SetReindexProcessing() - which
enables an asserts ensuring no index insertions happen into the index
- before calling RelationSetNewRelfilenode(). That not correct for
indexes on pg_class, because RelationSetNewRelfilenode() updates the
relevant pg_class row, which needs to update the indexes.

The are two reasons this wasn't noticed earlier. Firstly the bug
doesn't trigger when reindexing all of pg_class, as reindex_relation
has code "hiding" all yet-to-be-reindexed indexes. Secondly, the bug
only triggers when the the update to pg_class doesn't turn out to be a
HOT update - otherwise there's no index insertion to trigger the
bug. Most of the time there's enough space, making this bug hard to
trigger.

To fix, move RelationSetNewRelfilenode() to before the
SetReindexProcessing() (and, together with some other code, to outside
of the PG_TRY()).

To make sure the error checking intended by SetReindexProcessing() is
more robust, modify CatalogIndexInsert() to check
ReindexIsProcessingIndex() even when the update is a HOT update.

Also add a few regression tests for REINDEXing of system catalogs.

The last two improvements would have prevented some of the issues
fixed in 5c1560606d from being introduced in the first place.

Reported-By: Michael Paquier
Diagnosed-By: Tom Lane and Andres Freund
Author: Andres Freund
Reviewed-By: Tom Lane
Discussion: https://postgr.es/m/20190418011430.GA19133@paquier.xyz
Backpatch: 9.4-, the bug is present in all branches
2019-04-29 19:42:08 -07:00
..
.gitignore Replace our traditional initial-catalog-data format with a better design. 2018-04-08 13:17:27 -04:00
Catalog.pm Create a script that can renumber manually-assigned OIDs. 2019-03-12 10:50:48 -04:00
Makefile Use Getopt::Long for catalog scripts 2019-02-12 12:22:08 -03:00
aclchk.c tableam: Add and use scan APIs. 2019-03-11 12:46:41 -07:00
catalog.c Move generic snapshot related code from tqual.h to snapmgr.h. 2019-01-21 17:06:41 -08:00
dependency.c REINDEX CONCURRENTLY 2019-03-29 08:26:33 +01:00
genbki.pl Sync commentary in transam.h and bki.sgml. 2019-03-14 00:23:40 -04:00
heap.c Fix several recently introduced issues around handling new relation forks. 2019-04-29 19:28:05 -07:00
index.c Fix potential assertion failure when reindexing a pg_class index. 2019-04-29 19:42:08 -07:00
indexing.c Fix potential assertion failure when reindexing a pg_class index. 2019-04-29 19:42:08 -07:00
information_schema.sql Generated columns 2019-03-30 08:15:57 +01:00
namespace.c Restrict the use of temporary namespace in two-phase transactions 2019-01-18 09:21:44 +09:00
objectaccess.c Update copyright for 2019 2019-01-02 12:44:25 -05:00
objectaddress.c Make object address handling more robust 2019-02-20 11:26:08 -03:00
partition.c Add index_get_partition convenience function 2019-03-20 18:18:50 -03:00
pg_aggregate.c Implement OR REPLACE option for CREATE AGGREGATE. 2019-03-19 01:16:50 +00:00
pg_collation.c Collations with nondeterministic comparison 2019-03-22 12:12:43 +01:00
pg_constraint.c Move code for managing PartitionDescs into a new file, partdesc.c 2019-02-21 11:45:02 -05:00
pg_conversion.c tableam: Add and use scan APIs. 2019-03-11 12:46:41 -07:00
pg_db_role_setting.c tableam: Add and use scan APIs. 2019-03-11 12:46:41 -07:00
pg_depend.c Fix REINDEX CONCURRENTLY of partitions 2019-04-12 08:36:05 +02:00
pg_enum.c Remove superfluous tqual.h includes. 2019-01-21 12:15:02 -08:00
pg_inherits.c Remove superfluous tqual.h includes. 2019-01-21 12:15:02 -08:00
pg_largeobject.c Remove superfluous tqual.h includes. 2019-01-21 12:15:02 -08:00
pg_namespace.c Replace uses of heap_open et al with the corresponding table_* function. 2019-01-21 10:51:37 -08:00
pg_operator.c Replace uses of heap_open et al with the corresponding table_* function. 2019-01-21 10:51:37 -08:00
pg_proc.c Implement OR REPLACE option for CREATE AGGREGATE. 2019-03-19 01:16:50 +00:00
pg_publication.c tableam: Add and use scan APIs. 2019-03-11 12:46:41 -07:00
pg_range.c Remove superfluous tqual.h includes. 2019-01-21 12:15:02 -08:00
pg_shdepend.c Sort dependent objects before reporting them in DROP ROLE. 2019-03-24 18:17:53 -04:00
pg_subscription.c tableam: Add and use scan APIs. 2019-03-11 12:46:41 -07:00
pg_type.c Replace uses of heap_open et al with the corresponding table_* function. 2019-01-21 10:51:37 -08:00
sql_feature_packages.txt > I have installed your patch and adjusted the names of the standards 2004-12-02 22:51:28 +00:00
sql_features.txt Improve documentation about our XML functionality. 2019-04-01 16:20:22 -04:00
storage.c Fix several recently introduced issues around handling new relation forks. 2019-04-29 19:28:05 -07:00
system_views.sql Return NULL for checksum failures if checksums are not enabled 2019-04-17 13:51:48 +02:00
toasting.c Ignore attempts to add TOAST table to shared or catalog tables 2019-03-19 11:15:50 +01:00