mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
d1d58b5f1d
If a stored function or a trigger was killed it had aborted but no error was thrown. This allows the caller statement to continue without a notice. This may lead to a wrong data being inserted/updated to/deleted as in such cases the correct result of a stored function isn't guaranteed. In the case of triggers it allows the caller statement to ignore kill signal and to waste time because of re-evaluation of triggers that always will fail because thd->killed flag is still on. Now the Item_func_sp::execute() and the sp_head::execute_trigger() functions check whether a function or a trigger were killed during execution and throws an appropriate error if so. Now the fill_record() function stops filling record if an error was reported through thd->net.report_error.
125 lines
2.8 KiB
Text
125 lines
2.8 KiB
Text
drop table if exists t1, t2, t3;
|
|
create table t1 (kill_id int);
|
|
insert into t1 values(connection_id());
|
|
select ((@id := kill_id) - kill_id) from t1;
|
|
((@id := kill_id) - kill_id)
|
|
0
|
|
kill @id;
|
|
select ((@id := kill_id) - kill_id) from t1;
|
|
((@id := kill_id) - kill_id)
|
|
0
|
|
select @id != connection_id();
|
|
@id != connection_id()
|
|
1
|
|
select 4;
|
|
4
|
|
4
|
|
drop table t1;
|
|
kill (select count(*) from mysql.user);
|
|
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 'select count(*) from mysql.user)' at line 1
|
|
create table t1 (id int primary key);
|
|
create table t2 (id int unsigned not null);
|
|
insert into t2 select id from t1;
|
|
create table t3 (kill_id int);
|
|
insert into t3 values(connection_id());
|
|
select id from t1 where id in (select distinct id from t2);
|
|
select ((@id := kill_id) - kill_id) from t3;
|
|
((@id := kill_id) - kill_id)
|
|
0
|
|
kill @id;
|
|
Got one of the listed errors
|
|
drop table t1, t2, t3;
|
|
select get_lock("a", 10);
|
|
get_lock("a", 10)
|
|
1
|
|
select get_lock("a", 10);
|
|
get_lock("a", 10)
|
|
NULL
|
|
select 1;
|
|
1
|
|
1
|
|
select RELEASE_LOCK("a");
|
|
RELEASE_LOCK("a")
|
|
1
|
|
create table t1(f1 int);
|
|
create function bug27563() returns int(11)
|
|
deterministic
|
|
begin
|
|
declare continue handler for sqlstate '70100' set @a:= 'killed';
|
|
declare continue handler for sqlexception set @a:= 'exception';
|
|
set @a= get_lock("lock27563", 10);
|
|
return 1;
|
|
end|
|
|
select get_lock("lock27563",10);
|
|
get_lock("lock27563",10)
|
|
1
|
|
insert into t1 values (bug27563());
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
select * from t1;
|
|
f1
|
|
insert into t1 values(0);
|
|
update t1 set f1= bug27563();
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
select * from t1;
|
|
f1
|
|
0
|
|
insert into t1 values(1);
|
|
delete from t1 where bug27563() is null;
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
select * from t1;
|
|
f1
|
|
0
|
|
1
|
|
select * from t1 where f1= bug27563();
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
create procedure proc27563()
|
|
begin
|
|
declare continue handler for sqlstate '70100' set @a:= 'killed';
|
|
declare continue handler for sqlexception set @a:= 'exception';
|
|
select get_lock("lock27563",10);
|
|
select "shouldn't be selected";
|
|
end|
|
|
call proc27563();
|
|
get_lock("lock27563",10)
|
|
NULL
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
create table t2 (f2 int);
|
|
create trigger trg27563 before insert on t1 for each row
|
|
begin
|
|
declare continue handler for sqlstate '70100' set @a:= 'killed';
|
|
declare continue handler for sqlexception set @a:= 'exception';
|
|
set @a:= get_lock("lock27563",10);
|
|
insert into t2 values(1);
|
|
end|
|
|
insert into t1 values(2),(3);
|
|
ERROR 70100: Query execution was interrupted
|
|
select @a;
|
|
@a
|
|
NULL
|
|
select * from t1;
|
|
f1
|
|
0
|
|
1
|
|
select * from t2;
|
|
f2
|
|
select release_lock("lock27563");
|
|
release_lock("lock27563")
|
|
1
|
|
drop table t1, t2;
|
|
drop function bug27563;
|
|
drop procedure proc27563;
|