You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.3 KiB
79 lines
2.3 KiB
5 months ago
|
--source include/force_myisam_default.inc
|
||
|
--source include/have_myisam.inc
|
||
|
|
||
|
--echo
|
||
|
--echo Bug#26141 mixing table types in trigger causes full
|
||
|
--echo table lock on innodb table
|
||
|
--echo
|
||
|
--echo Ensure we do not open and lock tables for the triggers we do not
|
||
|
--echo fire.
|
||
|
--echo
|
||
|
|
||
|
# Note, for InnoDB to allow concurrent UPDATE and INSERT the
|
||
|
# table must have a unique key.
|
||
|
create table t1 (c int primary key) engine=innodb;
|
||
|
create table t2 (c int) engine=myisam;
|
||
|
create table t3 (c int) engine=myisam;
|
||
|
insert into t1 (c) values (1);
|
||
|
delimiter |;
|
||
|
|
||
|
create trigger trg_bug26141_ai after insert on t1
|
||
|
for each row
|
||
|
begin
|
||
|
insert into t2 (c) values (1);
|
||
|
# We need the 'sync' lock to synchronously wait in connection 2 till
|
||
|
# the moment when the trigger acquired all the locks.
|
||
|
select release_lock("lock_bug26141_sync") into @a;
|
||
|
# 1000 is time in seconds of lock wait timeout -- this is a way
|
||
|
# to cause a manageable sleep up to 1000 seconds
|
||
|
select get_lock("lock_bug26141_wait", 1000) into @a;
|
||
|
end|
|
||
|
|
||
|
create trigger trg_bug26141_au after update on t1
|
||
|
for each row
|
||
|
begin
|
||
|
insert into t3 (c) values (1);
|
||
|
end|
|
||
|
delimiter ;|
|
||
|
|
||
|
# Establish an alternative connection.
|
||
|
--connect (connection_aux,localhost,root,,test,,)
|
||
|
--connect (connection_update,localhost,root,,test,,)
|
||
|
|
||
|
connection connection_aux;
|
||
|
# Lock the wait lock, it must not be locked, so specify zero timeout.
|
||
|
select get_lock("lock_bug26141_wait", 0);
|
||
|
|
||
|
#
|
||
|
connection default;
|
||
|
#
|
||
|
# Run the trigger synchronously
|
||
|
#
|
||
|
select get_lock("lock_bug26141_sync", /* must not be priorly locked */ 0);
|
||
|
# Will acquire the table level locks, perform the insert into t2,
|
||
|
# release the sync lock and block on the wait lock.
|
||
|
send insert into t1 (c) values (2);
|
||
|
|
||
|
connection connection_update;
|
||
|
# Wait for the trigger to acquire its locks and unlock the sync lock.
|
||
|
select get_lock("lock_bug26141_sync", 1000);
|
||
|
#
|
||
|
# This must continue: after the fix for the bug, we do not
|
||
|
# open tables for t2, and with c=4 innobase allows the update
|
||
|
# to run concurrently with insert.
|
||
|
update t1 set c=3 where c=1;
|
||
|
select release_lock("lock_bug26141_sync");
|
||
|
connection connection_aux;
|
||
|
select release_lock("lock_bug26141_wait");
|
||
|
connection default;
|
||
|
reap;
|
||
|
select * from t1;
|
||
|
select * from t2;
|
||
|
select * from t3;
|
||
|
|
||
|
# Drops the trigger as well.
|
||
|
drop table t1, t2, t3;
|
||
|
disconnect connection_update;
|
||
|
disconnect connection_aux;
|
||
|
|