Print function signature, not just name, in PL/pgSQL error messages.

This makes it unambiguous which function the message is coming from, if you
have overloaded functions.

Pavel Stehule, reviewed by Abhijit Menon-Sen.
This commit is contained in:
Heikki Linnakangas 2012-01-31 10:34:50 +02:00
parent 82d4b262d9
commit 4c6cedd1b0
8 changed files with 91 additions and 88 deletions

View File

@ -342,6 +342,7 @@ do_compile(FunctionCallInfo fcinfo,
compile_tmp_cxt = MemoryContextSwitchTo(func_cxt); compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
function->fn_name = pstrdup(NameStr(procStruct->proname)); 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_oid = fcinfo->flinfo->fn_oid;
function->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data); function->fn_xmin = HeapTupleHeaderGetXmin(procTup->t_data);
function->fn_tid = procTup->t_self; function->fn_tid = procTup->t_self;
@ -803,6 +804,7 @@ plpgsql_compile_inline(char *proc_source)
compile_tmp_cxt = MemoryContextSwitchTo(func_cxt); compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);
function->fn_name = pstrdup(func_name); function->fn_name = pstrdup(func_name);
function->fn_signature = pstrdup(func_name);
function->fn_is_trigger = false; function->fn_is_trigger = false;
function->fn_input_collation = InvalidOid; function->fn_input_collation = InvalidOid;
function->fn_cxt = func_cxt; function->fn_cxt = func_cxt;

View File

@ -799,7 +799,7 @@ plpgsql_exec_error_callback(void *arg)
* local variable initialization" * local variable initialization"
*/ */
errcontext("PL/pgSQL function \"%s\" line %d %s", errcontext("PL/pgSQL function \"%s\" line %d %s",
estate->func->fn_name, estate->func->fn_signature,
estate->err_stmt->lineno, estate->err_stmt->lineno,
_(estate->err_text)); _(estate->err_text));
} }
@ -810,7 +810,7 @@ plpgsql_exec_error_callback(void *arg)
* arguments into local variables" * arguments into local variables"
*/ */
errcontext("PL/pgSQL function \"%s\" %s", errcontext("PL/pgSQL function \"%s\" %s",
estate->func->fn_name, estate->func->fn_signature,
_(estate->err_text)); _(estate->err_text));
} }
} }
@ -818,13 +818,13 @@ plpgsql_exec_error_callback(void *arg)
{ {
/* translator: last %s is a plpgsql statement type name */ /* translator: last %s is a plpgsql statement type name */
errcontext("PL/pgSQL function \"%s\" line %d at %s", errcontext("PL/pgSQL function \"%s\" line %d at %s",
estate->func->fn_name, estate->func->fn_signature,
estate->err_stmt->lineno, estate->err_stmt->lineno,
plpgsql_stmt_typename(estate->err_stmt)); plpgsql_stmt_typename(estate->err_stmt));
} }
else else
errcontext("PL/pgSQL function \"%s\"", errcontext("PL/pgSQL function \"%s\"",
estate->func->fn_name); estate->func->fn_signature);
} }

View File

@ -679,6 +679,7 @@ typedef struct PLpgSQL_func_hashkey
typedef struct PLpgSQL_function typedef struct PLpgSQL_function
{ /* Complete compiled function */ { /* Complete compiled function */
char *fn_name; char *fn_name;
char *fn_signature;
Oid fn_oid; Oid fn_oid;
TransactionId fn_xmin; TransactionId fn_xmin;
ItemPointerData fn_tid; ItemPointerData fn_tid;

View File

@ -493,7 +493,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select doubledecrement(3); -- fail because of implicit null assignment select doubledecrement(3); -- fail because of implicit null assignment
ERROR: domain pos_int does not allow null values ERROR: domain pos_int does not allow null values
CONTEXT: PL/pgSQL function "doubledecrement" line 3 during statement block local variable initialization 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 $$ create or replace function doubledecrement(p1 pos_int) returns pos_int as $$
declare v pos_int := 0; declare v pos_int := 0;
begin begin
@ -501,7 +501,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select doubledecrement(3); -- fail at initialization assignment select doubledecrement(3); -- fail at initialization assignment
ERROR: value for domain pos_int violates check constraint "pos_int_check" 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 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 $$ create or replace function doubledecrement(p1 pos_int) returns pos_int as $$
declare v pos_int := 1; declare v pos_int := 1;
begin begin
@ -514,10 +514,10 @@ select doubledecrement(0); -- fail before call
ERROR: value for domain pos_int violates check constraint "pos_int_check" ERROR: value for domain pos_int violates check constraint "pos_int_check"
select doubledecrement(1); -- fail at assignment to v select doubledecrement(1); -- fail at assignment to v
ERROR: value for domain pos_int violates check constraint "pos_int_check" ERROR: value for domain pos_int violates check constraint "pos_int_check"
CONTEXT: PL/pgSQL function "doubledecrement" line 4 at assignment CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" line 4 at assignment
select doubledecrement(2); -- fail at return select doubledecrement(2); -- fail at return
ERROR: value for domain pos_int violates check constraint "pos_int_check" 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 CONTEXT: PL/pgSQL function "doubledecrement(pos_int)" while casting return value to function's return type
select doubledecrement(3); -- good select doubledecrement(3); -- good
doubledecrement doubledecrement
----------------- -----------------
@ -566,7 +566,7 @@ end$$ language plpgsql;
select array_elem_check(121.00); select array_elem_check(121.00);
ERROR: numeric field overflow ERROR: numeric field overflow
DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. 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 CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment
select array_elem_check(1.23456); select array_elem_check(1.23456);
array_elem_check array_elem_check
------------------ ------------------
@ -584,7 +584,7 @@ end$$ language plpgsql;
select array_elem_check(121.00); select array_elem_check(121.00);
ERROR: numeric field overflow ERROR: numeric field overflow
DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. 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 CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment
select array_elem_check(1.23456); select array_elem_check(1.23456);
array_elem_check array_elem_check
------------------ ------------------
@ -602,7 +602,7 @@ end$$ language plpgsql;
select array_elem_check(121.00); select array_elem_check(121.00);
ERROR: numeric field overflow ERROR: numeric field overflow
DETAIL: A field with precision 4, scale 2 must round to an absolute value less than 10^2. 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 CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment
select array_elem_check(1.23456); select array_elem_check(1.23456);
array_elem_check array_elem_check
------------------ ------------------
@ -650,7 +650,7 @@ select array_elem_check(3);
select array_elem_check(-1); select array_elem_check(-1);
ERROR: value for domain orderedpair violates check constraint "orderedpair_check" ERROR: value for domain orderedpair violates check constraint "orderedpair_check"
CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment CONTEXT: PL/pgSQL function "array_elem_check(integer)" line 5 at assignment
drop function array_elem_check(int); drop function array_elem_check(int);
-- --
-- Renaming -- Renaming

View File

@ -687,7 +687,7 @@ set work_mem = '1MB';
select myfunc(0); select myfunc(0);
ERROR: division by zero ERROR: division by zero
CONTEXT: SQL statement "SELECT 1/$1" CONTEXT: SQL statement "SELECT 1/$1"
PL/pgSQL function "myfunc" line 4 at PERFORM PL/pgSQL function "myfunc(integer)" line 4 at PERFORM
select current_setting('work_mem'); select current_setting('work_mem');
current_setting current_setting
----------------- -----------------

View File

@ -235,7 +235,7 @@ end$$ language plpgsql;
select cachebug(); select cachebug();
NOTICE: table "temptable" does not exist, skipping NOTICE: table "temptable" does not exist, skipping
CONTEXT: SQL statement "drop table if exists temptable cascade" CONTEXT: SQL statement "drop table if exists temptable cascade"
PL/pgSQL function "cachebug" line 4 at SQL statement PL/pgSQL function "cachebug()" line 4 at SQL statement
NOTICE: 1 NOTICE: 1
NOTICE: 2 NOTICE: 2
NOTICE: 3 NOTICE: 3
@ -247,7 +247,7 @@ NOTICE: 3
select cachebug(); select cachebug();
NOTICE: drop cascades to view vv NOTICE: drop cascades to view vv
CONTEXT: SQL statement "drop table if exists temptable cascade" CONTEXT: SQL statement "drop table if exists temptable cascade"
PL/pgSQL function "cachebug" line 4 at SQL statement PL/pgSQL function "cachebug()" line 4 at SQL statement
NOTICE: 1 NOTICE: 1
NOTICE: 2 NOTICE: 2
NOTICE: 3 NOTICE: 3

View File

@ -1518,16 +1518,16 @@ ERROR: duplicate key value violates unique constraint "pfield_name"
DETAIL: Key (name)=(PF1_1) already exists. DETAIL: Key (name)=(PF1_1) already exists.
update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1'; update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
ERROR: WS.not.there does not exist ERROR: WS.not.there does not exist
CONTEXT: PL/pgSQL function "tg_backlink_a" line 17 at assignment CONTEXT: PL/pgSQL function "tg_backlink_a()" line 17 at assignment
update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1'; update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
ERROR: illegal backlink beginning with XX ERROR: illegal backlink beginning with XX
CONTEXT: PL/pgSQL function "tg_backlink_a" line 17 at assignment CONTEXT: PL/pgSQL function "tg_backlink_a()" line 17 at assignment
update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1'; update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
ERROR: PS.not.there does not exist ERROR: PS.not.there does not exist
CONTEXT: PL/pgSQL function "tg_slotlink_a" line 17 at assignment CONTEXT: PL/pgSQL function "tg_slotlink_a()" line 17 at assignment
update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1'; update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
ERROR: illegal slotlink beginning with XX ERROR: illegal slotlink beginning with XX
CONTEXT: PL/pgSQL function "tg_slotlink_a" line 17 at assignment CONTEXT: PL/pgSQL function "tg_slotlink_a()" line 17 at assignment
insert into HSlot values ('HS', 'base.hub1', 1, ''); insert into HSlot values ('HS', 'base.hub1', 1, '');
ERROR: duplicate key value violates unique constraint "hslot_name" ERROR: duplicate key value violates unique constraint "hslot_name"
DETAIL: Key (slotname)=(HS.base.hub1.1 ) already exists. DETAIL: Key (slotname)=(HS.base.hub1.1 ) already exists.
@ -2067,13 +2067,13 @@ end$$ language plpgsql;
select test_variable_storage(); select test_variable_storage();
NOTICE: should see this NOTICE: should see this
CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" CONTEXT: SQL statement "SELECT trap_zero_divide(-100)"
PL/pgSQL function "test_variable_storage" line 8 at PERFORM PL/pgSQL function "test_variable_storage()" line 8 at PERFORM
NOTICE: should see this only if -100 <> 0 NOTICE: should see this only if -100 <> 0
CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" CONTEXT: SQL statement "SELECT trap_zero_divide(-100)"
PL/pgSQL function "test_variable_storage" line 8 at PERFORM PL/pgSQL function "test_variable_storage()" line 8 at PERFORM
NOTICE: should see this only if -100 fits in smallint NOTICE: should see this only if -100 fits in smallint
CONTEXT: SQL statement "SELECT trap_zero_divide(-100)" CONTEXT: SQL statement "SELECT trap_zero_divide(-100)"
PL/pgSQL function "test_variable_storage" line 8 at PERFORM PL/pgSQL function "test_variable_storage()" line 8 at PERFORM
test_variable_storage test_variable_storage
----------------------- -----------------------
123456789012 123456789012
@ -2397,7 +2397,7 @@ end $$ language plpgsql;
select namedparmcursor_test7(); select namedparmcursor_test7();
ERROR: division by zero ERROR: division by zero
CONTEXT: SQL statement "SELECT 42/0 AS p1, 77 AS p2;" CONTEXT: SQL statement "SELECT 42/0 AS p1, 77 AS p2;"
PL/pgSQL function "namedparmcursor_test7" line 6 at OPEN PL/pgSQL function "namedparmcursor_test7()" line 6 at OPEN
-- check that line comments work correctly within the argument list (there -- check that line comments work correctly within the argument list (there
-- is some special handling of this case in the code: the newline after the -- is some special handling of this case in the code: the newline after the
-- comment must be preserved when the argument-evaluating query is -- comment must be preserved when the argument-evaluating query is
@ -2431,7 +2431,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select raise_test1(5); select raise_test1(5);
ERROR: too many parameters specified for RAISE ERROR: too many parameters specified for RAISE
CONTEXT: PL/pgSQL function "raise_test1" line 3 at RAISE CONTEXT: PL/pgSQL function "raise_test1(integer)" line 3 at RAISE
create function raise_test2(int) returns int as $$ create function raise_test2(int) returns int as $$
begin begin
raise notice 'This message has too few parameters: %, %, %', $1, $1; raise notice 'This message has too few parameters: %, %, %', $1, $1;
@ -2440,7 +2440,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select raise_test2(10); select raise_test2(10);
ERROR: too few parameters specified for RAISE ERROR: too few parameters specified for RAISE
CONTEXT: PL/pgSQL function "raise_test2" line 3 at RAISE CONTEXT: PL/pgSQL function "raise_test2(integer)" line 3 at RAISE
-- Test re-RAISE inside a nested exception block. This case is allowed -- 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. -- by Oracle's PL/SQL but was handled differently by PG before 9.1.
CREATE FUNCTION reraise_test() RETURNS void AS $$ CREATE FUNCTION reraise_test() RETURNS void AS $$
@ -2530,7 +2530,7 @@ begin
end;$$ language plpgsql; end;$$ language plpgsql;
select missing_return_expr(); select missing_return_expr();
ERROR: control reached end of function without RETURN ERROR: control reached end of function without RETURN
CONTEXT: PL/pgSQL function "missing_return_expr" CONTEXT: PL/pgSQL function "missing_return_expr()"
drop function void_return_expr(); drop function void_return_expr();
drop function missing_return_expr(); drop function missing_return_expr();
-- --
@ -2582,7 +2582,7 @@ ERROR: column "sqlstate" does not exist
LINE 1: SELECT sqlstate LINE 1: SELECT sqlstate
^ ^
QUERY: SELECT sqlstate QUERY: SELECT sqlstate
CONTEXT: PL/pgSQL function "excpt_test1" line 3 at RAISE CONTEXT: PL/pgSQL function "excpt_test1()" line 3 at RAISE
create function excpt_test2() returns void as $$ create function excpt_test2() returns void as $$
begin begin
begin begin
@ -2597,7 +2597,7 @@ ERROR: column "sqlstate" does not exist
LINE 1: SELECT sqlstate LINE 1: SELECT sqlstate
^ ^
QUERY: SELECT sqlstate QUERY: SELECT sqlstate
CONTEXT: PL/pgSQL function "excpt_test2" line 5 at RAISE CONTEXT: PL/pgSQL function "excpt_test2()" line 5 at RAISE
create function excpt_test3() returns void as $$ create function excpt_test3() returns void as $$
begin begin
begin begin
@ -2803,7 +2803,7 @@ $$ language plpgsql;
-- should fail -- should fail
select continue_test2(); select continue_test2();
ERROR: CONTINUE cannot be used outside a loop ERROR: CONTINUE cannot be used outside a loop
CONTEXT: PL/pgSQL function "continue_test2" CONTEXT: PL/pgSQL function "continue_test2()"
-- CONTINUE can't reference the label of a named block -- CONTINUE can't reference the label of a named block
create function continue_test3() returns void as $$ create function continue_test3() returns void as $$
begin begin
@ -2818,7 +2818,7 @@ $$ language plpgsql;
-- should fail -- should fail
select continue_test3(); select continue_test3();
ERROR: CONTINUE cannot be used outside a loop ERROR: CONTINUE cannot be used outside a loop
CONTEXT: PL/pgSQL function "continue_test3" CONTEXT: PL/pgSQL function "continue_test3()"
drop function continue_test1(); drop function continue_test1();
drop function continue_test2(); drop function continue_test2();
drop function continue_test3(); drop function continue_test3();
@ -2979,7 +2979,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select footest(); select footest();
ERROR: query returned more than one row ERROR: query returned more than one row
CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement
create or replace function footest() returns void as $$ create or replace function footest() returns void as $$
declare x record; declare x record;
begin begin
@ -3042,7 +3042,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select footest(); select footest();
ERROR: query returned no rows ERROR: query returned no rows
CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement
create or replace function footest() returns void as $$ create or replace function footest() returns void as $$
declare x record; declare x record;
begin begin
@ -3052,7 +3052,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select footest(); select footest();
ERROR: query returned more than one row ERROR: query returned more than one row
CONTEXT: PL/pgSQL function "footest" line 5 at SQL statement CONTEXT: PL/pgSQL function "footest()" line 5 at SQL statement
create or replace function footest() returns void as $$ create or replace function footest() returns void as $$
declare x record; declare x record;
begin begin
@ -3076,7 +3076,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select footest(); select footest();
ERROR: query returned no rows ERROR: query returned no rows
CONTEXT: PL/pgSQL function "footest" line 5 at EXECUTE statement CONTEXT: PL/pgSQL function "footest()" line 5 at EXECUTE statement
create or replace function footest() returns void as $$ create or replace function footest() returns void as $$
declare x record; declare x record;
begin begin
@ -3086,7 +3086,7 @@ begin
end$$ language plpgsql; end$$ language plpgsql;
select footest(); select footest();
ERROR: query returned more than one row ERROR: query returned more than one row
CONTEXT: PL/pgSQL function "footest" line 5 at EXECUTE statement CONTEXT: PL/pgSQL function "footest()" line 5 at EXECUTE statement
drop function footest(); drop function footest();
-- test scrollable cursor support -- test scrollable cursor support
create function sc_test() returns setof integer as $$ create function sc_test() returns setof integer as $$
@ -3130,7 +3130,7 @@ $$ language plpgsql;
select * from sc_test(); -- fails because of NO SCROLL specification select * from sc_test(); -- fails because of NO SCROLL specification
ERROR: cursor can only scan forward ERROR: cursor can only scan forward
HINT: Declare it with SCROLL option to enable backward scan. HINT: Declare it with SCROLL option to enable backward scan.
CONTEXT: PL/pgSQL function "sc_test" line 7 at FETCH CONTEXT: PL/pgSQL function "sc_test()" line 7 at FETCH
create or replace function sc_test() returns setof integer as $$ create or replace function sc_test() returns setof integer as $$
declare declare
c refcursor; c refcursor;
@ -3717,7 +3717,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select raise_test(); select raise_test();
ERROR: RAISE option already specified: MESSAGE ERROR: RAISE option already specified: MESSAGE
CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE
-- conflict on errcode -- conflict on errcode
create or replace function raise_test() returns void as $$ create or replace function raise_test() returns void as $$
begin begin
@ -3726,7 +3726,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select raise_test(); select raise_test();
ERROR: RAISE option already specified: ERRCODE ERROR: RAISE option already specified: ERRCODE
CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE
-- nothing to re-RAISE -- nothing to re-RAISE
create or replace function raise_test() returns void as $$ create or replace function raise_test() returns void as $$
begin begin
@ -3735,7 +3735,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select raise_test(); select raise_test();
ERROR: RAISE without parameters cannot be used outside an exception handler ERROR: RAISE without parameters cannot be used outside an exception handler
CONTEXT: PL/pgSQL function "raise_test" line 3 at RAISE CONTEXT: PL/pgSQL function "raise_test()" line 3 at RAISE
-- test access to exception data -- test access to exception data
create function zero_divide() returns int as $$ create function zero_divide() returns int as $$
declare v int := 0; declare v int := 0;
@ -3766,7 +3766,7 @@ exception when others then
end; end;
$$ language plpgsql; $$ language plpgsql;
select stacked_diagnostics_test(); 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] 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 stacked_diagnostics_test
-------------------------- --------------------------
@ -3808,7 +3808,7 @@ end;
$$ language plpgsql; $$ language plpgsql;
select stacked_diagnostics_test(); select stacked_diagnostics_test();
ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler
CONTEXT: PL/pgSQL function "stacked_diagnostics_test" line 6 at GET DIAGNOSTICS CONTEXT: PL/pgSQL function "stacked_diagnostics_test()" line 6 at GET DIAGNOSTICS
drop function zero_divide(); drop function zero_divide();
drop function stacked_diagnostics_test(); drop function stacked_diagnostics_test();
-- check cases where implicit SQLSTATE variable could be confused with -- check cases where implicit SQLSTATE variable could be confused with
@ -3872,7 +3872,7 @@ select case_test(4);
select case_test(5); -- fails select case_test(5); -- fails
ERROR: case not found ERROR: case not found
HINT: CASE statement is missing ELSE part. HINT: CASE statement is missing ELSE part.
CONTEXT: PL/pgSQL function "case_test" line 5 at CASE CONTEXT: PL/pgSQL function "case_test(bigint)" line 5 at CASE
select case_test(8); select case_test(8);
case_test case_test
---------------------- ----------------------
@ -3900,7 +3900,7 @@ select case_test(12);
select case_test(13); -- fails select case_test(13); -- fails
ERROR: case not found ERROR: case not found
HINT: CASE statement is missing ELSE part. HINT: CASE statement is missing ELSE part.
CONTEXT: PL/pgSQL function "case_test" line 5 at CASE CONTEXT: PL/pgSQL function "case_test(bigint)" line 5 at CASE
create or replace function catch() returns void as $$ create or replace function catch() returns void as $$
begin begin
raise notice '%', case_test(6); raise notice '%', case_test(6);
@ -4228,7 +4228,7 @@ SAVEPOINT a;
select error2('nonexistent.stuffs'); select error2('nonexistent.stuffs');
ERROR: schema "nonexistent" does not exist ERROR: schema "nonexistent" does not exist
CONTEXT: SQL function "error1" statement 1 CONTEXT: SQL function "error1" statement 1
PL/pgSQL function "error2" line 3 at RETURN PL/pgSQL function "error2(text)" line 3 at RETURN
ROLLBACK TO a; ROLLBACK TO a;
select error2('public.stuffs'); select error2('public.stuffs');
error2 error2
@ -4266,7 +4266,7 @@ LINE 1: SELECT 'foo\\bar\041baz'
^ ^
HINT: Use the escape string syntax for backslashes, e.g., E'\\'. HINT: Use the escape string syntax for backslashes, e.g., E'\\'.
QUERY: SELECT 'foo\\bar\041baz' QUERY: SELECT 'foo\\bar\041baz'
CONTEXT: PL/pgSQL function "strtest" line 4 at RETURN CONTEXT: PL/pgSQL function "strtest()" line 4 at RETURN
strtest strtest
------------- -------------
foo\bar!baz foo\bar!baz
@ -4386,7 +4386,7 @@ LINE 1: select q1,q2 from int8_tbl
^ ^
DETAIL: It could refer to either a PL/pgSQL variable or a table column. DETAIL: It could refer to either a PL/pgSQL variable or a table column.
QUERY: select q1,q2 from int8_tbl QUERY: select q1,q2 from int8_tbl
CONTEXT: PL/pgSQL function "conflict_test" line 5 at FOR over SELECT rows CONTEXT: PL/pgSQL function "conflict_test()" line 5 at FOR over SELECT rows
create or replace function conflict_test() returns setof int8_tbl as $$ create or replace function conflict_test() returns setof int8_tbl as $$
#variable_conflict use_variable #variable_conflict use_variable
declare r record; declare r record;
@ -4490,10 +4490,10 @@ $$ language plpgsql;
-- should fail -- should fail
select foreach_test(ARRAY[1,2,3,4]); select foreach_test(ARRAY[1,2,3,4]);
ERROR: FOREACH ... SLICE loop variable must be of an array type ERROR: FOREACH ... SLICE loop variable must be of an array type
CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array
select foreach_test(ARRAY[[1,2],[3,4]]); select foreach_test(ARRAY[[1,2],[3,4]]);
ERROR: FOREACH ... SLICE loop variable must be of an array type ERROR: FOREACH ... SLICE loop variable must be of an array type
CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array
create or replace function foreach_test(anyarray) create or replace function foreach_test(anyarray)
returns void as $$ returns void as $$
declare x int[]; declare x int[];
@ -4533,7 +4533,7 @@ $$ language plpgsql;
-- should fail -- should fail
select foreach_test(ARRAY[1,2,3,4]); select foreach_test(ARRAY[1,2,3,4]);
ERROR: slice dimension (2) is out of the valid range 0..1 ERROR: slice dimension (2) is out of the valid range 0..1
CONTEXT: PL/pgSQL function "foreach_test" line 4 at FOREACH over array CONTEXT: PL/pgSQL function "foreach_test(anyarray)" line 4 at FOREACH over array
-- ok -- ok
select foreach_test(ARRAY[[1,2],[3,4]]); select foreach_test(ARRAY[[1,2],[3,4]]);
NOTICE: {{1,2},{3,4}} NOTICE: {{1,2},{3,4}}
@ -4694,9 +4694,9 @@ select testoa(1,2,3); -- try again to exercise internal caching
select testoa(2,1,3); -- fail at initial assign select testoa(2,1,3); -- fail at initial assign
ERROR: value for domain orderedarray violates check constraint "sorted" ERROR: value for domain orderedarray violates check constraint "sorted"
CONTEXT: PL/pgSQL function "testoa" line 4 at assignment CONTEXT: PL/pgSQL function "testoa(integer,integer,integer)" line 4 at assignment
select testoa(1,2,1); -- fail at update select testoa(1,2,1); -- fail at update
ERROR: value for domain orderedarray violates check constraint "sorted" ERROR: value for domain orderedarray violates check constraint "sorted"
CONTEXT: PL/pgSQL function "testoa" line 5 at assignment CONTEXT: PL/pgSQL function "testoa(integer,integer,integer)" line 5 at assignment
drop function arrayassign1(); drop function arrayassign1();
drop function testoa(x1 int, x2 int, x3 int); drop function testoa(x1 int, x2 int, x3 int);

View File

@ -965,10 +965,10 @@ NOTICE: main_view INSTEAD OF INSERT ROW (instead_of_ins)
NOTICE: NEW: (20,30) NOTICE: NEW: (20,30)
NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT 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)" CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
PL/pgSQL function "view_trigger" line 17 at SQL statement PL/pgSQL function "view_trigger()" line 17 at SQL statement
NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = 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)" CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
PL/pgSQL function "view_trigger" line 17 at SQL statement PL/pgSQL function "view_trigger()" line 17 at SQL statement
NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt)
INSERT 0 1 INSERT 0 1
INSERT INTO main_view VALUES (21, 31) RETURNING a, b; INSERT INTO main_view VALUES (21, 31) RETURNING a, b;
@ -977,10 +977,10 @@ NOTICE: main_view INSTEAD OF INSERT ROW (instead_of_ins)
NOTICE: NEW: (21,31) NOTICE: NEW: (21,31)
NOTICE: trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT 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)" CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
PL/pgSQL function "view_trigger" line 17 at SQL statement PL/pgSQL function "view_trigger()" line 17 at SQL statement
NOTICE: trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = 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)" CONTEXT: SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
PL/pgSQL function "view_trigger" line 17 at SQL statement PL/pgSQL function "view_trigger()" line 17 at SQL statement
NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt)
a | b a | b
----+---- ----+----
@ -995,16 +995,16 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: OLD: (20,30), NEW: (20,31)
NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
UPDATE 0 UPDATE 0
UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b;
@ -1013,16 +1013,16 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: OLD: (21,31), NEW: (21,32)
NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
a | b a | b
---+--- ---+---
@ -1038,19 +1038,19 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
NOTICE: OLD: (20,30), NEW: (20,31) NOTICE: OLD: (20,30), NEW: (20,31)
NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT 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" 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 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 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
UPDATE 1 UPDATE 1
UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b; UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b;
@ -1059,19 +1059,19 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
NOTICE: OLD: (21,31), NEW: (21,32) NOTICE: OLD: (21,31), NEW: (21,32)
NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT 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" 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 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 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = 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" 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 PL/pgSQL function "view_trigger()" line 23 at SQL statement
NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
a | b a | b
----+---- ----+----
@ -1503,28 +1503,28 @@ insert into depth_a values (1);
NOTICE: depth_a_tr: depth = 1 NOTICE: depth_a_tr: depth = 1
NOTICE: depth_b_tr: depth = 2 NOTICE: depth_b_tr: depth = 2
CONTEXT: SQL statement "insert into depth_b values (new.id)" CONTEXT: SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_c_tr: depth = 3 NOTICE: depth_c_tr: depth = 3
CONTEXT: SQL statement "insert into depth_c values (1)" CONTEXT: SQL statement "insert into depth_c values (1)"
PL/pgSQL function "depth_b_tf" line 5 at EXECUTE statement PL/pgSQL function "depth_b_tf()" line 5 at EXECUTE statement
SQL statement "insert into depth_b values (new.id)" SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: SQLSTATE = U9999: depth = 2 NOTICE: SQLSTATE = U9999: depth = 2
CONTEXT: SQL statement "insert into depth_b values (new.id)" CONTEXT: SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_b_tr: depth = 2 NOTICE: depth_b_tr: depth = 2
CONTEXT: SQL statement "insert into depth_b values (new.id)" CONTEXT: SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_c_tr: depth = 3 NOTICE: depth_c_tr: depth = 3
CONTEXT: SQL statement "insert into depth_c values (1)" CONTEXT: SQL statement "insert into depth_c values (1)"
PL/pgSQL function "depth_b_tf" line 12 at EXECUTE statement PL/pgSQL function "depth_b_tf()" line 12 at EXECUTE statement
SQL statement "insert into depth_b values (new.id)" SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
ERROR: U9999 ERROR: U9999
CONTEXT: SQL statement "insert into depth_c values (1)" CONTEXT: SQL statement "insert into depth_c values (1)"
PL/pgSQL function "depth_b_tf" line 12 at EXECUTE statement PL/pgSQL function "depth_b_tf()" line 12 at EXECUTE statement
SQL statement "insert into depth_b values (new.id)" SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
select pg_trigger_depth(); select pg_trigger_depth();
pg_trigger_depth pg_trigger_depth
------------------ ------------------
@ -1535,20 +1535,20 @@ insert into depth_a values (2);
NOTICE: depth_a_tr: depth = 1 NOTICE: depth_a_tr: depth = 1
NOTICE: depth_b_tr: depth = 2 NOTICE: depth_b_tr: depth = 2
CONTEXT: SQL statement "insert into depth_b values (new.id)" CONTEXT: SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_c_tr: depth = 3 NOTICE: depth_c_tr: depth = 3
CONTEXT: SQL statement "insert into depth_c values (2)" CONTEXT: SQL statement "insert into depth_c values (2)"
PL/pgSQL function "depth_b_tf" line 5 at EXECUTE statement PL/pgSQL function "depth_b_tf()" line 5 at EXECUTE statement
SQL statement "insert into depth_b values (new.id)" SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_c_tr: depth = 3 NOTICE: depth_c_tr: depth = 3
CONTEXT: SQL statement "insert into depth_c values (2)" CONTEXT: SQL statement "insert into depth_c values (2)"
PL/pgSQL function "depth_b_tf" line 5 at EXECUTE statement PL/pgSQL function "depth_b_tf()" line 5 at EXECUTE statement
SQL statement "insert into depth_b values (new.id)" SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_b_tr: depth = 2 NOTICE: depth_b_tr: depth = 2
CONTEXT: SQL statement "insert into depth_b values (new.id)" CONTEXT: SQL statement "insert into depth_b values (new.id)"
PL/pgSQL function "depth_a_tf" line 4 at SQL statement PL/pgSQL function "depth_a_tf()" line 4 at SQL statement
NOTICE: depth_a_tr: depth = 1 NOTICE: depth_a_tr: depth = 1
select pg_trigger_depth(); select pg_trigger_depth();
pg_trigger_depth pg_trigger_depth