• Tom Lane's avatar
    Fix creation of resjunk tlist entries for inherited mixed UPDATE/DELETE. · 9a785ad5
    Tom Lane authored
    rewriteTargetListUD's processing is dependent on the relkind of the query's
    target table.  That was fine at the time it was made to act that way, even
    for queries on inheritance trees, because all tables in an inheritance tree
    would necessarily be plain tables.  However, the 9.5 feature addition
    allowing some members of an inheritance tree to be foreign tables broke the
    assumption that rewriteTargetListUD's output tlist could be applied to all
    child tables with nothing more than column-number mapping.  This led to
    visible failures if foreign child tables had row-level triggers, and would
    also break in cases where child tables belonged to FDWs that used methods
    other than CTID for row identification.
    
    To fix, delay running rewriteTargetListUD until after the planner has
    expanded inheritance, so that it is applied separately to the (already
    mapped) tlist for each child table.  We can conveniently call it from
    preprocess_targetlist.  Refactor associated code slightly to avoid the
    need to heap_open the target relation multiple times during
    preprocess_targetlist.  (The APIs remain a bit ugly, particularly around
    the point of which steps scribble on parse->targetList and which don't.
    But avoiding such scribbling would require a change in FDW callback APIs,
    which is more pain than it's worth.)
    
    Also fix ExecModifyTable to ensure that "tupleid" is reset to NULL when
    we transition from rows providing a CTID to rows that don't.  (That's
    really an independent bug, but it manifests in much the same cases.)
    
    Add a regression test checking one manifestation of this problem, which
    was that row-level triggers on a foreign child table did not work right.
    
    Back-patch to 9.5 where the problem was introduced.
    
    Etsuro Fujita, reviewed by Ildus Kurbangaliev and Ashutosh Bapat
    
    Discussion: https://postgr.es/m/20170514150525.0346ba72@postgrespro.ru
    9a785ad5
preptlist.c 12.8 KB