Commit fc83f787 authored by unknown's avatar unknown

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.
parent b9e9a416
...@@ -1241,4 +1241,19 @@ i j ...@@ -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; ...@@ -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() ...@@ -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();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment