Loading mysql-test/r/rpl000001.result +1 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ use test; drop table if exists t1,t3; create table t1 (word char(20) not null); load data infile '../../std_data/words.dat' into table t1; load data local infile '/home/sasha/bk/mysql-4.0/mysql-test/std_data/words.dat' into table t1; load data local infile '$MYSQL_TEST_DIR/std_data/words.dat' into table t1; select * from t1; word Aarhus Loading sql/log_event.cc +42 −22 Original line number Diff line number Diff line Loading @@ -556,6 +556,8 @@ Log_event* Log_event::read_log_event(const char* buf, int event_len, ev = new Query_log_event(buf, event_len, old_format); break; case LOAD_EVENT: ev = new Create_file_log_event(buf, event_len, old_format); break; case NEW_LOAD_EVENT: ev = new Load_log_event(buf, event_len, old_format); break; Loading @@ -566,7 +568,7 @@ Log_event* Log_event::read_log_event(const char* buf, int event_len, ev = new Slave_log_event(buf, event_len); break; case CREATE_FILE_EVENT: ev = new Create_file_log_event(buf, event_len); ev = new Create_file_log_event(buf, event_len, old_format); break; case APPEND_BLOCK_EVENT: ev = new Append_block_log_event(buf, event_len); Loading Loading @@ -959,6 +961,12 @@ char* sql_ex_info::init(char* buf,char* buf_end,bool use_new_format) if (use_new_format) { empty_flags=0; /* the code below assumes that buf will not disappear from under our feet during the lifetime of the event. This assumption holds true in the slave thread if the log is in new format, but is not the case when we have old format because we will be reusing net buffer to read the actual file before we write out the Create_file event */ if (read_str(buf, buf_end, field_term, field_term_len) || read_str(buf, buf_end, enclosed, enclosed_len) || read_str(buf, buf_end, line_term, line_term_len) || Loading @@ -970,11 +978,11 @@ char* sql_ex_info::init(char* buf,char* buf_end,bool use_new_format) else { field_term_len= enclosed_len= line_term_len= line_start_len= escaped_len=1; *field_term=*buf++; *enclosed= *buf++; *line_term= *buf++; *line_start=*buf++; *escaped= *buf++; field_term = buf++; enclosed= buf++; line_term= buf++; line_start= buf++; escaped= buf++; opt_flags = *buf++; empty_flags=*buf++; if (empty_flags & FIELD_TERM_EMPTY) Loading Loading @@ -1095,7 +1103,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, db_len = (uint)data_head[L_DB_LEN_OFFSET]; num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET); int body_offset = get_data_body_offset(); int body_offset = (buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ? LOAD_HEADER_LEN + OLD_HEADER_LEN : get_data_body_offset(); if ((int) event_len < body_offset) return 1; //sql_ex.init() on success returns the pointer to the first byte after Loading @@ -1117,7 +1127,6 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, table_name = fields + field_block_len; db = table_name + table_name_len + 1; fname = db + db_len + 1; int type_code = get_type_code(); fname_len = strlen(fname); // null termination is accomplished by the caller doing buf[event_len]=0 return 0; Loading Loading @@ -1367,12 +1376,15 @@ int Create_file_log_event::write_base(IO_CACHE* file) return res; } Create_file_log_event::Create_file_log_event(const char* buf, int len): Load_log_event(buf,0,0),fake_base(0),block(0) Create_file_log_event::Create_file_log_event(const char* buf, int len, bool old_format): Load_log_event(buf,0,old_format),fake_base(0),block(0),inited_from_old(0) { int block_offset; if (copy_log_event(buf,len,0)) if (copy_log_event(buf,len,old_format)) return; if (!old_format) { file_id = uint4korr(buf + LOG_EVENT_HEADER_LEN + + LOAD_HEADER_LEN + CF_FILE_ID_OFFSET); block_offset = LOG_EVENT_HEADER_LEN + Load_log_event::get_data_size() + Loading @@ -1382,6 +1394,12 @@ Create_file_log_event::Create_file_log_event(const char* buf, int len): block = (char*)buf + block_offset; block_len = len - block_offset; } else { sql_ex.force_new_format(); inited_from_old = 1; } } #ifdef MYSQL_CLIENT Loading Loading @@ -1568,6 +1586,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) int expected_error,actual_error = 0; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)db); DBUG_ASSERT(q_len == strlen(query)); if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) { thd->query = (char*)query; Loading Loading @@ -1738,12 +1757,13 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli) } int Start_log_event::exec_event(struct st_relay_log_info* rli) { if (!rli->mi->old_format) { close_temporary_tables(thd); // if we have old format, load_tmpdir is cleaned up by the I/O thread // TODO: cleanup_load_tmpdir() needs to remove only the files associated // with the server id that has just started if (!rli->mi->old_format) cleanup_load_tmpdir(); } return Log_event::exec_event(rli); } Loading sql/log_event.h +7 −4 Original line number Diff line number Diff line Loading @@ -64,6 +64,8 @@ struct old_sql_ex char empty_flags; }; #define NUM_LOAD_DELIM_STRS 5 struct sql_ex_info { Loading Loading @@ -153,8 +155,8 @@ struct sql_ex_info #define L_THREAD_ID_OFFSET 0 #define L_EXEC_TIME_OFFSET 4 #define L_SKIP_LINES_OFFSET 8 #define L_DB_LEN_OFFSET 12 #define L_TBL_LEN_OFFSET 13 #define L_TBL_LEN_OFFSET 12 #define L_DB_LEN_OFFSET 13 #define L_NUM_FIELDS_OFFSET 14 #define L_SQL_EX_OFFSET 18 #define L_DATA_OFFSET LOAD_HEADER_LEN Loading Loading @@ -570,6 +572,7 @@ class Create_file_log_event: public Load_log_event char* block; uint block_len; uint file_id; bool inited_from_old; #ifndef MYSQL_CLIENT Create_file_log_event(THD* thd, sql_exchange* ex, const char* db_arg, const char* table_name_arg, Loading @@ -578,7 +581,7 @@ class Create_file_log_event: public Load_log_event char* block_arg, uint block_len_arg); #endif Create_file_log_event(const char* buf, int event_len); Create_file_log_event(const char* buf, int event_len, bool old_format); ~Create_file_log_event() { } Loading @@ -591,7 +594,7 @@ class Create_file_log_event: public Load_log_event 4 + 1 + block_len;} int get_data_body_offset() { return fake_base ? LOAD_EVENT_OVERHEAD: LOAD_EVENT_OVERHEAD + CREATE_FILE_HEADER_LEN; } bool is_valid() { return block != 0; } bool is_valid() { return inited_from_old || block != 0; } int write_data_header(IO_CACHE* file); int write_data_body(IO_CACHE* file); int write_base(IO_CACHE* file); // cut out Create_file extentions and Loading sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ char *sql_strmake(const char *str,uint len); gptr sql_memdup(const void * ptr,unsigned size); void sql_element_free(void *ptr); void kill_one_thread(THD *thd, ulong id); int net_request_file(NET* net, const char* fname); char* query_table_status(THD *thd,const char *db,const char *table_name); #define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); } Loading sql/net_serv.cc +11 −0 Original line number Diff line number Diff line Loading @@ -814,3 +814,14 @@ my_net_read(NET *net) #endif /* HAVE_COMPRESS */ return len; } int net_request_file(NET* net, const char* fname) { char tmp [FN_REFLEN+1],*end; DBUG_ENTER("net_request_file"); tmp[0] = (char) 251; /* NULL_LENGTH */ end=strnmov(tmp+1,fname,sizeof(tmp)-2); DBUG_RETURN(my_net_write(net,tmp,(uint) (end-tmp)) || net_flush(net)); } Loading
mysql-test/r/rpl000001.result +1 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ use test; drop table if exists t1,t3; create table t1 (word char(20) not null); load data infile '../../std_data/words.dat' into table t1; load data local infile '/home/sasha/bk/mysql-4.0/mysql-test/std_data/words.dat' into table t1; load data local infile '$MYSQL_TEST_DIR/std_data/words.dat' into table t1; select * from t1; word Aarhus Loading
sql/log_event.cc +42 −22 Original line number Diff line number Diff line Loading @@ -556,6 +556,8 @@ Log_event* Log_event::read_log_event(const char* buf, int event_len, ev = new Query_log_event(buf, event_len, old_format); break; case LOAD_EVENT: ev = new Create_file_log_event(buf, event_len, old_format); break; case NEW_LOAD_EVENT: ev = new Load_log_event(buf, event_len, old_format); break; Loading @@ -566,7 +568,7 @@ Log_event* Log_event::read_log_event(const char* buf, int event_len, ev = new Slave_log_event(buf, event_len); break; case CREATE_FILE_EVENT: ev = new Create_file_log_event(buf, event_len); ev = new Create_file_log_event(buf, event_len, old_format); break; case APPEND_BLOCK_EVENT: ev = new Append_block_log_event(buf, event_len); Loading Loading @@ -959,6 +961,12 @@ char* sql_ex_info::init(char* buf,char* buf_end,bool use_new_format) if (use_new_format) { empty_flags=0; /* the code below assumes that buf will not disappear from under our feet during the lifetime of the event. This assumption holds true in the slave thread if the log is in new format, but is not the case when we have old format because we will be reusing net buffer to read the actual file before we write out the Create_file event */ if (read_str(buf, buf_end, field_term, field_term_len) || read_str(buf, buf_end, enclosed, enclosed_len) || read_str(buf, buf_end, line_term, line_term_len) || Loading @@ -970,11 +978,11 @@ char* sql_ex_info::init(char* buf,char* buf_end,bool use_new_format) else { field_term_len= enclosed_len= line_term_len= line_start_len= escaped_len=1; *field_term=*buf++; *enclosed= *buf++; *line_term= *buf++; *line_start=*buf++; *escaped= *buf++; field_term = buf++; enclosed= buf++; line_term= buf++; line_start= buf++; escaped= buf++; opt_flags = *buf++; empty_flags=*buf++; if (empty_flags & FIELD_TERM_EMPTY) Loading Loading @@ -1095,7 +1103,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, db_len = (uint)data_head[L_DB_LEN_OFFSET]; num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET); int body_offset = get_data_body_offset(); int body_offset = (buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ? LOAD_HEADER_LEN + OLD_HEADER_LEN : get_data_body_offset(); if ((int) event_len < body_offset) return 1; //sql_ex.init() on success returns the pointer to the first byte after Loading @@ -1117,7 +1127,6 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, table_name = fields + field_block_len; db = table_name + table_name_len + 1; fname = db + db_len + 1; int type_code = get_type_code(); fname_len = strlen(fname); // null termination is accomplished by the caller doing buf[event_len]=0 return 0; Loading Loading @@ -1367,12 +1376,15 @@ int Create_file_log_event::write_base(IO_CACHE* file) return res; } Create_file_log_event::Create_file_log_event(const char* buf, int len): Load_log_event(buf,0,0),fake_base(0),block(0) Create_file_log_event::Create_file_log_event(const char* buf, int len, bool old_format): Load_log_event(buf,0,old_format),fake_base(0),block(0),inited_from_old(0) { int block_offset; if (copy_log_event(buf,len,0)) if (copy_log_event(buf,len,old_format)) return; if (!old_format) { file_id = uint4korr(buf + LOG_EVENT_HEADER_LEN + + LOAD_HEADER_LEN + CF_FILE_ID_OFFSET); block_offset = LOG_EVENT_HEADER_LEN + Load_log_event::get_data_size() + Loading @@ -1382,6 +1394,12 @@ Create_file_log_event::Create_file_log_event(const char* buf, int len): block = (char*)buf + block_offset; block_len = len - block_offset; } else { sql_ex.force_new_format(); inited_from_old = 1; } } #ifdef MYSQL_CLIENT Loading Loading @@ -1568,6 +1586,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) int expected_error,actual_error = 0; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)db); DBUG_ASSERT(q_len == strlen(query)); if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) { thd->query = (char*)query; Loading Loading @@ -1738,12 +1757,13 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli) } int Start_log_event::exec_event(struct st_relay_log_info* rli) { if (!rli->mi->old_format) { close_temporary_tables(thd); // if we have old format, load_tmpdir is cleaned up by the I/O thread // TODO: cleanup_load_tmpdir() needs to remove only the files associated // with the server id that has just started if (!rli->mi->old_format) cleanup_load_tmpdir(); } return Log_event::exec_event(rli); } Loading
sql/log_event.h +7 −4 Original line number Diff line number Diff line Loading @@ -64,6 +64,8 @@ struct old_sql_ex char empty_flags; }; #define NUM_LOAD_DELIM_STRS 5 struct sql_ex_info { Loading Loading @@ -153,8 +155,8 @@ struct sql_ex_info #define L_THREAD_ID_OFFSET 0 #define L_EXEC_TIME_OFFSET 4 #define L_SKIP_LINES_OFFSET 8 #define L_DB_LEN_OFFSET 12 #define L_TBL_LEN_OFFSET 13 #define L_TBL_LEN_OFFSET 12 #define L_DB_LEN_OFFSET 13 #define L_NUM_FIELDS_OFFSET 14 #define L_SQL_EX_OFFSET 18 #define L_DATA_OFFSET LOAD_HEADER_LEN Loading Loading @@ -570,6 +572,7 @@ class Create_file_log_event: public Load_log_event char* block; uint block_len; uint file_id; bool inited_from_old; #ifndef MYSQL_CLIENT Create_file_log_event(THD* thd, sql_exchange* ex, const char* db_arg, const char* table_name_arg, Loading @@ -578,7 +581,7 @@ class Create_file_log_event: public Load_log_event char* block_arg, uint block_len_arg); #endif Create_file_log_event(const char* buf, int event_len); Create_file_log_event(const char* buf, int event_len, bool old_format); ~Create_file_log_event() { } Loading @@ -591,7 +594,7 @@ class Create_file_log_event: public Load_log_event 4 + 1 + block_len;} int get_data_body_offset() { return fake_base ? LOAD_EVENT_OVERHEAD: LOAD_EVENT_OVERHEAD + CREATE_FILE_HEADER_LEN; } bool is_valid() { return block != 0; } bool is_valid() { return inited_from_old || block != 0; } int write_data_header(IO_CACHE* file); int write_data_body(IO_CACHE* file); int write_base(IO_CACHE* file); // cut out Create_file extentions and Loading
sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ char *sql_strmake(const char *str,uint len); gptr sql_memdup(const void * ptr,unsigned size); void sql_element_free(void *ptr); void kill_one_thread(THD *thd, ulong id); int net_request_file(NET* net, const char* fname); char* query_table_status(THD *thd,const char *db,const char *table_name); #define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); } Loading
sql/net_serv.cc +11 −0 Original line number Diff line number Diff line Loading @@ -814,3 +814,14 @@ my_net_read(NET *net) #endif /* HAVE_COMPRESS */ return len; } int net_request_file(NET* net, const char* fname) { char tmp [FN_REFLEN+1],*end; DBUG_ENTER("net_request_file"); tmp[0] = (char) 251; /* NULL_LENGTH */ end=strnmov(tmp+1,fname,sizeof(tmp)-2); DBUG_RETURN(my_net_write(net,tmp,(uint) (end-tmp)) || net_flush(net)); }