• Andres Freund's avatar
    Raise error when affecting tuple moved into different partition. · f16241be
    Andres Freund authored
    When an update moves a row between partitions (supported since
    2f178441), our normal logic for following update chains in READ
    COMMITTED mode doesn't work anymore. Cross partition updates are
    modeled as an delete from the old and insert into the new
    partition. No ctid chain exists across partitions, and there's no
    convenient space to introduce that link.
    
    Not throwing an error in a partitioned context when one would have
    been thrown without partitioning is obviously problematic. This commit
    introduces infrastructure to detect when a tuple has been moved, not
    just plainly deleted. That allows to throw an error when encountering
    a deletion that's actually a move, while attempting to following a
    ctid chain.
    
    The row deleted as part of a cross partition update is marked by
    pointing it's t_ctid to an invalid block, instead of self as a normal
    update would.  That was deemed to be the least invasive and most
    future proof way to represent the knowledge, given how few infomask
    bits are there to be recycled (there's also some locking issues with
    using infomask bits).
    
    External code following ctid chains should be updated to check for
    moved tuples. The most likely consequence of not doing so is a missed
    error.
    
    Author: Amul Sul, editorialized by me
    Reviewed-By: Amit Kapila, Pavan Deolasee, Andres Freund, Robert Haas
    Discussion: http://postgr.es/m/CAAJ_b95PkwojoYfz0bzXU8OokcTVGzN6vYGCNVUukeUDrnF3dw@mail.gmail.com
    f16241be
itemptr.h 4.68 KB