• Peter Geoghegan's avatar
    Fix nbtree metapage cache upgrade bug. · d004147e
    Peter Geoghegan authored
    Commit 857f9c36, which taught nbtree VACUUM to avoid unnecessary
    index scans, bumped the nbtree version number from 2 to 3, while adding
    the ability for nbtree indexes to be upgraded on-the-fly.  Various
    assertions that assumed that an nbtree index was always on version 2 had
    to be changed to accept any supported version (version 2 or 3 on
    Postgres 11).
    
    However, a few assertions were missed in the initial commit, all of
    which were in code paths that cache a local copy of the metapage
    metadata, where the index had been expected to be on the current version
    (no longer version 2) as a generic sanity check.  Rather than simply
    update the assertions, follow-up commit 0a64b451 intentionally made
    the metapage caching code update the per-backend cached metadata version
    without changing the on-disk version at the same time.  This could even
    happen when the planner needed to determine the height of a B-Tree for
    costing purposes.  The assertions only fail on Postgres v12 when
    upgrading from v10, because they were adjusted to use the authoritative
    shared memory metapage by v12's commit dd299df8.
    
    To fix, remove the cache-only upgrade mechanism entirely, and update the
    assertions themselves to accept any supported version (go back to using
    the cached version in v12).  The fix is almost a full revert of commit
    0a64b451 on the v11 branch.
    
    VACUUM only considers the authoritative metapage, and never bothers with
    a locally cached version, whereas everywhere else isn't interested in
    the metapage fields that were added by commit 857f9c36.  It seems
    unlikely that this bug has affected any user on v11.
    
    Reported-By: Christoph Berg
    Bug: #15896
    Discussion: https://postgr.es/m/15896-5b25e260fdb0b081%40postgresql.org
    Backpatch: 11-, where VACUUM was taught to avoid unnecessary index scans.
    d004147e
nbtree.h 34.1 KB