• Tom Lane's avatar
    Refactor to reduce code duplication for function property checking. · 2f153ddf
    Tom Lane authored
    As noted by Andres Freund, we'd accumulated quite a few similar functions
    in clauses.c that examine all functions in an expression tree to see if
    they satisfy some boolean test.  Reduce the duplication by inventing a
    function check_functions_in_node() that applies a simple callback function
    to each SQL function OID appearing in a given expression node.  This also
    fixes some arguable oversights; for example, contain_mutable_functions()
    did not check aggregate or window functions for mutability.  I doubt that
    that represents a live bug at the moment, because we don't really consider
    mutability for aggregates; but it might someday be one.
    
    I chose to put check_functions_in_node() in nodeFuncs.c because it seemed
    like other modules might wish to use it in future.  That in turn forced
    moving set_opfuncid() et al into nodeFuncs.c, as the alternative was for
    nodeFuncs.c to depend on optimizer/setrefs.c which didn't seem very clean.
    
    In passing, teach contain_leaked_vars_walker() about a few more expression
    node types it can safely look through, and improve the rather messy and
    undercommented code in has_parallel_hazard_walker().
    
    Discussion: <20160527185853.ziol2os2zskahl7v@alap3.anarazel.de>
    2f153ddf
setrefs.c 78.1 KB