mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 13:32:33 +01:00
6ceacd4fb9
FOR UPDATE is causing a lock". This patch tries to address problems which were exposed during backporting of original patch to 5.1 tree. - It ensures that we don't change locking behavior of simple SELECT statements on InnoDB tables when they are executed under LOCK TABLES ... READ and with @@innodb_table_locks=0. Also we no longer pass TL_READ_DEFAULT/TL_WRITE_DEFAULT lock types, which are supposed to be parser-only, to handler::start_stmt() method. - It makes check_/no_concurrent_insert.inc auxiliary scripts more robust against changes in test cases that use them and also ensures that they don't unnecessarily change environment of caller.
96 lines
2.7 KiB
PHP
96 lines
2.7 KiB
PHP
#
|
|
# SUMMARY
|
|
# Check if statement reading table '$table' allows concurrent
|
|
# inserts in it.
|
|
#
|
|
# PARAMETERS
|
|
# $table Table in which concurrent inserts should be allowed.
|
|
# $con_aux1 Name of the first auxiliary connection to be used by this
|
|
# script.
|
|
# $con_aux2 Name of the second auxiliary connection to be used by this
|
|
# script.
|
|
# $statement Statement to be checked.
|
|
# $restore_table Table which might be modified affected by statement to be
|
|
# checked and thus needs backing up before its execution
|
|
# and restoring after it (can be empty).
|
|
#
|
|
# EXAMPLE
|
|
# lock_sync.test
|
|
#
|
|
--disable_result_log
|
|
--disable_query_log
|
|
|
|
# Reset DEBUG_SYNC facility for safety.
|
|
set debug_sync= "RESET";
|
|
|
|
if (`SELECT '$restore_table' <> ''`)
|
|
{
|
|
--eval create table t_backup select * from $restore_table;
|
|
}
|
|
|
|
connection $con_aux1;
|
|
set debug_sync='after_lock_tables_takes_lock SIGNAL parked WAIT_FOR go';
|
|
--send_eval $statement;
|
|
|
|
connection $con_aux2;
|
|
set debug_sync='now WAIT_FOR parked';
|
|
--send_eval insert into $table values (0);
|
|
|
|
--enable_result_log
|
|
--enable_query_log
|
|
connection default;
|
|
# Wait until concurrent insert is successfully executed while
|
|
# statement being checked has its tables locked.
|
|
# We use wait_condition.inc instead of simply executing
|
|
# concurrent insert here in order to avoid deadlocks if test
|
|
# fails and timing out instead.
|
|
let $wait_condition=
|
|
select count(*) = 0 from information_schema.processlist
|
|
where info = "insert into $table values (0)";
|
|
--source include/wait_condition.inc
|
|
|
|
--disable_result_log
|
|
--disable_query_log
|
|
|
|
if ($success)
|
|
{
|
|
# Apparently concurrent insert was successfully executed.
|
|
# To be safe against wait_condition.inc succeeding due to
|
|
# races let us first reap concurrent insert to ensure that
|
|
# it has really been successfully executed.
|
|
connection $con_aux2;
|
|
--reap
|
|
connection default;
|
|
set debug_sync= 'now SIGNAL go';
|
|
connection $con_aux1;
|
|
--reap
|
|
connection default;
|
|
--echo Success: '$statement' allows concurrent inserts into '$table'.
|
|
}
|
|
if (!$success)
|
|
{
|
|
# Waiting has timed out. Apparently concurrent insert was blocked.
|
|
# So to be able to continue we need to end our statement first.
|
|
set debug_sync= 'now SIGNAL go';
|
|
connection $con_aux1;
|
|
--reap
|
|
connection $con_aux2;
|
|
--reap
|
|
connection default;
|
|
--echo Error: '$statement' doesn't allow concurrent inserts into '$table'!
|
|
}
|
|
|
|
--eval delete from $table where i = 0;
|
|
|
|
if (`SELECT '$restore_table' <> ''`)
|
|
{
|
|
--eval truncate table $restore_table;
|
|
--eval insert into $restore_table select * from t_backup;
|
|
drop table t_backup;
|
|
}
|
|
|
|
# Clean-up. Reset DEBUG_SYNC facility after use.
|
|
set debug_sync= "RESET";
|
|
|
|
--enable_result_log
|
|
--enable_query_log
|