• Tom Lane's avatar
    Repair bogus handling of multi-assignment Params in upper plan levels. · 0f7ec8d9
    Tom Lane authored
    Our support for multiple-set-clauses in UPDATE assumes that the Params
    referencing a MULTIEXPR_SUBLINK SubPlan will appear before that SubPlan
    in the targetlist of the plan node that calculates the updated row.
    (Yeah, it's a hack...)  In some PG branches it's possible that a Result
    node gets inserted between the primary calculation of the update tlist
    and the ModifyTable node.  setrefs.c did the wrong thing in this case
    and left the upper-level Params as Params, causing a crash at runtime.
    What it should do is replace them with "outer" Vars referencing the child
    plan node's output.  That's a result of careless ordering of operations
    in fix_upper_expr_mutator, so we can fix it just by reordering the code.
    
    Fix fix_join_expr_mutator similarly for consistency, even though join
    nodes could never appear in such a context.  (In general, it seems
    likely to be a bit cheaper to use Vars than Params in such situations
    anyway, so this patch might offer a tiny performance improvement.)
    
    The hazard extends back to 9.5 where the MULTIEXPR_SUBLINK stuff
    was introduced, so back-patch that far.  However, this may be a live
    bug only in 9.6.x and 10.x, as the other branches don't seem to want
    to calculate the final tlist below the Result node.  (That plan shape
    change between branches might be a mini-bug in itself, but I'm not
    really interested in digging into the reasons for that right now.
    Still, add a regression test memorializing what we expect there,
    so we'll notice if it changes again.)
    
    Per bug report from Eduards Bezverhijs.
    
    Discussion: https://postgr.es/m/b6cd572a-3e44-8785-75e9-c512a5a17a73@tieto.com
    0f7ec8d9
update.sql 23 KB