*** ./src/pl/plpgsql/src/pl_comp.c.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/pl/plpgsql/src/pl_comp.c 2011-11-24 17:28:06.885255584 +0100 *************** *** 342,347 **** --- 342,348 ---- compile_tmp_cxt = MemoryContextSwitchTo(func_cxt); function->fn_name = pstrdup(NameStr(procStruct->proname)); + function->fn_signature = format_procedure(fcinfo->flinfo->fn_oid); function->fn_oid = fcinfo->flinfo->fn_oid; function->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data); function->fn_tid = procTup->t_self; *** ./src/pl/plpgsql/src/plpgsql.h.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/pl/plpgsql/src/plpgsql.h 2011-11-24 17:05:45.723119549 +0100 *************** *** 679,684 **** --- 679,685 ---- typedef struct PLpgSQL_function { /* Complete compiled function */ char *fn_name; + char *fn_signature; Oid fn_oid; TransactionId fn_xmin; ItemPointerData fn_tid; *** ./src/test/regress/expected/domain.out.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/test/regress/expected/domain.out 2011-11-24 17:32:27.000000000 +0100 *************** *** 483,489 **** end$$ language plpgsql; select doubledecrement(3); -- fail because of implicit null assignment ERROR: domain pos_int does not allow null values ! CONTEXT: PL/pgSQL function "doubledecrement" line 3 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 0; begin --- 483,489 ---- end$$ language plpgsql; select doubledecrement(3); -- fail because of implicit null assignment ERROR: domain pos_int does not allow null values ! CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" line 3 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 0; begin *************** *** 491,497 **** end$$ language plpgsql; select doubledecrement(3); -- fail at initialization assignment ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement" line 3 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 1; begin --- 491,497 ---- end$$ language plpgsql; select doubledecrement(3); -- fail at initialization assignment ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" line 3 during statement block local variable initialization create or replace function doubledecrement(p1 pos_int) returns pos_int as $$ declare v pos_int := 1; begin *************** *** 504,513 **** ERROR: value for domain pos_int violates check constraint "pos_int_check" select doubledecrement(1); -- fail at assignment to v ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement" line 4 at assignment select doubledecrement(2); -- fail at return ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement" while casting return value to function's return type select doubledecrement(3); -- good doubledecrement ----------------- --- 504,513 ---- ERROR: value for domain pos_int violates check constraint "pos_int_check" select doubledecrement(1); -- fail at assignment to v ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" line 4 at assignment select doubledecrement(2); -- fail at return ERROR: value for domain pos_int violates check constraint "pos_int_check" ! CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" while casting return value to function's return type select doubledecrement(3); -- good doubledecrement ----------------- *************** *** 556,562 **** select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ --- 556,562 ---- select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ *************** *** 574,580 **** select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ --- 574,580 ---- select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ *************** *** 592,598 **** select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ --- 592,598 ---- select array_elem_check(121.00); ERROR: numeric field overflow DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. ! CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ *************** *** 640,644 **** select array_elem_check(-1); ERROR: value for domain orderedpair violates check constraint "orderedpair_check" ! CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment drop function array_elem_check(int); --- 640,644 ---- select array_elem_check(-1); ERROR: value for domain orderedpair violates check constraint "orderedpair_check" ! CONTEXT: PL/pgSQL function "array_elem_check(integer)" line 5 at assignment drop function array_elem_check(int); *** ./src/test/regress/expected/guc.out.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/test/regress/expected/guc.out 2011-11-24 17:32:25.000000000 +0100 *************** *** 687,693 **** select myfunc(0); ERROR: division by zero CONTEXT: SQL statement "SELECT 1/$1" ! PL/pgSQL function "myfunc" line 4 at PERFORM select current_setting('work_mem'); current_setting ----------------- --- 687,693 ---- select myfunc(0); ERROR: division by zero CONTEXT: SQL statement "SELECT 1/$1" ! PL/pgSQL function "myfunc(integer)" line 4 at PERFORM select current_setting('work_mem'); current_setting ----------------- *** ./src/test/regress/expected/plancache.out.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/test/regress/expected/plancache.out 2011-11-24 17:32:27.000000000 +0100 *************** *** 235,241 **** select cachebug(); NOTICE: table "temptable" does not exist, skipping CONTEXT: SQL statement "drop table if exists temptable cascade" ! PL/pgSQL function "cachebug" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 --- 235,241 ---- select cachebug(); NOTICE: table "temptable" does not exist, skipping CONTEXT: SQL statement "drop table if exists temptable cascade" ! PL/pgSQL function "cachebug()" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 *************** *** 247,253 **** select cachebug(); NOTICE: drop cascades to view vv CONTEXT: SQL statement "drop table if exists temptable cascade" ! PL/pgSQL function "cachebug" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 --- 247,253 ---- select cachebug(); NOTICE: drop cascades to view vv CONTEXT: SQL statement "drop table if exists temptable cascade" ! PL/pgSQL function "cachebug()" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 *** ./src/test/regress/expected/plpgsql.out.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/test/regress/expected/plpgsql.out 2011-11-24 17:32:30.000000000 +0100 *************** *** 1518,1533 **** DETAIL: Key (name)=(PF1_1) already exists. update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1'; ERROR: WS.not.there does not exist ! CONTEXT: PL/pgSQL function "tg_backlink_a" line 17 at assignment update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1'; ERROR: illegal backlink beginning with XX ! CONTEXT: PL/pgSQL function "tg_backlink_a" line 17 at assignment update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1'; ERROR: PS.not.there does not exist ! CONTEXT: PL/pgSQL function "tg_slotlink_a" line 17 at assignment update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1'; ERROR: illegal slotlink beginning with XX ! CONTEXT: PL/pgSQL function "tg_slotlink_a" line 17 at assignment insert into HSlot values ('HS', 'base.hub1', 1, ''); ERROR: duplicate key value violates unique constraint "hslot_name" DETAIL: Key (slotname)=(HS.base.hub1.1 ) already exists. --- 1518,1533 ---- DETAIL: Key (name)=(PF1_1) already exists. update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1'; ERROR: WS.not.there does not exist ! CONTEXT: PL/pgSQL function "tg_backlink_a()" line 17 at assignment update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1'; ERROR: illegal backlink beginning with XX ! CONTEXT: PL/pgSQL function "tg_backlink_a()" line 17 at assignment update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1'; ERROR: PS.not.there does not exist ! CONTEXT: PL/pgSQL function "tg_slotlink_a()" line 17 at assignment update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1'; ERROR: illegal slotlink beginning with XX ! CONTEXT: PL/pgSQL function "tg_slotlink_a()" line 17 at assignment insert into HSlot values ('HS', 'base.hub1', 1, ''); ERROR: duplicate key value violates unique constraint "hslot_name" DETAIL: Key (slotname)=(HS.base.hub1.1 ) already exists. *************** *** 2067,2079 **** select test_variable_storage(); NOTICE: should see this CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage" line 8 at PERFORM NOTICE: should see this only if -100 <> 0 CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage" line 8 at PERFORM NOTICE: should see this only if -100 fits in smallint CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage" line 8 at PERFORM test_variable_storage ----------------------- 123456789012 --- 2067,2079 ---- select test_variable_storage(); NOTICE: should see this CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage()" line 8 at PERFORM NOTICE: should see this only if -100 <> 0 CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage()" line 8 at PERFORM NOTICE: should see this only if -100 fits in smallint CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" ! PL/pgSQL function "test_variable_storage()" line 8 at PERFORM test_variable_storage ----------------------- 123456789012 *************** *** 2302,2308 **** $$ language plpgsql; select raise_test1(5); ERROR: too many parameters specified for RAISE ! CONTEXT: PL/pgSQL function "raise_test1" line 3 at RAISE create function raise_test2(int) returns int as $$ begin raise notice 'This message has too few parameters: %, %, %', $1, $1; --- 2302,2308 ---- $$ language plpgsql; select raise_test1(5); ERROR: too many parameters specified for RAISE ! CONTEXT: PL/pgSQL function "raise_test1(integer)" line 3 at RAISE create function raise_test2(int) returns int as $$ begin raise notice 'This message has too few parameters: %, %, %', $1, $1; *************** *** 2311,2317 **** $$ language plpgsql; select raise_test2(10); ERROR: too few parameters specified for RAISE ! CONTEXT: PL/pgSQL function "raise_test2" line 3 at RAISE -- Test re-RAISE inside a nested exception block. This case is allowed -- by Oracle's PL/SQL but was handled differently by PG before 9.1. CREATE FUNCTION reraise_test() RETURNS void AS $$ --- 2311,2317 ---- $$ language plpgsql; select raise_test2(10); ERROR: too few parameters specified for RAISE ! CONTEXT: PL/pgSQL function "raise_test2(integer)" line 3 at RAISE -- Test re-RAISE inside a nested exception block. This case is allowed -- by Oracle's PL/SQL but was handled differently by PG before 9.1. CREATE FUNCTION reraise_test() RETURNS void AS $$ *************** *** 2401,2407 **** 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(); -- --- 2401,2407 ---- 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(); -- *************** *** 2453,2459 **** LINE 1: SELECT sqlstate ^ QUERY: SELECT sqlstate ! CONTEXT: PL/pgSQL function "excpt_test1" line 3 at RAISE create function excpt_test2() returns void as $$ begin begin --- 2453,2459 ---- LINE 1: SELECT sqlstate ^ QUERY: SELECT sqlstate ! CONTEXT: PL/pgSQL function "excpt_test1()" line 3 at RAISE create function excpt_test2() returns void as $$ begin begin *************** *** 2468,2474 **** LINE 1: SELECT sqlstate ^ QUERY: SELECT sqlstate ! CONTEXT: PL/pgSQL function "excpt_test2" line 5 at RAISE create function excpt_test3() returns void as $$ begin begin --- 2468,2474 ---- LINE 1: SELECT sqlstate ^ QUERY: SELECT sqlstate ! CONTEXT: PL/pgSQL function "excpt_test2()" line 5 at RAISE create function excpt_test3() returns void as $$ begin begin *************** *** 2674,2680 **** -- 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 --- 2674,2680 ---- -- 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 *************** *** 2689,2695 **** -- 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(); --- 2689,2695 ---- -- 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(); *************** *** 2850,2856 **** end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin --- 2850,2856 ---- end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin *************** *** 2913,2919 **** end$$ language plpgsql; select footest(); ERROR: query returned no rows ! CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin --- 2913,2919 ---- end$$ language plpgsql; select footest(); ERROR: query returned no rows ! CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin *************** *** 2923,2929 **** end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin --- 2923,2929 ---- end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement create or replace function footest() returns void as $$ declare x record; begin *************** *** 2947,2953 **** end$$ language plpgsql; select footest(); ERROR: query returned no rows ! CONTEXT: PL/pgSQL function "footest" line 5 at EXECUTE statement create or replace function footest() returns void as $$ declare x record; begin --- 2947,2953 ---- end$$ language plpgsql; select footest(); ERROR: query returned no rows ! CONTEXT: PL/pgSQL function "footest()" line 5 at EXECUTE statement create or replace function footest() returns void as $$ declare x record; begin *************** *** 2957,2963 **** end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest" line 5 at EXECUTE statement drop function footest(); -- test scrollable cursor support create function sc_test() returns setof integer as $$ --- 2957,2963 ---- end$$ language plpgsql; select footest(); ERROR: query returned more than one row ! CONTEXT: PL/pgSQL function "footest()" line 5 at EXECUTE statement drop function footest(); -- test scrollable cursor support create function sc_test() returns setof integer as $$ *************** *** 3001,3007 **** select * from sc_test(); -- fails because of NO SCROLL specification ERROR: cursor can only scan forward HINT: Declare it with SCROLL option to enable backward scan. ! CONTEXT: PL/pgSQL function "sc_test" line 7 at FETCH create or replace function sc_test() returns setof integer as $$ declare c refcursor; --- 3001,3007 ---- select * from sc_test(); -- fails because of NO SCROLL specification ERROR: cursor can only scan forward HINT: Declare it with SCROLL option to enable backward scan. ! CONTEXT: PL/pgSQL function "sc_test()" line 7 at FETCH create or replace function sc_test() returns setof integer as $$ declare c refcursor; *************** *** 3588,3594 **** $$ language plpgsql; select raise_test(); ERROR: RAISE option already specified: MESSAGE ! CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE -- conflict on errcode create or replace function raise_test() returns void as $$ begin --- 3588,3594 ---- $$ language plpgsql; select raise_test(); ERROR: RAISE option already specified: MESSAGE ! CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE -- conflict on errcode create or replace function raise_test() returns void as $$ begin *************** *** 3597,3603 **** $$ language plpgsql; select raise_test(); ERROR: RAISE option already specified: ERRCODE ! CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE -- nothing to re-RAISE create or replace function raise_test() returns void as $$ begin --- 3597,3603 ---- $$ language plpgsql; select raise_test(); ERROR: RAISE option already specified: ERRCODE ! CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE -- nothing to re-RAISE create or replace function raise_test() returns void as $$ begin *************** *** 3606,3612 **** $$ language plpgsql; select raise_test(); ERROR: RAISE without parameters cannot be used outside an exception handler ! CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE -- test access to exception data create function zero_divide() returns int as $$ declare v int := 0; --- 3606,3612 ---- $$ language plpgsql; select raise_test(); ERROR: RAISE without parameters cannot be used outside an exception handler ! CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE -- test access to exception data create function zero_divide() returns int as $$ declare v int := 0; *************** *** 3637,3643 **** end; $$ language plpgsql; select stacked_diagnostics_test(); ! NOTICE: sqlstate: 22012, message: division by zero, context: [PL/pgSQL function "zero_divide" line 4 at RETURN <- SQL statement "SELECT zero_divide()" <- PL/pgSQL function "stacked_diagnostics_test" line 6 at PERFORM] stacked_diagnostics_test -------------------------- --- 3637,3643 ---- end; $$ language plpgsql; select stacked_diagnostics_test(); ! NOTICE: sqlstate: 22012, message: division by zero, context: [PL/pgSQL function "zero_divide()" line 4 at RETURN <- SQL statement "SELECT zero_divide()" <- PL/pgSQL function "stacked_diagnostics_test()" line 6 at PERFORM] stacked_diagnostics_test -------------------------- *************** *** 3679,3685 **** $$ language plpgsql; select stacked_diagnostics_test(); ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler ! CONTEXT: PL/pgSQL function "stacked_diagnostics_test" line 6 at GET DIAGNOSTICS drop function zero_divide(); drop function stacked_diagnostics_test(); -- check cases where implicit SQLSTATE variable could be confused with --- 3679,3685 ---- $$ language plpgsql; select stacked_diagnostics_test(); ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler ! CONTEXT: PL/pgSQL function "stacked_diagnostics_test()" line 6 at GET DIAGNOSTICS drop function zero_divide(); drop function stacked_diagnostics_test(); -- check cases where implicit SQLSTATE variable could be confused with *************** *** 3743,3749 **** select case_test(5); -- fails ERROR: case not found HINT: CASE statement is missing ELSE part. ! CONTEXT: PL/pgSQL function "case_test" line 5 at CASE select case_test(8); case_test ---------------------- --- 3743,3749 ---- 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 ---------------------- *************** *** 3771,3777 **** select case_test(13); -- fails ERROR: case not found HINT: CASE statement is missing ELSE part. ! CONTEXT: PL/pgSQL function "case_test" line 5 at CASE create or replace function catch() returns void as $$ begin raise notice '%', case_test(6); --- 3771,3777 ---- 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); *************** *** 4099,4105 **** select error2('nonexistent.stuffs'); ERROR: schema "nonexistent" does not exist CONTEXT: SQL function "error1" statement 1 ! PL/pgSQL function "error2" line 3 at RETURN ROLLBACK TO a; select error2('public.stuffs'); error2 --- 4099,4105 ---- select error2('nonexistent.stuffs'); ERROR: schema "nonexistent" does not exist CONTEXT: SQL function "error1" statement 1 ! PL/pgSQL function "error2(text)" line 3 at RETURN ROLLBACK TO a; select error2('public.stuffs'); error2 *************** *** 4137,4143 **** ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. QUERY: SELECT 'foo\\bar\041baz' ! CONTEXT: PL/pgSQL function "strtest" line 4 at RETURN strtest ------------- foo\bar!baz --- 4137,4143 ---- ^ HINT: Use the escape string syntax for backslashes, e.g., E'\\'. QUERY: SELECT 'foo\\bar\041baz' ! CONTEXT: PL/pgSQL function "strtest()" line 4 at RETURN strtest ------------- foo\bar!baz *************** *** 4220,4226 **** LINE 1: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomn... ^ QUERY: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomno ! CONTEXT: PL/pgSQL function "inline_code_block" line 4 at FOR over SELECT rows -- Check variable scoping -- a var is not available in its own or prior -- default expressions. create function scope_test() returns int as $$ --- 4220,4226 ---- LINE 1: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomn... ^ QUERY: SELECT rtrim(roomno) AS roomno, foo FROM Room ORDER BY roomno ! CONTEXT: PL/pgSQL function "(null)" line 4 at FOR over SELECT rows -- Check variable scoping -- a var is not available in its own or prior -- default expressions. create function scope_test() returns int as $$ *************** *** 4257,4263 **** ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: select q1,q2 from int8_tbl ! CONTEXT: PL/pgSQL function "conflict_test" line 5 at FOR over SELECT rows create or replace function conflict_test() returns setof int8_tbl as $$ #variable_conflict use_variable declare r record; --- 4257,4263 ---- ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: select q1,q2 from int8_tbl ! CONTEXT: PL/pgSQL function "conflict_test()" line 5 at FOR over SELECT rows create or replace function conflict_test() returns setof int8_tbl as $$ #variable_conflict use_variable declare r record; *************** *** 4361,4370 **** -- should fail select foreach_test(ARRAY[1,2,3,4]); ERROR: FOREACH ... SLICE loop variable must be of an array type ! CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array select foreach_test(ARRAY[[1,2],[3,4]]); ERROR: FOREACH ... SLICE loop variable must be of an array type ! CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array create or replace function foreach_test(anyarray) returns void as $$ declare x int[]; --- 4361,4370 ---- -- should fail select foreach_test(ARRAY[1,2,3,4]); ERROR: FOREACH ... SLICE loop variable must be of an array type ! CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array select foreach_test(ARRAY[[1,2],[3,4]]); ERROR: FOREACH ... SLICE loop variable must be of an array type ! CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array create or replace function foreach_test(anyarray) returns void as $$ declare x int[]; *************** *** 4404,4410 **** -- should fail select foreach_test(ARRAY[1,2,3,4]); ERROR: slice dimension (2) is out of the valid range 0..1 ! CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array -- ok select foreach_test(ARRAY[[1,2],[3,4]]); NOTICE: {{1,2},{3,4}} --- 4404,4410 ---- -- should fail select foreach_test(ARRAY[1,2,3,4]); ERROR: slice dimension (2) is out of the valid range 0..1 ! CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array -- ok select foreach_test(ARRAY[[1,2],[3,4]]); NOTICE: {{1,2},{3,4}} *************** *** 4565,4573 **** select testoa(2,1,3); -- fail at initial assign ERROR: value for domain orderedarray violates check constraint "sorted" ! CONTEXT: PL/pgSQL function "testoa" line 4 at assignment select testoa(1,2,1); -- fail at update ERROR: value for domain orderedarray violates check constraint "sorted" ! CONTEXT: PL/pgSQL function "testoa" line 5 at assignment drop function arrayassign1(); drop function testoa(x1 int, x2 int, x3 int); --- 4565,4573 ---- select testoa(2,1,3); -- fail at initial assign ERROR: value for domain orderedarray violates check constraint "sorted" ! CONTEXT: PL/pgSQL function "testoa(integer,integer,integer)" line 4 at assignment select testoa(1,2,1); -- fail at update ERROR: value for domain orderedarray violates check constraint "sorted" ! CONTEXT: PL/pgSQL function "testoa(integer,integer,integer)" line 5 at assignment drop function arrayassign1(); drop function testoa(x1 int, x2 int, x3 int); *** ./src/test/regress/expected/triggers.out.orig 2011-11-24 12:51:45.000000000 +0100 --- ./src/test/regress/expected/triggers.out 2011-11-24 17:32:17.000000000 +0100 *************** *** 965,974 **** NOTICE: NEW: (20,30) NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger" line 17 at SQL statement NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger" line 17 at SQL statement NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) INSERT 0 1 INSERT INTO main_view VALUES (21, 31) RETURNING a, b; --- 965,974 ---- NOTICE: NEW: (20,30) NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger()" line 17 at SQL statement NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger()" line 17 at SQL statement NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) INSERT 0 1 INSERT INTO main_view VALUES (21, 31) RETURNING a, b; *************** *** 977,986 **** NOTICE: NEW: (21,31) NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger" line 17 at SQL statement NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger" line 17 at SQL statement NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) a | b ----+---- --- 977,986 ---- NOTICE: NEW: (21,31) NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger()" line 17 at SQL statement NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)" ! PL/pgSQL function "view_trigger()" line 17 at SQL statement NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) a | b ----+---- *************** *** 995,1010 **** NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) UPDATE 0 UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; --- 995,1010 ---- NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) UPDATE 0 UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; *************** *** 1013,1028 **** NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ---+--- --- 1013,1028 ---- NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ---+--- *************** *** 1038,1056 **** NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) UPDATE 1 UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; --- 1038,1056 ---- NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) UPDATE 1 UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; *************** *** 1059,1077 **** NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ----+---- --- 1059,1077 ---- NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT CONTEXT: SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b" ! PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ----+----