• Tom Lane's avatar
    Avoid touching replica identity index in ExtractReplicaIdentity(). · f63a5ead
    Tom Lane authored
    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 b04aeb0a.
    
    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 9c703c16 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
    f63a5ead
heapam.c 269 KB