diff options
| author | Tom Lane | 2005-04-07 14:53:04 +0000 |
|---|---|---|
| committer | Tom Lane | 2005-04-07 14:53:04 +0000 |
| commit | e00ee887612da0dab02f1a56e33d8ae821710e14 (patch) | |
| tree | 29ceb4c0da3d21fb3d9f20aed0024314ff9eaa82 /src/test | |
| parent | 5c7c017b0708083c1f609344f51dbe1f1822ca0e (diff) | |
Allow plpgsql functions to omit RETURN command when the function returns
output parameters or VOID or a set. There seems no particular reason to
insist on a RETURN in these cases, since the function return value is
determined by other elements anyway. Per recent discussion.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/plpgsql.out | 29 | ||||
| -rw-r--r-- | src/test/regress/sql/plpgsql.sql | 25 |
2 files changed, 45 insertions, 9 deletions
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index ee1c52dfa46..08fbe46b3a2 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -1739,7 +1739,8 @@ SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); (1 row) -- --- Test handling of OUT parameters, including polymorphic cases +-- Test handling of OUT parameters, including polymorphic cases. +-- Note that RETURN is optional with OUT params; we try both ways. -- -- wrong way to do it: create function f1(in i int, out j int) returns int as $$ @@ -1769,7 +1770,6 @@ select * from f1(42); create or replace function f1(inout i int) as $$ begin i := i+1; - return; end$$ language plpgsql; select f1(42); f1 @@ -1805,7 +1805,6 @@ begin j := i; j := j+1; k := 'foo'; - return; end$$ language plpgsql; select f1(42); f1 @@ -1828,7 +1827,6 @@ begin j := j+1; k := 'foot'; return next; - return; end$$ language plpgsql; select * from f1(42); j | k @@ -2358,6 +2356,27 @@ create function void_return_expr() returns void as $$ begin return 5; end;$$ language plpgsql; -ERROR: function returning void cannot specify RETURN expression at or near "5" at character 72 +ERROR: RETURN cannot have a parameter in function returning void at or near "5" at character 72 LINE 3: return 5; ^ +-- VOID functions are allowed to omit RETURN +create function void_return_expr() returns void as $$ +begin + perform 2+2; +end;$$ language plpgsql; +select void_return_expr(); + void_return_expr +------------------ + +(1 row) + +-- but ordinary functions are not +create function missing_return_expr() returns int as $$ +begin + perform 2+2; +end;$$ language plpgsql; +select missing_return_expr(); +ERROR: control reached end of function without RETURN +CONTEXT: PL/pgSQL function "missing_return_expr" +drop function void_return_expr(); +drop function missing_return_expr(); diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index e8079615f1e..7ea7c8c6e0c 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -1561,7 +1561,8 @@ SELECT * FROM test_ret_rec_dyn(1500) AS (a int, b int, c int); SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); -- --- Test handling of OUT parameters, including polymorphic cases +-- Test handling of OUT parameters, including polymorphic cases. +-- Note that RETURN is optional with OUT params; we try both ways. -- -- wrong way to do it: @@ -1582,7 +1583,6 @@ select * from f1(42); create or replace function f1(inout i int) as $$ begin i := i+1; - return; end$$ language plpgsql; select f1(42); @@ -1608,7 +1608,6 @@ begin j := i; j := j+1; k := 'foo'; - return; end$$ language plpgsql; select f1(42); @@ -1624,7 +1623,6 @@ begin j := j+1; k := 'foot'; return next; - return; end$$ language plpgsql; select * from f1(42); @@ -2001,3 +1999,22 @@ create function void_return_expr() returns void as $$ begin return 5; end;$$ language plpgsql; + +-- VOID functions are allowed to omit RETURN +create function void_return_expr() returns void as $$ +begin + perform 2+2; +end;$$ language plpgsql; + +select void_return_expr(); + +-- but ordinary functions are not +create function missing_return_expr() returns int as $$ +begin + perform 2+2; +end;$$ language plpgsql; + +select missing_return_expr(); + +drop function void_return_expr(); +drop function missing_return_expr(); |
