Fix EXIT out of outermost block in plpgsql.
Ordinarily, using EXIT this way would draw "control reached end of function without RETURN". However, if the function is one where we don't require an explicit RETURN (such as a DO block), that should not happen. It did anyway, because add_dummy_return() neglected to account for the case. Per report from Herwig Goemans. Back-patch to all supported branches. Discussion: https://postgr.es/m/868ae948-e3ca-c7ec-95a6-83cfc08ef750@gmail.com
This commit is contained in:
parent
b6a10ff4ab
commit
bdd6ce48d0
@ -413,6 +413,17 @@ begin
|
||||
raise notice 'should get here';
|
||||
end$$;
|
||||
NOTICE: should get here
|
||||
-- check exit out of outermost block
|
||||
do $$
|
||||
<<outerblock>>
|
||||
begin
|
||||
<<innerblock>>
|
||||
begin
|
||||
exit outerblock;
|
||||
raise notice 'should not get here';
|
||||
end;
|
||||
raise notice 'should not get here, either';
|
||||
end$$;
|
||||
-- unlabeled exit does match a while loop
|
||||
do $$
|
||||
begin
|
||||
|
@ -1029,9 +1029,11 @@ add_dummy_return(PLpgSQL_function *function)
|
||||
/*
|
||||
* If the outer block has an EXCEPTION clause, we need to make a new outer
|
||||
* block, since the added RETURN shouldn't act like it is inside the
|
||||
* EXCEPTION clause.
|
||||
* EXCEPTION clause. Likewise, if it has a label, wrap it in a new outer
|
||||
* block so that EXIT doesn't skip the RETURN.
|
||||
*/
|
||||
if (function->action->exceptions != NULL)
|
||||
if (function->action->exceptions != NULL ||
|
||||
function->action->label != NULL)
|
||||
{
|
||||
PLpgSQL_stmt_block *new;
|
||||
|
||||
|
@ -311,6 +311,18 @@ begin
|
||||
raise notice 'should get here';
|
||||
end$$;
|
||||
|
||||
-- check exit out of outermost block
|
||||
do $$
|
||||
<<outerblock>>
|
||||
begin
|
||||
<<innerblock>>
|
||||
begin
|
||||
exit outerblock;
|
||||
raise notice 'should not get here';
|
||||
end;
|
||||
raise notice 'should not get here, either';
|
||||
end$$;
|
||||
|
||||
-- unlabeled exit does match a while loop
|
||||
do $$
|
||||
begin
|
||||
|
Loading…
x
Reference in New Issue
Block a user