diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/plpgsql.out | 137 | ||||
| -rw-r--r-- | src/test/regress/sql/plpgsql.sql | 94 |
2 files changed, 231 insertions, 0 deletions
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index 21101958ab4..23ef2d3f2ed 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2491,3 +2491,140 @@ NOTICE: {10,20,30}; 20; xyz; xyzabc; (10,aaa,,30); <NULL> (1 row) drop function raise_exprs(); +-- continue statement +create table conttesttbl(idx serial, v integer); +NOTICE: CREATE TABLE will create implicit sequence "conttesttbl_idx_seq" for serial column "conttesttbl.idx" +insert into conttesttbl(v) values(10); +insert into conttesttbl(v) values(20); +insert into conttesttbl(v) values(30); +insert into conttesttbl(v) values(40); +create function continue_test1() returns void as $$ +declare _i integer = 0; _r record; +begin + raise notice '---1---'; + loop + _i := _i + 1; + raise notice '%', _i; + continue when _i < 10; + exit; + end loop; + + raise notice '---2---'; + <<lbl>> + loop + _i := _i - 1; + loop + raise notice '%', _i; + continue lbl when _i > 0; + exit lbl; + end loop; + end loop; + + raise notice '---3---'; + <<the_loop>> + while _i < 10 loop + _i := _i + 1; + continue the_loop when _i % 2 = 0; + raise notice '%', _i; + end loop; + + raise notice '---4---'; + for _i in 1..10 loop + begin + -- applies to outer loop, not the nested begin block + continue when _i < 5; + raise notice '%', _i; + end; + end loop; + + raise notice '---5---'; + for _r in select * from conttesttbl loop + continue when _r.v <= 20; + raise notice '%', _r.v; + end loop; + + raise notice '---6---'; + for _r in execute 'select * from conttesttbl' loop + continue when _r.v <= 20; + raise notice '%', _r.v; + end loop; +end; $$ language plpgsql; +select continue_test1(); +NOTICE: ---1--- +NOTICE: 1 +NOTICE: 2 +NOTICE: 3 +NOTICE: 4 +NOTICE: 5 +NOTICE: 6 +NOTICE: 7 +NOTICE: 8 +NOTICE: 9 +NOTICE: 10 +NOTICE: ---2--- +NOTICE: 9 +NOTICE: 8 +NOTICE: 7 +NOTICE: 6 +NOTICE: 5 +NOTICE: 4 +NOTICE: 3 +NOTICE: 2 +NOTICE: 1 +NOTICE: 0 +NOTICE: ---3--- +NOTICE: 1 +NOTICE: 3 +NOTICE: 5 +NOTICE: 7 +NOTICE: 9 +NOTICE: ---4--- +NOTICE: 5 +NOTICE: 6 +NOTICE: 7 +NOTICE: 8 +NOTICE: 9 +NOTICE: 10 +NOTICE: ---5--- +NOTICE: 30 +NOTICE: 40 +NOTICE: ---6--- +NOTICE: 30 +NOTICE: 40 + continue_test1 +---------------- + +(1 row) + +-- CONTINUE is only legal inside a loop +create function continue_test2() returns void as $$ +begin + begin + continue; + end; + return; +end; +$$ language plpgsql; +-- should fail +select continue_test2(); +ERROR: CONTINUE cannot be used outside a loop +CONTEXT: PL/pgSQL function "continue_test2" +-- CONTINUE can't reference the label of a named block +create function continue_test3() returns void as $$ +begin + <<begin_block1>> + begin + loop + continue begin_block1; + end loop; + end; +end; +$$ language plpgsql; +-- should fail +select continue_test3(); +ERROR: CONTINUE cannot be used outside a loop +CONTEXT: PL/pgSQL function "continue_test3" +drop function continue_test1(); +drop function continue_test2(); +drop function continue_test3(); +drop table conttesttbl; diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index 375eef8959c..393fdc52b0c 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -2112,3 +2112,97 @@ end;$$ language plpgsql; select raise_exprs(); drop function raise_exprs(); + +-- continue statement +create table conttesttbl(idx serial, v integer); +insert into conttesttbl(v) values(10); +insert into conttesttbl(v) values(20); +insert into conttesttbl(v) values(30); +insert into conttesttbl(v) values(40); + +create function continue_test1() returns void as $$ +declare _i integer = 0; _r record; +begin + raise notice '---1---'; + loop + _i := _i + 1; + raise notice '%', _i; + continue when _i < 10; + exit; + end loop; + + raise notice '---2---'; + <<lbl>> + loop + _i := _i - 1; + loop + raise notice '%', _i; + continue lbl when _i > 0; + exit lbl; + end loop; + end loop; + + raise notice '---3---'; + <<the_loop>> + while _i < 10 loop + _i := _i + 1; + continue the_loop when _i % 2 = 0; + raise notice '%', _i; + end loop; + + raise notice '---4---'; + for _i in 1..10 loop + begin + -- applies to outer loop, not the nested begin block + continue when _i < 5; + raise notice '%', _i; + end; + end loop; + + raise notice '---5---'; + for _r in select * from conttesttbl loop + continue when _r.v <= 20; + raise notice '%', _r.v; + end loop; + + raise notice '---6---'; + for _r in execute 'select * from conttesttbl' loop + continue when _r.v <= 20; + raise notice '%', _r.v; + end loop; +end; $$ language plpgsql; + +select continue_test1(); + +-- CONTINUE is only legal inside a loop +create function continue_test2() returns void as $$ +begin + begin + continue; + end; + return; +end; +$$ language plpgsql; + +-- should fail +select continue_test2(); + +-- CONTINUE can't reference the label of a named block +create function continue_test3() returns void as $$ +begin + <<begin_block1>> + begin + loop + continue begin_block1; + end loop; + end; +end; +$$ language plpgsql; + +-- should fail +select continue_test3(); + +drop function continue_test1(); +drop function continue_test2(); +drop function continue_test3(); +drop table conttesttbl; |
