mirror of
https://github.com/postgres/postgres.git
synced 2025-07-05 07:21:24 +03:00
Rearrange the handling of error context reports.
Remove the code in plpgsql that suppressed the innermost line of CONTEXT for messages emitted by RAISE commands. That was never more than a quick backwards-compatibility hack, and it's pretty silly in cases where the RAISE is nested in several levels of function. What's more, it violated our design theory that verbosity of error reports should be controlled on the client side not the server side. To alleviate the resulting noise increase, introduce a feature in libpq and psql whereby the CONTEXT field of messages can be suppressed, either always or only for non-error messages. Printing CONTEXT for errors only is now their default behavior. The actual code changes here are pretty small, but the effects on the regression test outputs are widespread. I had to edit some of the alternative expected outputs by hand; hopefully the buildfarm will soon find anything I fat-fingered. In passing, fix up (again) the output line counts in psql's various help displays. Add some commentary about how to verify them. Pavel Stehule, reviewed by Petr Jelínek, Jeevan Chalke, and others
This commit is contained in:
@ -447,12 +447,9 @@ Check constraints:
|
||||
|
||||
copy check_con_tbl from stdin;
|
||||
NOTICE: input = {"f1":1}
|
||||
CONTEXT: COPY check_con_tbl, line 1: "1"
|
||||
NOTICE: input = {"f1":null}
|
||||
CONTEXT: COPY check_con_tbl, line 2: "\N"
|
||||
copy check_con_tbl from stdin;
|
||||
NOTICE: input = {"f1":0}
|
||||
CONTEXT: COPY check_con_tbl, line 1: "0"
|
||||
ERROR: new row for relation "check_con_tbl" violates check constraint "check_con_tbl_check"
|
||||
DETAIL: Failing row contains (0).
|
||||
CONTEXT: COPY check_con_tbl, line 1: "0"
|
||||
|
@ -234,15 +234,10 @@ drop cascades to table schema_one.table_one
|
||||
drop cascades to table schema_one."table two"
|
||||
drop cascades to table schema_one.table_three
|
||||
NOTICE: table "schema_two_table_two" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
ERROR: object audit_tbls.schema_two_table_three of type table cannot be dropped
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
|
||||
CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE
|
||||
SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three';
|
||||
DROP SCHEMA schema_one, schema_two CASCADE;
|
||||
@ -255,23 +250,12 @@ drop cascades to table schema_one.table_one
|
||||
drop cascades to table schema_one."table two"
|
||||
drop cascades to table schema_one.table_three
|
||||
NOTICE: table "schema_two_table_two" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table_one" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_one"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table two" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls."schema_one_table two""
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table_three" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
ERROR: object schema_one.table_three of type table cannot be dropped
|
||||
CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE
|
||||
DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three';
|
||||
DROP SCHEMA schema_one, schema_two CASCADE;
|
||||
NOTICE: drop cascades to 7 other objects
|
||||
@ -283,22 +267,10 @@ drop cascades to table schema_one.table_one
|
||||
drop cascades to table schema_one."table two"
|
||||
drop cascades to table schema_one.table_three
|
||||
NOTICE: table "schema_two_table_two" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table_one" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_one"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table two" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls."schema_one_table two""
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
NOTICE: table "schema_one_table_three" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_three"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast';
|
||||
type | schema | object
|
||||
--------------+------------+-------------------------------------
|
||||
@ -329,8 +301,6 @@ SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast';
|
||||
|
||||
DROP OWNED BY regression_bob;
|
||||
NOTICE: schema "audit_tbls" does not exist, skipping
|
||||
CONTEXT: SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_one_table_two"
|
||||
PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE
|
||||
SELECT * FROM dropped_objects WHERE type = 'schema';
|
||||
type | schema | object
|
||||
--------+--------+------------
|
||||
@ -392,7 +362,7 @@ ERROR: pg_event_trigger_table_rewrite_oid() can only be called in a table_rewri
|
||||
CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
|
||||
LANGUAGE plpgsql AS $$
|
||||
BEGIN
|
||||
RAISE EXCEPTION 'I''m sorry Sir, No Rewrite Allowed.';
|
||||
RAISE EXCEPTION 'rewrites not allowed';
|
||||
END;
|
||||
$$;
|
||||
create event trigger no_rewrite_allowed on table_rewrite
|
||||
@ -401,9 +371,11 @@ create table rewriteme (id serial primary key, foo float);
|
||||
insert into rewriteme
|
||||
select x * 1.001 from generate_series(1, 500) as t(x);
|
||||
alter table rewriteme alter column foo type numeric;
|
||||
ERROR: I'm sorry Sir, No Rewrite Allowed.
|
||||
ERROR: rewrites not allowed
|
||||
CONTEXT: PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE
|
||||
alter table rewriteme add column baz int default 0;
|
||||
ERROR: I'm sorry Sir, No Rewrite Allowed.
|
||||
ERROR: rewrites not allowed
|
||||
CONTEXT: PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE
|
||||
-- test with more than one reason to rewrite a single table
|
||||
CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
|
||||
LANGUAGE plpgsql AS $$
|
||||
|
@ -234,8 +234,6 @@ begin
|
||||
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
|
||||
NOTICE: 1
|
||||
NOTICE: 2
|
||||
NOTICE: 3
|
||||
@ -246,8 +244,6 @@ 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
|
||||
NOTICE: 1
|
||||
NOTICE: 2
|
||||
NOTICE: 3
|
||||
|
@ -1518,27 +1518,35 @@ 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_set(character,character) line 30 at RAISE
|
||||
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_set(character,character) line 47 at RAISE
|
||||
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_set(character,character) line 30 at RAISE
|
||||
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_set(character,character) line 77 at RAISE
|
||||
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.
|
||||
insert into HSlot values ('HS', 'base.hub1', 20, '');
|
||||
ERROR: no manual manipulation of HSlot
|
||||
CONTEXT: PL/pgSQL function tg_hslot_biu() line 12 at RAISE
|
||||
delete from HSlot;
|
||||
ERROR: no manual manipulation of HSlot
|
||||
CONTEXT: PL/pgSQL function tg_hslot_bd() line 12 at RAISE
|
||||
insert into IFace values ('IF', 'notthere', 'eth0', '');
|
||||
ERROR: system "notthere" does not exist
|
||||
CONTEXT: PL/pgSQL function tg_iface_biu() line 8 at RAISE
|
||||
insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', '');
|
||||
ERROR: IFace slotname "IF.orion.ethernet_interface_name_too_long" too long (20 char max)
|
||||
CONTEXT: PL/pgSQL function tg_iface_biu() line 14 at RAISE
|
||||
--
|
||||
-- The following tests are unrelated to the scenario outlined above;
|
||||
-- they merely exercise specific parts of PL/pgSQL
|
||||
@ -1963,6 +1971,7 @@ NOTICE: should see this
|
||||
NOTICE: should see this only if -100 <> 0
|
||||
NOTICE: should see this only if -100 fits in smallint
|
||||
ERROR: -100 is less than zero
|
||||
CONTEXT: PL/pgSQL function trap_zero_divide(integer) line 12 at RAISE
|
||||
create function trap_matching_test(int) returns int as $$
|
||||
declare x int;
|
||||
sx smallint;
|
||||
@ -2066,14 +2075,8 @@ begin
|
||||
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
|
||||
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
|
||||
@ -4103,6 +4106,7 @@ DETAIL: some detail info
|
||||
HINT: some hint
|
||||
ERROR: 1 2 3
|
||||
DETAIL: some detail info
|
||||
CONTEXT: PL/pgSQL function raise_test() line 5 at RAISE
|
||||
-- Since we can't actually see the thrown SQLSTATE in default psql output,
|
||||
-- test it like this; this also tests re-RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
@ -4119,6 +4123,7 @@ select raise_test();
|
||||
NOTICE: SQLSTATE: 22012 SQLERRM: check me
|
||||
ERROR: check me
|
||||
DETAIL: some detail info
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise 'check me'
|
||||
@ -4133,6 +4138,7 @@ select raise_test();
|
||||
NOTICE: SQLSTATE: 1234F SQLERRM: check me
|
||||
ERROR: check me
|
||||
DETAIL: some detail info
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
-- SQLSTATE specification in WHEN
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
@ -4148,6 +4154,7 @@ select raise_test();
|
||||
NOTICE: SQLSTATE: 1234F SQLERRM: check me
|
||||
ERROR: check me
|
||||
DETAIL: some detail info
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise division_by_zero using detail = 'some detail info';
|
||||
@ -4161,6 +4168,7 @@ select raise_test();
|
||||
NOTICE: SQLSTATE: 22012 SQLERRM: division_by_zero
|
||||
ERROR: division_by_zero
|
||||
DETAIL: some detail info
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise division_by_zero;
|
||||
@ -4168,6 +4176,7 @@ end;
|
||||
$$ language plpgsql;
|
||||
select raise_test();
|
||||
ERROR: division_by_zero
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise sqlstate '1234F';
|
||||
@ -4175,6 +4184,7 @@ end;
|
||||
$$ language plpgsql;
|
||||
select raise_test();
|
||||
ERROR: 1234F
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise division_by_zero using message = 'custom' || ' message';
|
||||
@ -4182,6 +4192,7 @@ end;
|
||||
$$ language plpgsql;
|
||||
select raise_test();
|
||||
ERROR: custom message
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
raise using message = 'custom' || ' message', errcode = '22012';
|
||||
@ -4189,6 +4200,7 @@ end;
|
||||
$$ language plpgsql;
|
||||
select raise_test();
|
||||
ERROR: custom message
|
||||
CONTEXT: PL/pgSQL function raise_test() line 3 at RAISE
|
||||
-- conflict on message
|
||||
create or replace function raise_test() returns void as $$
|
||||
begin
|
||||
@ -4305,6 +4317,7 @@ $$ language plpgsql;
|
||||
select raise_test();
|
||||
NOTICE: 22012
|
||||
ERROR: substitute message
|
||||
CONTEXT: PL/pgSQL function raise_test() line 7 at RAISE
|
||||
drop function raise_test();
|
||||
-- test passing column_name, constraint_name, datatype_name, table_name
|
||||
-- and schema_name error fields
|
||||
@ -4864,7 +4877,6 @@ 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
|
||||
strtest
|
||||
-------------
|
||||
foo\bar!baz
|
||||
@ -5380,22 +5392,14 @@ $$ language plpgsql;
|
||||
select outer_outer_func(10);
|
||||
NOTICE: calling down into outer_func()
|
||||
NOTICE: calling down into inner_func()
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: lets make sure we didnt break anything
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: inner_func() done
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: outer_func() done
|
||||
outer_outer_func
|
||||
------------------
|
||||
@ -5406,22 +5410,14 @@ NOTICE: outer_func() done
|
||||
select outer_outer_func(20);
|
||||
NOTICE: calling down into outer_func()
|
||||
NOTICE: calling down into inner_func()
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: lets make sure we didnt break anything
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: inner_func() done
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: outer_func() done
|
||||
outer_outer_func
|
||||
------------------
|
||||
@ -5478,22 +5474,14 @@ $$ language plpgsql;
|
||||
select outer_outer_func(10);
|
||||
NOTICE: calling down into outer_func()
|
||||
NOTICE: calling down into inner_func()
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: lets make sure we didnt break anything
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: inner_func() done
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: outer_func() done
|
||||
outer_outer_func
|
||||
------------------
|
||||
@ -5504,22 +5492,14 @@ NOTICE: outer_func() done
|
||||
select outer_outer_func(20);
|
||||
NOTICE: calling down into outer_func()
|
||||
NOTICE: calling down into inner_func()
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS
|
||||
PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: lets make sure we didnt break anything
|
||||
CONTEXT: PL/pgSQL function outer_func(integer) line 6 at assignment
|
||||
PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: inner_func() done
|
||||
CONTEXT: PL/pgSQL function outer_outer_func(integer) line 6 at assignment
|
||||
NOTICE: outer_func() done
|
||||
outer_outer_func
|
||||
------------------
|
||||
|
@ -1023,7 +1023,6 @@ GRANT regressgroup2 TO regressuser5; -- fails: no ADMIN OPTION
|
||||
ERROR: must have admin option on role "regressgroup2"
|
||||
SELECT dogrant_ok(); -- ok: SECURITY DEFINER conveys ADMIN
|
||||
NOTICE: role "regressuser5" is already a member of role "regressgroup2"
|
||||
CONTEXT: SQL function "dogrant_ok" statement 1
|
||||
dogrant_ok
|
||||
------------
|
||||
|
||||
|
@ -2332,3 +2332,31 @@ execute q;
|
||||
<l|int >l|11
|
||||
|====
|
||||
deallocate q;
|
||||
-- SHOW_CONTEXT
|
||||
\set SHOW_CONTEXT never
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
NOTICE: foo
|
||||
ERROR: bar
|
||||
\set SHOW_CONTEXT errors
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
NOTICE: foo
|
||||
ERROR: bar
|
||||
CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
|
||||
\set SHOW_CONTEXT always
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
NOTICE: foo
|
||||
CONTEXT: PL/pgSQL function inline_code_block line 3 at RAISE
|
||||
ERROR: bar
|
||||
CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE
|
||||
|
@ -1704,9 +1704,7 @@ create trigger tnoticetrigger after insert on tt for each row
|
||||
execute procedure noticetrigger();
|
||||
select insert_tt2('foolme','barme') limit 1;
|
||||
NOTICE: noticetrigger 11 foolme
|
||||
CONTEXT: SQL function "insert_tt2" statement 1
|
||||
NOTICE: noticetrigger 12 barme
|
||||
CONTEXT: SQL function "insert_tt2" statement 1
|
||||
insert_tt2
|
||||
------------
|
||||
11
|
||||
@ -1735,9 +1733,7 @@ create rule insert_tt_rule as on insert to tt do also
|
||||
insert into tt_log values(new.*);
|
||||
select insert_tt2('foollog','barlog') limit 1;
|
||||
NOTICE: noticetrigger 13 foollog
|
||||
CONTEXT: SQL function "insert_tt2" statement 1
|
||||
NOTICE: noticetrigger 14 barlog
|
||||
CONTEXT: SQL function "insert_tt2" statement 1
|
||||
insert_tt2
|
||||
------------
|
||||
13
|
||||
|
@ -958,11 +958,7 @@ NOTICE: main_view BEFORE INSERT STATEMENT (before_view_ins_stmt)
|
||||
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
|
||||
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;
|
||||
@ -970,11 +966,7 @@ NOTICE: main_view BEFORE INSERT STATEMENT (before_view_ins_stmt)
|
||||
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
|
||||
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
|
||||
----+----
|
||||
@ -988,17 +980,9 @@ NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
|
||||
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
|
||||
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;
|
||||
@ -1006,17 +990,9 @@ NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
|
||||
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
|
||||
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
|
||||
---+---
|
||||
@ -1031,20 +1007,10 @@ NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
|
||||
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
|
||||
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;
|
||||
@ -1052,20 +1018,10 @@ NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
|
||||
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
|
||||
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
|
||||
----+----
|
||||
@ -1277,6 +1233,7 @@ INSERT 0 1
|
||||
-- UPDATE .. RETURNING
|
||||
UPDATE city_view SET country_name = 'Japon' WHERE city_name = 'Tokyo'; -- error
|
||||
ERROR: No such country: "Japon"
|
||||
CONTEXT: PL/pgSQL function city_update() line 9 at RAISE
|
||||
UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Takyo'; -- no match
|
||||
UPDATE 0
|
||||
UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Tokyo' RETURNING *; -- OK
|
||||
@ -1489,26 +1446,13 @@ select pg_trigger_depth();
|
||||
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
|
||||
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
|
||||
SQL statement "insert into depth_b values (new.id)"
|
||||
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
|
||||
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
|
||||
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
|
||||
SQL statement "insert into depth_b values (new.id)"
|
||||
PL/pgSQL function depth_a_tf() line 4 at SQL statement
|
||||
ERROR: U9999
|
||||
CONTEXT: SQL statement "insert into depth_c values (1)"
|
||||
CONTEXT: PL/pgSQL function depth_c_tf() line 5 at RAISE
|
||||
SQL statement "insert into depth_c values (1)"
|
||||
PL/pgSQL function depth_b_tf() line 12 at EXECUTE
|
||||
SQL statement "insert into depth_b values (new.id)"
|
||||
PL/pgSQL function depth_a_tf() line 4 at SQL statement
|
||||
@ -1521,21 +1465,9 @@ select pg_trigger_depth();
|
||||
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
|
||||
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
|
||||
SQL statement "insert into depth_b values (new.id)"
|
||||
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
|
||||
SQL statement "insert into depth_b values (new.id)"
|
||||
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
|
||||
NOTICE: depth_a_tr: depth = 1
|
||||
select pg_trigger_depth();
|
||||
pg_trigger_depth
|
||||
|
@ -934,7 +934,6 @@ SELECT xpath('/*', '<relativens xmlns=''relative''/>');
|
||||
WARNING: line 1: xmlns: URI relative is not absolute
|
||||
<relativens xmlns='relative'/>
|
||||
^
|
||||
CONTEXT: SQL function "xpath" statement 1
|
||||
xpath
|
||||
--------------------------------------
|
||||
{"<relativens xmlns=\"relative\"/>"}
|
||||
|
@ -282,7 +282,7 @@ select pg_event_trigger_table_rewrite_oid();
|
||||
CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
|
||||
LANGUAGE plpgsql AS $$
|
||||
BEGIN
|
||||
RAISE EXCEPTION 'I''m sorry Sir, No Rewrite Allowed.';
|
||||
RAISE EXCEPTION 'rewrites not allowed';
|
||||
END;
|
||||
$$;
|
||||
|
||||
|
@ -301,3 +301,26 @@ execute q;
|
||||
execute q;
|
||||
|
||||
deallocate q;
|
||||
|
||||
-- SHOW_CONTEXT
|
||||
|
||||
\set SHOW_CONTEXT never
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
|
||||
\set SHOW_CONTEXT errors
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
|
||||
\set SHOW_CONTEXT always
|
||||
do $$
|
||||
begin
|
||||
raise notice 'foo';
|
||||
raise exception 'bar';
|
||||
end $$;
|
||||
|
Reference in New Issue
Block a user