⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trigger.test

📁 开启mysql的远程连接的方法 mysql-noinstall-5.1.6-alpha-win32.zip
💻 TEST
📖 第 1 页 / 共 2 页
字号:
# We need at least 3 elements in t2 to test multi-update properlyinsert into t2 values (1), (2), (3);# Create and then break "after" triggerscreate 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;# We still should be able select data from tables.select * from t1;# The following statements changing t1 should fail, but still cause# their main effect. This is because operation on the table row is# executed before "after" trigger and its effect cannot be rolled back# when whole statement fails, because t1 is MyISAM table.--error 1054insert into t1 values (2, 1);select * from t1;--error 1054update t1 set k = 2 where i = 2;select * from t1;--error 1054delete from t1 where i = 2;select * from t1;# Should fail and insert only 1 row--error 1054load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);select * from t1;--error 1054insert into t1 select 3, 3;select * from t1;# Multi-update working on the fly, again it will update only# one row even if more matches--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i;select * from t1;# The same for multi-update via temp table--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i and k < 3;select * from t1;# Multi-delete on the fly--error 1054delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;select * from t1;# And via temporary storage--error 1054delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;select * from t1;# Prepare table for testing of REPLACE and INSERT ... ON DUPLICATE KEY UPDATEalter table t1 add primary key (i);--error 1054insert into t1 values (3, 4) on duplicate key update k= k + 10;select * from t1;--error 1054replace into t1 values (3, 3);select * from t1;# Change table in such way that REPLACE will delete rowalter table t1 add ts timestamp default now();--error 1054replace into t1 (i, k) values (3, 13);select * from t1;# Also drops all triggersdrop 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 and then break "before" triggerscreate 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;# The following statements changing t1 should fail and should not# cause any effect on table, since "before" trigger is executed # before operation on the table row.--error 1054insert into t1 values (3, 3);select * from t1;--error 1054update t1 set i = 2;select * from t1;--error 1054delete from t1;select * from t1;--error 1054load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (i, k);select * from t1;--error 1054insert into t1 select 3, 3;select * from t1;# Both types of multi-update (on the fly and via temp table)--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i;select * from t1;--error 1054update t1, t2 set k = k + 10 where t1.i = t2.i and k < 2;select * from t1;# Both types of multi-delete--error 1054delete t1, t2 from t1 straight_join t2 where t1.i = t2.i;select * from t1;--error 1054delete t2, t1 from t2 straight_join t1 where t1.i = t2.i;select * from t1;# Let us test REPLACE/INSERT ... ON DUPLICATE KEY UPDATE.# To test properly code-paths different from those that are used# in ordinary INSERT we need to drop "before insert" trigger.alter table t1 add primary key (i);drop trigger bi;--error 1054insert into t1 values (2, 4) on duplicate key update k= k + 10;select * from t1;--error 1054replace into t1 values (2, 4);select * from t1;# Change table in such way that REPLACE will delete rowalter table t1 add ts timestamp default now();--error 1054replace into t1 (i, k) values (2, 11);select * from t1;# Also drops all triggersdrop table t1, t2;# Test for bug #5893 "Triggers with dropped functions cause crashes"# Appropriate error should be reported instead of crash.# Also test for bug #11889 "Server crashes when dropping trigger# using stored routine".--disable_warningsdrop function if exists bug5893;--enable_warningscreate 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; --error 1305update t1 set col2 = 4;# This should not crash server too.drop trigger t1_bu;drop table t1;## storing and restoring parsing modes for triggers (BUG#5891)#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 with different sql_modecreate trigger t1_af after insert on t1 for each row set @a=10;insert into t1 values (0);select * from t1;select @a;--replace_column 6 #show triggers;drop table t1;# check that rigger preserve sql_mode during executionset sql_mode="traditional";create table t1 (a date);-- error 1292insert into t1 values ('2004-01-00');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;set sql_mode=default;show create table t1;--replace_column 6 #show triggers;drop table t1;# Test for bug #12280 "Triggers: crash if flush tables"# FLUSH TABLES and FLUSH PRIVILEGES should be disallowed inside# of functions and triggers.create table t1 (id int);--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGcreate trigger t1_ai after insert on t1 for each row flush tables;--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGcreate trigger t1_ai after insert on t1 for each row flush privileges;create procedure p1() flush tables;create trigger t1_ai after insert on t1 for each row call p1();--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGinsert into t1 values (0);drop procedure p1;create procedure p1() flush privileges;--error ER_STMT_NOT_ALLOWED_IN_SF_OR_TRGinsert into t1 values (0);drop procedure p1;drop table t1;# Test for bug #11973 "SELECT .. INTO var_name; in trigger cause#                      crash on update"create table t1 (id int, data int, username varchar(16));insert into t1 (id, data) values (1, 0);delimiter |;create trigger t1_whoupdated before update on t1 for each rowbegin  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|delimiter ;|update t1 set data = 1;connection addconroot1;update t1 set data = 2;connection default;drop table t1;## #11587 Trigger causes lost connection error#create table t1 (c1 int, c2 datetime);delimiter |;--error ER_SP_NO_RETSETcreate trigger tr1 before insert on t1 for each row begin   set new.c2= '2004-04-01';  select 'hello';end|delimiter ;|insert into t1 (c1) values (1),(2),(3);select * from t1;--disable_warningsdrop procedure if exists bug11587;--enable_warningsdelimiter |;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|delimiter ;|--error ER_SP_NO_RETSETinsert into t1 (c1) values (4),(5),(6);select * from t1;drop procedure bug11587;drop table t1;# Test for bug #11896 "Partial locking in case of recursive trigger# definitions". Recursion in triggers should not be allowed.# We also should not allow to change tables which are used in# statements invoking this trigger.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);# Allow SP resursion to be show that it has not influence hereset @SAVE_SP_RECURSION_LEVELS=@@max_sp_recursion_depth;set @@max_sp_recursion_depth=100;--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRGinsert into t1 values (1);set @@max_sp_recursion_depth=@SAVE_SP_RECURSION_LEVELS;select * from t1;select * from t2;drop trigger t1_ai;drop trigger t2_ai;create trigger t1_bu before update on t1  for each row insert into t1 values (2);--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRGupdate t1 set f1= 10;select * from t1;drop trigger t1_bu;create trigger t1_bu before update on t1  for each row delete from t1 where f1=new.f1;--error ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRGupdate t1 set f1= 10;select * from t1;drop trigger t1_bu;# This should work toughcreate 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;drop trigger t1_bi;drop tables t1, t2;# Tests for bug #12704 "Server crashes during trigger execution".# If we run DML statements and CREATE TRIGGER statements concurrently# it may happen that trigger will be created while DML statement is# waiting for table lock. In this case we have to reopen tables and# recalculate prelocking set.# Unfortunately these tests rely on the order in which tables are locked# by statement so they are non determenistic and are disabled.--disable_parsingcreate table t1 (id int);create table t2 (id int);create table t3 (id int);create function f1() returns int return (select max(id)+2 from t2);create view v1 as select f1() as f;# Let us check that we notice trigger at allconnection addconroot1;lock tables t2 write;connection default;send insert into t1 values ((select max(id) from t2)), (2);--sleep 1connection addconroot2;create trigger t1_trg before insert on t1 for each row set NEW.id:= 1;connection addconroot1;unlock tables;connection default;reap;select * from t1;# Check that we properly calculate new prelocking setinsert into t2 values (3);connection addconroot1;lock tables t2 write;connection default;send insert into t1 values ((select max(id) from t2)), (4);--sleep 1connection addconroot2;drop trigger t1_trg;create trigger t1_trg before insert on t1 for each row  insert into t3 values (new.id);connection addconroot1;unlock tables;connection default;reap;select * from t1;select * from t3;# We should be able to do this even if fancy views are involvedconnection addconroot1;lock tables t2 write;connection default;send insert into t1 values ((select max(f) from v1)), (6);--sleep 1connection addconroot2;drop trigger t1_trg;create trigger t1_trg before insert on t1 for each row  insert into t3 values (new.id + 100);connection addconroot1;unlock tables;connection default;reap;select * from t1;select * from t3;# This also should work for multi-update# Let us drop trigger to demonstrate that prelocking set is really# rebuiltdrop trigger t1_trg;connection addconroot1;lock tables t2 write;connection default;send update t1, t2 set t1.id=10 where t1.id=t2.id;--sleep 1connection addconroot2;create trigger t1_trg before update on t1 for each row  insert into t3 values (new.id);connection addconroot1;unlock tables;connection default;reap;select * from t1;select * from t3;# And even for multi-update converted from ordinary update thanks to viewdrop view v1;drop trigger t1_trg;create view v1 as select t1.id as id1 from t1, t2 where t1.id= t2.id;insert into t2 values (10);connection addconroot1;lock tables t2 write;connection default;send update v1 set id1= 11;--sleep 1connection addconroot2;create trigger t1_trg before update on t1 for each row  insert into t3 values (new.id + 100);connection addconroot1;unlock tables;connection default;reap;select * from t1;select * from t3;drop function f1;drop view v1;drop table t1, t2, t3;--enable_parsing## Test for bug #13399 "Crash when executing PS/SP which should activate# trigger which is now dropped". See also test for similar bug for stored# routines in sp-error.test (#12329).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();# Actually it is enough to do FLUSH TABLES instead of DROP TRIGGERdrop trigger t1_bi;# Server should not crash on these two statementsexecute stmt1;call p1();deallocate prepare stmt1;drop procedure p1;# Let us test more complex situation when we alter trigger in such way that# it uses different set of tables (or simply add new trigger).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();# Altering trigger forcing it use different set of tablesdrop trigger t1_bi;create trigger t1_bi after insert on t1 for each row insert into t3 values (new.id);# Until we implement proper mechanism for invalidation of PS/SP when table# or SP's are changed these two statements will fail with 'Table ... was# not locked' error (this mechanism should be based on the new TDC).--error 1100execute stmt1;--error 1100call p1();deallocate prepare stmt1;drop procedure p1;drop table t1, t2, t3;## BUG#13549 "Server crash with nested stored procedures".# Server should not crash when during execution of stored procedure# we have to parse trigger/function definition and this new trigger/# function has more local variables declared than invoking stored# procedure and last of these variables is used in argument of NOT# operator.#create table t1 (a int);DELIMITER //;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//DELIMITER ;//CALL p1();drop procedure p1;drop table t1;## Test for bug #14863 "Triggers: crash if create and there is no current# database". We should not crash and give proper error when database for# trigger or its table is not specified and there is no current database.#connection addconwithoutdb;--error ER_NO_DB_ERRORcreate trigger t1_bi before insert on test.t1 for each row set @a:=0;--error ER_NO_DB_ERRORcreate trigger test.t1_bi before insert on t1 for each row set @a:=0;--error ER_NO_DB_ERRORdrop trigger t1_bi;connection default;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -