• Tom Lane's avatar
    Fix missed lock acquisition while inlining new-style SQL functions. · 983d7033
    Tom Lane authored
    When starting to use a query parsetree loaded from the catalogs,
    we must begin by applying AcquireRewriteLocks(), to obtain the same
    relation locks that the parser would have gotten if the query were
    entered interactively, and to do some other cleanup such as dealing
    with later-dropped columns.  New-style SQL functions are just as
    subject to this rule as other stored parsetrees; however, of the
    places dealing with such functions, only init_sql_fcache had gotten
    the memo.  In particular, if we successfully inlined a new-style
    set-returning SQL function that contained any relation references,
    we'd either get an assertion failure or attempt to use those
    relation(s) sans locks.
    
    I also added AcquireRewriteLocks calls to fmgr_sql_validator and
    print_function_sqlbody.  Desultory experiments didn't demonstrate any
    failures in those, but I suspect that I just didn't try hard enough.
    Certainly we don't expect nearby code paths to operate without locks.
    
    On the same logic of it-ought-to-have-the-same-effects-as-the-old-code,
    call pg_rewrite_query() in fmgr_sql_validator, too.  It's possible
    that neither code path there needs to bother with rewriting, but
    doing the analysis to prove that is beyond my goals for today.
    
    Per bug #17161 from Alexander Lakhin.
    
    Discussion: https://postgr.es/m/17161-048a1cdff8422800@postgresql.org
    983d7033
create_function_3.sql 11.8 KB