• Tom Lane's avatar
    Avoid listing ungrouped Vars in the targetlist of Agg-underneath-Window. · c1d9579d
    Tom Lane authored
    Regular aggregate functions in combination with, or within the arguments
    of, window functions are OK per spec; they have the semantics that the
    aggregate output rows are computed and then we run the window functions
    over that row set.  (Thus, this combination is not really useful unless
    there's a GROUP BY so that more than one aggregate output row is possible.)
    The case without GROUP BY could fail, as recently reported by Jeff Davis,
    because sloppy construction of the Agg node's targetlist resulted in extra
    references to possibly-ungrouped Vars appearing outside the aggregate
    function calls themselves.  See the added regression test case for an
    example.
    
    Fixing this requires modifying the API of flatten_tlist and its underlying
    function pull_var_clause.  I chose to make pull_var_clause's API for
    aggregates identical to what it was already doing for placeholders, since
    the useful behaviors turn out to be the same (error, report node as-is, or
    recurse into it).  I also tightened the error checking in this area a bit:
    if it was ever valid to see an uplevel Var, Aggref, or PlaceHolderVar here,
    that was a long time ago, so complain instead of ignoring them.
    
    Backpatch into 9.1.  The failure exists in 8.4 and 9.0 as well, but seeing
    that it only occurs in a basically-useless corner case, it doesn't seem
    worth the risks of changing a function API in a minor release.  There might
    be third-party code using pull_var_clause.
    c1d9579d
clauses.h 2.82 KB