summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorTom Lane2005-04-07 14:53:04 +0000
committerTom Lane2005-04-07 14:53:04 +0000
commite00ee887612da0dab02f1a56e33d8ae821710e14 (patch)
tree29ceb4c0da3d21fb3d9f20aed0024314ff9eaa82 /src/test
parent5c7c017b0708083c1f609344f51dbe1f1822ca0e (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.out29
-rw-r--r--src/test/regress/sql/plpgsql.sql25
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();