• Tom Lane's avatar
    Fix ruleutils issues with dropped cols in functions-returning-composite. · da9a28fd
    Tom Lane authored
    Due to lack of concern for the case in the dependency code, it's
    possible to drop a column of a composite type even though stored
    queries have references to the dropped column via functions-in-FROM
    that return the composite type.  There are "soft" references,
    namely FROM-clause aliases for such columns, and "hard" references,
    that is actual Vars referring to them.  The right fix for hard
    references is to add dependencies preventing the drop; something
    we've known for many years and not done (and this commit still doesn't
    address it).  A "soft" reference shouldn't prevent a drop though.
    We've been around on this before (cf. 9b35ddce, 2c4debbd), but
    nobody had noticed that the current behavior can result in dump/reload
    failures, because ruleutils.c can print more column aliases than the
    underlying composite type now has.  So we need to rejigger the
    column-alias-handling code to treat such columns as dropped and not
    print aliases for them.
    
    Rather than writing new code for this, I used expandRTE() which already
    knows how to figure out which function result columns are dropped.
    I'd initially thought maybe we could use expandRTE() in all cases, but
    that fails for EXPLAIN's purposes, because the planner strips a lot of
    RTE infrastructure that expandRTE() needs.  So this patch just uses it
    for unplanned function RTEs and otherwise does things the old way.
    
    If there is a hard reference (Var), then removing the column alias
    causes us to fail to print the Var, since there's no longer a name
    to print.  Failing seems less desirable than printing a made-up
    name, so I made it print "?dropped?column?" instead.
    
    Per report from Timo Stolz.  Back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/5c91267e-3b6d-5795-189c-d15a55d61dbb@nullachtvierzehn.de
    da9a28fd
create_view.sql 21.1 KB