• Andres Freund's avatar
    Fix deletion of speculatively inserted TOAST on conflict · 07ef0351
    Andres Freund authored
    INSERT ..  ON CONFLICT runs a pre-check of the possible conflicting
    constraints before performing the actual speculative insertion.  In case
    the inserted tuple included TOASTed columns the ON CONFLICT condition
    would be handled correctly in case the conflict was caught by the
    pre-check, but if two transactions entered the speculative insertion
    phase at the same time, one would have to re-try, and the code for
    aborting a speculative insertion did not handle deleting the
    speculatively inserted TOAST datums correctly.
    
    TOAST deletion would fail with "ERROR: attempted to delete invisible
    tuple" as we attempted to remove the TOAST tuples using
    simple_heap_delete which reasoned that the given tuples should not be
    visible to the command that wrote them.
    
    This commit updates the heap_abort_speculative() function which aborts
    the conflicting tuple to use itself, via toast_delete, for deleting
    associated TOAST datums.  Like before, the inserted toast rows are not
    marked as being speculative.
    
    This commit also adds a isolationtester spec test, exercising the
    relevant code path. Unfortunately 9.5 cannot handle two waiting
    sessions, and thus cannot execute this test.
    
    Reported-By: Viren Negi, Oskari Saarenmaa
    Author: Oskari Saarenmaa, edited a bit by me
    Bug: #14150
    Discussion: <20160519123338.12513.20271@wrigleys.postgresql.org>
    Backpatch: 9.5, where ON CONFLICT was introduced
    07ef0351
tuptoaster.c 62.2 KB