• Tom Lane's avatar
    Calculate extraUpdatedCols in query rewriter, not parser. · ad77039f
    Tom Lane authored
    It's unsafe to do this at parse time because addition of generated
    columns to a table would not invalidate stored rules containing
    UPDATEs on the table ... but there might now be dependent generated
    columns that were not there when the rule was made.  This also fixes
    an oversight that rewriteTargetView failed to update extraUpdatedCols
    when transforming an UPDATE on an updatable view.  (Since the new
    calculation is downstream of that, rewriteTargetView doesn't actually
    need to do anything; but before, there was a demonstrable bug there.)
    
    In v13 and HEAD, this leads to easily-visible bugs because (since
    commit c6679e4f) we won't recalculate generated columns that aren't
    listed in extraUpdatedCols.  In v12 this bitmap is mostly just used
    for trigger-firing decisions, so you'd only notice a problem if a
    trigger cared whether a generated column had been updated.
    
    I'd complained about this back in May, but then forgot about it
    until bug #16671 from Michael Paul Killian revived the issue.
    
    Back-patch to v12 where this field was introduced.  If existing
    stored rules contain any extraUpdatedCols values, they'll be
    ignored because the rewriter will overwrite them, so the bug will
    be fixed even for existing rules.  (But note that if someone were
    to update to 13.1 or 12.5, store some rules with UPDATEs on tables
    having generated columns, and then downgrade to a prior minor version,
    they might observe issues similar to what this patch fixes.  That
    seems unlikely enough to not be worth going to a lot of effort to fix.)
    
    Discussion: https://postgr.es/m/10206.1588964727@sss.pgh.pa.us
    Discussion: https://postgr.es/m/16671-2fa55851859fb166@postgresql.org
    ad77039f
worker.c 83.3 KB