• Tom Lane's avatar
    Fix PlanRowMark/ExecRowMark structures to handle inheritance correctly. · d487afbb
    Tom Lane authored
    In an inherited UPDATE/DELETE, each target table has its own subplan,
    because it might have a column set different from other targets.  This
    means that the resjunk columns we add to support EvalPlanQual might be
    at different physical column numbers in each subplan.  The EvalPlanQual
    rewrite I did for 9.0 failed to account for this, resulting in possible
    misbehavior or even crashes during concurrent updates to the same row,
    as seen in a recent report from Gordon Shannon.  Revise the data structure
    so that we track resjunk column numbers separately for each subplan.
    
    I also chose to move responsibility for identifying the physical column
    numbers back to executor startup, instead of assuming that numbers derived
    during preprocess_targetlist would stay valid throughout subsequent
    massaging of the plan.  That's a bit slower, so we might want to consider
    undoing it someday; but it would complicate the patch considerably and
    didn't seem justifiable in a bug fix that has to be back-patched to 9.0.
    d487afbb
plannodes.h 25 KB