• Peter Geoghegan's avatar
    Avoid amcheck inline compression false positives. · eba77534
    Peter Geoghegan authored
    The previous tacit assumption that index_form_tuple() hides differences
    in the TOAST state of its input datums was wrong.  Normalize input
    varlena datums by decompressing compressed values, and forming a new
    index tuple for fingerprinting using uncompressed inputs.  The final
    normalized representation may actually be compressed once again within
    index_form_tuple(), though that shouldn't matter.  When the original
    tuple is found to have no datums that are compressed inline, fingerprint
    the original tuple directly.
    
    Normalization avoids false positive reports of corruption in certain
    cases.  For example, the executor can apply toasting with some inline
    compression to an entire heap tuple because its input has a single
    external TOAST pointer.  Varlena datums for other attributes that are
    not particularly good candidates for inline compression can be
    compressed in the heap tuple in passing, without the representation of
    the same values in index tuples ever receiving concomitant inline
    compression.
    
    Add a test case to recreate the issue in a simpler though less realistic
    way: by exploiting differences in pg_attribute.attstorage between heap
    and index relations.
    
    This bug was discovered by me during testing of an upcoming set of nbtree
    enhancements.  It was also independently reported by Andreas Kunert, as
    bug #15597.  His test case was rather more realistic than the one I
    ended up using.
    
    Bug: #15597
    Discussion: https://postgr.es/m/CAH2-WznrVd9ie+TTJ45nDT+v2nUt6YJwQrT9SebCdQKtAvfPZw@mail.gmail.com
    Discussion: https://postgr.es/m/15597-294e5d3e7f01c407@postgresql.org
    Backpatch: 11-, where heapallindexed verification was introduced.
    eba77534
check_btree.out 5.58 KB