mirror of
https://github.com/MariaDB/server.git
synced 2025-01-27 01:04:19 +01:00
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
4 changed files with 100 additions and 0 deletions
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);
|
||||
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)
|
||||
{
|
||||
thd->lex->duplicates= DUP_REPLACE;
|
||||
handle_dup= DUP_REPLACE;
|
||||
}
|
||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
{
|
||||
ignore= 1;
|
||||
thd->lex->duplicates= DUP_ERROR;
|
||||
handle_dup= DUP_ERROR;
|
||||
}
|
||||
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
|
||||
to IGNORE.
|
||||
*/
|
||||
thd->lex->duplicates= DUP_ERROR;
|
||||
handle_dup= DUP_ERROR;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue