Loading mysql-test/r/sp-error.result +16 −0 Original line number Diff line number Diff line Loading @@ -705,3 +705,19 @@ end| call bug11394(2, 1)| ERROR HY000: Recursive stored routines are not allowed. drop procedure bug11394| drop function if exists bug11834_1; drop function if exists bug11834_2; create function bug11834_1() returns int return 10; create function bug11834_2() returns int return bug11834_1(); prepare stmt from "select bug11834_2()"; execute stmt; bug11834_2() 10 execute stmt; bug11834_2() 10 drop function bug11834_1; execute stmt; ERROR 42000: FUNCTION test.bug11834_1 does not exist deallocate prepare stmt; drop function bug11834_2; mysql-test/r/sp.result +1 −1 Original line number Diff line number Diff line Loading @@ -1088,7 +1088,7 @@ a select * from v1| a 3 select * from v1, v2| select * from v1, t1| ERROR HY000: Table 't1' was not locked with LOCK TABLES select f4()| ERROR HY000: Table 't2' was not locked with LOCK TABLES Loading mysql-test/r/trigger.result +92 −10 Original line number Diff line number Diff line drop table if exists t1, t2; drop table if exists t1, t2, t3; drop view if exists v1; drop database if exists mysqltest; drop function if exists f1; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; set @a:=0; Loading Loading @@ -182,6 +183,96 @@ select @log; @log (BEFORE_INSERT: new=(id=1, data=5))(BEFORE_UPDATE: old=(id=1, data=4) new=(id=1, data=6))(AFTER_UPDATE: old=(id=1, data=4) new=(id=1, data=6))(BEFORE_INSERT: new=(id=3, data=3))(AFTER_INSERT: new=(id=3, data=3)) drop table t1; create table t1 (id int primary key, data varchar(10), fk int); create table t2 (event varchar(100)); create table t3 (id int primary key); create trigger t1_ai after insert on t1 for each row insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "'")); insert into t1 (id, data) values (1, "one"), (2, "two"); select * from t1; id data fk 1 one NULL 2 two NULL select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' drop trigger t1.t1_ai; create trigger t1_bi before insert on t1 for each row begin if exists (select id from t3 where id=new.fk) then insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "' fk=", new.fk)); else insert into t2 values (concat("INSERT INTO t1 FAILED id=", new.id, " data='", new.data, "' fk=", new.fk)); set new.id= NULL; end if; end| insert into t3 values (1); insert into t1 values (4, "four", 1), (5, "five", 2); ERROR 23000: Column 'id' cannot be null select * from t1; id data fk 1 one NULL 2 two NULL 4 four 1 select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' INSERT INTO t1 id=4 data='four' fk=1 INSERT INTO t1 FAILED id=5 data='five' fk=2 drop table t1, t2, t3; create table t1 (id int primary key, data varchar(10)); create table t2 (seq int); insert into t2 values (10); create function f1 () returns int return (select max(seq) from t2); create trigger t1_bi before insert on t1 for each row begin if new.id > f1() then set new.id:= f1(); end if; end| select f1(); f1() 10 insert into t1 values (1, "first"); insert into t1 values (f1(), "max"); select * from t1; id data 1 first 10 max drop table t1, t2; drop function f1; create table t1 (id int primary key, fk_t2 int); create table t2 (id int primary key, fk_t3 int); create table t3 (id int primary key); insert into t1 values (1,1), (2,1), (3,2); insert into t2 values (1,1), (2,2); insert into t3 values (1), (2); create trigger t3_ad after delete on t3 for each row delete from t2 where fk_t3=old.id; create trigger t2_ad after delete on t2 for each row delete from t1 where fk_t2=old.id; delete from t3 where id = 1; select * from t1 left join (t2 left join t3 on t2.fk_t3 = t3.id) on t1.fk_t2 = t2.id; id fk_t2 id fk_t3 id 3 2 2 2 2 drop table t1, t2, t3; create table t1 (id int primary key, copy int); create table t2 (id int primary key, data int); insert into t2 values (1,1), (2,2); create trigger t1_bi before insert on t1 for each row set new.copy= (select data from t2 where id = new.id); create trigger t1_bu before update on t1 for each row set new.copy= (select data from t2 where id = new.id); insert into t1 values (1,3), (2,4), (3,3); update t1 set copy= 1 where id = 2; select * from t1; id copy 1 1 2 2 3 NULL drop table t1, t2; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:= old.i; ERROR HY000: There is no OLD row in on INSERT trigger Loading Loading @@ -482,12 +573,3 @@ i k ts 1 1 0000-00-00 00:00:00 2 2 0000-00-00 00:00:00 drop table t1, t2; drop function if exists bug5893; create 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; update t1 set col2 = 4; ERROR 42000: FUNCTION test.bug5893 does not exist drop table t1; mysql-test/t/sp-error.test +24 −1 Original line number Diff line number Diff line Loading @@ -1025,4 +1025,27 @@ end| --error 1424 call bug11394(2, 1)| drop procedure bug11394| delimiter |; delimiter ;| # # Bug#11834 "Re-execution of prepared statement with dropped function # crashes server". Also tests handling of prepared stmts which use # stored functions but does not require prelocking. # --disable_warnings drop function if exists bug11834_1; drop function if exists bug11834_2; --enable_warnings create function bug11834_1() returns int return 10; create function bug11834_2() returns int return bug11834_1(); prepare stmt from "select bug11834_2()"; execute stmt; # Re-execution of statement should not crash server. execute stmt; drop function bug11834_1; # Attempt to execute statement should return proper error and # should not crash server. --error ER_SP_DOES_NOT_EXIST execute stmt; deallocate prepare stmt; drop function bug11834_2; mysql-test/t/sp.test +3 −5 Original line number Diff line number Diff line Loading @@ -1283,7 +1283,8 @@ select * from v1| # views and functions ? create function f1() returns int return (select sum(data) from t1) + (select sum(data) from v1)| # FIXME All these just exceed file limit for me :) # This queries will crash server because we can't use LEX in # reenterable fashion yet. Patch disabling recursion will heal this. #select f1()| #select * from v1| #select * from v2| Loading Loading @@ -1328,15 +1329,12 @@ select * from v2| select * from v1| # These should not work as we have too little instances of tables locked --error 1100 select * from v1, v2| select * from v1, t1| --error 1100 select f4()| unlock tables| # TODO We also should test integration with triggers # Cleanup drop function f0| drop function f1| Loading Loading
mysql-test/r/sp-error.result +16 −0 Original line number Diff line number Diff line Loading @@ -705,3 +705,19 @@ end| call bug11394(2, 1)| ERROR HY000: Recursive stored routines are not allowed. drop procedure bug11394| drop function if exists bug11834_1; drop function if exists bug11834_2; create function bug11834_1() returns int return 10; create function bug11834_2() returns int return bug11834_1(); prepare stmt from "select bug11834_2()"; execute stmt; bug11834_2() 10 execute stmt; bug11834_2() 10 drop function bug11834_1; execute stmt; ERROR 42000: FUNCTION test.bug11834_1 does not exist deallocate prepare stmt; drop function bug11834_2;
mysql-test/r/sp.result +1 −1 Original line number Diff line number Diff line Loading @@ -1088,7 +1088,7 @@ a select * from v1| a 3 select * from v1, v2| select * from v1, t1| ERROR HY000: Table 't1' was not locked with LOCK TABLES select f4()| ERROR HY000: Table 't2' was not locked with LOCK TABLES Loading
mysql-test/r/trigger.result +92 −10 Original line number Diff line number Diff line drop table if exists t1, t2; drop table if exists t1, t2, t3; drop view if exists v1; drop database if exists mysqltest; drop function if exists f1; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; set @a:=0; Loading Loading @@ -182,6 +183,96 @@ select @log; @log (BEFORE_INSERT: new=(id=1, data=5))(BEFORE_UPDATE: old=(id=1, data=4) new=(id=1, data=6))(AFTER_UPDATE: old=(id=1, data=4) new=(id=1, data=6))(BEFORE_INSERT: new=(id=3, data=3))(AFTER_INSERT: new=(id=3, data=3)) drop table t1; create table t1 (id int primary key, data varchar(10), fk int); create table t2 (event varchar(100)); create table t3 (id int primary key); create trigger t1_ai after insert on t1 for each row insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "'")); insert into t1 (id, data) values (1, "one"), (2, "two"); select * from t1; id data fk 1 one NULL 2 two NULL select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' drop trigger t1.t1_ai; create trigger t1_bi before insert on t1 for each row begin if exists (select id from t3 where id=new.fk) then insert into t2 values (concat("INSERT INTO t1 id=", new.id, " data='", new.data, "' fk=", new.fk)); else insert into t2 values (concat("INSERT INTO t1 FAILED id=", new.id, " data='", new.data, "' fk=", new.fk)); set new.id= NULL; end if; end| insert into t3 values (1); insert into t1 values (4, "four", 1), (5, "five", 2); ERROR 23000: Column 'id' cannot be null select * from t1; id data fk 1 one NULL 2 two NULL 4 four 1 select * from t2; event INSERT INTO t1 id=1 data='one' INSERT INTO t1 id=2 data='two' INSERT INTO t1 id=4 data='four' fk=1 INSERT INTO t1 FAILED id=5 data='five' fk=2 drop table t1, t2, t3; create table t1 (id int primary key, data varchar(10)); create table t2 (seq int); insert into t2 values (10); create function f1 () returns int return (select max(seq) from t2); create trigger t1_bi before insert on t1 for each row begin if new.id > f1() then set new.id:= f1(); end if; end| select f1(); f1() 10 insert into t1 values (1, "first"); insert into t1 values (f1(), "max"); select * from t1; id data 1 first 10 max drop table t1, t2; drop function f1; create table t1 (id int primary key, fk_t2 int); create table t2 (id int primary key, fk_t3 int); create table t3 (id int primary key); insert into t1 values (1,1), (2,1), (3,2); insert into t2 values (1,1), (2,2); insert into t3 values (1), (2); create trigger t3_ad after delete on t3 for each row delete from t2 where fk_t3=old.id; create trigger t2_ad after delete on t2 for each row delete from t1 where fk_t2=old.id; delete from t3 where id = 1; select * from t1 left join (t2 left join t3 on t2.fk_t3 = t3.id) on t1.fk_t2 = t2.id; id fk_t2 id fk_t3 id 3 2 2 2 2 drop table t1, t2, t3; create table t1 (id int primary key, copy int); create table t2 (id int primary key, data int); insert into t2 values (1,1), (2,2); create trigger t1_bi before insert on t1 for each row set new.copy= (select data from t2 where id = new.id); create trigger t1_bu before update on t1 for each row set new.copy= (select data from t2 where id = new.id); insert into t1 values (1,3), (2,4), (3,3); update t1 set copy= 1 where id = 2; select * from t1; id copy 1 1 2 2 3 NULL drop table t1, t2; create table t1 (i int); create trigger trg before insert on t1 for each row set @a:= old.i; ERROR HY000: There is no OLD row in on INSERT trigger Loading Loading @@ -482,12 +573,3 @@ i k ts 1 1 0000-00-00 00:00:00 2 2 0000-00-00 00:00:00 drop table t1, t2; drop function if exists bug5893; create 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; update t1 set col2 = 4; ERROR 42000: FUNCTION test.bug5893 does not exist drop table t1;
mysql-test/t/sp-error.test +24 −1 Original line number Diff line number Diff line Loading @@ -1025,4 +1025,27 @@ end| --error 1424 call bug11394(2, 1)| drop procedure bug11394| delimiter |; delimiter ;| # # Bug#11834 "Re-execution of prepared statement with dropped function # crashes server". Also tests handling of prepared stmts which use # stored functions but does not require prelocking. # --disable_warnings drop function if exists bug11834_1; drop function if exists bug11834_2; --enable_warnings create function bug11834_1() returns int return 10; create function bug11834_2() returns int return bug11834_1(); prepare stmt from "select bug11834_2()"; execute stmt; # Re-execution of statement should not crash server. execute stmt; drop function bug11834_1; # Attempt to execute statement should return proper error and # should not crash server. --error ER_SP_DOES_NOT_EXIST execute stmt; deallocate prepare stmt; drop function bug11834_2;
mysql-test/t/sp.test +3 −5 Original line number Diff line number Diff line Loading @@ -1283,7 +1283,8 @@ select * from v1| # views and functions ? create function f1() returns int return (select sum(data) from t1) + (select sum(data) from v1)| # FIXME All these just exceed file limit for me :) # This queries will crash server because we can't use LEX in # reenterable fashion yet. Patch disabling recursion will heal this. #select f1()| #select * from v1| #select * from v2| Loading Loading @@ -1328,15 +1329,12 @@ select * from v2| select * from v1| # These should not work as we have too little instances of tables locked --error 1100 select * from v1, v2| select * from v1, t1| --error 1100 select f4()| unlock tables| # TODO We also should test integration with triggers # Cleanup drop function f0| drop function f1| Loading