Ensure we have a snapshot when updating pg_index entries.
authorNathan Bossart <nathan@postgresql.org>
Thu, 26 Sep 2024 20:51:23 +0000 (15:51 -0500)
committerNathan Bossart <nathan@postgresql.org>
Thu, 26 Sep 2024 20:51:23 +0000 (15:51 -0500)
commitb52adbad46740524cbfbffaeb202b01a2c16202a
tree329f4423c29e64f9fa9db9a1c97daac543d54258
parent9726653185de62f2f8bf42a25e961bc56895a41b
Ensure we have a snapshot when updating pg_index entries.

Creating, reindexing, and dropping an index concurrently could
entail accessing pg_index's TOAST table, which was recently added
in commit b52c4fc3c0.  These code paths start and commit their own
transactions, but they do not always set an active snapshot.  This
rightfully leads to assertion failures and ERRORs when trying to
access pg_index's TOAST table, such as the following:

ERROR:  cannot fetch toast data without an active snapshot

To fix, push an active snapshot just before each section of code
that might require accessing pg_index's TOAST table, and pop it
shortly afterwards.

Reported-by: Alexander Lakhin
Reviewed-by: Michael Paquier
Discussion: https://postgr.es/m/a97d7401-e7c9-f771-6a00-037379f0a8bb%40gmail.com
src/backend/catalog/index.c
src/backend/commands/indexcmds.c
src/test/regress/expected/indexing.out
src/test/regress/sql/indexing.sql