Bug#11401: Setting thd->lex so that engines (i.e., InnoDB) recognizes
this as a LOAD DATA ... REPLACE INTO .. statement. sql/log_event.cc: Setting thd->lex so that engines (i.e., InnoDB) recognizes this as a LOAD DATA ... REPLACE INTO .. statement.
This commit is contained in:
parent
0ff72e6019
commit
28f554af12
37
mysql-test/r/rpl_innodb.result
Normal file
37
mysql-test/r/rpl_innodb.result
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
CREATE TABLE t4 (
|
||||||
|
id INT(5) unsigned NOT NULL auto_increment,
|
||||||
|
name varchar(15) NOT NULL default '',
|
||||||
|
number varchar(35) NOT NULL default 'default',
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY unique_rec (name,number)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
LOAD DATA
|
||||||
|
INFILE '../../std_data/loaddata_pair.dat'
|
||||||
|
REPLACE INTO TABLE t4
|
||||||
|
(name,number);
|
||||||
|
SELECT * FROM t4;
|
||||||
|
id name number
|
||||||
|
1 XXX 12345
|
||||||
|
2 XXY 12345
|
||||||
|
SELECT * FROM t4;
|
||||||
|
id name number
|
||||||
|
1 XXX 12345
|
||||||
|
2 XXY 12345
|
||||||
|
LOAD DATA
|
||||||
|
INFILE '../../std_data/loaddata_pair.dat'
|
||||||
|
REPLACE INTO TABLE t4
|
||||||
|
(name,number);
|
||||||
|
SELECT * FROM t4;
|
||||||
|
id name number
|
||||||
|
3 XXX 12345
|
||||||
|
4 XXY 12345
|
||||||
|
SELECT * FROM t4;
|
||||||
|
id name number
|
||||||
|
3 XXX 12345
|
||||||
|
4 XXY 12345
|
2
mysql-test/std_data/loaddata_pair.dat
Normal file
2
mysql-test/std_data/loaddata_pair.dat
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
XXX 12345
|
||||||
|
XXY 12345
|
46
mysql-test/t/rpl_innodb.test
Normal file
46
mysql-test/t/rpl_innodb.test
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# File for specialities regarding replication from or to InnoDB
|
||||||
|
# tables.
|
||||||
|
|
||||||
|
source include/master-slave.inc;
|
||||||
|
source include/have_innodb.inc;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#11401: Load data infile 'REPLACE INTO' fails on slave.
|
||||||
|
#
|
||||||
|
connection master;
|
||||||
|
CREATE TABLE t4 (
|
||||||
|
id INT(5) unsigned NOT NULL auto_increment,
|
||||||
|
name varchar(15) NOT NULL default '',
|
||||||
|
number varchar(35) NOT NULL default 'default',
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY unique_rec (name,number)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
LOAD DATA
|
||||||
|
INFILE '../../std_data/loaddata_pair.dat'
|
||||||
|
REPLACE INTO TABLE t4
|
||||||
|
(name,number);
|
||||||
|
--enable_warnings
|
||||||
|
SELECT * FROM t4;
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT * FROM t4;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--disable_warnings
|
||||||
|
LOAD DATA
|
||||||
|
INFILE '../../std_data/loaddata_pair.dat'
|
||||||
|
REPLACE INTO TABLE t4
|
||||||
|
(name,number);
|
||||||
|
--enable_warnings
|
||||||
|
SELECT * FROM t4;
|
||||||
|
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT * FROM t4;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--disable_query_log
|
||||||
|
DROP TABLE t4;
|
||||||
|
--enable_query_log
|
||||||
|
sync_slave_with_master;
|
@ -1809,11 +1809,25 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
"` <...>", NullS) - load_data_query);
|
"` <...>", NullS) - load_data_query);
|
||||||
thd->query= load_data_query;
|
thd->query= load_data_query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
We need to set thd->lex->sql_command and thd->lex->duplicates
|
||||||
|
since InnoDB tests these variables to decide if this is a LOAD
|
||||||
|
DATA ... REPLACE INTO ... statement even though mysql_parse()
|
||||||
|
is not called. This is not needed in 5.0 since there the LOAD
|
||||||
|
DATA ... statement is replicated using mysql_parse(), which
|
||||||
|
sets the thd->lex fields correctly.
|
||||||
|
*/
|
||||||
|
thd->lex->sql_command= SQLCOM_LOAD;
|
||||||
if (sql_ex.opt_flags & REPLACE_FLAG)
|
if (sql_ex.opt_flags & REPLACE_FLAG)
|
||||||
|
{
|
||||||
|
thd->lex->duplicates= DUP_REPLACE;
|
||||||
handle_dup= DUP_REPLACE;
|
handle_dup= DUP_REPLACE;
|
||||||
|
}
|
||||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||||
{
|
{
|
||||||
ignore= 1;
|
ignore= 1;
|
||||||
|
thd->lex->duplicates= DUP_ERROR;
|
||||||
handle_dup= DUP_ERROR;
|
handle_dup= DUP_ERROR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1831,6 +1845,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
If reading from net (a 3.23 master), mysql_load() will change this
|
If reading from net (a 3.23 master), mysql_load() will change this
|
||||||
to IGNORE.
|
to IGNORE.
|
||||||
*/
|
*/
|
||||||
|
thd->lex->duplicates= DUP_ERROR;
|
||||||
handle_dup= DUP_ERROR;
|
handle_dup= DUP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user