mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			263 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# See if replication of a "LOAD DATA in an autoincrement column"
 | 
						|
# Honours autoincrement values
 | 
						|
# i.e. if the master and slave have the same sequence
 | 
						|
#
 | 
						|
# check replication of load data for temporary tables with additional
 | 
						|
# parameters
 | 
						|
#
 | 
						|
# check if duplicate entries trigger an error (they should unless IGNORE or
 | 
						|
# REPLACE was used on the master) (bug 571).
 | 
						|
#
 | 
						|
# check if START SLAVE, RESET SLAVE, CHANGE MASTER reset Last_slave_error and
 | 
						|
# Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
 | 
						|
 | 
						|
-- source include/have_binlog_format_statement.inc
 | 
						|
-- source include/master-slave.inc
 | 
						|
source include/have_innodb.inc;
 | 
						|
 | 
						|
--disable_query_log
 | 
						|
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
 | 
						|
--enable_query_log
 | 
						|
 | 
						|
# MTR is not case-sensitive.
 | 
						|
let $lower_stmt_head= load data;
 | 
						|
let $UPPER_STMT_HEAD= LOAD DATA;
 | 
						|
if ($lock_option)
 | 
						|
{
 | 
						|
  #if $lock_option is null, an extra blank is added into the statement,
 | 
						|
  #this will change the result of rpl_loaddata test case. so $lock_option
 | 
						|
  #is set only when it is not null.
 | 
						|
  let $lower_stmt_head= load data $lock_option;
 | 
						|
  let $UPPER_STMT_HEAD= LOAD DATA $lock_option;
 | 
						|
}
 | 
						|
 | 
						|
select last_insert_id();
 | 
						|
create table t1(a int not null auto_increment, b int, primary key(a) );
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
 | 
						|
# verify that LAST_INSERT_ID() is set by LOAD DATA INFILE
 | 
						|
select last_insert_id();
 | 
						|
 | 
						|
create temporary table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60));
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines;
 | 
						|
 | 
						|
create table t3 (day date,id int(9),category enum('a','b','c'),name varchar(60));
 | 
						|
--disable_warnings
 | 
						|
insert into t3 select * from t2;
 | 
						|
--enable_warnings
 | 
						|
 | 
						|
sync_slave_with_master;
 | 
						|
 | 
						|
select * from t1;
 | 
						|
select * from t3;
 | 
						|
 | 
						|
connection master;
 | 
						|
 | 
						|
drop table t1;
 | 
						|
drop table t2;
 | 
						|
drop table t3;
 | 
						|
create table t1(a int, b int, unique(b));
 | 
						|
 | 
						|
sync_slave_with_master;
 | 
						|
 | 
						|
# See if slave stops when there's a duplicate entry for key error in LOAD DATA
 | 
						|
 | 
						|
insert into t1 values(1,10);
 | 
						|
 | 
						|
connection master;
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
 | 
						|
 | 
						|
save_master_pos;
 | 
						|
connection slave;
 | 
						|
# 1062 = ER_DUP_ENTRY
 | 
						|
call mtr.add_suppression("Slave SQL.*Error .Duplicate entry .10. for key .b.. on query.* Error_code: 1062");
 | 
						|
call mtr.add_suppression("Slave SQL.*Query caused different errors on master and slave.*Error on master:.*error code=1062.*Error on slave:.*Error_code: 0");
 | 
						|
--let $slave_sql_errno= 1062
 | 
						|
--source include/wait_for_slave_sql_error_and_skip.inc
 | 
						|
 | 
						|
# Skip the bad event and see if error is cleared in SHOW SLAVE STATUS by START
 | 
						|
# SLAVE, even though we are not executing any event (as sql_slave_skip_counter
 | 
						|
# takes us directly to the end of the relay log).
 | 
						|
 | 
						|
sync_with_master;
 | 
						|
--source include/check_slave_no_error.inc
 | 
						|
 | 
						|
# Trigger error again to test CHANGE MASTER
 | 
						|
 | 
						|
connection master;
 | 
						|
set sql_log_bin=0;
 | 
						|
delete from t1;
 | 
						|
set sql_log_bin=1;
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
 | 
						|
save_master_pos;
 | 
						|
connection slave;
 | 
						|
# The SQL slave thread should be stopped now. 
 | 
						|
# Exec_Master_Log_Pos should point to the start of Execute event
 | 
						|
# for last load data.
 | 
						|
# 1062 = ER_DUP_ENTRY
 | 
						|
--let $slave_sql_errno= 1062
 | 
						|
--source include/wait_for_slave_sql_error.inc
 | 
						|
 | 
						|
# CHANGE MASTER and see if error is cleared in SHOW SLAVE STATUS.
 | 
						|
--source include/stop_slave_io.inc
 | 
						|
change master to master_user='test';
 | 
						|
change master to master_user='root';
 | 
						|
--source include/check_slave_no_error.inc
 | 
						|
 | 
						|
# Trigger error again to test RESET SLAVE
 | 
						|
 | 
						|
set global sql_slave_skip_counter=1;
 | 
						|
start slave;
 | 
						|
sync_with_master;
 | 
						|
connection master;
 | 
						|
set sql_log_bin=0;
 | 
						|
delete from t1;
 | 
						|
set sql_log_bin=1;
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata.dat' into table t1;
 | 
						|
save_master_pos;
 | 
						|
connection slave;
 | 
						|
# The SQL slave thread should be stopped now.
 | 
						|
# 1062 = ER_DUP_ENTRY
 | 
						|
--let $slave_sql_errno= 1062
 | 
						|
--source include/wait_for_slave_sql_error.inc
 | 
						|
 | 
						|
# RESET SLAVE and see if error is cleared in SHOW SLAVE STATUS.
 | 
						|
stop slave;
 | 
						|
reset slave;
 | 
						|
--source include/check_slave_no_error.inc
 | 
						|
 | 
						|
# Finally, see if logging is done ok on master for a failing LOAD DATA INFILE
 | 
						|
 | 
						|
connection master;
 | 
						|
reset master;
 | 
						|
eval create table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60),
 | 
						|
unique(day)) engine=$engine_type; # no transactions
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
 | 
						|
terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 | 
						|
'\n##\n' starting by '>' ignore 1 lines;
 | 
						|
select * from t2;
 | 
						|
save_master_pos;
 | 
						|
connection slave;
 | 
						|
start slave;
 | 
						|
sync_with_master;
 | 
						|
select * from t2;
 | 
						|
 | 
						|
# verify that if no error on slave, this is an error
 | 
						|
 | 
						|
alter table t2 drop key day;
 | 
						|
connection master;
 | 
						|
delete from t2;
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
eval $lower_stmt_head infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
 | 
						|
terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
 | 
						|
'\n##\n' starting by '>' ignore 1 lines;
 | 
						|
connection slave;
 | 
						|
 | 
						|
if (`SELECT @@global.binlog_format != 'ROW'`)
 | 
						|
{
 | 
						|
  # Query causes error on master but not on slave. This causes the slave to
 | 
						|
  # stop with error code 0 (which is wrong: see BUG#57287)
 | 
						|
  --let $slave_sql_errno= 0
 | 
						|
  --source include/wait_for_slave_sql_error.inc
 | 
						|
  drop table t1, t2;
 | 
						|
}
 | 
						|
connection master;
 | 
						|
drop table t1, t2;
 | 
						|
 | 
						|
# BUG#17233 LOAD DATA INFILE: failure causes mysqld dbug_assert, binlog not flushed
 | 
						|
CREATE TABLE t1 (word CHAR(20) NOT NULL PRIMARY KEY) ENGINE=INNODB;
 | 
						|
 | 
						|
--error ER_DUP_ENTRY
 | 
						|
eval $UPPER_STMT_HEAD INFILE "../../std_data/words.dat" INTO TABLE t1;
 | 
						|
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
# BUG#48297: Schema name is ignored when LOAD DATA is written into binlog,
 | 
						|
# replication aborts
 | 
						|
-- let $rpl_only_running_threads= 1
 | 
						|
-- source include/rpl_reset.inc
 | 
						|
 | 
						|
-- let $db1= b48297_db1
 | 
						|
-- let $db2= b42897_db2
 | 
						|
 | 
						|
-- connection master
 | 
						|
 | 
						|
-- disable_warnings
 | 
						|
-- eval drop database if exists $db1
 | 
						|
-- eval drop database if exists $db2
 | 
						|
-- enable_warnings
 | 
						|
 | 
						|
-- eval create database $db1
 | 
						|
-- eval create database $db2
 | 
						|
 | 
						|
-- eval use $db1
 | 
						|
-- eval CREATE TABLE t1 (c1 VARCHAR(256)) engine=$engine_type;
 | 
						|
 | 
						|
-- eval use $db2
 | 
						|
 | 
						|
-- echo ### assertion: works with cross-referenced database
 | 
						|
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | 
						|
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | 
						|
 | 
						|
-- eval use $db1
 | 
						|
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | 
						|
-- echo ### assertion: works with fully qualified name on current database
 | 
						|
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | 
						|
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | 
						|
 | 
						|
-- echo ### assertion: works without fully qualified name on current database
 | 
						|
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | 
						|
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE t1
 | 
						|
 | 
						|
-- echo ### create connection without default database
 | 
						|
-- echo ### connect (conn2,localhost,root,,*NO-ONE*);
 | 
						|
connect (conn2,localhost,root,,*NO-ONE*);
 | 
						|
-- connection conn2
 | 
						|
-- echo ### assertion: works without stating the default database
 | 
						|
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 | 
						|
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
 | 
						|
 | 
						|
# We cannot disconnect right away because when inserting
 | 
						|
# concurrently in a MyISAM table, the server is sending an OK 
 | 
						|
# to the client before updating the table state (where the 
 | 
						|
# number of records is kept). See: BUG#37521 and BUG#29334.
 | 
						|
# So we need to wait, otherwise we would be having sporadic 
 | 
						|
# failures as reported here: BUG#50451.
 | 
						|
 | 
						|
# 12 = 3 rows per each LOAD DATA executed x 4
 | 
						|
-- let $count= 12
 | 
						|
-- let $table= $db1.t1
 | 
						|
--source include/wait_until_rows_count.inc
 | 
						|
 | 
						|
-- echo ### disconnect and switch back to master connection
 | 
						|
-- disconnect conn2
 | 
						|
-- connection master
 | 
						|
 | 
						|
-- sync_slave_with_master
 | 
						|
-- eval use $db1
 | 
						|
 | 
						|
let $diff_tables= master:$db1.t1, slave:$db1.t1;
 | 
						|
source include/diff_tables.inc;
 | 
						|
 | 
						|
-- connection master
 | 
						|
 | 
						|
-- eval DROP DATABASE $db1
 | 
						|
-- eval DROP DATABASE $db2
 | 
						|
 | 
						|
-- sync_slave_with_master
 | 
						|
 | 
						|
# BUG#49479: LOAD DATA INFILE is binlogged without escaping field names
 | 
						|
-- source include/rpl_reset.inc
 | 
						|
-- connection master
 | 
						|
use test;
 | 
						|
CREATE TABLE t1 (`key` TEXT, `text` TEXT);
 | 
						|
 | 
						|
LOAD DATA INFILE '../../std_data/loaddata2.dat' REPLACE INTO TABLE `t1` FIELDS TERMINATED BY ',';
 | 
						|
SELECT * FROM t1;
 | 
						|
 | 
						|
-- sync_slave_with_master
 | 
						|
-- connection master
 | 
						|
DROP TABLE t1;
 | 
						|
 | 
						|
--source include/rpl_end.inc
 |