• Tom Lane's avatar
    In INSERT/UPDATE, use the table's real tuple descriptor as target. · 20d3fe90
    Tom Lane authored
    Previously, ExecInitModifyTable relied on ExecInitJunkFilter,
    and thence ExecCleanTypeFromTL, to build the target descriptor from
    the query tlist.  While we just checked (in ExecCheckPlanOutput)
    that the tlist produces compatible output, this is not a great
    substitute for the relation's actual tuple descriptor that's
    available from the relcache.  For one thing, dropped columns will
    not be correctly marked attisdropped; it's a bit surprising that
    we've gotten away with that this long.  But the real reason for
    being concerned with this is that using the table's descriptor means
    that the slot will have correct attrmissing data, allowing us to
    revert the klugy fix of commit ba9f18ab.  (This commit undoes
    that one's changes in trigger.c, but keeps the new test case.)
    Thus we can solve the bogus-trigger-tuple problem with fewer cycles
    rather than more.
    
    No back-patch, since this doesn't fix any additional bug, and it
    seems somewhat more likely to have unforeseen side effects than
    ba9f18ab's narrow fix.
    
    Discussion: https://postgr.es/m/16644-5da7ef98a7ac4545@postgresql.org
    20d3fe90
nodeModifyTable.c 85.2 KB