trigger.test

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· TEST 代码 · 共 2,221 行 · 第 1/5 页

TEST
2,221
字号
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 ER_NO_SUCH_TABLE execute stmt1;--error ER_NO_SUCH_TABLE call 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_SUCH_TABLEcreate trigger test.t1_bi before insert on t1 for each row set @a:=0;--error ER_NO_DB_ERRORdrop trigger t1_bi;connection default;## Tests for bug #13525 "Rename table does not keep info of triggers"# and bug #17866 "Problem with renaming table with triggers with fully# qualified subject table".#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;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';rename table t1 to t2;# Trigger should work after renameinsert into t2 values (102);select @a, @b;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';# Let us check that the same works for simple ALTER TABLE ... RENAMEalter table t2 rename to t3;insert into t3 values (103);select @a, @b;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';# And for more complex ALTER TABLEalter table t3 rename to t4, add column val int default 0;insert into t4 values (104, 1);select @a, @b;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';# .TRN file should be updated with new table namedrop trigger t1_bi;drop trigger t1_ai;drop table t4;# Rename between different databases if triggers exist should failcreate 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;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';--error ER_TRG_IN_WRONG_SCHEMArename table t1 to test.t2;insert into t1 values (102);select @a;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';# There should be no fantom .TRN files --error ER_TRG_DOES_NOT_EXISTdrop trigger test.t1_bi;# Let us also check handling of this restriction in ALTER TABLE ... RENAME--error ER_TRG_IN_WRONG_SCHEMAalter table t1 rename to test.t1;insert into t1 values (103);select @a;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';# Again there should be no fantom .TRN files --error ER_TRG_DOES_NOT_EXISTdrop trigger test.t1_bi;--error ER_TRG_IN_WRONG_SCHEMAalter table t1 rename to test.t1, add column val int default 0;insert into t1 values (104);select @a;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';# Table definition should not changeshow create table t1;# And once again check for fantom .TRN files --error ER_TRG_DOES_NOT_EXISTdrop trigger test.t1_bi;drop trigger t1_bi;drop table t1;drop database mysqltest;use test;# And now let us check that the properly handle rename if there is some# error during it (that we rollback such renames completely).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;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';# Trick which makes update of second .TRN file impossiblewrite_file $MYSQLTEST_VARDIR/master-data/test/t1_ai.TRN~;dummyEOFchmod 0000 $MYSQLTEST_VARDIR/master-data/test/t1_ai.TRN~;--replace_result $MYSQLTEST_VARDIR . master-data/ ''--error 1rename table t1 to t2;# 't1' should be still there and triggers should work correctlyinsert into t1 values (102);select @a, @b;select trigger_schema, trigger_name, event_object_schema,       event_object_table, action_statement from information_schema.triggers       where event_object_schema = 'test';chmod 0600 $MYSQLTEST_VARDIR/master-data/test/t1_ai.TRN~;remove_file $MYSQLTEST_VARDIR/master-data/test/t1_ai.TRN~;# Let us check that updates to .TRN files were rolled back toodrop trigger t1_bi;drop trigger t1_ai;drop table t1;# Test for bug #16829 "Firing trigger with RETURN crashes the server"# RETURN is not supposed to be used anywhere except functions, so error# should be returned when one attempts to create trigger with RETURN.create table t1 (i int);--error ER_SP_BADRETURNcreate trigger t1_bi before insert on t1 for each row return 0;insert into t1 values (1);drop table t1;# Test for bug #17764 "Trigger crashes MyISAM table"## Table was reported as crashed when it was subject table of trigger invoked# by insert statement which was executed with enabled bulk insert mode (which# is actually set of optimizations enabled by handler::start_bulk_insert())# and this trigger also explicitly referenced it.# The same problem arose when table to which bulk insert was done was also# referenced in function called by insert statement.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_ln/words.dat' into table t1 (a);drop trigger t1_ai;drop trigger t2_ai;# Test that the problem for functions is fixed as wellcreate 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_ln/words.dat' into table t1 (a) set b:= f1();drop table t1, t2;drop function f1;drop function f2;## Test for bug #16021 "Wrong index given to function in trigger" which# was caused by the same bulk insert optimization as bug #17764 but had# slightly different symptoms (instead of reporting table as crashed# storage engine reported error number 124)#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));delimiter |;create trigger t1_ai after insert on t1 for each rowbegin  declare sn numeric(15,2);  select sum(n) into sn from t1 where i=new.i;  replace into t2 values(new.i, sn);end|delimiter ;|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;select * from t2;drop tables t1, t2;## Test for Bug #16461 connection_id() does not work properly inside trigger#--disable_warningsDROP TABLE IF EXISTS t1;--enable_warningsCREATE 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);connect (con1,localhost,root,,);INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1);connection default;disconnect con1;SELECT * FROM t1 WHERE conn_id != trigger_conn_id;DROP TRIGGER t1_bi;DROP TABLE t1;## Bug#6951: Triggers/Traditional: SET @ result wrong#--disable_warningsDROP TABLE IF EXISTS t1;--enable_warningsCREATE 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;SET @x=2;UPDATE t1 SET i1 = @x;SELECT @x;SET SQL_MODE='';SET @x=3;INSERT INTO t1 VALUES (@x);SELECT @x;SET @x=4;UPDATE t1 SET i1 = @x;SELECT @x;SET @@sql_mode=@save_sql_mode;DROP TRIGGER t1_ai;DROP TRIGGER t1_au;DROP TABLE t1;## Test for bug #14635 Accept NEW.x as INOUT parameters to stored# procedures from within triggers#--disable_warningsDROP TABLE IF EXISTS t1;DROP PROCEDURE IF EXISTS p1;DROP PROCEDURE IF EXISTS p2;--enable_warningsCREATE TABLE t1 (i1 INT);# Check that NEW.x pseudo variable is accepted as INOUT and OUT# parameter to stored routine.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;delimiter //;CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 FOR EACH ROWBEGIN  CALL p1(NEW.i1);  CALL p2(NEW.i1);END//delimiter ;//UPDATE t1 SET i1 = 11 WHERE i1 = 3;DROP TRIGGER t1_bu;DROP PROCEDURE p2;DROP PROCEDURE p1;# Check that OLD.x pseudo variable is not accepted as INOUT and OUT# parameter to stored routine.INSERT INTO t1 VALUES (13);

⌨️ 快捷键说明

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