SET @@session.sql_mode = 'NO_ENGINE_SUBSTITUTION'; 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 = ; 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 Testcase: 3.5: -------------- create User test_general@localhost; set password for test_general@localhost = password('PWD'); revoke ALL PRIVILEGES, GRANT OPTION FROM test_general@localhost; create User test_super@localhost; set password for test_super@localhost = password('PWD'); grant ALL on *.* to test_super@localhost with grant OPTION; Testcase 3.5.8.1: (implied in previous tests) --------------------------------------------- Testcase 3.5.8.2: (implied in previous tests) --------------------------------------------- Testcase 3.5.8.3/4: ------------------- create database db_test; grant SELECT, INSERT, UPDATE, DELETE on db_test.* to test_general; grant LOCK TABLES on db_test.* to test_general; Use db_test; create table t1_i ( i120 char ascii not null DEFAULT b'101', i136 smallint zerofill not null DEFAULT 999, i144 int zerofill not null DEFAULT 99999, i163 decimal (63,30)) engine=; create table t1_u ( u120 char ascii not null DEFAULT b'101', u136 smallint zerofill not null DEFAULT 999, u144 int zerofill not null DEFAULT 99999, u163 decimal (63,30)) engine=; create table t1_d ( d120 char ascii not null DEFAULT b'101', d136 smallint zerofill not null DEFAULT 999, d144 int zerofill not null DEFAULT 99999, d163 decimal (63,30)) engine=; Insert into t1_u values ('a',111,99999,999.99); Insert into t1_u values ('b',222,99999,999.99); Insert into t1_u values ('c',333,99999,999.99); Insert into t1_u values ('d',222,99999,999.99); Insert into t1_u values ('e',222,99999,999.99); Insert into t1_u values ('f',333,99999,999.99); Insert into t1_d values ('a',111,99999,999.99); Insert into t1_d values ('b',222,99999,999.99); Insert into t1_d values ('c',333,99999,999.99); Insert into t1_d values ('d',444,99999,999.99); Insert into t1_d values ('e',222,99999,999.99); Insert into t1_d values ('f',222,99999,999.99); 3.5.8.4 - multiple SQL ---------------------- use test; Create trigger trg1 AFTER INSERT on tb3 for each row BEGIN insert into db_test.t1_i values (new.f120, new.f136, new.f144, new.f163); update db_test.t1_u set u144=new.f144, u163=new.f163 where u136=new.f136; delete from db_test.t1_d where d136= new.f136; select sum(db_test.t1_u.u163) into @test_var from db_test.t1_u where u136= new.f136; END// Use test; set @test_var=0; Insert into tb3 (f120, f122, f136, f144, f163) values ('1', 'Test 3.5.8.4', 222, 23456, 1.05); Select f120, f122, f136, f144, f163 from tb3 where f122= 'Test 3.5.8.4'; f120 f122 f136 f144 f163 1 Test 3.5.8.4 00222 0000023456 1.050000000000000000000000000000 select * from db_test.t1_i; i120 i136 i144 i163 1 00222 0000023456 1.050000000000000000000000000000 select * from db_test.t1_u; u120 u136 u144 u163 a 00111 0000099999 999.990000000000000000000000000000 b 00222 0000023456 1.050000000000000000000000000000 c 00333 0000099999 999.990000000000000000000000000000 d 00222 0000023456 1.050000000000000000000000000000 e 00222 0000023456 1.050000000000000000000000000000 f 00333 0000099999 999.990000000000000000000000000000 select * from db_test.t1_d; d120 d136 d144 d163 a 00111 0000099999 999.990000000000000000000000000000 c 00333 0000099999 999.990000000000000000000000000000 d 00444 0000099999 999.990000000000000000000000000000 select @test_var; @test_var 3.150000000000000000000000000000 3.5.8.4 - single SQL - insert ----------------------------- Create trigger trg2 BEFORE UPDATE on tb3 for each row BEGIN insert into db_test.t1_i values (new.f120, new.f136, new.f144, new.f163); END// Select f120, f122, f136, f144, f163 from tb3 where f122 like 'Test 3.5.8.4%'; f120 f122 f136 f144 f163 1 Test 3.5.8.4 00222 0000023456 1.050000000000000000000000000000 select * from db_test.t1_i order by i120; i120 i136 i144 i163 1 00222 0000023456 1.050000000000000000000000000000 update tb3 set f120='I', f122='Test 3.5.8.4-Single Insert' where f122='Test 3.5.8.4'; Select f120, f122, f136, f144, f163 from tb3 where f122 like 'Test 3.5.8.4%'; f120 f122 f136 f144 f163 I Test 3.5.8.4-Single Insert 00222 0000023456 1.050000000000000000000000000000 select * from db_test.t1_i order by i120; i120 i136 i144 i163 1 00222 0000023456 1.050000000000000000000000000000 I 00222 0000023456 1.050000000000000000000000000000 3.5.8.4 - single SQL - update ----------------------------- drop trigger trg2; Create trigger trg3 BEFORE UPDATE on tb3 for each row update db_test.t1_u set u120=new.f120 where u136=new.f136; update tb3 set f120='U', f122='Test 3.5.8.4-Single Update' where f122='Test 3.5.8.4-Single Insert'; Select f120, f122, f136, f144, f163 from tb3 where f122 like 'Test 3.5.8.4%'; f120 f122 f136 f144 f163 U Test 3.5.8.4-Single Update 00222 0000023456 1.050000000000000000000000000000 select * from db_test.t1_u order by u120; u120 u136 u144 u163 a 00111 0000099999 999.990000000000000000000000000000 c 00333 0000099999 999.990000000000000000000000000000 f 00333 0000099999 999.990000000000000000000000000000 U 00222 0000023456 1.050000000000000000000000000000 U 00222 0000023456 1.050000000000000000000000000000 U 00222 0000023456 1.050000000000000000000000000000 3.5.8.3/4 - single SQL - delete ------------------------------- drop trigger trg3; Create trigger trg4 AFTER UPDATE on tb3 for each row delete from db_test.t1_d where d136= new.f136; update tb3 set f120='D', f136=444, f122='Test 3.5.8.4-Single Delete' where f122='Test 3.5.8.4-Single Update'; Select f120, f122, f136, f144, f163 from tb3 where f122 like 'Test 3.5.8.4%'; f120 f122 f136 f144 f163 D Test 3.5.8.4-Single Delete 00444 0000023456 1.050000000000000000000000000000 select * from db_test.t1_d order by d120; d120 d136 d144 d163 a 00111 0000099999 999.990000000000000000000000000000 c 00333 0000099999 999.990000000000000000000000000000 3.5.8.3/4 - single SQL - select ------------------------------- drop trigger trg4; Create trigger trg5 AFTER UPDATE on tb3 for each row select sum(db_test.t1_u.u163) into @test_var from db_test.t1_u where u136= new.f136; set @test_var=0; update tb3 set f120='S', f136=111, f122='Test 3.5.8.4-Single Select' where f122='Test 3.5.8.4-Single Delete'; Select f120, f122, f136, f144, f163 from tb3 where f122 like 'Test 3.5.8.4%'; f120 f122 f136 f144 f163 S Test 3.5.8.4-Single Select 00111 0000023456 1.050000000000000000000000000000 select @test_var; @test_var 999.990000000000000000000000000000 drop trigger trg1; drop trigger trg5; drop database if exists db_test; delete from tb3 where f122 like 'Test 3.5.8.4%'; revoke ALL PRIVILEGES, GRANT OPTION FROM 'test_general'@'localhost'; Testcase 3.5.8.5 (IF): ---------------------- create trigger trg2 before insert on tb3 for each row BEGIN IF new.f120='1' then set @test_var='one', new.f120='2'; ELSEIF new.f120='2' then set @test_var='two', new.f120='3'; ELSEIF new.f120='3' then set @test_var='three', new.f120='4'; END IF; IF (new.f120='4') and (new.f136=10) then set @test_var2='2nd if', new.f120='d'; ELSE set @test_var2='2nd else', new.f120='D'; END IF; END// set @test_var='Empty', @test_var2=0; Insert into tb3 (f120, f122, f136) values ('1', 'Test 3.5.8.5-if', 101); select f120, f122, f136, @test_var, @test_var2 from tb3 where f122 = 'Test 3.5.8.5-if' order by f136; f120 f122 f136 @test_var @test_var2 D Test 3.5.8.5-if 00101 one 2nd else Insert into tb3 (f120, f122, f136) values ('2', 'Test 3.5.8.5-if', 102); select f120, f122, f136, @test_var, @test_var2 from tb3 where f122 = 'Test 3.5.8.5-if' order by f136; f120 f122 f136 @test_var @test_var2 D Test 3.5.8.5-if 00101 two 2nd else D Test 3.5.8.5-if 00102 two 2nd else Insert into tb3 (f120, f122, f136) values ('3', 'Test 3.5.8.5-if', 10); select f120, f122, f136, @test_var, @test_var2 from tb3 where f122 = 'Test 3.5.8.5-if' order by f136; f120 f122 f136 @test_var @test_var2 d Test 3.5.8.5-if 00010 three 2nd if D Test 3.5.8.5-if 00101 three 2nd if D Test 3.5.8.5-if 00102 three 2nd if Insert into tb3 (f120, f122, f136) values ('3', 'Test 3.5.8.5-if', 103); select f120, f122, f136, @test_var, @test_var2 from tb3 where f122 = 'Test 3.5.8.5-if' order by f136; f120 f122 f136 @test_var @test_var2 d Test 3.5.8.5-if 00010 three 2nd else D Test 3.5.8.5-if 00101 three 2nd else D Test 3.5.8.5-if 00102 three 2nd else D Test 3.5.8.5-if 00103 three 2nd else create trigger trg3 before update on tb3 for each row BEGIN ELSEIF new.f120='2' then END IF; END// 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 'ELSEIF new.f120='2' then END IF; END' at line 3 drop trigger trg3// create trigger trg4 before update on tb3 for each row BEGIN IF (new.f120='4') and (new.f136=10) then set @test_var2='2nd if', new.f120='d'; ELSE set @test_var2='2nd else', new.f120='D'; END// 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 '' at line 7 drop trigger trg4; drop trigger trg2; delete from tb3 where f121='Test 3.5.8.5-if'; Testcase 3.5.8.5-case: ---------------------- create trigger trg3 before insert on tb3 for each row BEGIN SET new.f120=char(ascii(new.f120)-32); CASE when new.f136<100 then set new.f136=new.f136+120; when new.f136<10 then set new.f144=777; when new.f136>100 then set new.f120=new.f136-1; END case; CASE when new.f136=200 then set @test_var=CONCAT(new.f120, '='); ELSE set @test_var=concat(new.f120, '*'); END case; CASE new.f144 when 1 then set @test_var=concat(@test_var, 'one'); when 2 then set @test_var=concat(@test_var, 'two'); when 3 then set @test_var=concat(@test_var, 'three'); when 4 then set @test_var=concat(@test_var, 'four'); when 5 then set @test_var=concat(@test_var, 'five'); when 6 then set @test_var=concat(@test_var, 'six'); when 7 then set @test_var=concat(@test_var, 'seven'); when 8 then set @test_var=concat(@test_var, 'eight'); when 9 then set @test_var=concat(@test_var, 'nine'); when 10 then set @test_var=concat(@test_var, 'ten'); when 11 then set @test_var=concat(@test_var, 'eleven'); when 12 then set @test_var=concat(@test_var, 'twelve'); when 13 then set @test_var=concat(@test_var, 'thirteen'); when 14 then set @test_var=concat(@test_var, 'fourteen'); when 15 then set @test_var=concat(@test_var, 'fifteen'); ELSE set @test_var=CONCAT(new.f120, '*', new.f144); END case; END// set @test_var='Empty'; Insert into tb3 (f120, f122, f136, f144) values ('a', 'Test 3.5.8.5-case', 5, 7); select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var A Test 3.5.8.5-case 00125 0000000007 A*seven Insert into tb3 (f120, f122, f136, f144) values ('b', 'Test 3.5.8.5-case', 71,16); select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var A Test 3.5.8.5-case 00125 0000000007 B*0000000016 B Test 3.5.8.5-case 00191 0000000016 B*0000000016 Insert into tb3 (f120, f122, f136, f144) values ('c', 'Test 3.5.8.5-case', 80,1); select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var A Test 3.5.8.5-case 00125 0000000007 C=one B Test 3.5.8.5-case 00191 0000000016 C=one C Test 3.5.8.5-case 00200 0000000001 C=one Insert into tb3 (f120, f122, f136) values ('d', 'Test 3.5.8.5-case', 152); Warnings: Warning 1265 Data truncated for column 'f120' at row 1 select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var 1 Test 3.5.8.5-case 00152 0000099999 1*0000099999 A Test 3.5.8.5-case 00125 0000000007 1*0000099999 B Test 3.5.8.5-case 00191 0000000016 1*0000099999 C Test 3.5.8.5-case 00200 0000000001 1*0000099999 Insert into tb3 (f120, f122, f136, f144) values ('e', 'Test 3.5.8.5-case', 200, 8); Warnings: Warning 1265 Data truncated for column 'f120' at row 1 select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var 1 Test 3.5.8.5-case 00152 0000099999 1=eight 1 Test 3.5.8.5-case 00200 0000000008 1=eight A Test 3.5.8.5-case 00125 0000000007 1=eight B Test 3.5.8.5-case 00191 0000000016 1=eight C Test 3.5.8.5-case 00200 0000000001 1=eight Insert into tb3 (f120, f122, f136, f144) values ('f', 'Test 3.5.8.5-case', 100, 8); select f120, f122, f136, f144, @test_var from tb3 where f122 = 'Test 3.5.8.5-case' order by f120,f136; f120 f122 f136 f144 @test_var 1 Test 3.5.8.5-case 00152 0000099999 1=eight 1 Test 3.5.8.5-case 00200 0000000008 1=eight A Test 3.5.8.5-case 00125 0000000007 1=eight B Test 3.5.8.5-case 00191 0000000016 1=eight C Test 3.5.8.5-case 00200 0000000001 1=eight create trigger trg3a before update on tb3 for each row BEGIN CASE when new.f136<100 then set new.f120='p'; END// 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 '' at line 5 drop trigger trg3a; drop trigger trg3; delete from tb3 where f121='Test 3.5.8.5-case'; Testcase 3.5.8.5-loop/leave: ---------------------------- Create trigger trg4 after insert on tb3 for each row BEGIN set @counter=0, @flag='Initial'; Label1: loop if new.f136 new.f136 END REPEAT rp_label; END// set @counter1= 0, @counter2= 0; Insert into tb3 (f122, f136) values ('Test 3.5.8.5-repeat', 13); select @counter1, @counter2; @counter1 @counter2 15 8 Create trigger trg6_2 after update on tb3 for each row BEGIN REPEAT SET @counter2 = @counter2 + 1; END// 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 'END' at line 5 drop trigger trg6; delete from tb3 where f122='Test 3.5.8.5-repeat'; Testcase 3.5.8.5-while: ----------------------- Create trigger trg7 after insert on tb3 for each row wl_label: WHILE @counter1 < new.f136 DO SET @counter1 = @counter1 + 1; IF (@counter1 MOD 2 = 0) THEN ITERATE wl_label; END IF; SET @counter2 = @counter2 + 1; END WHILE wl_label// set @counter1= 0, @counter2= 0; Insert into tb3 (f122, f136) values ('Test 3.5.8.5-while', 7); select @counter1, @counter2; @counter1 @counter2 7 4 Create trigger trg7_2 after update on tb3 for each row BEGIN WHILE @counter1 < new.f136 SET @counter1 = @counter1 + 1; END// 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 'SET @counter1 = @counter1 + 1; END' at line 4 delete from tb3 where f122='Test 3.5.8.5-while'; drop trigger trg7; Testcase 3.5.8.6: (requirement void) ------------------------------------ CREATE PROCEDURE sp_01 () BEGIN set @v1=1; END// CREATE TRIGGER trg8_1 BEFORE UPDATE ON tb3 FOR EACH ROW BEGIN CALL sp_01 (); END// Insert into tb3 (f120, f122, f136) values ('6', 'Test 3.5.8.6-insert', 101); update tb3 set f120='S', f136=111, f122='Test 3.5.8.6-tr8_1' where f122='Test 3.5.8.6-insert'; select f120, f122 from tb3 where f122 like 'Test 3.5.8.6%' order by f120; f120 f122 S Test 3.5.8.6-tr8_1 DROP TRIGGER trg8_1; DROP PROCEDURE sp_01; Testcase 3.5.8.7 ---------------- Create trigger trg9_1 before update on tb3 for each row BEGIN Start transaction; Set new.f120='U'; Commit; END// ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. Create trigger trg9_2 before delete on tb3 for each row BEGIN Start transaction; Set @var2=old.f120; Rollback; END// ERROR HY000: Explicit or implicit commit is not allowed in stored function or trigger. drop user test_general@localhost; drop user test_general; drop user test_super@localhost; DROP TABLE test.tb3;