• Robert Haas's avatar
    Fix corruption of tableElts list by MergeAttributes(). · ac8d7e1b
    Robert Haas authored
    Since commit e7b3349a, MergeAttributes
    destructively modifies the input List, to which the caller's
    CreateStmt still points.  One may wonder whether this was already a
    bug, but commit f0e44751 made things
    noticeably worse by adding additional destructive modifications so
    that the caller's List might, in the case of creation a partitioned
    table, no longer even be structurally valid.  Restore the status quo
    ante by assigning the return value of MergeAttributes back to
    stmt->tableElts in the caller.
    
    In most of the places where DefineRelation is called, it doesn't
    matter what stmt->tableElts points to here or whether it's valid or
    not, because the caller doesn't use the statement for anything after
    DefineRelation returns anyway.  However, ProcessUtilitySlow passes it
    to EventTriggerCollectSimpleCommand, and that function tries to invoke
    copyObject on it.  If any of the CreateStmt's substructure is invalid
    at that point, undefined behavior will result.
    
    One might wonder whether this whole area needs further revision -
    perhaps DefineRelation() ought not to be destructively modifying the
    caller-provided CreateStmt at all.  However, that would be a behavior
    change for any event triggers using C code to inspect the CreateStmt,
    so for now, just fix the crash.
    
    Report by Amit Langote, who provided a somewhat different patch for it.
    
    Discussion: http://postgr.es/m/bf6a39a7-100a-74bd-1156-3c16a1429d88@lab.ntt.co.jp
    ac8d7e1b
tablecmds.c 416 KB