Prefer argument name over "$n" for the refname of a plpgsql argument.

If a function argument has a name, use that as the "refname" of the
PLpgSQL_datum representing the argument, instead of $n as before.
This allows better error messages in some cases.

Pavel Stehule, reviewed by Jeevan Chalke

Discussion: https://postgr.es/m/CAFj8pRB9GyU2U1Sb2ssgP26DZ_yq-FYDfpvUvGQ=k4R=yOPVjg@mail.gmail.com
This commit is contained in:
Tom Lane 2017-09-11 16:24:34 -04:00
parent 3612019a79
commit b8060e41b5
3 changed files with 28 additions and 3 deletions

View File

@ -433,9 +433,14 @@ do_compile(FunctionCallInfo fcinfo,
errmsg("PL/pgSQL functions cannot accept type %s",
format_type_be(argtypeid))));
/* Build variable and add to datum list */
argvariable = plpgsql_build_variable(buf, 0,
argdtype, false);
/*
* Build variable and add to datum list. If there's a name
* for the argument, use that as refname, else use $n name.
*/
argvariable = plpgsql_build_variable((argnames &&
argnames[i][0] != '\0') ?
argnames[i] : buf,
0, argdtype, false);
if (argvariable->dtype == PLPGSQL_DTYPE_VAR)
{

View File

@ -6029,3 +6029,14 @@ SELECT * FROM list_partitioned_table() AS t;
2
(2 rows)
--
-- Check argument name is used instead of $n in error message
--
CREATE FUNCTION fx(x WSlot) RETURNS void AS $$
BEGIN
GET DIAGNOSTICS x = ROW_COUNT;
RETURN;
END; $$ LANGUAGE plpgsql;
ERROR: "x" is not a scalar variable
LINE 3: GET DIAGNOSTICS x = ROW_COUNT;
^

View File

@ -4811,3 +4811,12 @@ BEGIN
END; $$ LANGUAGE plpgsql;
SELECT * FROM list_partitioned_table() AS t;
--
-- Check argument name is used instead of $n in error message
--
CREATE FUNCTION fx(x WSlot) RETURNS void AS $$
BEGIN
GET DIAGNOSTICS x = ROW_COUNT;
RETURN;
END; $$ LANGUAGE plpgsql;