[SQL] Inconsistent/wrong behavior of pg_trigger_depth when used withDEFERRED CONSTRAINTS

Поиск
Список
Период
Сортировка
От Achilleas Mantzios
Тема [SQL] Inconsistent/wrong behavior of pg_trigger_depth when used withDEFERRED CONSTRAINTS
Дата
Msg-id 3d1a5143-389c-256a-cda9-44ca002fc606@matrix.gatewaynet.com
обсуждение исходный текст
Ответы Re: [SQL] Inconsistent/wrong behavior of pg_trigger_depth when used with DEFERRED CONSTRAINTS  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-sql

Hello,

I just run into a behavior that I consider wrong. Test case :

create table test(id serial primary key, name text);

CREATE OR REPLACE FUNCTION public.force_integrity()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$DECLARE

BEGIN
        RAISE NOTICE 'TABLE = %.% , pg_trigger_depth()=%',TG_TABLE_SCHEMA, TG_TABLE_NAME, pg_trigger_depth();
        IF (pg_trigger_depth() = 1) THEN
                UPDATE test SET id=id WHERE id=NEW.id;
        END IF;
        RETURN NEW;
END;
$function$

CREATE CONSTRAINT TRIGGER test_force_integrity_tg
  AFTER INSERT OR UPDATE
  ON test
  DEFERRABLE INITIALLY DEFERRED
  FOR EACH ROW
  EXECUTE PROCEDURE force_integrity();


-- test by forcing immediate constraints and thus expected results

begin;

BEGIN

set CONSTRAINTS ALL IMMEDIATE;

insert into test(name) values ('foo');
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=2
CONTEXT:  SQL statement "UPDATE test SET id=id WHERE id=NEW.id"
PL/pgSQL function force_integrity() line 9 at SQL statement
INSERT 0 1

commit;

COMMIT

-- test with defaults - unexpected results

begin ;
BEGIN
insert into test(name) values ('foo');
INSERT 0 1
commit ;

NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1
NOTICE:  TABLE = public.test , pg_trigger_depth()=1

-- Endless loop, pg_trigger_depth() never gets increased

This was reproduced on 9.3.17 and on 9.5.6

-- 
Achilleas Mantzios
IT DEV Lead
IT DEPT
Dynacom Tankers Mgmt

В списке pgsql-sql по дате отправления:

Предыдущее
От: Vladimir Nicolici
Дата:
Сообщение: Re: [SQL] Re: SQL error: function round(double precision, integer)does not exist
Следующее
От: tel medola
Дата:
Сообщение: [SQL] Lost my tablespace