• Peter Geoghegan's avatar
    Refactor nbtree insertion scankeys. · e5adcb78
    Peter Geoghegan authored
    Use dedicated struct to represent nbtree insertion scan keys.  Having a
    dedicated struct makes the difference between search type scankeys and
    insertion scankeys a lot clearer, and simplifies the signature of
    several related functions.  This is based on a suggestion by Andrey
    Lepikhov.
    
    Streamline how unique index insertions cache binary search progress.
    Cache the state of in-progress binary searches within _bt_check_unique()
    for later instead of having callers avoid repeating the binary search in
    an ad-hoc manner.  This makes it easy to add a new optimization:
    _bt_check_unique() now falls out of its loop immediately in the common
    case where it's already clear that there couldn't possibly be a
    duplicate.
    
    The new _bt_check_unique() scheme makes it a lot easier to manage cached
    binary search effort afterwards, from within _bt_findinsertloc().  This
    is needed for the upcoming patch to make nbtree tuples unique by
    treating heap TID as a final tiebreaker column.  Unique key binary
    searches need to restore lower and upper bounds.  They cannot simply
    continue to use the >= lower bound as the offset to insert at, because
    the heap TID tiebreaker column must be used in comparisons for the
    restored binary search (unlike the original _bt_check_unique() binary
    search, where scankey's heap TID column must be omitted).
    
    Author: Peter Geoghegan, Heikki Linnakangas
    Reviewed-By: Heikki Linnakangas, Andrey Lepikhov
    Discussion: https://postgr.es/m/CAH2-WzmE6AhUdk9NdWBf4K3HjWXZBX3+umC7mH7+WDrKcRtsOw@mail.gmail.com
    e5adcb78
verify_nbtree.c 77.6 KB