• Tom Lane's avatar
    Preserve toast value OIDs in toast-swap-by-content for CLUSTER/VACUUM FULL. · 7b0d0e93
    Tom Lane authored
    This works around the problem that a catalog cache entry might contain a
    toast pointer that we try to dereference just as a VACUUM FULL completes
    on that catalog.  We will see the sinval message on the cache entry when
    we acquire lock on the toast table, but by that point we've already told
    tuptoaster.c "here's the pointer to fetch", so it's difficult from a code
    structural standpoint to update the pointer before we use it.  Much less
    painful to ensure that toast pointers are not invalidated in the first
    place.  We have to add a bit of code to deal with the case that a value
    that previously wasn't toasted becomes so; but that should be a
    seldom-exercised corner case, so the inefficiency shouldn't be significant.
    
    Back-patch to 9.0.  In prior versions, we didn't allow CLUSTER on system
    catalogs, and VACUUM FULL didn't result in reassignment of toast OIDs, so
    there was no problem.
    7b0d0e93
cluster.c 50 KB