diff options
Diffstat (limited to 'src/test/regress/expected/plpgsql.out')
-rw-r--r-- | src/test/regress/expected/plpgsql.out | 476 |
1 files changed, 13 insertions, 463 deletions
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index a2df411132b..4783807ae04 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2706,339 +2706,6 @@ 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); -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; - - raise notice '---7---'; - for _i in 1..3 loop - raise notice '%', _i; - continue when _i = 3; - end loop; - - raise notice '---8---'; - _i := 1; - while _i <= 3 loop - raise notice '%', _i; - _i := _i + 1; - continue when _i = 3; - end loop; - - raise notice '---9---'; - for _r in select * from conttesttbl order by v limit 1 loop - raise notice '%', _r.v; - continue; - end loop; - - raise notice '---10---'; - for _r in execute 'select * from conttesttbl order by v limit 1' loop - raise notice '%', _r.v; - continue; - 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 -NOTICE: ---7--- -NOTICE: 1 -NOTICE: 2 -NOTICE: 3 -NOTICE: ---8--- -NOTICE: 1 -NOTICE: 2 -NOTICE: 3 -NOTICE: ---9--- -NOTICE: 10 -NOTICE: ---10--- -NOTICE: 10 - continue_test1 ----------------- - -(1 row) - -drop function continue_test1(); -drop table conttesttbl; --- should fail: CONTINUE is only legal inside a loop -create function continue_error1() returns void as $$ -begin - begin - continue; - end; -end; -$$ language plpgsql; -ERROR: CONTINUE cannot be used outside a loop -LINE 4: continue; - ^ --- should fail: unlabeled EXIT is only legal inside a loop -create function exit_error1() returns void as $$ -begin - begin - exit; - end; -end; -$$ language plpgsql; -ERROR: EXIT cannot be used outside a loop, unless it has a label -LINE 4: exit; - ^ --- should fail: no such label -create function continue_error2() returns void as $$ -begin - begin - loop - continue no_such_label; - end loop; - end; -end; -$$ language plpgsql; -ERROR: there is no label "no_such_label" attached to any block or loop enclosing this statement -LINE 5: continue no_such_label; - ^ --- should fail: no such label -create function exit_error2() returns void as $$ -begin - begin - loop - exit no_such_label; - end loop; - end; -end; -$$ language plpgsql; -ERROR: there is no label "no_such_label" attached to any block or loop enclosing this statement -LINE 5: exit no_such_label; - ^ --- should fail: CONTINUE can't reference the label of a named block -create function continue_error3() returns void as $$ -begin - <<begin_block1>> - begin - loop - continue begin_block1; - end loop; - end; -end; -$$ language plpgsql; -ERROR: block label "begin_block1" cannot be used in CONTINUE -LINE 6: continue begin_block1; - ^ --- On the other hand, EXIT *can* reference the label of a named block -create function exit_block1() returns void as $$ -begin - <<begin_block1>> - begin - loop - exit begin_block1; - raise exception 'should not get here'; - end loop; - end; -end; -$$ language plpgsql; -select exit_block1(); - exit_block1 -------------- - -(1 row) - -drop function exit_block1(); --- verbose end block and end loop -create function end_label1() returns void as $$ -<<blbl>> -begin - <<flbl1>> - for _i in 1 .. 10 loop - exit flbl1; - end loop flbl1; - <<flbl2>> - for _i in 1 .. 10 loop - exit flbl2; - end loop; -end blbl; -$$ language plpgsql; -select end_label1(); - end_label1 ------------- - -(1 row) - -drop function end_label1(); --- should fail: undefined end label -create function end_label2() returns void as $$ -begin - for _i in 1 .. 10 loop - exit; - end loop flbl1; -end; -$$ language plpgsql; -ERROR: end label "flbl1" specified for unlabelled block -LINE 5: end loop flbl1; - ^ --- should fail: end label does not match start label -create function end_label3() returns void as $$ -<<outer_label>> -begin - <<inner_label>> - for _i in 1 .. 10 loop - exit; - end loop outer_label; -end; -$$ language plpgsql; -ERROR: end label "outer_label" differs from block's label "inner_label" -LINE 7: end loop outer_label; - ^ --- should fail: end label on a block without a start label -create function end_label4() returns void as $$ -<<outer_label>> -begin - for _i in 1 .. 10 loop - exit; - end loop outer_label; -end; -$$ language plpgsql; -ERROR: end label "outer_label" specified for unlabelled block -LINE 6: end loop outer_label; - ^ --- using list of scalars in fori and fore stmts -create function for_vect() returns void as $proc$ -<<lbl>>declare a integer; b varchar; c varchar; r record; -begin - -- fori - for i in 1 .. 3 loop - raise notice '%', i; - end loop; - -- fore with record var - for r in select gs as aa, 'BB' as bb, 'CC' as cc from generate_series(1,4) gs loop - raise notice '% % %', r.aa, r.bb, r.cc; - end loop; - -- fore with single scalar - for a in select gs from generate_series(1,4) gs loop - raise notice '%', a; - end loop; - -- fore with multiple scalars - for a,b,c in select gs, 'BB','CC' from generate_series(1,4) gs loop - raise notice '% % %', a, b, c; - end loop; - -- using qualified names in fors, fore is enabled, disabled only for fori - for lbl.a, lbl.b, lbl.c in execute $$select gs, 'bb','cc' from generate_series(1,4) gs$$ loop - raise notice '% % %', a, b, c; - end loop; -end; -$proc$ language plpgsql; -select for_vect(); -NOTICE: 1 -NOTICE: 2 -NOTICE: 3 -NOTICE: 1 BB CC -NOTICE: 2 BB CC -NOTICE: 3 BB CC -NOTICE: 4 BB CC -NOTICE: 1 -NOTICE: 2 -NOTICE: 3 -NOTICE: 4 -NOTICE: 1 BB CC -NOTICE: 2 BB CC -NOTICE: 3 BB CC -NOTICE: 4 BB CC -NOTICE: 1 bb cc -NOTICE: 2 bb cc -NOTICE: 3 bb cc -NOTICE: 4 bb cc - for_vect ----------- - -(1 row) - -- regression test: verify that multiple uses of same plpgsql datum within -- a SQL command all get mapped to the same $n parameter. The return value -- of the SELECT is not important, we only care that it doesn't fail with @@ -4368,136 +4035,6 @@ NOTICE: column >>some column name<<, constraint >>some constraint name<<, type (1 row) drop function stacked_diagnostics_test(); --- test CASE statement -create or replace function case_test(bigint) returns text as $$ -declare a int = 10; - b int = 1; -begin - case $1 - when 1 then - return 'one'; - when 2 then - return 'two'; - when 3,4,3+5 then - return 'three, four or eight'; - when a then - return 'ten'; - when a+b, a+b+1 then - return 'eleven, twelve'; - end case; -end; -$$ language plpgsql immutable; -select case_test(1); - case_test ------------ - one -(1 row) - -select case_test(2); - case_test ------------ - two -(1 row) - -select case_test(3); - case_test ----------------------- - three, four or eight -(1 row) - -select case_test(4); - case_test ----------------------- - three, four or eight -(1 row) - -select case_test(5); -- fails -ERROR: case not found -HINT: CASE statement is missing ELSE part. -CONTEXT: PL/pgSQL function case_test(bigint) line 5 at CASE -select case_test(8); - case_test ----------------------- - three, four or eight -(1 row) - -select case_test(10); - case_test ------------ - ten -(1 row) - -select case_test(11); - case_test ----------------- - eleven, twelve -(1 row) - -select case_test(12); - case_test ----------------- - eleven, twelve -(1 row) - -select case_test(13); -- fails -ERROR: case not found -HINT: CASE statement is missing ELSE part. -CONTEXT: PL/pgSQL function case_test(bigint) line 5 at CASE -create or replace function catch() returns void as $$ -begin - raise notice '%', case_test(6); -exception - when case_not_found then - raise notice 'caught case_not_found % %', SQLSTATE, SQLERRM; -end -$$ language plpgsql; -select catch(); -NOTICE: caught case_not_found 20000 case not found - catch -------- - -(1 row) - --- test the searched variant too, as well as ELSE -create or replace function case_test(bigint) returns text as $$ -declare a int = 10; -begin - case - when $1 = 1 then - return 'one'; - when $1 = a + 2 then - return 'twelve'; - else - return 'other'; - end case; -end; -$$ language plpgsql immutable; -select case_test(1); - case_test ------------ - one -(1 row) - -select case_test(2); - case_test ------------ - other -(1 row) - -select case_test(12); - case_test ------------ - twelve -(1 row) - -select case_test(13); - case_test ------------ - other -(1 row) - -drop function catch(); -drop function case_test(bigint); -- test variadic functions create or replace function vari(variadic int[]) returns void as $$ @@ -5409,6 +4946,12 @@ create function consumes_rw_array(int[]) returns int language plpgsql as $$ begin return $1[1]; end; $$ stable; +select consumes_rw_array(returns_rw_array(42)); + consumes_rw_array +------------------- + 42 +(1 row) + -- bug #14174 explain (verbose, costs off) select i, a from @@ -5465,6 +5008,13 @@ select consumes_rw_array(a), a from 2 | {2,2} (2 rows) +do $$ +declare a int[] := array[1,2]; +begin + a := a || 3; + raise notice 'a = %', a; +end$$; +NOTICE: a = {1,2,3} -- -- Test access to call stack -- |