From 4c6cedd1b014abf2046886a9a92e10e18f0d658e Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 31 Jan 2012 10:34:50 +0200 Subject: [PATCH] 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. --- src/pl/plpgsql/src/pl_comp.c | 2 + src/pl/plpgsql/src/pl_exec.c | 8 +-- src/pl/plpgsql/src/plpgsql.h | 1 + src/test/regress/expected/domain.out | 16 +++--- src/test/regress/expected/guc.out | 2 +- src/test/regress/expected/plancache.out | 4 +- src/test/regress/expected/plpgsql.out | 72 ++++++++++++------------ src/test/regress/expected/triggers.out | 74 ++++++++++++------------- 8 files changed, 91 insertions(+), 88 deletions(-) diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index 6ba1e5ebb3..56b6d49d61 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -342,6 +342,7 @@ do_compile(FunctionCallInfo fcinfo, 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; @@ -803,6 +804,7 @@ plpgsql_compile_inline(char *proc_source) compile_tmp_cxt = MemoryContextSwitchTo(func_cxt); function->fn_name = pstrdup(func_name); + function->fn_signature = pstrdup(func_name); function->fn_is_trigger = false; function->fn_input_collation = InvalidOid; function->fn_cxt = func_cxt; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 5ce8d6eff8..57e337ee72 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -799,7 +799,7 @@ plpgsql_exec_error_callback(void *arg) * local variable initialization" */ errcontext("PL/pgSQL function \"%s\" line %d %s", - estate->func->fn_name, + estate->func->fn_signature, estate->err_stmt->lineno, _(estate->err_text)); } @@ -810,7 +810,7 @@ plpgsql_exec_error_callback(void *arg) * arguments into local variables" */ errcontext("PL/pgSQL function \"%s\" %s", - estate->func->fn_name, + estate->func->fn_signature, _(estate->err_text)); } } @@ -818,13 +818,13 @@ plpgsql_exec_error_callback(void *arg) { /* translator: last %s is a plpgsql statement type name */ errcontext("PL/pgSQL function \"%s\" line %d at %s", - estate->func->fn_name, + estate->func->fn_signature, estate->err_stmt->lineno, plpgsql_stmt_typename(estate->err_stmt)); } else errcontext("PL/pgSQL function \"%s\"", - estate->func->fn_name); + estate->func->fn_signature); } diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 0aef8dca2e..739b9e48db 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -679,6 +679,7 @@ typedef struct PLpgSQL_func_hashkey typedef struct PLpgSQL_function { /* Complete compiled function */ char *fn_name; + char *fn_signature; Oid fn_oid; TransactionId fn_xmin; ItemPointerData fn_tid; diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 4f47374b5d..4da1c53740 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -493,7 +493,7 @@ begin 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 +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 @@ -501,7 +501,7 @@ begin 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 +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 @@ -514,10 +514,10 @@ select doubledecrement(0); -- fail before call 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 +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" 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 doubledecrement ----------------- @@ -566,7 +566,7 @@ end$$ language plpgsql; 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 +CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ @@ -584,7 +584,7 @@ end$$ language plpgsql; 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 +CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ @@ -602,7 +602,7 @@ end$$ language plpgsql; 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 +CONTEXT: PL/pgSQL function "array_elem_check(numeric)" line 5 at assignment select array_elem_check(1.23456); array_elem_check ------------------ @@ -650,7 +650,7 @@ select array_elem_check(3); 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 +CONTEXT: PL/pgSQL function "array_elem_check(integer)" line 5 at assignment drop function array_elem_check(int); -- -- Renaming diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out index 98671a2bcd..212728545b 100644 --- a/src/test/regress/expected/guc.out +++ b/src/test/regress/expected/guc.out @@ -687,7 +687,7 @@ set work_mem = '1MB'; select myfunc(0); ERROR: division by zero 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'); current_setting ----------------- diff --git a/src/test/regress/expected/plancache.out b/src/test/regress/expected/plancache.out index 9a84a979c3..80322e8e7b 100644 --- a/src/test/regress/expected/plancache.out +++ b/src/test/regress/expected/plancache.out @@ -235,7 +235,7 @@ end$$ language plpgsql; 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 +PL/pgSQL function "cachebug()" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 @@ -247,7 +247,7 @@ NOTICE: 3 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 +PL/pgSQL function "cachebug()" line 4 at SQL statement NOTICE: 1 NOTICE: 2 NOTICE: 3 diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index bdef259c7e..03f22e7278 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -1518,16 +1518,16 @@ ERROR: duplicate key value violates unique constraint "pfield_name" 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 +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 +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 +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 +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,13 +2067,13 @@ end$$ language plpgsql; 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 +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 +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 +PL/pgSQL function "test_variable_storage()" line 8 at PERFORM test_variable_storage ----------------------- 123456789012 @@ -2397,7 +2397,7 @@ end $$ language plpgsql; select namedparmcursor_test7(); ERROR: division by zero 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 -- is some special handling of this case in the code: the newline after the -- comment must be preserved when the argument-evaluating query is @@ -2431,7 +2431,7 @@ end; $$ language plpgsql; select raise_test1(5); 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 $$ begin raise notice 'This message has too few parameters: %, %, %', $1, $1; @@ -2440,7 +2440,7 @@ end; $$ language plpgsql; select raise_test2(10); 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 -- by Oracle's PL/SQL but was handled differently by PG before 9.1. CREATE FUNCTION reraise_test() RETURNS void AS $$ @@ -2530,7 +2530,7 @@ begin end;$$ language plpgsql; select missing_return_expr(); 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 missing_return_expr(); -- @@ -2582,7 +2582,7 @@ ERROR: column "sqlstate" does not exist LINE 1: 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 $$ begin begin @@ -2597,7 +2597,7 @@ ERROR: column "sqlstate" does not exist LINE 1: 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 $$ begin begin @@ -2803,7 +2803,7 @@ $$ language plpgsql; -- should fail select continue_test2(); 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 create function continue_test3() returns void as $$ begin @@ -2818,7 +2818,7 @@ $$ language plpgsql; -- should fail select continue_test3(); 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_test2(); drop function continue_test3(); @@ -2979,7 +2979,7 @@ begin end$$ language plpgsql; select footest(); 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 $$ declare x record; begin @@ -3042,7 +3042,7 @@ begin end$$ language plpgsql; select footest(); 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 $$ declare x record; begin @@ -3052,7 +3052,7 @@ begin end$$ language plpgsql; select footest(); 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 $$ declare x record; begin @@ -3076,7 +3076,7 @@ begin end$$ language plpgsql; select footest(); 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 $$ declare x record; begin @@ -3086,7 +3086,7 @@ begin end$$ language plpgsql; select footest(); 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(); -- test scrollable cursor support create function sc_test() returns setof integer as $$ @@ -3130,7 +3130,7 @@ $$ language plpgsql; 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 +CONTEXT: PL/pgSQL function "sc_test()" line 7 at FETCH create or replace function sc_test() returns setof integer as $$ declare c refcursor; @@ -3717,7 +3717,7 @@ end; $$ language plpgsql; select raise_test(); 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 create or replace function raise_test() returns void as $$ begin @@ -3726,7 +3726,7 @@ end; $$ language plpgsql; select raise_test(); 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 create or replace function raise_test() returns void as $$ begin @@ -3735,7 +3735,7 @@ end; $$ 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 +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; @@ -3766,7 +3766,7 @@ exception when others then 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] +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 -------------------------- @@ -3808,7 +3808,7 @@ end; $$ 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 +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 @@ -3872,7 +3872,7 @@ select case_test(4); 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 +CONTEXT: PL/pgSQL function "case_test(bigint)" line 5 at CASE select case_test(8); case_test ---------------------- @@ -3900,7 +3900,7 @@ select case_test(12); 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 +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); @@ -4228,7 +4228,7 @@ SAVEPOINT a; select error2('nonexistent.stuffs'); ERROR: schema "nonexistent" does not exist 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; select error2('public.stuffs'); error2 @@ -4266,7 +4266,7 @@ LINE 1: SELECT 'foo\\bar\041baz' ^ 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 +CONTEXT: PL/pgSQL function "strtest()" line 4 at RETURN strtest ------------- 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. 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 $$ #variable_conflict use_variable declare r record; @@ -4490,10 +4490,10 @@ $$ language plpgsql; -- 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 +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" 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) returns void as $$ declare x int[]; @@ -4533,7 +4533,7 @@ $$ language plpgsql; -- 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 +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}} @@ -4694,9 +4694,9 @@ select testoa(1,2,3); -- try again to exercise internal caching 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 +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" line 5 at assignment +CONTEXT: PL/pgSQL function "testoa(integer,integer,integer)" line 5 at assignment drop function arrayassign1(); drop function testoa(x1 int, x2 int, x3 int); diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index d039b6e38b..3c96c892a4 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -965,10 +965,10 @@ NOTICE: main_view INSTEAD OF INSERT ROW (instead_of_ins) 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 +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 +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,10 +977,10 @@ NOTICE: main_view INSTEAD OF INSERT ROW (instead_of_ins) 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 +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 +PL/pgSQL function "view_trigger()" line 17 at SQL statement NOTICE: main_view AFTER INSERT STATEMENT (after_view_ins_stmt) a | b ----+---- @@ -995,16 +995,16 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd) 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 +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 +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 +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 +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,16 +1013,16 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd) 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 +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 +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 +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 +PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ---+--- @@ -1038,19 +1038,19 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd) 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 +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 +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 +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 +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 +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,19 +1059,19 @@ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd) 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 +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 +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 +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 +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 +PL/pgSQL function "view_trigger()" line 23 at SQL statement NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt) a | b ----+---- @@ -1503,28 +1503,28 @@ insert into depth_a values (1); NOTICE: depth_a_tr: depth = 1 NOTICE: depth_b_tr: depth = 2 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 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)" -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 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 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 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)" -PL/pgSQL function "depth_a_tf" line 4 at SQL statement +PL/pgSQL function "depth_a_tf()" line 4 at SQL statement ERROR: U9999 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)" -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(); pg_trigger_depth ------------------ @@ -1535,20 +1535,20 @@ insert into depth_a values (2); NOTICE: depth_a_tr: depth = 1 NOTICE: depth_b_tr: depth = 2 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 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)" -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 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)" -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 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 select pg_trigger_depth(); pg_trigger_depth