mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix for bug bug#23651 "Server crashes when trigger which uses
stored function invoked from different connections". Invocation of trigger which was using stored function from different connections caused server crashes (for non-debug server this happened in highly concurrent environment, but debug server failed on assertion in relatively simple scenario). Item_func_sp was not safe to use in triggers (in other words for re-execution from different threads) as artificial TABLE object pointed by Item_func_sp::dummy_table referenced incorrect THD object. To fix the problem we force re-initialization of this object for each re-execution of statement. mysql-test/r/trigger.result: Added test for bug#23651 "Server crashes when trigger which uses stored function invoked from different connections". mysql-test/t/trigger.test: Added test for bug#23651 "Server crashes when trigger which uses stored function invoked from different connections". sql/item_func.cc: To make Item_func_sp safe for usage in triggers (in other words safe for re-execution in different threads) we need to ensure that artificial TABLE object pointed by Item_func_sp::dummy_table references correct THD object. To achieve this we simply force its re-initialization for each re-execution of statement.
This commit is contained in:
@ -1241,4 +1241,19 @@ i j
|
|||||||
2 2
|
2 2
|
||||||
13 13
|
13 13
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
drop table if exists t1;
|
||||||
|
drop function if exists f1;
|
||||||
|
create table t1 (i int);
|
||||||
|
create function f1() returns int return 10;
|
||||||
|
create trigger t1_bi before insert on t1 for each row set @a:= f1() + 10;
|
||||||
|
insert into t1 values ();
|
||||||
|
select @a;
|
||||||
|
@a
|
||||||
|
20
|
||||||
|
insert into t1 values ();
|
||||||
|
select @a;
|
||||||
|
@a
|
||||||
|
20
|
||||||
|
drop table t1;
|
||||||
|
drop function f1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
|
@ -1499,4 +1499,24 @@ select * from t1;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #23651 "Server crashes when trigger which uses stored function
|
||||||
|
# invoked from different connections".
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop table if exists t1;
|
||||||
|
drop function if exists f1;
|
||||||
|
--enable_warnings
|
||||||
|
create table t1 (i int);
|
||||||
|
create function f1() returns int return 10;
|
||||||
|
create trigger t1_bi before insert on t1 for each row set @a:= f1() + 10;
|
||||||
|
insert into t1 values ();
|
||||||
|
select @a;
|
||||||
|
connection addconroot1;
|
||||||
|
insert into t1 values ();
|
||||||
|
select @a;
|
||||||
|
connection default;
|
||||||
|
drop table t1;
|
||||||
|
drop function f1;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
@ -4845,6 +4845,7 @@ Item_func_sp::cleanup()
|
|||||||
result_field= NULL;
|
result_field= NULL;
|
||||||
}
|
}
|
||||||
m_sp= NULL;
|
m_sp= NULL;
|
||||||
|
dummy_table->s= NULL;
|
||||||
Item_func::cleanup();
|
Item_func::cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user