diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 1bb25738a5..6b4022c3bc 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -6566,7 +6566,7 @@ get_insert_query_def(Query *query, deparse_context *context) if (select_rte) { /* Add the SELECT */ - get_query_def(select_rte->subquery, buf, NIL, NULL, + get_query_def(select_rte->subquery, buf, context->namespaces, NULL, context->prettyFlags, context->wrapColumn, context->indentLevel); } @@ -7919,10 +7919,12 @@ get_parameter(Param *param, deparse_context *context) * If it's an external parameter, see if the outermost namespace provides * function argument names. */ - if (param->paramkind == PARAM_EXTERN) + if (param->paramkind == PARAM_EXTERN && context->namespaces != NIL) { - dpns = lfirst(list_tail(context->namespaces)); - if (dpns->argnames) + dpns = llast(context->namespaces); + if (dpns->argnames && + param->paramid > 0 && + param->paramid <= dpns->numargs) { char *argname = dpns->argnames[param->paramid - 1]; diff --git a/src/test/regress/expected/create_function_3.out b/src/test/regress/expected/create_function_3.out index a77df01042..3a4fd45147 100644 --- a/src/test/regress/expected/create_function_3.out +++ b/src/test/regress/expected/create_function_3.out @@ -279,6 +279,13 @@ CREATE FUNCTION functest_S_13() RETURNS boolean SELECT 1; SELECT false; END; +-- check display of function argments in sub-SELECT +CREATE TABLE functest1 (i int); +CREATE FUNCTION functest_S_16(a int, b int) RETURNS void + LANGUAGE SQL + BEGIN ATOMIC + INSERT INTO functest1 SELECT a + $2; + END; -- error: duplicate function body CREATE FUNCTION functest_S_xxx(x int) RETURNS int LANGUAGE SQL @@ -417,6 +424,20 @@ SELECT pg_get_functiondef('functest_S_15'::regproc); (1 row) +SELECT pg_get_functiondef('functest_S_16'::regproc); + pg_get_functiondef +------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION temp_func_test.functest_s_16(a integer, b integer)+ + RETURNS void + + LANGUAGE sql + + BEGIN ATOMIC + + INSERT INTO functest1 (i) SELECT (functest_s_16.a + functest_s_16.b); + + END + + +(1 row) + +DROP TABLE functest1 CASCADE; +NOTICE: drop cascades to function functest_s_16(integer,integer) -- test with views CREATE TABLE functest3 (a int); INSERT INTO functest3 VALUES (1), (2); diff --git a/src/test/regress/sql/create_function_3.sql b/src/test/regress/sql/create_function_3.sql index 23a46b0b11..7edd757b8f 100644 --- a/src/test/regress/sql/create_function_3.sql +++ b/src/test/regress/sql/create_function_3.sql @@ -180,6 +180,14 @@ CREATE FUNCTION functest_S_13() RETURNS boolean SELECT false; END; +-- check display of function argments in sub-SELECT +CREATE TABLE functest1 (i int); +CREATE FUNCTION functest_S_16(a int, b int) RETURNS void + LANGUAGE SQL + BEGIN ATOMIC + INSERT INTO functest1 SELECT a + $2; + END; + -- error: duplicate function body CREATE FUNCTION functest_S_xxx(x int) RETURNS int LANGUAGE SQL @@ -217,6 +225,9 @@ SELECT pg_get_functiondef('functest_S_3a'::regproc); SELECT pg_get_functiondef('functest_S_10'::regproc); SELECT pg_get_functiondef('functest_S_13'::regproc); SELECT pg_get_functiondef('functest_S_15'::regproc); +SELECT pg_get_functiondef('functest_S_16'::regproc); + +DROP TABLE functest1 CASCADE; -- test with views CREATE TABLE functest3 (a int);