• Tom Lane's avatar
    Don't mess up pstate->p_next_resno in transformOnConflictClause(). · 38507232
    Tom Lane authored
    transformOnConflictClause incremented p_next_resno while generating the
    phony targetlist for the EXCLUDED pseudo-rel.  Then that field got
    incremented some more during transformTargetList, possibly leading to
    free_parsestate concluding that we'd overrun the allowed length of a tlist,
    as reported by Justin Pryzby.
    
    We could fix this by resetting p_next_resno to 1 after using it for the
    EXCLUDED pseudo-rel tlist, but it seems easier and less coupled to other
    places if we just don't use that field at all in this loop.  (Note that
    this doesn't change anything about the resnos that end up appearing in
    the main target list, because those are all replaced with target-column
    numbers by updateTargetListEntry.)
    
    In passing, fix incorrect type OID assigned to the whole-row Var for
    "EXCLUDED.*" (somehow this escaped having any bad consequences so far,
    but it's certainly wrong); remove useless assignment to var->location;
    pstrdup the column names in case of a relcache flush; and improve
    nearby comments.
    
    Back-patch to 9.5 where ON CONFLICT was introduced.
    
    Report: https://postgr.es/m/20161204163237.GA8030@telsasoft.com
    38507232
analyze.c 84.6 KB