• Tom Lane's avatar
    Fix display of SQL-standard function's arguments in INSERT/SELECT. · 5d5779ae
    Tom Lane authored
    If a SQL-standard function body contains an INSERT ... SELECT statement,
    any function parameters referenced within the SELECT were always printed
    in $N style, rather than using the parameter name if any.  While not
    strictly incorrect, this wasn't the intention, and it's inconsistent
    with the way that such parameters would be printed in any other kind
    of statement.
    
    The cause is that the recursion to get_query_def from
    get_insert_query_def neglected to pass down the context->namespaces
    list, passing constant NIL instead.  This is a very ancient oversight,
    but AFAICT it had no visible consequences before commit e717a9a1
    added an outermost namespace with function parameters.  We don't allow
    INSERT ... SELECT as a sub-query, except in a top-level WITH clause,
    where it couldn't contain any outer references that might need to access
    upper namespaces.  So although that's arguably a bug, I don't see any
    point in changing it before v14.
    
    In passing, harden the code added to get_parameter by e717a9a1 so that
    it won't crash if a PARAM_EXTERN Param appears in an unexpected place.
    
    Per report from Erki Eessaar.  Code fix by me, regression test case
    by Masahiko Sawada.
    
    Discussion: https://postgr.es/m/AM9PR01MB8268347BED344848555167FAFE949@AM9PR01MB8268.eurprd01.prod.exchangelabs.com
    5d5779ae
create_function_3.out 24.2 KB