• Tom Lane's avatar
    Fix bugs in indexing of in-doubt HOT-updated tuples. · 520bcd9c
    Tom Lane authored
    If we find a DELETE_IN_PROGRESS HOT-updated tuple, it is impossible to know
    whether to index it or not except by waiting to see if the deleting
    transaction commits.  If it doesn't, the tuple might again be LIVE, meaning
    we have to index it.  So wait and recheck in that case.
    
    Also, we must not rely on ii_BrokenHotChain to decide that it's possible to
    omit tuples from the index.  That could result in omitting tuples that we
    need, particularly in view of yesterday's fixes to not necessarily set
    indcheckxmin (but it's broken even without that, as per my analysis today).
    Since this is just an extremely marginal performance optimization, dropping
    the test shouldn't hurt.
    
    These cases are only expected to happen in system catalogs (they're
    possible there due to early release of RowExclusiveLock in most
    catalog-update code paths).  Since reindexing of a system catalog isn't a
    particularly performance-critical operation anyway, there's no real need to
    be concerned about possible performance degradation from these changes.
    
    The worst aspects of this bug were introduced in 9.0 --- 8.x will always
    wait out a DELETE_IN_PROGRESS tuple.  But I think dropping index entries
    on the strength of ii_BrokenHotChain is dangerous even without that, so
    back-patch removal of that optimization to 8.3 and 8.4.
    520bcd9c
index.c 95.1 KB