drop table if exists t1, t2, t3, t4; drop view if exists v1; drop database if exists mysqltest; drop function if exists f1; drop function if exists f2; drop procedure if exists p1; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; set @a:=0; select @a; @a 0 insert into t1 values (1); select @a; @a 1 drop trigger trg; create trigger trg before insert on t1 for each row set @a:=new.i; insert into t1 values (123); select @a; @a 123 drop trigger trg; drop table t1; create table t1 (i int not null, j int); create trigger trg before insert on t1 for each row begin if isnull(new.j) then set new.j:= new.i * 10; end if; end| insert into t1 (i) values (1)| insert into t1 (i,j) values (2, 3)| select * from t1| i j 1 10 2 3 drop trigger trg| drop table t1| create table t1 (i int not null primary key); create trigger trg after insert on t1 for each row set @a:= if(@a,concat(@a, ":", new.i), new.i); set @a:=""; insert into t1 values (2),(3),(4),(5); select @a; @a 2:3:4:5 drop trigger trg; drop table t1; create table t1 (aid int not null primary key, balance int not null default 0); insert into t1 values (1, 1000), (2,3000); create trigger trg before update on t1 for each row begin declare loc_err varchar(255); if abs(new.balance - old.balance) > 1000 then set new.balance:= old.balance; set loc_err := concat("Too big change for aid = ", new.aid); set @update_failed:= if(@update_failed, concat(@a, ":", loc_err), loc_err); end if; end| set @update_failed:=""| update t1 set balance=1500| select @update_failed; select * from t1| @update_failed Too big change for aid = 2 aid balance 1 1500 2 3000 drop trigger trg| drop table t1| create table t1 (i int); insert into t1 values (1),(2),(3),(4); create trigger trg after update on t1 for each row set @total_change:=@total_change + new.i - old.i; set @total_change:=0; update t1 set i=3; select @total_change; @total_change 2 drop trigger trg; drop table t1; create table t1 (i int); insert into t1 values (1),(2),(3),(4); create trigger trg before delete on t1 for each row set @del_sum:= @del_sum + old.i; set @del_sum:= 0; delete from t1 where i <= 3; select @del_sum; @del_sum 6 drop trigger trg; drop table t1; create table t1 (i int); insert into t1 values (1),(2),(3),(4); create trigger trg after delete on t1 for each row set @del:= 1; set @del:= 0; delete from t1 where i <> 0; select @del; @del 1 drop trigger trg; drop table t1; create table t1 (i int, j int); create trigger trg1 before insert on t1 for each row begin if new.j > 10 then set new.j := 10; end if; end| create trigger trg2 before update on t1 for each row begin if old.i % 2 = 0 then set new.j := -1; end if; end| create trigger trg3 after update on t1 for each row begin if new.j = -1 then set @fired:= "Yes"; end if; end| set @fired:=""; insert into t1 values (1,2),(2,3),(3,14); select @fired; @fired select * from t1; i j 1 2 2 3 3 10 update t1 set j= 20; select @fired; @fired Yes select * from t1; i j 1 20 2 -1 3 20 drop trigger trg1; drop trigger trg2; drop trigger trg3; drop table t1; create table t1 (id int not null primary key, data int); create trigger t1_bi before insert on t1 for each row set @log:= concat(@log, "(BEFORE_INSERT: new=(id=", new.id, ", data=", new.data,"))"); create trigger t1_ai after insert on t1 for each row set @log:= concat(@log, "(AFTER_INSERT: new=(id=", new.id, ", data=", new.data,"))"); create trigger t1_bu before update on t1 for each row set @log:= concat(@log, "(BEFORE_UPDATE: old=(id=", old.id, ", data=", old.data, ") new=(id=", new.id, ", data=", new.data,"))"); create trigger t1_au after update on t1 for each row set @log:= concat(@log, "(AFTER_UPDATE: old=(id=", old.id, ", data=", old.data, ") new=(id=", new.id, ", data=", new.data,"))"); create trigger t1_bd before delete on t1 for each row set @log:= concat(@log, "(BEFORE_DELETE: old=(id=", old.id, ", data=", old.data,"))"); create trigger t1_ad after delete on t1 for each row set @log:= concat(@log, "(AFTER_DELETE: old=(id=", old.id, ", data=", old.data,"))"); set @log:= ""; insert into t1 values (1, 1); select @log; @log (BEFORE_INSERT: new=(id=1, data=1))(AFTER_INSERT: new=(id=1, data=1)) set @log:= ""; insert ignore t1 values (1, 2); select @log; @log (BEFORE_INSERT: new=(id=1, data=2)) set @log:= ""; insert into t1 (id, data) values (1, 3), (2, 2) on duplicate key update data= data + 1; select @log; @log (BEFORE_INSERT: new=(id=1, data=3))(BEFORE_UPDATE: old=(id=1, data=1) new=(id=1, data=2))(AFTER_UPDATE: old=(id=1, data=1) new=(id=1, data=2))(BEFORE_INSERT: new=(id=2, data=2))(AFTER_INSERT: new=(id=2, data=2)) set @log:= ""; replace t1 values (1, 4), (3, 3); select @log; @log (BEFORE_INSERT: new=(id=1, data=4))(BEFORE_DELETE: old=(id=1, data=2))(AFTER_DELETE: old=(id=1, data=2))(AFTER_INSERT: new=(id=1, data=4))(BEFORE_INSERT: new=(id=3, data=3))(AFTER_INSERT: new=(id=3, data=3)) drop trigger t1_bd; drop trigger t1_ad; set @log:= ""; replace t1 values (1, 5); select @log; @log (BEFORE_INSERT: new=(id=1, data=5))(AFTER_INSERT: new=(id=1, data=5)) drop table t1; create table t1 (id int primary key, data varchar(10), fk int); create table t2 (event varchar(100)); create table t3 (id int primary key); create trigger t1_ai after insert on t1 for each row insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "'")); insert into t1 (id, data) values (1, "one"), (2, "two"); select * from t1; id data fk 1 one NULL 2 two NULL select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' drop trigger t1_ai; create trigger t1_bi before insert on t1 for each row begin if exists (select id from t3 where id=new.fk) then insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "' fk=", new.fk)); else insert into t2 values (concat("INSERT INTO t1 FAILED id=", new.id, " data='", new.data, "' fk=", new.fk)); set new.id= NULL; end if; end| insert into t3 values (1); insert into t1 values (4, "four", 1), (5, "five", 2); ERROR 23000: Column 'id' cannot be null select * from t1; id data fk 1 one NULL 2 two NULL 4 four 1 select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' INSERT INTO t1 id=4 data='four' fk=1 INSERT INTO t1 FAILED id=5 data='five' fk=2 drop table t1, t2, t3; create table t1 (id int primary key, data varchar(10)); create table t2 (seq int); insert into t2 values (10); create function f1 () returns int return (select max(seq) from t2); create trigger t1_bi before insert on t1 for each row begin if new.id > f1() then set new.id:= f1(); end if; end| insert into t1 values (1, "first"); insert into t1 values (f1(), "max"); select * from t1; id data 1 first 10 max drop table t1, t2; drop function f1; create table t1 (id int primary key, fk_t2 int); create table t2 (id int primary key, fk_t3 int); create table t3 (id int primary key); insert into t1 values (1,1), (2,1), (3,2); insert into t2 values (1,1), (2,2); insert into t3 values (1), (2); create trigger t3_ad after delete on t3 for each row delete from t2 where fk_t3=old.id; create trigger t2_ad after delete on t2 for each row delete from t1 where fk_t2=old.id; delete from t3 where id = 1; select * from t1 left join (t2 left join t3 on t2.fk_t3 = t3.id) on t1.fk_t2 = t2.id; id fk_t2 id fk_t3 id 3 2 2 2 2 drop table t1, t2, t3; create table t1 (id int primary key, copy int); create table t2 (id int primary key, data int); insert into t2 values (1,1), (2,2); create trigger t1_bi before insert on t1 for each row set new.copy= (select data from t2 where id = new.id); create trigger t1_bu before update on t1 for each row set new.copy= (select data from t2 where id = new.id); insert into t1 values (1,3), (2,4), (3,3); update t1 set copy= 1 where id = 2; select * from t1; id copy 1 1 2 2 3 NULL drop table t1, t2; create table t1 (i int); create table t3 (i int); create trigger trg before insert on t1 for each row set @a:= old.i; ERROR HY000: There is no OLD row in on INSERT trigger create trigger trg before delete on t1 for each row set @a:= new.i; ERROR HY000: There is no NEW row in on DELETE trigger create trigger trg before update on t1 for each row set old.i:=1; ERROR HY000: Updating of OLD row is not allowed in trigger create trigger trg before delete on t1 for each row set new.i:=1; ERROR HY000: There is no NEW row in on DELETE trigger create trigger trg after update on t1 for each row set new.i:=1; ERROR HY000: Updating of NEW row is not allowed in after trigger create trigger trg before update on t1 for each row set new.j:=1; ERROR 42S22: Unknown column 'j' in 'NEW' create trigger trg before update on t1 for each row set @a:=old.j; ERROR 42S22: Unknown column 'j' in 'OLD' create trigger trg before insert on t2 for each row set @a:=1; ERROR 42S02: Table 'test.t2' doesn't exist create trigger trg before insert on t1 for each row set @a:=1; create trigger trg after insert on t1 for each row set @a:=1; ERROR HY000: Trigger already exists create trigger trg2 before insert on t1 for each row set @a:=1; ERROR 42000: This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table' create trigger trg before insert on t3 for each row set @a:=1; ERROR HY000: Trigger already exists create trigger trg2 before insert on t3 for each row set @a:=1; drop trigger trg2; drop trigger trg; drop trigger trg; ERROR HY000: Trigger does not exist create view v1 as select * from t1; create trigger trg before insert on v1 for each row set @a:=1; ERROR HY000: 'test.v1' is not BASE TABLE drop view v1; drop table t1; drop table t3; create temporary table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; ERROR HY000: Trigger's 't1' is view or temporary table drop table t1; create table t1 (x1col char); create trigger tx1 before insert on t1 for each row set new.x1col = 'x'; insert into t1 values ('y'); drop trigger tx1; drop table t1; create table t1 (i int) engine=myisam; insert into t1 values (1), (2); create trigger trg1 before delete on t1 for each row set @del_before:= @del_before + old.i; create trigger trg2 after delete on t1 for each row set @del_after:= @del_after + old.i; set @del_before:=0, @del_after:= 0; delete from t1; select @del_before, @del_after; @del_before @del_after 3 3 drop trigger trg1; drop trigger trg2; drop table t1; create table t1 (a int); create trigger trg1 before insert on t1 for each row set new.a= 10; drop table t1; create table t1 (a int); insert into t1 values (); select * from t1; a NULL drop table t1; create database mysqltest; use mysqltest; create table t1 (i int); create trigger trg1 before insert on t1 for each row set @a:= 1; drop database mysqltest; use test; create database mysqltest; create table mysqltest.t1 (i int); create trigger trg1 before insert on mysqltest.t1 for each row set @a:= 1; ERROR HY000: Trigger in wrong schema use mysqltest; create trigger test.trg1 before insert on t1 for each row set @a:= 1; ERROR 42S02: Table 'test.t1' doesn't exist drop database mysqltest; use test; create table t1 (i int, j int default 10, k int not null, key (k)); create table t2 (i int); insert into t1 (i, k) values (1, 1); insert into t2 values (1); create trigger trg1 before update on t1 for each row set @a:= @a + new.j - old.j; create trigger trg2 after update on t1 for each row set @b:= "Fired"; set @a:= 0, @b:= ""; update t1, t2 set j = j + 10 where t1.i = t2.i; select @a, @b; @a @b 10 Fired insert into t1 values (2, 13, 2); insert into t2 values (2); set @a:= 0, @b:= ""; update t1, t2 set j = j + 15 where t1.i = t2.i and t1.k >= 2; select @a, @b; @a @b 15 Fired create trigger trg3 before delete on t1 for each row set @c:= @c + old.j; create trigger trg4 before delete on t2 for each row set @d:= @d + old.i; create trigger trg5 after delete on t1 for each row set @e:= "After delete t1 fired"; create trigger trg6 after delete on t2 for each row set @f:= "After delete t2 fired"; set @c:= 0, @d:= 0, @e:= "", @f:= ""; delete t1, t2 from t1, t2 where t1.i = t2.i; select @c, @d, @e, @f; @c @d @e @f 48 3 After delete t1 fired After delete t2 fired drop table t1, t2; create table t1 (i int, j int default 10)| create table t2 (i int)| insert into t2 values (1), (2)| create trigger trg1 before insert on t1 for each row begin if new.i = 1 then set new.j := 1; end if; end| create trigger trg2 after insert on t1 for each row set @a:= 1| set @a:= 0| insert into t1 (i) select * from t2| select * from t1| i j 1 1 2 10 select @a| @a 1 drop table t1, t2| create table t1 (i int, j int, k int); create trigger trg1 before insert on t1 for each row set new.k = new.i; create trigger trg2 after insert on t1 for each row set @b:= "Fired"; set @b:=""; load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, i); select *, @b from t1; i j k @b 10 NULL 10 Fired 15 NULL 15 Fired set @b:=""; load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, j); select *, @b from t1; i j k @b 10 NULL 10 Fired 15 NULL 15 Fired 1 2 1 Fired 3 4 3 Fired 5 6 5 Fired drop table t1; create table t1 (i int, at int, k int, key(k)) engine=myisam; create table t2 (i int); insert into t1 values (1, 1, 1); insert into t2 values (1), (2), (3); create trigger ai after insert on t1 for each row set @a:= new.at; create trigger au after update on t1 for each row set @a:= new.at; create trigger ad after delete on t1 for each row set @a:= old.at; alter table t1 drop column at; select * from t1; i k 1 1 insert into t1 values (2, 1); ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 1 2 1 update t1 set k = 2 where i = 2; ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 1 2 2 delete from t1 where i = 2; ERROR 42S22: Unknown column 'at' in 'OLD' select * from t1; i k 1 1 load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k); ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 1 1 2 insert into t1 select 3, 3; ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 1 1 2 3 3 update t1, t2 set k = k + 10 where t1.i = t2.i; ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 11 1 2 3 3 update t1, t2 set k = k + 10 where t1.i = t2.i and k < 3; ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 1 11 1 12 3 3 delete t1, t2 from t1 straight_join t2 where t1.i = t2.i; ERROR 42S22: Unknown column 'at' in 'OLD' select * from t1; i k 1 12 3 3 delete t2, t1 from t2 straight_join t1 where t1.i = t2.i; ERROR 42S22: Unknown column 'at' in 'OLD' select * from t1; i k 3 3 alter table t1 add primary key (i); insert into t1 values (3, 4) on duplicate key update k= k + 10; ERROR 42S22: Unknown column 'at' in 'NEW' select * from t1; i k 3 13 replace into t1 values (3, 3); ERROR 42S22: Unknown column 'at' in 'OLD' select * from t1; i k drop table t1, t2; create table t1 (i int, bt int, k int, key(k)) engine=myisam; create table t2 (i int); insert into t1 values (1, 1, 1), (2, 2, 2); insert into t2 values (1), (2), (3); create trigger bi before insert on t1 for each row set @a:= new.bt; create trigger bu before update on t1 for each row set @a:= new.bt; create trigger bd before delete on t1 for each row set @a:= old.bt; alter table t1 drop column bt; insert into t1 values (3, 3); ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 update t1 set i = 2; ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 delete from t1; ERROR 42S22: Unknown column 'bt' in 'OLD' select * from t1; i k 1 1 2 2 load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k); ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 insert into t1 select 3, 3; ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 update t1, t2 set k = k + 10 where t1.i = t2.i; ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 update t1, t2 set k = k + 10 where t1.i = t2.i and k < 2; ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 delete t1, t2 from t1 straight_join t2 where t1.i = t2.i; ERROR 42S22: Unknown column 'bt' in 'OLD' select * from t1; i k 1 1 2 2 delete t2, t1 from t2 straight_join t1 where t1.i = t2.i; ERROR 42S22: Unknown column 'bt' in 'OLD' select * from t1; i k 1 1 2 2 alter table t1 add primary key (i); drop trigger bi; insert into t1 values (2, 4) on duplicate key update k= k + 10; ERROR 42S22: Unknown column 'bt' in 'NEW' select * from t1; i k 1 1 2 2 replace into t1 values (2, 4); ERROR 42S22: Unknown column 'bt' in 'OLD' select * from t1; i k 1 1 2 2 drop table t1, t2; drop function if exists bug5893; create table t1 (col1 int, col2 int); insert into t1 values (1, 2); create function bug5893 () returns int return 5; create trigger t1_bu before update on t1 for each row set new.col1= bug5893(); drop function bug5893; update t1 set col2 = 4; ERROR 42000: FUNCTION test.bug5893 does not exist drop trigger t1_bu; drop table t1; set sql_mode='ansi'; create table t1 ("t1 column" int); create trigger t1_bi before insert on t1 for each row set new."t1 column" = 5; set sql_mode=""; insert into t1 values (0); create trigger t1_af after insert on t1 for each row set @a=10; insert into t1 values (0); select * from t1; t1 column 5 5 select @a; @a 10 show triggers; Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation t1_bi INSERT t1 set new."t1 column" = 5 BEFORE # REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI root@localhost latin1 latin1_swedish_ci latin1_swedish_ci t1_af INSERT t1 set @a=10 AFTER # root@localhost latin1 latin1_swedish_ci latin1_swedish_ci drop table t1; set sql_mode="traditional"; create table t1 (a date); insert into t1 values ('2004-01-00'); ERROR 22007: Incorrect date value: '2004-01-00' for column 'a' at row 1 set sql_mode=""; create trigger t1_bi before insert on t1 for each row set new.a = '2004-01-00'; set sql_mode="traditional"; insert into t1 values ('2004-01-01'); select * from t1; a 2004-01-00 set sql_mode=default; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` date DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 show triggers; Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation t1_bi INSERT t1 set new.a = '2004-01-00' BEFORE # root@localhost latin1 latin1_swedish_ci latin1_swedish_ci drop table t1; create table t1 (id int); create trigger t1_ai after insert on t1 for each row reset query cache; ERROR 0A000: RESET is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row reset master; ERROR 0A000: RESET is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row reset slave; ERROR 0A000: RESET is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush hosts; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush tables with read lock; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush logs; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush status; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush slave; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush master; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush des_key_file; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush user_resources; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush tables; ERROR 0A000: FLUSH is not allowed in stored function or trigger create trigger t1_ai after insert on t1 for each row flush privileges; ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure if exists p1; create trigger t1_ai after insert on t1 for each row call p1(); create procedure p1() flush tables; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() reset query cache; insert into t1 values (0); ERROR 0A000: RESET is not allowed in stored function or trigger drop procedure p1; create procedure p1() reset master; insert into t1 values (0); ERROR 0A000: RESET is not allowed in stored function or trigger drop procedure p1; create procedure p1() reset slave; insert into t1 values (0); ERROR 0A000: RESET is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush hosts; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush privileges; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush tables with read lock; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush tables; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush logs; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush status; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush slave; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush master; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush des_key_file; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; create procedure p1() flush user_resources; insert into t1 values (0); ERROR 0A000: FLUSH is not allowed in stored function or trigger drop procedure p1; drop table t1; create table t1 (id int, data int, username varchar(16)); insert into t1 (id, data) values (1, 0); create trigger t1_whoupdated before update on t1 for each row begin declare user varchar(32); declare i int; select user() into user; set NEW.username = user; select count(*) from ((select 1) union (select 2)) as d1 into i; end| update t1 set data = 1; update t1 set data = 2; drop table t1; create table t1 (c1 int, c2 datetime); create trigger tr1 before insert on t1 for each row begin set new.c2= '2004-04-01'; select 'hello'; end| ERROR 0A000: Not allowed to return a result set from a trigger insert into t1 (c1) values (1),(2),(3); select * from t1; c1 c2 1 NULL 2 NULL 3 NULL drop procedure if exists bug11587; create procedure bug11587(x char(16)) begin select "hello"; select "hello again"; end| create trigger tr1 before insert on t1 for each row begin call bug11587(); set new.c2= '2004-04-02'; end| insert into t1 (c1) values (4),(5),(6); ERROR 0A000: Not allowed to return a result set from a trigger select * from t1; c1 c2 1 NULL 2 NULL 3 NULL drop procedure bug11587; drop table t1; create table t1 (f1 integer); create table t2 (f2 integer); create trigger t1_ai after insert on t1 for each row insert into t2 values (new.f1+1); create trigger t2_ai after insert on t2 for each row insert into t1 values (new.f2+1); set @SAVE_SP_RECURSION_LEVELS=@@max_sp_recursion_depth; set @@max_sp_recursion_depth=100; insert into t1 values (1); ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. set @@max_sp_recursion_depth=@SAVE_SP_RECURSION_LEVELS; select * from t1; f1 1 select * from t2; f2 2 drop trigger t1_ai; drop trigger t2_ai; create trigger t1_bu before update on t1 for each row insert into t1 values (2); update t1 set f1= 10; ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. select * from t1; f1 1 drop trigger t1_bu; create trigger t1_bu before update on t1 for each row delete from t1 where f1=new.f1; update t1 set f1= 10; ERROR HY000: Can't update table 't1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. select * from t1; f1 1 drop trigger t1_bu; create trigger t1_bi before insert on t1 for each row set new.f1=(select sum(f1) from t1); insert into t1 values (3); select * from t1; f1 1 1 drop trigger t1_bi; drop tables t1, t2; create table t1 (id int); create table t2 (id int); create trigger t1_bi before insert on t1 for each row insert into t2 values (new.id); prepare stmt1 from "insert into t1 values (10)"; create procedure p1() insert into t1 values (10); call p1(); drop trigger t1_bi; execute stmt1; call p1(); deallocate prepare stmt1; drop procedure p1; create table t3 (id int); create trigger t1_bi after insert on t1 for each row insert into t2 values (new.id); prepare stmt1 from "insert into t1 values (10)"; create procedure p1() insert into t1 values (10); call p1(); drop trigger t1_bi; create trigger t1_bi after insert on t1 for each row insert into t3 values (new.id); execute stmt1; call p1(); ERROR 42S02: Table 'test.t3' doesn't exist deallocate prepare stmt1; drop procedure p1; drop table t1, t2, t3; create table t1 (a int); CREATE PROCEDURE `p1`() begin insert into t1 values (1); end// create trigger trg before insert on t1 for each row begin declare done int default 0; set done= not done; end// CALL p1(); drop procedure p1; drop table t1; create trigger t1_bi before insert on test.t1 for each row set @a:=0; ERROR 3D000: No database selected create trigger test.t1_bi before insert on t1 for each row set @a:=0; ERROR 42S02: Table 'test.t1' doesn't exist drop trigger t1_bi; ERROR 3D000: No database selected create table t1 (id int); create trigger t1_bi before insert on t1 for each row set @a:=new.id; create trigger t1_ai after insert on test.t1 for each row set @b:=new.id; insert into t1 values (101); select @a, @b; @a @b 101 101 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t1 set @a:=new.id test t1_ai test t1 set @b:=new.id rename table t1 to t2; insert into t2 values (102); select @a, @b; @a @b 102 102 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t2 set @a:=new.id test t1_ai test t2 set @b:=new.id alter table t2 rename to t3; insert into t3 values (103); select @a, @b; @a @b 103 103 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t3 set @a:=new.id test t1_ai test t3 set @b:=new.id alter table t3 rename to t4, add column val int default 0; insert into t4 values (104, 1); select @a, @b; @a @b 104 104 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t4 set @a:=new.id test t1_ai test t4 set @b:=new.id drop trigger t1_bi; drop trigger t1_ai; drop table t4; create database mysqltest; use mysqltest; create table t1 (id int); create trigger t1_bi before insert on t1 for each row set @a:=new.id; insert into t1 values (101); select @a; @a 101 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test' or event_object_schema = 'mysqltest'; trigger_schema trigger_name event_object_schema event_object_table action_statement mysqltest t1_bi mysqltest t1 set @a:=new.id rename table t1 to test.t2; ERROR HY000: Trigger in wrong schema insert into t1 values (102); select @a; @a 102 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test' or event_object_schema = 'mysqltest'; trigger_schema trigger_name event_object_schema event_object_table action_statement mysqltest t1_bi mysqltest t1 set @a:=new.id drop trigger test.t1_bi; ERROR HY000: Trigger does not exist alter table t1 rename to test.t1; ERROR HY000: Trigger in wrong schema insert into t1 values (103); select @a; @a 103 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test' or event_object_schema = 'mysqltest'; trigger_schema trigger_name event_object_schema event_object_table action_statement mysqltest t1_bi mysqltest t1 set @a:=new.id drop trigger test.t1_bi; ERROR HY000: Trigger does not exist alter table t1 rename to test.t1, add column val int default 0; ERROR HY000: Trigger in wrong schema insert into t1 values (104); select @a; @a 104 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test' or event_object_schema = 'mysqltest'; trigger_schema trigger_name event_object_schema event_object_table action_statement mysqltest t1_bi mysqltest t1 set @a:=new.id show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop trigger test.t1_bi; ERROR HY000: Trigger does not exist drop trigger t1_bi; drop table t1; drop database mysqltest; use test; create table t1 (id int); create trigger t1_bi before insert on t1 for each row set @a:=new.id; create trigger t1_ai after insert on t1 for each row set @b:=new.id; insert into t1 values (101); select @a, @b; @a @b 101 101 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t1 set @a:=new.id test t1_ai test t1 set @b:=new.id rename table t1 to t2; ERROR HY000: Can't create/write to file './test/t1_ai.TRN~' (Errcode: 13) insert into t1 values (102); select @a, @b; @a @b 102 102 select trigger_schema, trigger_name, event_object_schema, event_object_table, action_statement from information_schema.triggers where event_object_schema = 'test'; trigger_schema trigger_name event_object_schema event_object_table action_statement test t1_bi test t1 set @a:=new.id test t1_ai test t1 set @b:=new.id drop trigger t1_bi; drop trigger t1_ai; drop table t1; create table t1 (i int); create trigger t1_bi before insert on t1 for each row return 0; ERROR 42000: RETURN is only allowed in a FUNCTION insert into t1 values (1); drop table t1; create table t1 (a varchar(64), b int); create table t2 like t1; create trigger t1_ai after insert on t1 for each row set @a:= (select max(a) from t1); insert into t1 (a) values ("Twas"),("brillig"),("and"),("the"),("slithy"),("toves"), ("Did"),("gyre"),("and"),("gimble"),("in"),("the"),("wabe"); create trigger t2_ai after insert on t2 for each row set @a:= (select max(a) from t2); insert into t2 select * from t1; load data infile '../../std_data/words.dat' into table t1 (a); drop trigger t1_ai; drop trigger t2_ai; create function f1() returns int return (select max(b) from t1); insert into t1 values ("All",f1()),("mimsy",f1()),("were",f1()),("the",f1()),("borogoves",f1()), ("And",f1()),("the",f1()),("mome", f1()),("raths",f1()),("outgrabe",f1()); create function f2() returns int return (select max(b) from t2); insert into t2 select a, f2() from t1; load data infile '../../std_data/words.dat' into table t1 (a) set b:= f1(); drop function f1; drop function f2; drop table t1, t2; create table t1(i int not null, j int not null, n numeric(15,2), primary key(i,j)); create table t2(i int not null, n numeric(15,2), primary key(i)); create trigger t1_ai after insert on t1 for each row begin declare sn numeric(15,2); select sum(n) into sn from t1 where i=new.i; replace into t2 values(new.i, sn); end| insert into t1 values (1,1,10.00),(1,2,10.00),(1,3,10.00),(1,4,10.00),(1,5,10.00), (1,6,10.00),(1,7,10.00),(1,8,10.00),(1,9,10.00),(1,10,10.00), (1,11,10.00),(1,12,10.00),(1,13,10.00),(1,14,10.00),(1,15,10.00); select * from t1; i j n 1 1 10.00 1 2 10.00 1 3 10.00 1 4 10.00 1 5 10.00 1 6 10.00 1 7 10.00 1 8 10.00 1 9 10.00 1 10 10.00 1 11 10.00 1 12 10.00 1 13 10.00 1 14 10.00 1 15 10.00 select * from t2; i n 1 150.00 drop tables t1, t2; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( conn_id INT, trigger_conn_id INT ); CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET NEW.trigger_conn_id = CONNECTION_ID(); INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1); INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1); SELECT * FROM t1 WHERE conn_id != trigger_conn_id; conn_id trigger_conn_id DROP TRIGGER t1_bi; DROP TABLE t1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 (i1 INT); SET @save_sql_mode=@@sql_mode; SET SQL_MODE=''; CREATE TRIGGER t1_ai AFTER INSERT ON t1 FOR EACH ROW SET @x = 5/0; SET SQL_MODE='traditional'; CREATE TRIGGER t1_au AFTER UPDATE ON t1 FOR EACH ROW SET @x = 5/0; SET @x=1; INSERT INTO t1 VALUES (@x); SELECT @x; @x NULL SET @x=2; UPDATE t1 SET i1 = @x; Warnings: Error 1365 Division by 0 SELECT @x; @x NULL SET SQL_MODE=''; SET @x=3; INSERT INTO t1 VALUES (@x); SELECT @x; @x NULL SET @x=4; UPDATE t1 SET i1 = @x; Warnings: Error 1365 Division by 0 Error 1365 Division by 0 SELECT @x; @x NULL SET @@sql_mode=@save_sql_mode; DROP TRIGGER t1_ai; DROP TRIGGER t1_au; DROP TABLE t1; DROP TABLE IF EXISTS t1; DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p2; CREATE TABLE t1 (i1 INT); INSERT INTO t1 VALUES (3); CREATE PROCEDURE p1(OUT i1 INT) DETERMINISTIC NO SQL SET i1 = 5; CREATE PROCEDURE p2(INOUT i1 INT) DETERMINISTIC NO SQL SET i1 = i1 * 7; CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW BEGIN CALL p1(NEW.i1); CALL p2(NEW.i1); END// UPDATE t1 SET i1 = 11 WHERE i1 = 3; DROP TRIGGER t1_bu; DROP PROCEDURE p2; DROP PROCEDURE p1; INSERT INTO t1 VALUES (13); CREATE PROCEDURE p1(OUT i1 INT) DETERMINISTIC NO SQL SET @a = 17; CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW CALL p1(OLD.i1); UPDATE t1 SET i1 = 19 WHERE i1 = 13; ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger DROP TRIGGER t1_bu; DROP PROCEDURE p1; INSERT INTO t1 VALUES (23); CREATE PROCEDURE p1(INOUT i1 INT) DETERMINISTIC NO SQL SET @a = i1 * 29; CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW CALL p1(OLD.i1); UPDATE t1 SET i1 = 31 WHERE i1 = 23; ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger DROP TRIGGER t1_bu; DROP PROCEDURE p1; INSERT INTO t1 VALUES (37); CREATE PROCEDURE p1(OUT i1 INT) DETERMINISTIC NO SQL SET @a = 41; CREATE TRIGGER t1_au AFTER UPDATE ON t1 FOR EACH ROW CALL p1(NEW.i1); UPDATE t1 SET i1 = 43 WHERE i1 = 37; ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger DROP TRIGGER t1_au; DROP PROCEDURE p1; INSERT INTO t1 VALUES (47); CREATE PROCEDURE p1(INOUT i1 INT) DETERMINISTIC NO SQL SET @a = i1 * 49; CREATE TRIGGER t1_au AFTER UPDATE ON t1 FOR EACH ROW CALL p1(NEW.i1); UPDATE t1 SET i1 = 51 WHERE i1 = 47; ERROR 42000: OUT or INOUT argument 1 for routine test.p1 is not a variable or NEW pseudo-variable in BEFORE trigger DROP TRIGGER t1_au; DROP PROCEDURE p1; SELECT * FROM t1; i1 35 13 23 43 51 DROP TABLE t1; create trigger wont_work after update on mysql.user for each row begin set @a:= 1; end| ERROR HY000: Triggers can not be created on system tables use mysql| create trigger wont_work after update on event for each row begin set @a:= 1; end| ERROR HY000: Triggers can not be created on system tables use test| DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t2; CREATE TABLE t1(c INT); CREATE TABLE t2(c INT); CREATE DEFINER=1234567890abcdefGHIKL@localhost TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a = 1; ERROR HY000: String '1234567890abcdefGHIKL' is too long for user name (should be no longer than 16) CREATE DEFINER=some_user_name@1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY TRIGGER t2_bi BEFORE INSERT ON t2 FOR EACH ROW SET @a = 2; ERROR HY000: String '1234567890abcdefghij1234567890abcdefghij1234567890abcdefghijQWERTY' is too long for host name (should be no longer than 60) DROP TABLE t1; DROP TABLE t2; drop table if exists t1; drop table if exists t2; drop table if exists t3; drop table if exists t4; SET @save_sql_mode=@@sql_mode; SET sql_mode='TRADITIONAL'| create table t1 (id int(10) not null primary key, v int(10) )| create table t2 (id int(10) not null primary key, v int(10) )| create table t3 (id int(10) not null primary key, v int(10) )| create table t4 (c int)| create trigger t4_bi before insert on t4 for each row set @t4_bi_called:=1| create trigger t4_bu before update on t4 for each row set @t4_bu_called:=1| insert into t1 values(10, 10)| set @a:=1/0| Warnings: Error 1365 Division by 0 select 1/0 from t1| 1/0 NULL Warnings: Error 1365 Division by 0 create trigger t1_bi before insert on t1 for each row set @a:=1/0| insert into t1 values(20, 20)| Warnings: Error 1365 Division by 0 drop trigger t1_bi| create trigger t1_bi before insert on t1 for each row begin insert into t2 values (new.id, new.v); update t2 set v=v+1 where id= new.id; replace t3 values (new.id, 0); update t2, t3 set t2.v=new.v, t3.v=new.v where t2.id=t3.id; create temporary table t5 select * from t1; delete from t5; insert into t5 select * from t1; insert into t4 values (0); set @check= (select count(*) from t5); update t4 set c= @check; drop temporary table t5; set @a:=1/0; end| set @check=0, @t4_bi_called=0, @t4_bu_called=0| insert into t1 values(30, 30)| Warnings: Error 1365 Division by 0 select @check, @t4_bi_called, @t4_bu_called| @check @t4_bi_called @t4_bu_called 2 1 1 SET @@sql_mode=@save_sql_mode; drop table t1; drop table t2; drop table t3; drop table t4; drop table if exists t1; create table t1 (i int, j int key); insert into t1 values (1,1), (2,2), (3,3); create trigger t1_bu before update on t1 for each row set new.j = new.j + 10; update t1 set i= i+ 10 where j > 2; select * from t1; i j 1 1 2 2 13 13 drop table t1; CREATE TABLE t1 (a INT PRIMARY KEY); CREATE TABLE t2 (a INT PRIMARY KEY); INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8); CREATE TRIGGER trg_t1 BEFORE DELETE on t1 FOR EACH ROW INSERT INTO t2 VALUES (OLD.a); FLUSH STATUS; TRUNCATE t1; SHOW STATUS LIKE 'handler_delete'; Variable_name Value Handler_delete 0 SELECT COUNT(*) FROM t2; COUNT(*) 0 INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8); DELETE FROM t2; FLUSH STATUS; DELETE FROM t1; SHOW STATUS LIKE 'handler_delete'; Variable_name Value Handler_delete 8 SELECT COUNT(*) FROM t2; COUNT(*) 8 DROP TRIGGER trg_t1; DROP TABLE t1,t2; drop table if exists t1; drop function if exists f1; create table t1 (i int); create function f1() returns int return 10; create trigger t1_bi before insert on t1 for each row set @a:= f1() + 10; insert into t1 values (); select @a; @a 20 insert into t1 values (); select @a; @a 20 drop table t1; drop function f1; drop table if exists t1; create table t1(a int, b varchar(50)); drop trigger not_a_trigger; ERROR HY000: Trigger does not exist drop trigger if exists not_a_trigger; Warnings: Note 1360 Trigger does not exist create trigger t1_bi before insert on t1 for each row set NEW.b := "In trigger t1_bi"; insert into t1 values (1, "a"); drop trigger if exists t1_bi; insert into t1 values (2, "b"); drop trigger if exists t1_bi; Warnings: Note 1360 Trigger does not exist insert into t1 values (3, "c"); select * from t1; a b 1 In trigger t1_bi 2 b 3 c drop table t1; CREATE TABLE t1 ( id int NOT NULL DEFAULT '0', a varchar(10) NOT NULL, b varchar(10), c varchar(10), d timestamp NOT NULL, PRIMARY KEY (id, a) ); CREATE TABLE t2 ( fubar_id int unsigned NOT NULL DEFAULT '0', last_change_time datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (fubar_id) ); CREATE TRIGGER fubar_change AFTER UPDATE ON t1 FOR EACH ROW BEGIN INSERT INTO t2 (fubar_id, last_change_time) SELECT DISTINCT NEW.id AS fubar_id, NOW() AS last_change_time FROM t1 WHERE (id = NEW.id) AND (OLD.c != NEW.c) ON DUPLICATE KEY UPDATE last_change_time = IF((fubar_id = NEW.id)AND(OLD.c != NEW.c),NOW(),last_change_time); END | INSERT INTO t1 (id,a, b,c,d) VALUES (1,'a','b','c',now()),(2,'a','b','c',now()); UPDATE t1 SET c='Bang!' WHERE id=1; SELECT fubar_id FROM t2; fubar_id 1 DROP TABLE t1,t2; DROP TABLE IF EXISTS bug21825_A; DROP TABLE IF EXISTS bug21825_B; CREATE TABLE bug21825_A (id int(10)); CREATE TABLE bug21825_B (id int(10)); CREATE TRIGGER trgA AFTER INSERT ON bug21825_A FOR EACH ROW BEGIN INSERT INTO bug21825_B (id) values (1); END// INSERT INTO bug21825_A (id) VALUES (10); INSERT INTO bug21825_A (id) VALUES (20); DROP TABLE bug21825_B; DELETE FROM bug21825_A WHERE id = 20; DROP TABLE bug21825_A; DROP TABLE IF EXISTS bug22580_t1; DROP PROCEDURE IF EXISTS bug22580_proc_1; DROP PROCEDURE IF EXISTS bug22580_proc_2; CREATE TABLE bug22580_t1 (a INT, b INT); CREATE PROCEDURE bug22580_proc_2() BEGIN DROP TABLE IF EXISTS bug22580_tmp; CREATE TEMPORARY TABLE bug22580_tmp (a INT); DROP TABLE bug22580_tmp; END|| CREATE PROCEDURE bug22580_proc_1() BEGIN CALL bug22580_proc_2(); END|| CREATE TRIGGER t1bu BEFORE UPDATE ON bug22580_t1 FOR EACH ROW BEGIN CALL bug22580_proc_1(); END|| INSERT INTO bug22580_t1 VALUES (1,1); DROP TABLE bug22580_t1; DROP PROCEDURE bug22580_proc_1; DROP PROCEDURE bug22580_proc_2; DROP TRIGGER IF EXISTS trg27006_a_update; DROP TRIGGER IF EXISTS trg27006_a_insert; CREATE TABLE t1 ( `id` int(10) unsigned NOT NULL auto_increment, `val` varchar(10) NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE t2 like t1; CREATE TRIGGER trg27006_a_insert AFTER INSERT ON t1 FOR EACH ROW BEGIN insert into t2 values (NULL,new.val); END | CREATE TRIGGER trg27006_a_update AFTER UPDATE ON t1 FOR EACH ROW BEGIN insert into t2 values (NULL,new.val); END | INSERT INTO t1(val) VALUES ('test1'),('test2'); SELECT * FROM t1; id val 1 test1 2 test2 SELECT * FROM t2; id val 1 test1 2 test2 INSERT INTO t1 VALUES (2,'test2') ON DUPLICATE KEY UPDATE val=VALUES(val); INSERT INTO t1 VALUES (2,'test3') ON DUPLICATE KEY UPDATE val=VALUES(val); INSERT INTO t1 VALUES (3,'test4') ON DUPLICATE KEY UPDATE val=VALUES(val); SELECT * FROM t1; id val 1 test1 2 test3 3 test4 SELECT * FROM t2; id val 1 test1 2 test2 3 test3 4 test4 DROP TRIGGER trg27006_a_insert; DROP TRIGGER trg27006_a_update; drop table t1,t2; drop table if exists t1, t2, t3; create table t1 (i int); create trigger t1_bi before insert on t1 for each row set new.i = 7; create trigger t1_ai after insert on t1 for each row set @a := 7; create table t2 (j int); insert into t2 values (1), (2); set @a:=""; create table if not exists t1 select * from t2; Warnings: Note 1050 Table 't1' already exists select * from t1; i 7 7 select @a; @a 7 drop trigger t1_bi; drop trigger t1_ai; create table t3 (isave int); create trigger t1_bi before insert on t1 for each row insert into t3 values (new.i); create table if not exists t1 select * from t2; Warnings: Note 1050 Table 't1' already exists select * from t1; i 7 7 1 2 select * from t3; isave 1 2 drop table t1, t2, t3; Bug#28502 Triggers that update another innodb table will block on X lock unnecessarily Ensure we do not open and lock tables for triggers we do not fire. drop table if exists t1, t2; drop trigger if exists trg_bug28502_au; create table t1 (id int, count int); create table t2 (id int); create trigger trg_bug28502_au before update on t2 for each row begin if (new.id is not null) then update t1 set count= count + 1 where id = old.id; end if; end| insert into t1 (id, count) values (1, 0); lock table t1 write; insert into t2 set id=1; unlock tables; update t2 set id=1 where id=1; select * from t1; id count 1 1 select * from t2; id 1 drop table t1, t2; Additionally, provide test coverage for triggers and all MySQL data changing commands. drop table if exists t1, t2, t1_op_log; drop view if exists v1; drop trigger if exists trg_bug28502_bi; drop trigger if exists trg_bug28502_ai; drop trigger if exists trg_bug28502_bu; drop trigger if exists trg_bug28502_au; drop trigger if exists trg_bug28502_bd; drop trigger if exists trg_bug28502_ad; create table t1 (id int primary key auto_increment, operation varchar(255)); create table t2 (id int primary key); create table t1_op_log(operation varchar(255)); create view v1 as select * from t1; create trigger trg_bug28502_bi before insert on t1 for each row insert into t1_op_log (operation) values (concat("Before INSERT, new=", new.operation)); create trigger trg_bug28502_ai after insert on t1 for each row insert into t1_op_log (operation) values (concat("After INSERT, new=", new.operation)); create trigger trg_bug28502_bu before update on t1 for each row insert into t1_op_log (operation) values (concat("Before UPDATE, new=", new.operation, ", old=", old.operation)); create trigger trg_bug28502_au after update on t1 for each row insert into t1_op_log (operation) values (concat("After UPDATE, new=", new.operation, ", old=", old.operation)); create trigger trg_bug28502_bd before delete on t1 for each row insert into t1_op_log (operation) values (concat("Before DELETE, old=", old.operation)); create trigger trg_bug28502_ad after delete on t1 for each row insert into t1_op_log (operation) values (concat("After DELETE, old=", old.operation)); insert into t1 (operation) values ("INSERT"); set @id=last_insert_id(); select * from t1; id operation 1 INSERT select * from t1_op_log; operation Before INSERT, new=INSERT After INSERT, new=INSERT truncate t1_op_log; update t1 set operation="UPDATE" where id=@id; select * from t1; id operation 1 UPDATE select * from t1_op_log; operation Before UPDATE, new=UPDATE, old=INSERT After UPDATE, new=UPDATE, old=INSERT truncate t1_op_log; delete from t1 where id=@id; select * from t1; id operation select * from t1_op_log; operation Before DELETE, old=UPDATE After DELETE, old=UPDATE truncate t1; truncate t1_op_log; insert into t1 (id, operation) values (NULL, "INSERT ON DUPLICATE KEY UPDATE, inserting a new key") on duplicate key update id=NULL, operation="Should never happen"; set @id=last_insert_id(); select * from t1; id operation 1 INSERT ON DUPLICATE KEY UPDATE, inserting a new key select * from t1_op_log; operation Before INSERT, new=INSERT ON DUPLICATE KEY UPDATE, inserting a new key After INSERT, new=INSERT ON DUPLICATE KEY UPDATE, inserting a new key truncate t1_op_log; insert into t1 (id, operation) values (@id, "INSERT ON DUPLICATE KEY UPDATE, the key value is the same") on duplicate key update id=NULL, operation="INSERT ON DUPLICATE KEY UPDATE, updating the duplicate"; select * from t1; id operation 0 INSERT ON DUPLICATE KEY UPDATE, updating the duplicate select * from t1_op_log; operation Before INSERT, new=INSERT ON DUPLICATE KEY UPDATE, the key value is the same Before UPDATE, new=INSERT ON DUPLICATE KEY UPDATE, updating the duplicate, old=INSERT ON DUPLICATE KEY UPDATE, inserting a new key After UPDATE, new=INSERT ON DUPLICATE KEY UPDATE, updating the duplicate, old=INSERT ON DUPLICATE KEY UPDATE, inserting a new key truncate t1; truncate t1_op_log; replace into t1 values (NULL, "REPLACE, inserting a new key"); set @id=last_insert_id(); select * from t1; id operation 1 REPLACE, inserting a new key select * from t1_op_log; operation Before INSERT, new=REPLACE, inserting a new key After INSERT, new=REPLACE, inserting a new key truncate t1_op_log; replace into t1 values (@id, "REPLACE, deleting the duplicate"); select * from t1; id operation 1 REPLACE, deleting the duplicate select * from t1_op_log; operation Before INSERT, new=REPLACE, deleting the duplicate Before DELETE, old=REPLACE, inserting a new key After DELETE, old=REPLACE, inserting a new key After INSERT, new=REPLACE, deleting the duplicate truncate t1; truncate t1_op_log; create table if not exists t1 select NULL, "CREATE TABLE ... SELECT, inserting a new key"; Warnings: Note 1050 Table 't1' already exists set @id=last_insert_id(); select * from t1; id operation 1 CREATE TABLE ... SELECT, inserting a new key select * from t1_op_log; operation Before INSERT, new=CREATE TABLE ... SELECT, inserting a new key After INSERT, new=CREATE TABLE ... SELECT, inserting a new key truncate t1_op_log; create table if not exists t1 replace select @id, "CREATE TABLE ... REPLACE SELECT, deleting a duplicate key"; Warnings: Note 1050 Table 't1' already exists select * from t1; id operation 1 CREATE TABLE ... REPLACE SELECT, deleting a duplicate key select * from t1_op_log; operation Before INSERT, new=CREATE TABLE ... REPLACE SELECT, deleting a duplicate key Before DELETE, old=CREATE TABLE ... SELECT, inserting a new key After DELETE, old=CREATE TABLE ... SELECT, inserting a new key After INSERT, new=CREATE TABLE ... REPLACE SELECT, deleting a duplicate key truncate t1; truncate t1_op_log; insert into t1 (id, operation) select NULL, "INSERT ... SELECT, inserting a new key"; set @id=last_insert_id(); select * from t1; id operation 1 INSERT ... SELECT, inserting a new key select * from t1_op_log; operation Before INSERT, new=INSERT ... SELECT, inserting a new key After INSERT, new=INSERT ... SELECT, inserting a new key truncate t1_op_log; insert into t1 (id, operation) select @id, "INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate" on duplicate key update id=NULL, operation="INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate"; select * from t1; id operation 0 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate select * from t1_op_log; operation Before INSERT, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate Before UPDATE, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate, old=INSERT ... SELECT, inserting a new key After UPDATE, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate, old=INSERT ... SELECT, inserting a new key truncate t1; truncate t1_op_log; replace into t1 (id, operation) select NULL, "REPLACE ... SELECT, inserting a new key"; set @id=last_insert_id(); select * from t1; id operation 1 REPLACE ... SELECT, inserting a new key select * from t1_op_log; operation Before INSERT, new=REPLACE ... SELECT, inserting a new key After INSERT, new=REPLACE ... SELECT, inserting a new key truncate t1_op_log; replace into t1 (id, operation) select @id, "REPLACE ... SELECT, deleting a duplicate"; select * from t1; id operation 1 REPLACE ... SELECT, deleting a duplicate select * from t1_op_log; operation Before INSERT, new=REPLACE ... SELECT, deleting a duplicate Before DELETE, old=REPLACE ... SELECT, inserting a new key After DELETE, old=REPLACE ... SELECT, inserting a new key After INSERT, new=REPLACE ... SELECT, deleting a duplicate truncate t1; truncate t1_op_log; insert into t1 (id, operation) values (1, "INSERT for multi-DELETE"); insert into t2 (id) values (1); delete t1.*, t2.* from t1, t2 where t1.id=1; select * from t1; id operation select * from t2; id select * from t1_op_log; operation Before INSERT, new=INSERT for multi-DELETE After INSERT, new=INSERT for multi-DELETE Before DELETE, old=INSERT for multi-DELETE After DELETE, old=INSERT for multi-DELETE truncate t1; truncate t2; truncate t1_op_log; insert into t1 (id, operation) values (1, "INSERT for multi-UPDATE"); insert into t2 (id) values (1); update t1, t2 set t1.id=2, operation="multi-UPDATE" where t1.id=1; update t1, t2 set t2.id=3, operation="multi-UPDATE, SET for t2, but the trigger is fired" where t1.id=2; select * from t1; id operation 2 multi-UPDATE, SET for t2, but the trigger is fired select * from t2; id 3 select * from t1_op_log; operation Before INSERT, new=INSERT for multi-UPDATE After INSERT, new=INSERT for multi-UPDATE Before UPDATE, new=multi-UPDATE, old=INSERT for multi-UPDATE After UPDATE, new=multi-UPDATE, old=INSERT for multi-UPDATE Before UPDATE, new=multi-UPDATE, SET for t2, but the trigger is fired, old=multi-UPDATE After UPDATE, new=multi-UPDATE, SET for t2, but the trigger is fired, old=multi-UPDATE truncate table t1; truncate table t2; truncate table t1_op_log; Now do the same but use a view instead of the base table. insert into v1 (operation) values ("INSERT"); set @id=last_insert_id(); select * from t1; id operation 1 INSERT select * from t1_op_log; operation Before INSERT, new=INSERT After INSERT, new=INSERT truncate t1_op_log; update v1 set operation="UPDATE" where id=@id; select * from t1; id operation 1 UPDATE select * from t1_op_log; operation Before UPDATE, new=UPDATE, old=INSERT After UPDATE, new=UPDATE, old=INSERT truncate t1_op_log; delete from v1 where id=@id; select * from t1; id operation select * from t1_op_log; operation Before DELETE, old=UPDATE After DELETE, old=UPDATE truncate t1; truncate t1_op_log; insert into v1 (id, operation) values (NULL, "INSERT ON DUPLICATE KEY UPDATE, inserting a new key") on duplicate key update id=NULL, operation="Should never happen"; set @id=last_insert_id(); select * from t1; id operation 1 INSERT ON DUPLICATE KEY UPDATE, inserting a new key select * from t1_op_log; operation Before INSERT, new=INSERT ON DUPLICATE KEY UPDATE, inserting a new key After INSERT, new=INSERT ON DUPLICATE KEY UPDATE, inserting a new key truncate t1_op_log; insert into v1 (id, operation) values (@id, "INSERT ON DUPLICATE KEY UPDATE, the key value is the same") on duplicate key update id=NULL, operation="INSERT ON DUPLICATE KEY UPDATE, updating the duplicate"; select * from t1; id operation 0 INSERT ON DUPLICATE KEY UPDATE, updating the duplicate select * from t1_op_log; operation Before INSERT, new=INSERT ON DUPLICATE KEY UPDATE, the key value is the same Before UPDATE, new=INSERT ON DUPLICATE KEY UPDATE, updating the duplicate, old=INSERT ON DUPLICATE KEY UPDATE, inserting a new key After UPDATE, new=INSERT ON DUPLICATE KEY UPDATE, updating the duplicate, old=INSERT ON DUPLICATE KEY UPDATE, inserting a new key truncate t1; truncate t1_op_log; replace into v1 values (NULL, "REPLACE, inserting a new key"); set @id=last_insert_id(); select * from t1; id operation 1 REPLACE, inserting a new key select * from t1_op_log; operation Before INSERT, new=REPLACE, inserting a new key After INSERT, new=REPLACE, inserting a new key truncate t1_op_log; replace into v1 values (@id, "REPLACE, deleting the duplicate"); select * from t1; id operation 1 REPLACE, deleting the duplicate select * from t1_op_log; operation Before INSERT, new=REPLACE, deleting the duplicate Before DELETE, old=REPLACE, inserting a new key After DELETE, old=REPLACE, inserting a new key After INSERT, new=REPLACE, deleting the duplicate truncate t1; truncate t1_op_log; create table if not exists v1 select NULL, "CREATE TABLE ... SELECT, inserting a new key"; Warnings: Note 1050 Table 'v1' already exists set @id=last_insert_id(); select * from t1; id operation select * from t1_op_log; operation truncate t1_op_log; create table if not exists v1 replace select @id, "CREATE TABLE ... REPLACE SELECT, deleting a duplicate key"; Warnings: Note 1050 Table 'v1' already exists select * from t1; id operation select * from t1_op_log; operation truncate t1; truncate t1_op_log; insert into v1 (id, operation) select NULL, "INSERT ... SELECT, inserting a new key"; set @id=last_insert_id(); select * from t1; id operation 1 INSERT ... SELECT, inserting a new key select * from t1_op_log; operation Before INSERT, new=INSERT ... SELECT, inserting a new key After INSERT, new=INSERT ... SELECT, inserting a new key truncate t1_op_log; insert into v1 (id, operation) select @id, "INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate" on duplicate key update id=NULL, operation="INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate"; select * from t1; id operation 0 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate select * from t1_op_log; operation Before INSERT, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate Before UPDATE, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate, old=INSERT ... SELECT, inserting a new key After UPDATE, new=INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, updating a duplicate, old=INSERT ... SELECT, inserting a new key truncate t1; truncate t1_op_log; replace into v1 (id, operation) select NULL, "REPLACE ... SELECT, inserting a new key"; set @id=last_insert_id(); select * from t1; id operation 1 REPLACE ... SELECT, inserting a new key select * from t1_op_log; operation Before INSERT, new=REPLACE ... SELECT, inserting a new key After INSERT, new=REPLACE ... SELECT, inserting a new key truncate t1_op_log; replace into v1 (id, operation) select @id, "REPLACE ... SELECT, deleting a duplicate"; select * from t1; id operation 1 REPLACE ... SELECT, deleting a duplicate select * from t1_op_log; operation Before INSERT, new=REPLACE ... SELECT, deleting a duplicate Before DELETE, old=REPLACE ... SELECT, inserting a new key After DELETE, old=REPLACE ... SELECT, inserting a new key After INSERT, new=REPLACE ... SELECT, deleting a duplicate truncate t1; truncate t1_op_log; insert into v1 (id, operation) values (1, "INSERT for multi-DELETE"); insert into t2 (id) values (1); delete v1.*, t2.* from v1, t2 where v1.id=1; select * from t1; id operation select * from t2; id select * from t1_op_log; operation Before INSERT, new=INSERT for multi-DELETE After INSERT, new=INSERT for multi-DELETE Before DELETE, old=INSERT for multi-DELETE After DELETE, old=INSERT for multi-DELETE truncate t1; truncate t2; truncate t1_op_log; insert into v1 (id, operation) values (1, "INSERT for multi-UPDATE"); insert into t2 (id) values (1); update v1, t2 set v1.id=2, operation="multi-UPDATE" where v1.id=1; update v1, t2 set t2.id=3, operation="multi-UPDATE, SET for t2, but the trigger is fired" where v1.id=2; select * from t1; id operation 2 multi-UPDATE, SET for t2, but the trigger is fired select * from t2; id 3 select * from t1_op_log; operation Before INSERT, new=INSERT for multi-UPDATE After INSERT, new=INSERT for multi-UPDATE Before UPDATE, new=multi-UPDATE, old=INSERT for multi-UPDATE After UPDATE, new=multi-UPDATE, old=INSERT for multi-UPDATE Before UPDATE, new=multi-UPDATE, SET for t2, but the trigger is fired, old=multi-UPDATE After UPDATE, new=multi-UPDATE, SET for t2, but the trigger is fired, old=multi-UPDATE drop view v1; drop table t1, t2, t1_op_log; Bug#27248 Triggers: error if insert affects temporary table The bug was fixed by the fix for Bug#26141 drop table if exists t1; drop temporary table if exists t2; create table t1 (s1 int); create temporary table t2 (s1 int); create trigger t1_bi before insert on t1 for each row insert into t2 values (0); create trigger t1_bd before delete on t1 for each row delete from t2; insert into t1 values (0); insert into t1 values (0); select * from t1; s1 0 0 select * from t2; s1 0 0 delete from t1; select * from t1; s1 select * from t2; s1 drop table t1; drop temporary table t2; #------------------------------------------------------------------------ # Bug#39953 Triggers are not working properly with multi table updates #------------------------------------------------------------------------ DROP TABLE IF EXISTS t1; DROP TRIGGER IF EXISTS t_insert; DROP TABLE IF EXISTS t2; CREATE TABLE t1 (a int, date_insert timestamp, PRIMARY KEY (a)); INSERT INTO t1 (a) VALUES (2),(5); CREATE TABLE t2 (a int, b int, PRIMARY KEY (a)); CREATE TRIGGER t_insert AFTER INSERT ON t2 FOR EACH ROW BEGIN UPDATE t1,t2 SET date_insert=NOW() WHERE t1.a=t2.b AND t2.a=NEW.a; END | INSERT INTO t2 (a,b) VALUES (1,2); DROP TRIGGER t_insert; CREATE TRIGGER t_insert AFTER INSERT ON t2 FOR EACH ROW BEGIN UPDATE t1,t2 SET date_insert=NOW(),b=b+1 WHERE t1.a=t2.b AND t2.a=NEW.a; END | INSERT INTO t2 (a,b) VALUES (3,5); ERROR HY000: Can't update table 't2' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. DROP TABLE t1; DROP TRIGGER t_insert; DROP TABLE t2; End of 5.0 tests drop table if exists table_25411_a; drop table if exists table_25411_b; create table table_25411_a(a int); create table table_25411_b(b int); create trigger trg_25411a_ai after insert on table_25411_a for each row insert into table_25411_b select new.*; select * from table_25411_a; a insert into table_25411_a values (1); ERROR 42S02: Unknown table 'new' select * from table_25411_a; a 1 drop table table_25411_a; drop table table_25411_b; DROP TRIGGER IF EXISTS trg; SHOW CREATE TRIGGER trg; ERROR HY000: Trigger does not exist drop table if exists t1; create table t1 (i int, j int); create trigger t1_bi before insert on t1 for each row begin end; create trigger t1_bi before insert on t1 for each row begin end; ERROR 42000: This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table' drop trigger t1_bi; drop trigger t1_bi; ERROR HY000: Trigger does not exist lock tables t1 read; create trigger t1_bi before insert on t1 for each row begin end; ERROR HY000: Table 't1' was locked with a READ lock and can't be updated create trigger t1_bi before insert on t1 for each row begin end; ERROR HY000: Table 't1' was locked with a READ lock and can't be updated drop trigger t1_bi; ERROR HY000: Trigger does not exist unlock tables; create trigger t1_bi before insert on t1 for each row begin end; lock tables t1 read; create trigger t1_bi before insert on t1 for each row begin end; ERROR HY000: Table 't1' was locked with a READ lock and can't be updated drop trigger t1_bi; ERROR HY000: Table 't1' was locked with a READ lock and can't be updated unlock tables; drop trigger t1_bi; lock tables t1 write; create trigger b1_bi before insert on t1 for each row set new.i = new.i + 10; insert into t1 values (10, 10); drop trigger b1_bi; insert into t1 values (10, 10); select * from t1; i j 20 10 10 10 unlock tables; drop table t1; drop table if exists t1, t2; drop trigger if exists trg1; drop trigger if exists trg2; create table t1 (a int); create table t2 (b int); create trigger trg1 after update on t1 for each row set @a= @a+1; create trigger trg2 after update on t2 for each row set @b= @b+1; insert into t1 values (1), (2), (3); insert into t2 values (1), (2), (3); set @a= 0; set @b= 0; update t1, t2 set t1.a= t1.a, t2.b= t2.b; select @a, @b; @a @b 3 3 update t1, t2 set t1.a= t2.b, t2.b= t1.a; select @a, @b; @a @b 6 6 update t1 set a= a; select @a, @b; @a @b 9 6 update t2 set b= b; select @a, @b; @a @b 9 9 update t1 set a= 1; select @a, @b; @a @b 12 9 update t2 set b= 1; select @a, @b; @a @b 12 12 drop trigger trg1; drop trigger trg2; drop table t1, t2; CREATE TABLE t1 ( a INT, b INT ); CREATE TABLE t2 ( a INT AUTO_INCREMENT KEY, b INT ); INSERT INTO t1 (a) VALUES (1); CREATE TRIGGER tr1 BEFORE INSERT ON t2 FOR EACH ROW BEGIN UPDATE a_nonextisting_table SET a = 1; END// CREATE TABLE IF NOT EXISTS t2 ( a INT, b INT ) SELECT a, b FROM t1; ERROR 42S02: Table 'test.a_nonextisting_table' doesn't exist SELECT * FROM t2; a b DROP TABLE t1, t2; # # Bug#51650 crash with user variables and triggers # DROP TRIGGER IF EXISTS trg1; DROP TABLE IF EXISTS t1, t2; CREATE TABLE t1 (b VARCHAR(50) NOT NULL); CREATE TABLE t2 (a VARCHAR(10) NOT NULL DEFAULT ''); CREATE TRIGGER trg1 AFTER INSERT ON t2 FOR EACH ROW BEGIN SELECT 1 FROM t1 c WHERE (@bug51650 IS NULL OR @bug51650 != c.b) AND c.b = NEW.a LIMIT 1 INTO @foo; END// SET @bug51650 = 1; INSERT IGNORE INTO t2 VALUES(); Warnings: Warning 1329 No data - zero rows fetched, selected, or processed INSERT IGNORE INTO t1 SET b = '777'; INSERT IGNORE INTO t2 SET a = '111'; Warnings: Warning 1329 No data - zero rows fetched, selected, or processed SET @bug51650 = 1; INSERT IGNORE INTO t2 SET a = '777'; DROP TRIGGER trg1; DROP TABLE t1, t2; CREATE TABLE t1 (id INT NOT NULL); CREATE TABLE t2 (id INT NOT NULL); INSERT t1 VALUES (1),(2),(3); UPDATE t1 SET id=NULL; Warnings: Warning 1048 Column 'id' cannot be null Warning 1048 Column 'id' cannot be null Warning 1048 Column 'id' cannot be null CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROW INSERT INTO t2 VALUES (3); UPDATE t1 SET id=NULL; Warnings: Warning 1048 Column 'id' cannot be null Warning 1048 Column 'id' cannot be null Warning 1048 Column 'id' cannot be null DROP TRIGGER t1_bu; DROP TABLE t1,t2; # # Bug#50755: Crash if stored routine def contains version comments # DROP DATABASE IF EXISTS db1; DROP TRIGGER IF EXISTS trg1; DROP TABLE IF EXISTS t1, t2; CREATE DATABASE db1; USE db1; CREATE TABLE t1 (b INT); CREATE TABLE t2 (a INT); CREATE TRIGGER trg1 BEFORE INSERT ON t2 FOR EACH ROW INSERT/*!INTO*/t1 VALUES (1); # Used to crash SHOW TRIGGERS IN db1; Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation Warnings: Warning 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES (1)' at line 1 INSERT INTO t2 VALUES (1); ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES (1)' at line 1 SELECT * FROM t1; b # Work around Bug#45235 DROP DATABASE db1; USE test; End of 5.1 tests. create table t1 (i int); create table t2 (i int); flush tables; flush status; CREATE DEFINER=`root`@`localhost` TRIGGER trg AFTER DELETE ON t1 FOR EACH ROW BEGIN DELETE FROM t2 WHERE t2.i = OLD.i; END // insert into t1 values (1),(2); insert into t2 values (1),(2); delete from t1 where i=1; show status like 'Opened_tables'; Variable_name Value Opened_tables 3 select * from t1; i 2 select * from t2; i 2 drop table t1,t2; End of 5.2 tests.