diff --git a/src/pl/plpgsql/src/expected/plpgsql_call.out b/src/pl/plpgsql/src/expected/plpgsql_call.out index e2442c603c..2f3adcd8d8 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_call.out +++ b/src/pl/plpgsql/src/expected/plpgsql_call.out @@ -17,9 +17,9 @@ BEGIN RETURN 5; END; $$; -CALL test_proc2(); -ERROR: cannot return a value from a procedure -CONTEXT: PL/pgSQL function test_proc2() while casting return value to function's return type +ERROR: RETURN cannot have a parameter in a procedure +LINE 5: RETURN 5; + ^ CREATE TABLE test1 (a int); CREATE PROCEDURE test_proc3(x int) LANGUAGE plpgsql @@ -54,7 +54,6 @@ SELECT * FROM test1; (2 rows) DROP PROCEDURE test_proc1; -DROP PROCEDURE test_proc2; DROP PROCEDURE test_proc3; DROP PROCEDURE test_proc4; DROP TABLE test1; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 297aa3e473..489484f184 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -617,11 +617,6 @@ plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo, } else if (!estate.retisnull) { - if (func->fn_prokind == PROKIND_PROCEDURE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot return a value from a procedure"))); - /* * Cast result value to function's declared result type, and copy it * out to the upper executor memory context. We must treat tuple diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 697ead0570..9fcf2424da 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -3138,14 +3138,21 @@ make_return_stmt(int location) parser_errposition(yylloc))); new->retvarno = plpgsql_curr_compile->out_param_varno; } - else if (plpgsql_curr_compile->fn_rettype == VOIDOID && - plpgsql_curr_compile->fn_prokind != PROKIND_PROCEDURE) + else if (plpgsql_curr_compile->fn_rettype == VOIDOID) { if (yylex() != ';') - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("RETURN cannot have a parameter in function returning void"), - parser_errposition(yylloc))); + { + if (plpgsql_curr_compile->fn_prokind == PROKIND_PROCEDURE) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("RETURN cannot have a parameter in a procedure"), + parser_errposition(yylloc))); + else + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("RETURN cannot have a parameter in function returning void"), + parser_errposition(yylloc))); + } } else { diff --git a/src/pl/plpgsql/src/sql/plpgsql_call.sql b/src/pl/plpgsql/src/sql/plpgsql_call.sql index 321ed43af8..e580e5fea0 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_call.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_call.sql @@ -22,8 +22,6 @@ BEGIN END; $$; -CALL test_proc2(); - CREATE TABLE test1 (a int); @@ -58,7 +56,6 @@ SELECT * FROM test1; DROP PROCEDURE test_proc1; -DROP PROCEDURE test_proc2; DROP PROCEDURE test_proc3; DROP PROCEDURE test_proc4;