Attached is a patch adding regression tests for this code.
Thanks,
Gavin
On Tue, 23 Aug 2005, Bruce Momjian wrote:
>
> Thanks, modified patch applied by Tom, with the addition of a USER
> triggers only mode.
>
> ---------------------------------------------------------------------------
>
> Satoshi Nagayasu wrote:
> > The message format for elog() report is cleaned up.
> >
> > --
> > NAGAYASU Satoshi <[EMAIL PROTECTED]>
>
> > diff -cr pgsql.orig/src/backend/commands/tablecmds.c
> > pgsql/src/backend/commands/tablecmds.c
> > *** pgsql.orig/src/backend/commands/tablecmds.c 2005-06-28
> > 14:08:54.000000000 +0900
> > --- pgsql/src/backend/commands/tablecmds.c 2005-08-08 13:46:44.000000000
> > +0900
> > ***************
> > *** 236,241 ****
> > --- 236,243 ----
> --
> Bruce Momjian | http://candle.pha.pa.us
> pgman@candle.pha.pa.us | (610) 359-1001
> + If your life is a hard drive, | 13 Roberts Road
> + Christ can be your backup. | Newtown Square, Pennsylvania 19073
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Have you searched our list archives?
>
> http://archives.postgresql.org
>
Index: src/test/regress/expected/triggers.out
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/test/regress/expected/triggers.out,v
retrieving revision 1.18
diff -c -p -r1.18 triggers.out
*** src/test/regress/expected/triggers.out 13 Oct 2004 01:22:31 -0000
1.18
--- src/test/regress/expected/triggers.out 25 Aug 2005 01:07:08 -0000
*************** SELECT * FROM main_table ORDER BY a, b;
*** 322,324 ****
--- 322,388 ----
|
(8 rows)
+ -- Test enable/disable triggers
+ create table trigtest (i serial primary key);
+ NOTICE: CREATE TABLE will create implicit sequence "trigtest_i_seq" for
serial column "trigtest.i"
+ NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index
"trigtest_pkey" for table "trigtest"
+ -- test that disabling RI triggers works
+ create table trigtest2 (i int references trigtest(i) on delete cascade);
+ create function trigtest() returns trigger as $$
+ begin
+ raise notice '% % % %', TG_RELNAME, TG_OP, TG_WHEN, TG_LEVEL;
+ return new;
+ end;$$ language plpgsql;
+ create trigger trigtest_b_row_tg before insert or update or delete on trigtest
+ for each row execute procedure trigtest();
+ create trigger trigtest_a_row_tg after insert or update or delete on trigtest
+ for each row execute procedure trigtest();
+ create trigger trigtest_b_stmt_tg before insert or update or delete on
trigtest
+ for each statement execute procedure trigtest();
+ create trigger trigtest_a_stmt_tg after insert or update or delete on trigtest
+ for each statement execute procedure trigtest();
+ insert into trigtest default values;
+ NOTICE: trigtest INSERT BEFORE STATEMENT
+ NOTICE: trigtest INSERT BEFORE ROW
+ NOTICE: trigtest INSERT AFTER ROW
+ NOTICE: trigtest INSERT AFTER STATEMENT
+ alter table trigtest disable trigger trigtest_b_row_tg;
+ insert into trigtest default values;
+ NOTICE: trigtest INSERT BEFORE STATEMENT
+ NOTICE: trigtest INSERT AFTER ROW
+ NOTICE: trigtest INSERT AFTER STATEMENT
+ alter table trigtest disable trigger user;
+ insert into trigtest default values;
+ alter table trigtest enable trigger trigtest_a_stmt_tg;
+ insert into trigtest default values;
+ NOTICE: trigtest INSERT AFTER STATEMENT
+ insert into trigtest2 values(1);
+ insert into trigtest2 values(2);
+ delete from trigtest where i=2;
+ NOTICE: trigtest DELETE AFTER STATEMENT
+ select * from trigtest2;
+ i
+ ---
+ 1
+ (1 row)
+
+ alter table trigtest disable trigger all;
+ delete from trigtest where i=1;
+ select * from trigtest2;
+ i
+ ---
+ 1
+ (1 row)
+
+ -- ensure we still insert, even when all triggers are disabled
+ insert into trigtest default values;
+ select * from trigtest;
+ i
+ ---
+ 3
+ 4
+ 5
+ (3 rows)
+
+ drop table trigtest2;
+ drop table trigtest;
Index: src/test/regress/sql/triggers.sql
===================================================================
RCS file: /usr/local/cvsroot/pgsql/src/test/regress/sql/triggers.sql,v
retrieving revision 1.8
diff -c -p -r1.8 triggers.sql
*** src/test/regress/sql/triggers.sql 21 Nov 2003 22:32:49 -0000 1.8
--- src/test/regress/sql/triggers.sql 25 Aug 2005 01:04:38 -0000
*************** COPY main_table (a, b) FROM stdin;
*** 253,255 ****
--- 253,296 ----
\.
SELECT * FROM main_table ORDER BY a, b;
+
+ -- Test enable/disable triggers
+
+ create table trigtest (i serial primary key);
+ -- test that disabling RI triggers works
+ create table trigtest2 (i int references trigtest(i) on delete cascade);
+
+ create function trigtest() returns trigger as $$
+ begin
+ raise notice '% % % %', TG_RELNAME, TG_OP, TG_WHEN, TG_LEVEL;
+ return new;
+ end;$$ language plpgsql;
+
+ create trigger trigtest_b_row_tg before insert or update or delete on trigtest
+ for each row execute procedure trigtest();
+ create trigger trigtest_a_row_tg after insert or update or delete on trigtest
+ for each row execute procedure trigtest();
+ create trigger trigtest_b_stmt_tg before insert or update or delete on
trigtest
+ for each statement execute procedure trigtest();
+ create trigger trigtest_a_stmt_tg after insert or update or delete on trigtest
+ for each statement execute procedure trigtest();
+
+ insert into trigtest default values;
+ alter table trigtest disable trigger trigtest_b_row_tg;
+ insert into trigtest default values;
+ alter table trigtest disable trigger user;
+ insert into trigtest default values;
+ alter table trigtest enable trigger trigtest_a_stmt_tg;
+ insert into trigtest default values;
+ insert into trigtest2 values(1);
+ insert into trigtest2 values(2);
+ delete from trigtest where i=2;
+ select * from trigtest2;
+ alter table trigtest disable trigger all;
+ delete from trigtest where i=1;
+ select * from trigtest2;
+ -- ensure we still insert, even when all triggers are disabled
+ insert into trigtest default values;
+ select * from trigtest;
+ drop table trigtest2;
+ drop table trigtest;
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings