USE test; drop table if exists tb3; create table tb3 ( f118 char not null DEFAULT 'a', f119 char binary not null DEFAULT b'101', f120 char ascii not null DEFAULT b'101', f121 char(50), f122 char(50), f129 binary not null DEFAULT b'101', f130 tinyint not null DEFAULT 99, f131 tinyint unsigned not null DEFAULT 99, f132 tinyint zerofill not null DEFAULT 99, f133 tinyint unsigned zerofill not null DEFAULT 99, f134 smallint not null DEFAULT 999, f135 smallint unsigned not null DEFAULT 999, f136 smallint zerofill not null DEFAULT 999, f137 smallint unsigned zerofill not null DEFAULT 999, f138 mediumint not null DEFAULT 9999, f139 mediumint unsigned not null DEFAULT 9999, f140 mediumint zerofill not null DEFAULT 9999, f141 mediumint unsigned zerofill not null DEFAULT 9999, f142 int not null DEFAULT 99999, f143 int unsigned not null DEFAULT 99999, f144 int zerofill not null DEFAULT 99999, f145 int unsigned zerofill not null DEFAULT 99999, f146 bigint not null DEFAULT 999999, f147 bigint unsigned not null DEFAULT 999999, f148 bigint zerofill not null DEFAULT 999999, f149 bigint unsigned zerofill not null DEFAULT 999999, f150 decimal not null DEFAULT 999.999, f151 decimal unsigned not null DEFAULT 999.17, f152 decimal zerofill not null DEFAULT 999.999, f153 decimal unsigned zerofill, f154 decimal (0), f155 decimal (64), f156 decimal (0) unsigned, f157 decimal (64) unsigned, f158 decimal (0) zerofill, f159 decimal (64) zerofill, f160 decimal (0) unsigned zerofill, f161 decimal (64) unsigned zerofill, f162 decimal (0,0), f163 decimal (63,30), f164 decimal (0,0) unsigned, f165 decimal (63,30) unsigned, f166 decimal (0,0) zerofill, f167 decimal (63,30) zerofill, f168 decimal (0,0) unsigned zerofill, f169 decimal (63,30) unsigned zerofill, f170 numeric, f171 numeric unsigned, f172 numeric zerofill, f173 numeric unsigned zerofill, f174 numeric (0), f175 numeric (64) ) engine = memory; Warnings: Note 1265 Data truncated for column 'f150' at row 1 Note 1265 Data truncated for column 'f151' at row 1 Note 1265 Data truncated for column 'f152' at row 1 load data infile 'MYSQL_TEST_DIR/suite/funcs_1/data/memory_tb3.txt' into table tb3 ; Testcase 3.5.10.1/2/3: ---------------------- Create view vw11 as select * from tb3 where f122 like 'Test 3.5.10.1/2/3%'; Create trigger trg1a before insert on tb3 for each row set new.f163=111.11; Create trigger trg1b after insert on tb3 for each row set @test_var='After Insert'; Create trigger trg1c before update on tb3 for each row set new.f121='Y', new.f122='Test 3.5.10.1/2/3-Update'; Create trigger trg1d after update on tb3 for each row set @test_var='After Update'; Create trigger trg1e before delete on tb3 for each row set @test_var=5; Create trigger trg1f after delete on tb3 for each row set @test_var= 2* @test_var+7; Insert into vw11 (f122, f151) values ('Test 3.5.10.1/2/3', 1); Insert into vw11 (f122, f151) values ('Test 3.5.10.1/2/3', 2); Insert into vw11 (f122, f151) values ('Not in View', 3); select f121, f122, f151, f163 from tb3 where f122 like 'Test 3.5.10.1/2/3%'; f121 f122 f151 f163 NULL Test 3.5.10.1/2/3 1 111.110000000000000000000000000000 NULL Test 3.5.10.1/2/3 2 111.110000000000000000000000000000 select f121, f122, f151, f163 from vw11; f121 f122 f151 f163 NULL Test 3.5.10.1/2/3 1 111.110000000000000000000000000000 NULL Test 3.5.10.1/2/3 2 111.110000000000000000000000000000 select f121, f122, f151, f163 from tb3 where f122 like 'Not in View'; f121 f122 f151 f163 NULL Not in View 3 111.110000000000000000000000000000 Update vw11 set f163=1; select f121, f122, f151, f163 from tb3 where f122 like 'Test 3.5.10.1/2/3%'; f121 f122 f151 f163 Y Test 3.5.10.1/2/3-Update 1 1.000000000000000000000000000000 Y Test 3.5.10.1/2/3-Update 2 1.000000000000000000000000000000 select f121, f122, f151, f163 from vw11; f121 f122 f151 f163 Y Test 3.5.10.1/2/3-Update 1 1.000000000000000000000000000000 Y Test 3.5.10.1/2/3-Update 2 1.000000000000000000000000000000 set @test_var=0; Select @test_var as 'before delete'; before delete 0 delete from vw11 where f151=1; select f121, f122, f151, f163 from tb3 where f122 like 'Test 3.5.10.1/2/3%'; f121 f122 f151 f163 Y Test 3.5.10.1/2/3-Update 2 1.000000000000000000000000000000 select f121, f122, f151, f163 from vw11; f121 f122 f151 f163 Y Test 3.5.10.1/2/3-Update 2 1.000000000000000000000000000000 Select @test_var as 'after delete'; after delete 17 drop view vw11; drop trigger trg1a; drop trigger trg1b; drop trigger trg1c; drop trigger trg1d; drop trigger trg1e; drop trigger trg1f; delete from tb3 where f122 like 'Test 3.5.10.1/2/3%'; Testcase 3.5.10.4: ------------------ create table tb_load (f1 int, f2 char(25),f3 int) engine=memory; Create trigger trg4 before insert on tb_load for each row set new.f3=-(new.f1 div 5), @counter= @counter+1; set @counter= 0; select @counter as 'Rows Loaded Before'; Rows Loaded Before 0 load data infile 'MYSQL_TEST_DIR/suite/funcs_1/data/t9.txt' into table tb_load; select @counter as 'Rows Loaded After'; Rows Loaded After 10 Select * from tb_load limit 10; f1 f2 f3 -5000 a` 1000 -4999 aaa 999 -4998 abaa 999 -4997 acaaa 999 -4996 adaaaa 999 -4995 aeaaaaa 999 -4994 afaaaaaa 998 -4993 agaaaaaaa 998 -4992 a^aaaaaaaa 998 -4991 a_aaaaaaaaa 998 drop trigger trg4; drop table tb_load; Testcase 3.5.10.5: (implemented in trig_frkey.test) --------------------------------------------------- Testcase 3.5.10.6: (implemented in trig_frkey.test) --------------------------------------------------- Testcase 3.5.10.extra: ---------------------- create table t1_sp (var136 tinyint, var151 decimal) engine=memory; create trigger trg before insert on t1_sp for each row set @counter=@counter+1; create procedure trig_sp() begin declare done int default 0; declare var151 decimal; declare var136 tinyint; declare cur1 cursor for select f136, f151 from tb3; declare continue handler for sqlstate '01000' set done = 1; open cur1; fetch cur1 into var136, var151; wl_loop: WHILE NOT done DO insert into t1_sp values (var136, var151); fetch cur1 into var136, var151; END WHILE wl_loop; close cur1; end// set @counter=0; select @counter; @counter 0 call trig_sp(); ERROR 02000: No data - zero rows fetched, selected, or processed select @counter; @counter 11 select count(*) from tb3; count(*) 11 select count(*) from t1_sp; count(*) 11 drop procedure trig_sp; drop trigger trg; drop table t1_sp; Testcase 3.5.11.1 (implemented in trig_perf.test) ------------------------------------------------- Testcase y.y.y.2: Check for triggers starting triggers ------------------------------------------------------ use test; drop table if exists t1; drop table if exists t2_1; drop table if exists t2_2; drop table if exists t2_3; drop table if exists t2_4; drop table if exists t3; create table t1 (f1 integer) engine=memory; create table t2_1 (f1 integer) engine=memory; create table t2_2 (f1 integer) engine=memory; create table t2_3 (f1 integer) engine=memory; create table t2_4 (f1 integer) engine=memory; create table t3 (f1 integer) engine=memory; insert into t1 values (1); create trigger tr1 after insert on t1 for each row BEGIN insert into t2_1 (f1) values (new.f1+1); insert into t2_2 (f1) values (new.f1+1); insert into t2_3 (f1) values (new.f1+1); insert into t2_4 (f1) values (new.f1+1); END// create trigger tr2_1 after insert on t2_1 for each row insert into t3 (f1) values (new.f1+10); create trigger tr2_2 after insert on t2_2 for each row insert into t3 (f1) values (new.f1+100); create trigger tr2_3 after insert on t2_3 for each row insert into t3 (f1) values (new.f1+1000); create trigger tr2_4 after insert on t2_4 for each row insert into t3 (f1) values (new.f1+10000); insert into t1 values (1); select * from t3; f1 12 102 1002 10002 drop trigger tr1; drop trigger tr2_1; drop trigger tr2_2; drop trigger tr2_3; drop trigger tr2_4; drop table t1, t2_1, t2_2, t2_3, t2_4, t3; Testcase y.y.y.3: Circular trigger reference -------------------------------------------- use test; drop table if exists t1; drop table if exists t2; drop table if exists t3; drop table if exists t4; create table t1 (f1 integer) engine = memory; create table t2 (f2 integer) engine = memory; create table t3 (f3 integer) engine = memory; create table t4 (f4 integer) engine = memory; insert into t1 values (0); create trigger tr1 after insert on t1 for each row insert into t2 (f2) values (new.f1+1); create trigger tr2 after insert on t2 for each row insert into t3 (f3) values (new.f2+1); create trigger tr3 after insert on t3 for each row insert into t4 (f4) values (new.f3+1); create trigger tr4 after insert on t4 for each row insert into t1 (f1) values (new.f4+1); 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. select * from t1; f1 0 1 select * from t2; f2 2 select * from t3; f3 3 select * from t4; f4 4 drop trigger tr1; drop trigger tr2; drop trigger tr3; drop trigger tr4; drop table t1; drop table t2; drop table t3; drop table t4; Testcase y.y.y.4: Recursive trigger/SP references (disabled bug 11889) ---------------------------------------------------------------------- set @sql_mode='traditional'; create table t1_sp ( count integer, var136 tinyint, var151 decimal) engine=memory; create procedure trig_sp() begin declare done int default 0; declare var151 decimal; declare var136 tinyint; declare cur1 cursor for select f136, f151 from tb3; declare continue handler for sqlstate '01000' set done = 1; set @counter= @counter+1; open cur1; fetch cur1 into var136, var151; wl_loop: WHILE NOT done DO insert into t1_sp values (@counter, var136, var151); fetch cur1 into var136, var151; END WHILE wl_loop; close cur1; end// create trigger trg before insert on t1_sp for each row call trig_sp(); set @counter=0; select @counter; @counter 0 call trig_sp(); ERROR HY000: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine trig_sp select @counter; @counter 1 select count(*) from tb3; count(*) 11 select count(*) from t1_sp; count(*) 0 set @@max_sp_recursion_depth= 10; set @counter=0; select @counter; @counter 0 call trig_sp(); ERROR HY000: Can't update table 't1_sp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. select @counter; @counter 2 select count(*) from tb3; count(*) 11 select count(*) from t1_sp; count(*) 0 drop procedure trig_sp; drop trigger trg; drop table t1_sp; Testcase y.y.y.5: Roleback of nested trigger references ------------------------------------------------------- set @@sql_mode='traditional'; use test; drop table if exists t1; drop table if exists t2; drop table if exists t3; drop table if exists t4; create table t1 (f1 integer) engine = memory; create table t2 (f2 integer) engine = memory; create table t3 (f3 integer) engine = memory; create table t4 (f4 tinyint) engine = memory; show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `f1` int(11) default NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 insert into t1 values (1); create trigger tr1 after insert on t1 for each row insert into t2 (f2) values (new.f1+1); create trigger tr2 after insert on t2 for each row insert into t3 (f3) values (new.f2+1); create trigger tr3 after insert on t3 for each row insert into t4 (f4) values (new.f3+1000); set autocommit=0; start transaction; insert into t1 values (1); ERROR 22003: Out of range value adjusted for column 'f4' at row 1 commit; select * from t1; f1 1 1 select * from t2; f2 2 select * from t3; f3 3 drop trigger tr1; drop trigger tr2; drop trigger tr3; drop table t1; drop table t2; drop table t3; drop table t4; DROP TABLE test.tb3;