mirror of
https://github.com/MariaDB/server.git
synced 2025-03-07 03:33:09 +01:00

Some of the test cases reference to binlog position and these position numbers are written into result explicitly. It is difficult to maintain if log event format changes. There are a couple of cases explicit position number appears, we handle them in different ways A. 'CHANGE MASTER ...' with MASTER_LOG_POS or/and RELAY_LOG_POS options Use --replace_result to mask them. B. 'SHOW BINLOG EVENT ...' Replaced by show_binlog_events.inc or wait_for_binlog_event.inc. show_binlog_events.inc file's function is enhanced by given $binlog_file and $binlog_limit. C. 'SHOW SLAVE STATUS', 'show_slave_status.inc' and 'show_slave_status2.inc' For the test cases just care a few items in the result of 'SHOW SLAVE STATUS', only the items related to each test case are showed. 'show_slave_status.inc' is rebuild, only the given items in $status_items will be showed. 'check_slave_is_running.inc' and 'check_slave_no_error.inc' and 'check_slave_param.inc' are auxiliary files helping to show running status and error information easily. mysql-test/extra/binlog_tests/binlog.test: It only cares whether current binlog file index is changed, so it is ok with 'show_master_status.inc' instead of 'show mater status'. mysql-test/extra/binlog_tests/blackhole.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/extra/rpl_tests/rpl_deadlock.test: Use 'check_slave_is_running.inc' instead of 'show_slave_status2.inc'. mysql-test/extra/rpl_tests/rpl_extraMaster_Col.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/extra/rpl_tests/rpl_extraSlave_Col.test: Use 'wait_for_slave_sql_error.inc' and 'ait_for_slave_sql_error_and_skip.inc' instead of 'show slave status'. mysql-test/extra/rpl_tests/rpl_flsh_tbls.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test: It is need now to give a error number, so use 'wait_for_slave_io_to_stop.inc' instead of 'wait_for_slave_io_error.inc'. mysql-test/extra/rpl_tests/rpl_insert_delayed.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/extra/rpl_tests/rpl_log.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. se 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/extra/rpl_tests/rpl_max_relay_size.test: se 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/extra/rpl_tests/rpl_ndb_apply_status.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/extra/rpl_tests/rpl_reset_slave.test: Use 'show_slave_status.inc' instead of 'show_slave_status2.inc' statement. Use 'check_slave_no_error.inc' to simplify the check that there is no error. mysql-test/extra/rpl_tests/rpl_row_basic.test: Use 'check_slave_is_running.inc' to verify that Slave threads are running well. Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. mysql-test/extra/rpl_tests/rpl_row_tabledefs.test: Use 'show_slave_error_status_and_skip.inc' instead of 'show slave status'. mysql-test/include/check_slave_is_running.inc: To make sure both sql and io thread are running well. If not, the test will be aborted. mysql-test/include/check_slave_no_error.inc: To make sure both sql and io thread have no error. If not, the test will be aborted. mysql-test/include/get_relay_log_pos.inc: According to the position of a log event in master binlog file, find the peer position of a log event in relay log file. mysql-test/include/rpl_stmt_seq.inc: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/include/show_binlog_events.inc: Add two options $binlog_file and $binlog_limit for showing binlog events from different binlog files or/and given different limits on position or row number. mysql-test/include/show_rpl_debug_info.inc: Add 'SELECT NOW()' in the debug information. mysql-test/include/show_slave_status.inc: It's more clean and tidy Only the given columns of slave status are printed. mysql-test/include/test_fieldsize.inc: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/include/wait_for_binlog_event.inc: Use show_rpl_debug_info.inc instead of 'SHOW BINLOG EVENTS'. mysql-test/include/wait_for_slave_io_error.inc: Add $slave_io_errno and $show_slave_io_error, it waits only a given error. mysql-test/include/wait_for_slave_param.inc: Use die instead of exit. mysql-test/include/wait_for_slave_sql_error.inc: Add $slave_sql_errno and $show_slave_sql_error, it waits only a given error. mysql-test/include/wait_for_status_var.inc: Use die instead of exit. mysql-test/r/flush_block_commit_notembedded.result: It checks whether somethings are binlogged, so we using 'show_binlog_event.inc' instead of 'show master status'. mysql-test/r/multi_update.result: It checks whether somethings are binlogged, so we using 'show_binlog_event.inc' instead of 'show master status'. mysql-test/suite/binlog/r/binlog_innodb.result: It checks whether somethings are binlogged, so we using 'show_binlog_event.inc' instead of 'show master status'. mysql-test/suite/binlog/r/binlog_row_binlog.result: Position in the result of 'show master status' is replaced by '#'. mysql-test/suite/binlog/r/binlog_stm_binlog.result: Position in the result of 'show master status' is replaced by '#'. mysql-test/suite/binlog/t/binlog_innodb.test: It checks whether somethings are binlogged, so we use 'show_binlog_event.inc' instead of 'show master status'. mysql-test/suite/binlog/t/binlog_stm_binlog.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/bugs/r/rpl_bug36391.result: Position in the result of 'show master status' is replaced by '#'. mysql-test/suite/bugs/t/rpl_bug12691.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/bugs/t/rpl_bug36391.test: 'show master status' is replaced by 'show_master_status.inc'. Position in the result of 'show master status' is replaced by '#'. mysql-test/suite/engines/funcs/r/rpl_000015.result: It checks whether somethings are binlogged, so we using 'show_binlog_event.inc' instead of 'show master status'. mysql-test/suite/engines/funcs/t/rpl_000015.test: Use 'check_slave_is_running.inc' to verify that Slave threads are running well. mysql-test/suite/engines/funcs/t/rpl_REDIRECT.test: Use 'query_vertical SHOW SLAVE STATUS' instead of 'show slave status'. There is no status columns in the result file, for no slave exists on master's server. mysql-test/suite/engines/funcs/t/rpl_change_master.test: This test just care whether Read_Master_Log_Pos is equal to Exec_Master_Log_Pos after 'CHANGE MASTER ..'. So 'show slave status' is removed and just check the value of Read_Master_Log_Pos and Exec_Master_Log_Pos. mysql-test/suite/engines/funcs/t/rpl_empty_master_crash.test: We doesn't really need the statement. mysql-test/suite/engines/funcs/t/rpl_flushlog_loop.test: Just show Relay_Log_File, running status and error informations. Use 'check_slave_is_running.inc' to verify that Slave threads are running well. mysql-test/suite/engines/funcs/t/rpl_loaddata_s.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/engines/funcs/t/rpl_log_pos.test: Mask the explicit positions in the result file. Use 'check_slave_no_error.inc' to simplify the check that there is no error. Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/engines/funcs/t/rpl_rbr_to_sbr.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/engines/funcs/t/rpl_row_drop.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/engines/funcs/t/rpl_row_inexist_tbl.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/engines/funcs/t/rpl_row_until.test: Use 'check_slave_param.inc' to check whether SQL Thread stop at a right position, and use binlog position variables instead of explicit number in the 'CHANGE MASTER' statements. Mask the explicit binary log positions in the result file. mysql-test/suite/engines/funcs/t/rpl_server_id1.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. Use 'check_slave_no_error.inc' to simplify the check that there is no error. mysql-test/suite/engines/funcs/t/rpl_server_id2.test: It doesn't really need in this test. mysql-test/suite/engines/funcs/t/rpl_slave_status.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/engines/funcs/t/rpl_switch_stm_row_mixed.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/manual/t/rpl_replication_delay.test: Use 'show_slave_status.inc' instead of 'show slave status'. mysql-test/suite/parts/t/rpl_partition.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl/include/rpl_mixed_ddl.inc: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/include/rpl_mixed_dml.inc: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_000015.test: Use 'show_slave_status.inc' instead of 'show_slave_status2.inc'. mysql-test/suite/rpl/t/rpl_binlog_grant.test: Use 'wait_for_binlog_event.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_bug33931.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/rpl/t/rpl_change_master.test: This test just care whether Read_Master_Log_Pos is equal to Exec_Master_Log_Pos after 'CHANGE MASTER ..'. So 'show slave status' is removed and just check the value of Read_Master_Log_Pos and Exec_Master_Log_Pos. mysql-test/suite/rpl/t/rpl_critical_errors.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/rpl/t/rpl_dual_pos_advance.test: Mask the explicit position numbers in result file. It is restricted running on SBR, for it want to binlog 'set @a=1' statement. mysql-test/suite/rpl/t/rpl_empty_master_crash.test: It doesn't need in this test. mysql-test/suite/rpl/t/rpl_flushlog_loop.test: UUse 'check_slave_is_running.inc' and 'show_slave_status.inc' instead of 'show slave status' statement. mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test: Use 'wait_for_slave_io_error.inc' to wait the given io thread error happening. mysql-test/suite/rpl/t/rpl_grant.test: It doesn't need in this test. mysql-test/suite/rpl/t/rpl_incident.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl/t/rpl_known_bugs_detection.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave stutus'. mysql-test/suite/rpl/t/rpl_loaddata_fatal.test: Use 'wait_for_slave_sql_error_and_skip.inc' to wait the given sql thread error happening and then skip the event. There is no need to print the result of 'show slave stutus'. mysql-test/suite/rpl/t/rpl_log_pos.test: Use 'wait_for_slave_io_error.inc' to wait the given io thread error happening. There is no need to print the result of 'show slave status'. mysql-test/suite/rpl/t/rpl_rbr_to_sbr.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_replicate_do.test: Use 'show_slave_status.inc' instead of 'show slave status'. mysql-test/suite/rpl/t/rpl_rotate_logs.test: Use 'show_slave_status.inc' instead of 'show_slave_status2.inc'. mysql-test/suite/rpl/t/rpl_row_basic_11bugs.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_row_create_table.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_row_drop.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_row_until.test: Use 'check_slave_param.inc' to check whether SQL Thread stop at a right position, and use binlog position variables instead of explicit number in the 'CHANGE MASTER' statements. mysql-test/suite/rpl/t/rpl_skip_error.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave status'. mysql-test/suite/rpl/t/rpl_slave_skip.test: Use 'check_slave_param.inc' to check whether SQL Thread stop at a right position, and mask the explicit position number in the 'CHANGE MASTER' statements. mysql-test/suite/rpl/t/rpl_sp.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/suite/rpl/t/rpl_ssl.test: Use 'show_slave_status.inc' instead of 'show slave status'. mysql-test/suite/rpl/t/rpl_ssl1.test: Use 'show_slave_status.inc' instead of 'show slave status'. mysql-test/suite/rpl/t/rpl_stm_until.test: Use 'check_slave_param.inc' to check whether SQL Thread stop at a right position, and use binlog position variables instead of explicit number in the 'CHANGE MASTER' statements. mysql-test/suite/rpl/t/rpl_temporary_errors.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl_ndb/t/rpl_ndb_basic.test: Use 'wait_for_slave_sql_error.inc' to wait the given sql thread error happening. There is no need to print the result of 'show slave status'. mysql-test/suite/rpl_ndb/t/rpl_ndb_circular.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl_ndb/t/rpl_ndb_circular_simplex.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl_ndb/t/rpl_ndb_idempotent.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl_ndb/t/rpl_ndb_multi.test: Mask master_log_pos and master_log_file mysql-test/suite/rpl_ndb/t/rpl_ndb_sync.test: Use 'check_slave_is_running.inc' instead of 'show slave status' statement. mysql-test/suite/rpl_ndb/t/rpl_truncate_7ndb.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/t/alter_table-big.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/t/create-big.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/t/ctype_cp932_binlog_stm.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement. mysql-test/t/flush_block_commit_notembedded.test: It checks whether somethings are binlogged, so we using 'show_binlog_event.inc' instead of 'show master status'. mysql-test/t/multi_update.test: It checks whether somethings are binlogged, so we using 'wait_binlog_event.inc' instead of 'show master status'. mysql-test/t/sp_trans_log.test: Use 'show_binlog_events.inc' instead of 'show binlog events' statement.
388 lines
10 KiB
Text
388 lines
10 KiB
Text
# Tests for various concurrency-related aspects of CREATE TABLE ... SELECT
|
|
# and CREATE TABLE like implementation.
|
|
#
|
|
# Note that we don't test general CREATE TABLE ... SELECT/LIKE functionality
|
|
# here as it is already covered by create.test. We are more interested in
|
|
# extreme cases.
|
|
#
|
|
# This test takes rather long time so let us run it only in --big-test mode
|
|
--source include/big_test.inc
|
|
# We are using some debug-only features in this test
|
|
--source include/have_debug.inc
|
|
# Some of tests below also use binlog to check that statements are
|
|
# executed and logged in correct order
|
|
--source include/have_binlog_format_mixed_or_statement.inc
|
|
|
|
# Create auxilliary connections
|
|
connect (addconroot1, localhost, root,,);
|
|
connect (addconroot2, localhost, root,,);
|
|
connect (addconroot3, localhost, root,,);
|
|
connection default;
|
|
|
|
--disable_warnings
|
|
drop table if exists t1,t2,t3,t4,t5;
|
|
--enable_warnings
|
|
|
|
|
|
#
|
|
# Tests for concurrency problems in CREATE TABLE ... SELECT
|
|
#
|
|
# We introduce delays between various stages of table creation
|
|
# and check that other statements dealing with this table cannot
|
|
# interfere during those delays.
|
|
#
|
|
# What happens in situation when other statement messes with
|
|
# table to be created before it is created ?
|
|
# Concurrent CREATE TABLE
|
|
set session debug="+d,sleep_create_select_before_create";
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
create table t1 (j char(5));
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1;
|
|
# Concurrent CREATE TABLE ... SELECT
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
create table t1 select "Test" as j;
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1;
|
|
# Concurrent CREATE TABLE LIKE
|
|
create table t3 (j char(5));
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
create table t1 like t3;
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1;
|
|
# Concurrent RENAME TABLE
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
rename table t3 to t1;
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1;
|
|
# Concurrent ALTER TABLE RENAME
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
alter table t3 rename to t1;
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1;
|
|
# Concurrent ALTER TABLE RENAME which also adds column
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
--error ER_TABLE_EXISTS_ERROR
|
|
alter table t3 rename to t1, add k int;
|
|
connection default;
|
|
--reap
|
|
show create table t1;
|
|
drop table t1, t3;
|
|
# What happens if other statement sneaks in after the table
|
|
# creation but before its opening ?
|
|
set session debug="-d,sleep_create_select_before_create:+d,sleep_create_select_before_open";
|
|
# Concurrent DROP TABLE
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
# Concurrent RENAME TABLE
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
rename table t1 to t2;
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
# Concurrent SELECT
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
select * from t1;
|
|
connection default;
|
|
--reap
|
|
drop table t1;
|
|
# Concurrent INSERT
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
insert into t1 values (2);
|
|
connection default;
|
|
--reap
|
|
select * from t1;
|
|
drop table t1;
|
|
# Concurrent CREATE TRIGGER
|
|
set @a:=0;
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
create trigger t1_bi before insert on t1 for each row set @a:=1;
|
|
connection default;
|
|
--reap
|
|
select @a;
|
|
drop table t1;
|
|
# Okay, now the same tests for the potential gap between open and lock
|
|
set session debug="-d,sleep_create_select_before_open:+d,sleep_create_select_before_lock";
|
|
# Concurrent DROP TABLE
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
# Concurrent RENAME TABLE
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
rename table t1 to t2;
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
# Concurrent SELECT
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
select * from t1;
|
|
connection default;
|
|
--reap
|
|
drop table t1;
|
|
# Concurrent INSERT
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
insert into t1 values (2);
|
|
connection default;
|
|
--reap
|
|
select * from t1;
|
|
drop table t1;
|
|
# Concurrent CREATE TRIGGER
|
|
set @a:=0;
|
|
--send create table t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
create trigger t1_bi before insert on t1 for each row set @a:=1;
|
|
connection default;
|
|
--reap
|
|
select @a;
|
|
drop table t1;
|
|
# Some tests for case with existing table
|
|
set session debug="-d,sleep_create_select_before_lock:+d,sleep_create_select_before_check_if_exists";
|
|
create table t1 (i int);
|
|
# Concurrent DROP TABLE
|
|
--send create table if not exists t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
# Concurrent CREATE TRIGGER
|
|
create table t1 (i int);
|
|
set @a:=0;
|
|
--send create table if not exists t1 select 1 as i;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
create trigger t1_bi before insert on t1 for each row set @a:=1;
|
|
connection default;
|
|
--reap
|
|
select @a;
|
|
select * from t1;
|
|
drop table t1;
|
|
set session debug="-d,sleep_create_select_before_check_if_exists";
|
|
|
|
|
|
# Test for some details of CREATE TABLE ... SELECT implementation.
|
|
#
|
|
# We check that create placeholder is handled properly if we have
|
|
# to reopen tables in open_tables().
|
|
# This test heavily relies on current implementation of name-locking/
|
|
# table cache so it may stop working if it changes. OTOH it such problem
|
|
# will serve as warning that such changes should not be done lightly.
|
|
create table t2 (a int);
|
|
create table t4 (b int);
|
|
connection addconroot2;
|
|
lock table t4 write;
|
|
select 1;
|
|
connection addconroot1;
|
|
# Create placeholder/name-lock for t3
|
|
--send create table t3 as select * from t4;
|
|
--sleep 2
|
|
connection default;
|
|
# This statement creates placeholder for t1, then opens t2,
|
|
# then meets name-lock for t3 and then reopens all tables
|
|
--send create table t1 select * from t2, t3;
|
|
--sleep 2
|
|
connection addconroot2;
|
|
unlock tables;
|
|
connection addconroot1;
|
|
--reap
|
|
connection default;
|
|
--reap
|
|
select * from t1;
|
|
show create table t1;
|
|
drop table t1, t3;
|
|
# Now similar test which proves that we really temporarily
|
|
# remove placeholder when we reopen tables.
|
|
connection addconroot2;
|
|
lock table t4 read;
|
|
select 1;
|
|
connection addconroot1;
|
|
# Create name-lock for t3
|
|
--send rename table t4 to t3;
|
|
--sleep 2
|
|
connection default;
|
|
# This statement creates placeholder for t1, then opens t2,
|
|
# then meets name-lock for t3 and then reopens all tables
|
|
--send create table if not exists t1 select 1 as i from t2, t3;
|
|
--sleep 2
|
|
connection addconroot3;
|
|
# We should be able to take name-lock on table t1 as we should not have
|
|
# open placeholder for it at this point (otherwise it is possible to
|
|
# come-up with situation which will lead to deadlock, e.g. think of
|
|
# concurrent CREATE TABLE t1 SELECT * FROM t2 and RENAME TABLE t2 TO t1)
|
|
create table t5 (j int);
|
|
# This statement takes name-lock on t1 and therefore proves
|
|
# that there is no active open placeholder for it.
|
|
rename table t5 to t1;
|
|
connection addconroot2;
|
|
unlock tables;
|
|
connection addconroot1;
|
|
--reap
|
|
connection default;
|
|
--reap
|
|
select * from t1;
|
|
show create table t1;
|
|
drop table t1, t2, t3;
|
|
|
|
|
|
# Tests for possible concurrency issues with CREATE TABLE ... LIKE
|
|
#
|
|
# Bug #18950 "create table like does not obtain LOCK_open"
|
|
# Bug #23667 "CREATE TABLE LIKE is not isolated from alteration by other
|
|
# connections"
|
|
#
|
|
# Again the idea of this test is that we introduce artificial delays on
|
|
# various stages of table creation and check that concurrent statements
|
|
# for tables from CREATE TABLE ... LIKE are not interfering.
|
|
|
|
--disable_warnings
|
|
drop table if exists t1,t2;
|
|
--enable_warnings
|
|
|
|
# What happens if some statements sneak in right after we have
|
|
# opened source table ?
|
|
create table t1 (i int);
|
|
set session debug="+d,sleep_create_like_before_check_if_exists";
|
|
# Reset binlog to have clear start
|
|
reset master;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
# DML on source table should be allowed to run concurrently
|
|
insert into t1 values (1);
|
|
# And DDL should wait
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
show create table t2;
|
|
drop table t2;
|
|
# Let us check that statements were executed/binlogged in correct order
|
|
source include/show_binlog_events.inc;
|
|
|
|
# Now let us check the gap between check for target table
|
|
# existance and copying of .frm file.
|
|
create table t1 (i int);
|
|
set session debug="-d,sleep_create_like_before_check_if_exists:+d,sleep_create_like_before_copy";
|
|
# It should be impossible to create target table concurrently
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
create table if not exists t2 (j int);
|
|
connection default;
|
|
--reap
|
|
show create table t2;
|
|
drop table t2;
|
|
# And concurrent DDL on the source table should be still disallowed
|
|
reset master;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
source include/show_binlog_events.inc;
|
|
|
|
# And now he gap between copying of .frm file and ha_create_table() call.
|
|
create table t1 (i int);
|
|
set session debug="-d,sleep_create_like_before_copy:+d,sleep_create_like_before_ha_create";
|
|
# Both DML and DDL on target table should wait till operation completes
|
|
reset master;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
insert into t2 values (1);
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t2;
|
|
connection default;
|
|
--reap
|
|
# Concurrent DDL on the source table still waits
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
source include/show_binlog_events.inc;
|
|
|
|
# Finally we check the gap between ha_create_table() and binlogging
|
|
create table t1 (i int);
|
|
set session debug="-d,sleep_create_like_before_ha_create:+d,sleep_create_like_before_binlogging";
|
|
reset master;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
insert into t2 values (1);
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t2;
|
|
connection default;
|
|
--reap
|
|
--send create table t2 like t1;
|
|
connection addconroot1;
|
|
--sleep 2
|
|
drop table t1;
|
|
connection default;
|
|
--reap
|
|
drop table t2;
|
|
source include/show_binlog_events.inc;
|
|
|
|
set session debug="-d,sleep_create_like_before_binlogging";
|