1#====================================================================== 2# 3# Trigger Tests 4# (test case numbering refer to requirement document TP v1.1) 5#====================================================================== 6 7USE test; 8--source suite/funcs_1/include/tb3.inc 9 10# OBM - ToDo 11############ 12# 1. Performace 13############################################### 14 15--disable_abort_on_error 16 17##################################################### 18################# Section 3.5.1 ##################### 19# Syntax checks for CREATE TRIGGER and DROP TRIGGER # 20##################################################### 21 22#Section 3.5.1.1 23# Testcase: Ensure that all clauses that should be supported are supported. 24let $message= Testcase: 3.5.1.1:; 25--source include/show_msg.inc 26# OBN - This test case tests basic trigger definition and execution 27# of INSERT/UPDATE/DELETE actions and BEFORE/AFTER timings. 28# As such it covers the equirements in sections 3.5.6.1, 3.5.6.2, 29# 3.5.6.4, 3.5.6.5, 3.5.7.1, 3.5.7.2, 3.5.7.3, 3.5.7.17 below. 30# - Note currently as a result of limitations with locking tables in 31# triggers, a specifc lockingof the tables is done. 32# Once fixed, the locking and alias referances should be removed 33 34use test; 35# Trigger Definition 36 Create trigger trg1_1 BEFORE INSERT 37 on tb3 for each row set @test_before = 2, new.f142 = @test_before; 38 Create trigger trg1_2 AFTER INSERT 39 on tb3 for each row set @test_after = 6; 40 Create trigger trg1_4 BEFORE UPDATE 41 on tb3 for each row set @test_before = 27, 42 new.f142 = @test_before, 43 new.f122 = 'Before Update Trigger'; 44 Create trigger trg1_3 AFTER UPDATE 45 on tb3 for each row set @test_after = '15'; 46 Create trigger trg1_5 BEFORE DELETE on tb3 for each row 47 select count(*) into @test_before from tb3 as tr_tb3 48 where f121 = 'Test 3.5.1.1'; 49 Create trigger trg1_6 AFTER DELETE on tb3 for each row 50 select count(*) into @test_after from tb3 as tr_tb3 51 where f121 = 'Test 3.5.1.1'; 52# Trigger Execution Insert (before and after) 53 set @test_before = 1; 54 set @test_after = 5; 55 select @test_before, @test_after; 56 Insert into tb3 (f121, f122, f142, f144, f134) 57 values ('Test 3.5.1.1', 'First Row', @test_before, @test_after, 1); 58 --sorted_result 59 select f121, f122, f142, f144, f134 from tb3 where f121 = 'Test 3.5.1.1'; 60 select @test_before, @test_after; 61 62# Trigger Execution Update (before and after) 63 set @test_before = 18; 64 set @test_after = 8; 65 select @test_before, @test_after; 66 Update tb3 set tb3.f122 = 'Update', 67 tb3.f142 = @test_before, 68 tb3.f144 = @test_after 69 where tb3.f121 = 'Test 3.5.1.1'; 70 --sorted_result 71 select f121, f122, f142, f144, f134 from tb3 where f121 = 'Test 3.5.1.1'; 72 select @test_before, @test_after; 73 74# Trigger Execution Delete (before and after) 75 Insert into tb3 (f121, f122, f142, f144, f134) 76 values ('Test 3.5.1.1', 'Second Row', 5, 6, 2); 77 set @test_before = 0; 78 set @test_after = 0; 79 --sorted_result 80 select f121, f122, f142, f144, f134 from tb3 where f121 = 'Test 3.5.1.1'; 81 select @test_before, @test_after; 82 Delete from tb3 where f121 = 'Test 3.5.1.1' and f134 = 2; 83 --sorted_result 84 select f121, f122, f142, f144, f134 from tb3 where f121 = 'Test 3.5.1.1'; 85 select @test_before, @test_after; 86 87#Cleanup 88 --disable_warnings 89 --error 0, ER_TRG_DOES_NOT_EXIST 90 drop trigger trg1_1; 91 --error 0, ER_TRG_DOES_NOT_EXIST 92 drop trigger trg1_2; 93 --error 0, ER_TRG_DOES_NOT_EXIST 94 drop trigger trg1_3; 95 --error 0, ER_TRG_DOES_NOT_EXIST 96 drop trigger trg1_4; 97 --error 0, ER_TRG_DOES_NOT_EXIST 98 drop trigger trg1_5; 99 --error 0, ER_TRG_DOES_NOT_EXIST 100 drop trigger trg1_6; 101 --enable_warnings 102 delete from tb3 where f121='Test 3.5.1.1'; 103 --enable_warnings 104 105#Section 3.5.1.2 106# Testcase: Ensure that all clauses that should not be supported are disallowed 107# with an appropriate error message. 108let $message= Testcase: 3.5.1.2:; 109--source include/show_msg.inc 110 111 --error ER_PARSE_ERROR 112 Create trigger trg_1 after insert 113 on tb3 for each statement set @x= 1; 114 115#Cleanup 116 --disable_warnings 117 --error 0, ER_TRG_DOES_NOT_EXIST 118 drop trigger trg_1; 119 --enable_warnings 120 121 122#Section 3.5.1.3 123# Testcase: Ensure that all supported clauses are supported only in the correct order. 124let $message= Testcase 3.5.1.3:; 125--source include/show_msg.inc 126 --error ER_PARSE_ERROR 127 CREATE TRIGGER trg3_1 on tb3 BEFORE INSERT for each row set new.f120 = 't'; 128 129 --error ER_PARSE_ERROR 130 CREATE trg3_2 TRIGGER AFTER INSERT on tb3 for each row set new.f120 = 's'; 131 132 --error ER_PARSE_ERROR 133 CREATE TRIGGER trg3_3 Before DELETE on tb3 set @ret1 = 'test' for each row; 134 135 --error ER_PARSE_ERROR 136 CREATE TRIGGER trg3_4 DELETE AFTER on tb3 set @ret1 = 'test' for each row; 137 138 --error ER_PARSE_ERROR 139 CREATE for each row TRIGGER trg3_5 AFTER UPDATE on tb3 set @ret1 = 'test'; 140 141#Cleanup 142# OBN - Although none of the above should have been created we should do a cleanup 143# since if they have been created, not dropping them will affect following 144# tests. 145 --disable_warnings 146 --error 0, ER_TRG_DOES_NOT_EXIST 147 drop trigger trg3_1; 148 --error 0, ER_TRG_DOES_NOT_EXIST 149 drop trigger trg3_2; 150 --error 0, ER_TRG_DOES_NOT_EXIST 151 drop trigger trg3_3; 152 --error 0, ER_TRG_DOES_NOT_EXIST 153 drop trigger trg3_4; 154 --error 0, ER_TRG_DOES_NOT_EXIST 155 drop trigger trg3_5; 156 --enable_warnings 157 158 159#Section 3.5.1.4 160# Testcase: Ensure that an appropriate error message is returned if a clause 161# is out-of-order in an SQL statement. 162# OBN - FIXME - Missing 3.5.1.4 need to add 163 164#Section 3.5.1.5 165# Testcase: Ensure that all clauses that are defined to be mandatory are indeed 166# required to be mandatory by the MySQL server and tools 167let $message= Testcase: 3.5.1.5:; 168--source include/show_msg.inc 169 170 --error ER_PARSE_ERROR 171 CREATE TRIGGER trg4_1 AFTER on tb3 for each row set new.f120 = 'e'; 172 173 --error ER_PARSE_ERROR 174 CREATE TRIGGER trg4_2 INSERT on tb3 for each set row new.f120 = 'f'; 175 176 --error ER_PARSE_ERROR 177 CREATE TRIGGER trg4_3 BEFORE INSERT tb3 for each row set new.f120 = 'g'; 178 179 --error ER_PARSE_ERROR 180 CREATE TRIGGER trg4_4 AFTER UPDATE on tb3 for each set new.f120 = 'g'; 181 182 --error ER_PARSE_ERROR 183 CREATE trg4_5 AFTER DELETE on tb3 for each set new.f120 = 'g'; 184 185 --error ER_PARSE_ERROR 186 CREATE TRIGGER trg4_6 BEFORE DELETE for each row set new.f120 = 'g'; 187 188#Cleanup 189# OBN - Although none of the above should have been created we should do a cleanup 190# since if they have been created, not dropping them will affect following 191# tests. 192 --disable_warnings 193 --error 0, ER_TRG_DOES_NOT_EXIST 194 drop trigger trg4_1; 195 --error 0, ER_TRG_DOES_NOT_EXIST 196 drop trigger trg4_2; 197 --error 0, ER_TRG_DOES_NOT_EXIST 198 drop trigger trg4_3; 199 --error 0, ER_TRG_DOES_NOT_EXIST 200 drop trigger trg4_4; 201 --error 0, ER_TRG_DOES_NOT_EXIST 202 drop trigger trg4_5; 203 --error 0, ER_TRG_DOES_NOT_EXIST 204 drop trigger trg4_6; 205 --enable_warnings 206 207#Section 3.5.1.6 208# Testcase: Ensure that any clauses that are defined to be optional are indeed 209# trated as optional by MySQL server and tools 210let $message= Testcase 3.5.1.6: - Need to fix; 211--source include/show_msg.inc 212# OBN - FIXME - Missing 3.5.1.6 need to add 213 214#Section 3.5.1.7 215# Testcase: Ensure that all valid, fully-qualified, and non-qualified, 216# trigger names are accepted, at creation time. 217let $message= Testcase 3.5.1.7: - need to fix; 218--source include/show_msg.inc 219 220 drop table if exists t1; 221 --replace_result $engine_type <engine_to_be_used> 222 eval create table t1 (f1 int, f2 char(25),f3 int) engine = $engine_type; 223 CREATE TRIGGER trg5_1 BEFORE INSERT on test.t1 224 for each row set new.f3 = '14'; 225# In 5.0 names to long (more than 64 chars) were trimed without an error 226# In 5.1 an error is returned. So adding a call with the expected error 227# and one with a shorter name to validate proper execution 228 --error ER_TOO_LONG_IDENT 229 CREATE TRIGGER trg_abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ 230 BEFORE UPDATE on test.t1 for each row set new.f3 = '42'; 231 CREATE TRIGGER trg_abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWX 232 BEFORE UPDATE on test.t1 for each row set new.f3 = '42'; 233 234 insert into t1 (f2) values ('insert 3.5.1.7'); 235 select * from t1; 236 update t1 set f2='update 3.5.1.7'; 237 select * from t1; 238 select trigger_name from information_schema.triggers where trigger_schema != 'sys' order by trigger_name; 239 240#Cleanup 241 --disable_warnings 242 --error 0, ER_TRG_DOES_NOT_EXIST 243 drop trigger trg5_1; 244 # In 5.1 the long name should generate an error that is to long 245 --error ER_TOO_LONG_IDENT 246 drop trigger trg_abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ; 247 drop trigger trg_abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWX; 248 drop table t1; 249 250#Section 3.5.1.8 251# Testcase: Ensure that any invalid trigger name is never accepted, and that an 252# appropriate error message is returned when the name is rejected. 253let $message= Testcase 3.5.1.8:; 254--source include/show_msg.inc 255 256 --error ER_PARSE_ERROR 257 CREATE TRIGGER trg12* before insert on tb3 for each row set new.f120 = 't'; 258 259 --error ER_PARSE_ERROR 260 CREATE TRIGGER trigger before insert on tb3 for each row set new.f120 = 't'; 261 262 --error ER_PARSE_ERROR 263 CREATE TRIGGER 100 before insert on tb3 for each row set new.f120 = 't'; 264 265 --error ER_PARSE_ERROR 266 CREATE TRIGGER @@view before insert on tb3 for each row set new.f120 = 't'; 267 268 --error ER_PARSE_ERROR 269 CREATE TRIGGER @name before insert on tb3 for each row set new.f120 = 't'; 270 271 --error ER_TRG_IN_WRONG_SCHEMA 272 CREATE TRIGGER tb3.trg6_1 BEFORE INSERT on test.tb3 273 for each row set new.f120 ='X'; 274 275 --disable_warnings 276 drop database if exists trig_db; 277 --enable_warnings 278 create database trig_db; 279 use trig_db; 280 --replace_result $engine_type <engine_to_be_used> 281 eval create table t1 (f1 integer) engine = $engine_type; 282 283 # Can't create a trigger in a different database 284 use test; 285 --error ER_NO_SUCH_TABLE 286 CREATE TRIGGER trig_db.trg6_2 AFTER INSERT on tb3 287 for each row set @ret_trg6_2 = 5; 288 289 # Can't create a trigger refrencing a table in a different db 290 use trig_db; 291 --error ER_TRG_IN_WRONG_SCHEMA 292 CREATE TRIGGER trg6_3 AFTER INSERT on test.tb3 293 for each row set @ret_trg6_3 = 18; 294 295 use test; 296 297#Cleanup 298 --disable_warnings 299 drop database trig_db; 300# OBN - Although none of the above should have been created we should do a cleanup 301# since if they have been created, not dropping them will affect following 302# tests. 303 --error 0, ER_TRG_DOES_NOT_EXIST 304 drop trigger trg6_1; 305 --error 0, ER_TRG_DOES_NOT_EXIST 306 drop trigger trg6_3; 307 --enable_warnings 308 309#Section 3.5.1.9 310#Testcase: Ensure that a reference to a non-existent trigger is rejected with 311# an appropriate error message. 312let $message= Testcase 3.5.1.9:(cannot be inplemented at this point); 313--source include/show_msg.inc 314 315 316#Section 3.5.1.10 317#Testcase: Ensure that it is not possible to create two triggers with the same name on 318# the same table 319let $message= Testcase 3.5.1.10:; 320--source include/show_msg.inc 321 322 CREATE TRIGGER trg7_1 BEFORE UPDATE on tb3 for each row set new.f120 ='X'; 323 324 --error ER_TRG_ALREADY_EXISTS 325 CREATE TRIGGER trg7_1 AFTER INSERT on tb3 for each row set @x ='Y'; 326 327#Cleanup 328 --disable_warnings 329 --error 0, ER_TRG_DOES_NOT_EXIST 330 drop trigger trg7_1; 331 --enable_warnings 332 333 334#Section 3.5.1.? 335# Testcase: Ensure that it is not possible to create two or more triggers with 336# the same name, provided each is associated with a different table. 337let $message= Testcase 3.5.1.?:; 338--source include/show_msg.inc 339 340 --disable_warnings 341 drop table if exists t1; 342 drop table if exists t2; 343 --enable_warnings 344 --replace_result $engine_type <engine_to_be_used> 345 eval create table t1 (f1 char(50), f2 integer) engine = $engine_type; 346 --replace_result $engine_type <engine_to_be_used> 347 eval create table t2 (f1 char(50), f2 integer) engine = $engine_type; 348 349 create trigger trig before insert on t1 350 for each row set new.f1 ='trig t1'; 351 352 --error ER_TRG_ALREADY_EXISTS 353 create trigger trig before update on t2 354 for each row set new.f1 ='trig t2'; 355 356 insert into t1 value ('insert to t1',1); 357 select * from t1; 358 update t1 set f1='update to t1'; 359 select * from t1; 360 insert into t2 value ('insert to t2',2); 361 update t2 set f1='update to t1'; 362 select * from t2; 363 364#Cleanup 365 --disable_warnings 366 drop table t1; 367 drop table t2; 368 --error 0, ER_TRG_DOES_NOT_EXIST 369 drop trigger trig; 370 --enable_warnings 371 372 373#Section 3.5.1.11 374# Testcase: Ensure that it is possible to create two or more triggers with 375# the same name, provided each resides in a different database 376let $message= Testcase 3.5.1.11:; 377--source include/show_msg.inc 378 379 --disable_warnings 380 drop database if exists trig_db1; 381 drop database if exists trig_db2; 382 drop database if exists trig_db3; 383 --enable_warnings 384 create database trig_db1; 385 create database trig_db2; 386 create database trig_db3; 387 use trig_db1; 388 --replace_result $engine_type <engine_to_be_used> 389 eval create table t1 (f1 char(50), f2 integer) engine = $engine_type; 390 create trigger trig before insert on t1 391 for each row set new.f1 ='trig1', @test_var1='trig1'; 392 use trig_db2; 393 --replace_result $engine_type <engine_to_be_used> 394 eval create table t2 (f1 char(50), f2 integer) engine = $engine_type; 395 create trigger trig before insert on t2 396 for each row set new.f1 ='trig2', @test_var2='trig2'; 397 use trig_db3; 398 --replace_result $engine_type <engine_to_be_used> 399 eval create table t1 (f1 char(50), f2 integer) engine = $engine_type; 400 create trigger trig before insert on t1 401 for each row set new.f1 ='trig3', @test_var3='trig3'; 402 403 set @test_var1= '', @test_var2= '', @test_var3= ''; 404 use trig_db1; 405 insert into t1 (f1,f2) values ('insert to db1 t1',1); 406 insert into trig_db1.t1 (f1,f2) values ('insert to db1 t1 from db1',2); 407 insert into trig_db2.t2 (f1,f2) values ('insert to db2 t2 from db1',3); 408 insert into trig_db3.t1 (f1,f2) values ('insert to db3 t1 from db1',4); 409 select @test_var1, @test_var2, @test_var3; 410 select * from t1 order by f2; 411 select * from trig_db2.t2; 412 select * from trig_db3.t1; 413 select * from t1 order by f2; 414 use test; 415 416#Cleanup 417 --disable_warnings 418 drop database trig_db1; 419 drop database trig_db2; 420 drop database trig_db3; 421 --enable_warnings 422 423########################################### 424################ Section 3.5.2 ############ 425# Check for the global nature of Triggers # 426########################################### 427 428#Section 3.5.2.1 429# Test case: Ensure that if a trigger created without a qualifying database 430# name belongs to the database in use at creation time. 431#Section 3.5.2.2 432# Test case: Ensure that if a trigger created with a qualifying database name 433# belongs to the database specified. 434#Section 3.5.2.3 435# Test case: Ensure that if a trigger created with a qualifying database name 436# does not belong to the database in use at creation time unless 437# the qualifying database name identifies the database that is 438# also in use at creation time. 439let $message= Testcase 3.5.2.1/2/3:; 440--source include/show_msg.inc 441 442 443 --disable_warnings 444 drop database if exists trig_db1; 445 drop database if exists trig_db2; 446 --enable_warnings 447 create database trig_db1; 448 create database trig_db2; 449 use trig_db1; 450 --replace_result $engine_type <engine_to_be_used> 451 eval create table t1 (f1 char(50), f2 integer) engine = $engine_type; 452 --replace_result $engine_type <engine_to_be_used> 453 eval create table trig_db2.t1 (f1 char(50), f2 integer) engine = $engine_type; 454 create trigger trig1_b before insert on t1 455 for each row set @test_var1='trig1_b'; 456 create trigger trig_db1.trig1_a after insert on t1 457 for each row set @test_var2='trig1_a'; 458 create trigger trig_db2.trig2 before insert on trig_db2.t1 459 for each row set @test_var3='trig2'; 460 select trigger_schema, trigger_name, event_object_table 461 from information_schema.triggers 462 where trigger_schema like 'trig_db%' 463 order by trigger_name; 464 465 set @test_var1= '', @test_var2= '', @test_var3= ''; 466 insert into t1 (f1,f2) values ('insert to db1 t1 from db1',352); 467 insert into trig_db2.t1 (f1,f2) values ('insert to db2 t1 from db1',352); 468 select @test_var1, @test_var2, @test_var3; 469 470#Cleanup 471 --disable_warnings 472 drop database trig_db1; 473 drop database trig_db2; 474DROP TABLE test.tb3; 475