aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2018-03-04 10:35:23 -0500
committerPeter Eisentraut <peter_e@gmx.net>2018-03-04 10:35:23 -0500
commitf7c7f67fecc40170a2fad2d1cff24dd1ddd22d7f (patch)
tree6ab7329bf787f326bd4ba789d91e948701dce1f1
parent58d9acc18d38899ebc30812b4984778c7069f42c (diff)
downloadpostgresql-f7c7f67fecc40170a2fad2d1cff24dd1ddd22d7f.tar.gz
postgresql-f7c7f67fecc40170a2fad2d1cff24dd1ddd22d7f.zip
PL/pgSQL: Simplify RETURN checking for procedures
Check at compile time that RETURN in a procedure does not specify a parameter, rather than at run time.
-rw-r--r--src/pl/plpgsql/src/expected/plpgsql_call.out7
-rw-r--r--src/pl/plpgsql/src/pl_exec.c5
-rw-r--r--src/pl/plpgsql/src/pl_gram.y19
-rw-r--r--src/pl/plpgsql/src/sql/plpgsql_call.sql3
4 files changed, 16 insertions, 18 deletions
diff --git a/src/pl/plpgsql/src/expected/plpgsql_call.out b/src/pl/plpgsql/src/expected/plpgsql_call.out
index e2442c603cd..2f3adcd8d82 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 297aa3e4732..489484f184c 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 697ead0570e..9fcf2424dae 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 321ed43af8e..e580e5fea07 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;