• Peter Geoghegan's avatar
    Fix memory leak in indexUnchanged hint mechanism. · 41ee68a9
    Peter Geoghegan authored
    Commit 9dc718bd added a "logically unchanged by UPDATE" hinting
    mechanism, which is currently used within nbtree indexes only (see
    commit d168b666).  This mechanism determined whether or not the incoming
    item is a logically unchanged duplicate (a duplicate needed only for
    MVCC versioning purposes) once per row updated per non-HOT update.  This
    approach led to memory leaks which were noticeable with an UPDATE
    statement that updated sufficiently many rows, at least on tables that
    happen to have an expression index.
    
    On HEAD, fix the issue by adding a cache to the executor's per-index
    IndexInfo struct.
    
    Take a different approach on Postgres 14 to avoid an ABI break: simply
    pass down the hint to all indexes unconditionally with non-HOT UPDATEs.
    This is deemed acceptable because the hint is currently interpreted
    within btinsert() as "perform a bottom-up index deletion pass if and
    when the only alternative is splitting the leaf page -- prefer to delete
    any LP_DEAD-set items first".  nbtree must always treat the hint as a
    noisy signal about what might work, as a strategy of last resort, with
    costs imposed on non-HOT updaters.  (The same thing might not be true
    within another index AM that applies the hint, which is why the original
    behavior is preserved on HEAD.)
    
    Author: Peter Geoghegan <pg@bowt.ie>
    Reported-By: default avatarKlaudie Willis <Klaudie.Willis@protonmail.com>
    Diagnosed-By: default avatarTom Lane <tgl@sss.pgh.pa.us>
    Discussion: https://postgr.es/m/261065.1639497535@sss.pgh.pa.us
    Backpatch: 14-, where the hinting mechanism was added.
    41ee68a9
execIndexing.c 29.6 KB