postgresql/src/backend/access
Tom Lane f63a5ead9d Avoid touching replica identity index in ExtractReplicaIdentity().
In what seems like a fit of misplaced optimization,
ExtractReplicaIdentity() accessed the relation's replica-identity
index without taking any lock on it.  Usually, the surrounding query
already holds some lock so this is safe enough ... but in the case
of a previously-planned delete, there might be no existing lock.
Given a suitable test case, this is exposed in v12 and HEAD by an
assertion added by commit b04aeb0a0.

The whole thing's rather poorly thought out anyway; rather than
looking directly at the index, we should use the index-attributes
bitmap that's held by the parent table's relcache entry, as the
caller functions do.  This is more consistent and likely a bit
faster, since it avoids a cache lookup.  Hence, change to doing it
that way.

While at it, rather than blithely assuming that the identity
columns are non-null (with catastrophic results if that's wrong),
add assertion checks that they aren't null.  Possibly those should
be actual test-and-elog, but I'll leave it like this for now.

In principle, this is a bug that's been there since this code was
introduced (in 9.4).  In practice, the risk seems quite low, since
we do have a lock on the index's parent table, so concurrent
changes to the index's catalog entries seem unlikely.  Given the
precedent that commit 9c703c169 wasn't back-patched, I won't risk
back-patching this further than v12.

Per report from Hadi Moshayedi.

Discussion: https://postgr.es/m/CAK=1=Wrek44Ese1V7LjKiQS-Nd-5LgLi_5_CskGbpggKEf3tKQ@mail.gmail.com
2019-09-02 16:10:37 -04:00
..
brin Fix inconsistencies and typos in the tree, take 10 2019-08-13 13:53:41 +09:00
common Remove fmgr.h includes from headers that don't really need it. 2019-08-16 10:35:31 -07:00
gin Fix overflow check and comment in GIN posting list encoding. 2019-08-28 12:55:33 +03:00
gist Fix inconsistencies and typos in the tree, take 10 2019-08-13 13:53:41 +09:00
hash Fix inconsistencies and typos in the tree, take 10 2019-08-13 13:53:41 +09:00
heap Avoid touching replica identity index in ExtractReplicaIdentity(). 2019-09-02 16:10:37 -04:00
index Fix inconsistencies and typos in the tree 2019-07-22 10:01:50 +09:00
nbtree Remove obsolete nbtree page deletion comment. 2019-08-27 14:01:43 -07:00
rmgrdesc Use full 64-bit XID for checking if a deleted GiST page is old enough. 2019-07-24 20:24:07 +03:00
spgist Fix inconsistencies and typos in the tree 2019-07-29 12:28:30 +09:00
table tableam: Provide helper functions for relation sizing. 2019-07-08 14:51:53 -04:00
tablesample Phase 2 pgindent run for v12. 2019-05-22 13:04:48 -04:00
transam Fix inconsistencies and typos in the tree, take 11 2019-08-19 16:21:39 +09:00
Makefile Introduce access/{table.h, relation.h}, for generic functions from heapam.h. 2019-01-21 10:51:36 -08:00