mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#6353 V2:
Replication using replicate-rewrite-db did not work for LOAD DATA INFILE. Now is does. There was one place in the code that used current database instead of the rewrite database.
This commit is contained in:
@ -20,3 +20,73 @@ a
|
|||||||
9
|
9
|
||||||
drop table t1;
|
drop table t1;
|
||||||
drop database mysqltest1;
|
drop database mysqltest1;
|
||||||
|
drop database if exists rewrite;
|
||||||
|
create database rewrite;
|
||||||
|
use test;
|
||||||
|
create table t1 (a date, b date, c date not null, d date);
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',';
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 1
|
||||||
|
Warning 1265 Data truncated for column 'c' at row 1
|
||||||
|
Warning 1265 Data truncated for column 'd' at row 1
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 2
|
||||||
|
Warning 1265 Data truncated for column 'b' at row 2
|
||||||
|
Warning 1265 Data truncated for column 'd' at row 2
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' IGNORE 2 LINES;
|
||||||
|
select * from rewrite.t1;
|
||||||
|
a b c d
|
||||||
|
0000-00-00 NULL 0000-00-00 0000-00-00
|
||||||
|
0000-00-00 0000-00-00 0000-00-00 0000-00-00
|
||||||
|
2003-03-03 2003-03-03 2003-03-03 NULL
|
||||||
|
2003-03-03 2003-03-03 2003-03-03 NULL
|
||||||
|
truncate table t1;
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d);
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'c' at row 1
|
||||||
|
Warning 1265 Data truncated for column 'd' at row 1
|
||||||
|
Warning 1265 Data truncated for column 'b' at row 2
|
||||||
|
Warning 1265 Data truncated for column 'd' at row 2
|
||||||
|
select * from rewrite.t1;
|
||||||
|
a b c d
|
||||||
|
NULL NULL 0000-00-00 0000-00-00
|
||||||
|
NULL 0000-00-00 0000-00-00 0000-00-00
|
||||||
|
NULL 2003-03-03 2003-03-03 NULL
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a text, b text);
|
||||||
|
load data infile '../../std_data/loaddata2.dat' into table t1 fields terminated by ',' enclosed by '''';
|
||||||
|
Warnings:
|
||||||
|
Warning 1261 Row 3 doesn't contain data for all columns
|
||||||
|
select concat('|',a,'|'), concat('|',b,'|') from rewrite.t1;
|
||||||
|
concat('|',a,'|') concat('|',b,'|')
|
||||||
|
|Field A| |Field B|
|
||||||
|
|Field 1| |Field 2'
|
||||||
|
Field 3,'Field 4|
|
||||||
|
|Field 5' ,'Field 6| NULL
|
||||||
|
|Field 6| | 'Field 7'|
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a int, b char(10));
|
||||||
|
load data infile '../../std_data/loaddata3.dat' into table t1 fields terminated by '' enclosed by '' ignore 1 lines;
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 3
|
||||||
|
Warning 1262 Row 3 was truncated; it contained more data than there were input columns
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 5
|
||||||
|
Warning 1262 Row 5 was truncated; it contained more data than there were input columns
|
||||||
|
select * from rewrite.t1;
|
||||||
|
a b
|
||||||
|
1 row 1
|
||||||
|
2 row 2
|
||||||
|
0 1234567890
|
||||||
|
3 row 3
|
||||||
|
0 1234567890
|
||||||
|
truncate table t1;
|
||||||
|
load data infile '../../std_data/loaddata4.dat' into table t1 fields terminated by '' enclosed by '' lines terminated by '' ignore 1 lines;
|
||||||
|
Warnings:
|
||||||
|
Warning 1265 Data truncated for column 'a' at row 4
|
||||||
|
Warning 1261 Row 4 doesn't contain data for all columns
|
||||||
|
select * from rewrite.t1;
|
||||||
|
a b
|
||||||
|
1 row 1
|
||||||
|
2 row 2
|
||||||
|
3 row 3
|
||||||
|
0
|
||||||
|
drop table t1;
|
||||||
|
@ -1 +1 @@
|
|||||||
"--replicate-rewrite-db=mysqltest1->test"
|
"--replicate-rewrite-db=test->rewrite" "--replicate-rewrite-db=mysqltest1->test"
|
||||||
|
@ -17,3 +17,61 @@ drop table t1;
|
|||||||
drop database mysqltest1;
|
drop database mysqltest1;
|
||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#6353:
|
||||||
|
# Option --replicate-rewrite-db should work together with LOAD DATA INFILE
|
||||||
|
#
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
--disable_warnings
|
||||||
|
drop database if exists rewrite;
|
||||||
|
--enable_warnings
|
||||||
|
create database rewrite;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
use test;
|
||||||
|
create table t1 (a date, b date, c date not null, d date);
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',';
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' IGNORE 2 LINES;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
select * from rewrite.t1;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
truncate table t1;
|
||||||
|
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',' LINES STARTING BY ',' (b,c,d);
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
select * from rewrite.t1;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a text, b text);
|
||||||
|
load data infile '../../std_data/loaddata2.dat' into table t1 fields terminated by ',' enclosed by '''';
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
select concat('|',a,'|'), concat('|',b,'|') from rewrite.t1;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a int, b char(10));
|
||||||
|
load data infile '../../std_data/loaddata3.dat' into table t1 fields terminated by '' enclosed by '' ignore 1 lines;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
select * from rewrite.t1;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
truncate table t1;
|
||||||
|
load data infile '../../std_data/loaddata4.dat' into table t1 fields terminated by '' enclosed by '' lines terminated by '' ignore 1 lines;
|
||||||
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
connection slave;
|
||||||
|
# The empty line last comes from the end line field in the file
|
||||||
|
select * from rewrite.t1;
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
@ -1655,16 +1655,22 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
Load_log_event::set_fields()
|
Load_log_event::set_fields()
|
||||||
|
|
||||||
|
Note that this function can not use the member variable
|
||||||
|
for the database, since LOAD DATA INFILE on the slave
|
||||||
|
can be for a different database than the current one.
|
||||||
|
This is the reason for the affected_db argument to this method.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MYSQL_CLIENT
|
#ifndef MYSQL_CLIENT
|
||||||
void Load_log_event::set_fields(List<Item> &field_list)
|
void Load_log_event::set_fields(const char* affected_db,
|
||||||
|
List<Item> &field_list)
|
||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
const char* field = fields;
|
const char* field = fields;
|
||||||
for (i= 0; i < num_fields; i++)
|
for (i= 0; i < num_fields; i++)
|
||||||
{
|
{
|
||||||
field_list.push_back(new Item_field(db, table_name, field));
|
field_list.push_back(new Item_field(affected_db, table_name, field));
|
||||||
field+= field_lens[i] + 1;
|
field+= field_lens[i] + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1820,7 +1826,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
|
|
||||||
ex.skip_lines = skip_lines;
|
ex.skip_lines = skip_lines;
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
set_fields(field_list);
|
set_fields(thd->db,field_list);
|
||||||
thd->variables.pseudo_thread_id= thread_id;
|
thd->variables.pseudo_thread_id= thread_id;
|
||||||
if (net)
|
if (net)
|
||||||
{
|
{
|
||||||
@ -1837,13 +1843,13 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||||||
if (thd->cuted_fields)
|
if (thd->cuted_fields)
|
||||||
{
|
{
|
||||||
/* log_pos is the position of the LOAD event in the master log */
|
/* log_pos is the position of the LOAD event in the master log */
|
||||||
sql_print_error("\
|
sql_print_warning("Slave: load data infile on table '%s' at "
|
||||||
Slave: load data infile on table '%s' at log position %s in log \
|
"log position %s in log '%s' produced %ld "
|
||||||
'%s' produced %ld warning(s). Default database: '%s'",
|
"warning(s). Default database: '%s'",
|
||||||
(char*) table_name,
|
(char*) table_name,
|
||||||
llstr(log_pos,llbuff), RPL_LOG_NAME,
|
llstr(log_pos,llbuff), RPL_LOG_NAME,
|
||||||
(ulong) thd->cuted_fields,
|
(ulong) thd->cuted_fields,
|
||||||
print_slave_db_safe(thd->db));
|
print_slave_db_safe(thd->db));
|
||||||
}
|
}
|
||||||
if (net)
|
if (net)
|
||||||
net->pkt_nr= thd->net.pkt_nr;
|
net->pkt_nr= thd->net.pkt_nr;
|
||||||
|
@ -587,7 +587,7 @@ public:
|
|||||||
const char* table_name_arg,
|
const char* table_name_arg,
|
||||||
List<Item>& fields_arg, enum enum_duplicates handle_dup,
|
List<Item>& fields_arg, enum enum_duplicates handle_dup,
|
||||||
bool using_trans);
|
bool using_trans);
|
||||||
void set_fields(List<Item> &fields_arg);
|
void set_fields(const char* db, List<Item> &fields_arg);
|
||||||
const char* get_db() { return db; }
|
const char* get_db() { return db; }
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
void pack_info(Protocol* protocol);
|
void pack_info(Protocol* protocol);
|
||||||
|
Reference in New Issue
Block a user