diff options
author | unknown <dlenev@mysql.com> | 2005-03-16 17:00:13 +0300 |
---|---|---|
committer | unknown <dlenev@mysql.com> | 2005-03-16 17:00:13 +0300 |
commit | d5ec9ed899bc7ea7d0888dcbe96bb6841b7275af (patch) | |
tree | c37246cec6d64728e31fd8f7e53303f750317d1c | |
parent | f21905e066ab4aa5da817f87586660f4bcddfd45 (diff) | |
parent | ec919d742838f491556cb98a894bffab79957cd5 (diff) | |
download | mariadb-git-d5ec9ed899bc7ea7d0888dcbe96bb6841b7275af.tar.gz |
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/dlenev/src/mysql-5.0-eld-exp
69 files changed, 1548 insertions, 580 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index f564ee31fed..c296447def9 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -103,6 +103,22 @@ class Load_log_processor { char target_dir_name[FN_REFLEN]; int target_dir_name_len; + + /* + When we see first event corresponding to some LOAD DATA statement in + binlog, we create temporary file to store data to be loaded. + We add name of this file to file_names array using its file_id as index. + If we have Create_file event (i.e. we have binary log in pre-5.0.3 + format) we also store save event object to be able which is needed to + emit LOAD DATA statement when we will meet Exec_load_data event. + If we have Begin_load_query event we simply store 0 in + File_name_record::event field. + */ + struct File_name_record + { + char *fname; + Create_file_log_event *event; + }; DYNAMIC_ARRAY file_names; /* @@ -144,7 +160,7 @@ public: int init() { - return init_dynamic_array(&file_names,sizeof(Create_file_log_event*), + return init_dynamic_array(&file_names, sizeof(File_name_record), 100,100 CALLER_INFO); } @@ -161,33 +177,91 @@ public: } void destroy() { - Create_file_log_event **ptr= (Create_file_log_event**)file_names.buffer; - Create_file_log_event **end= ptr + file_names.elements; + File_name_record *ptr= (File_name_record *)file_names.buffer; + File_name_record *end= ptr + file_names.elements; for (; ptr<end; ptr++) { - if (*ptr) + if (ptr->fname) { - my_free((char*)(*ptr)->fname,MYF(MY_WME)); - delete *ptr; - *ptr= 0; + my_free(ptr->fname, MYF(MY_WME)); + delete ptr->event; + bzero((char *)ptr, sizeof(File_name_record)); } } } + + /* + Obtain Create_file event for LOAD DATA statement by its file_id. + + SYNOPSIS + grab_event() + file_id - file_id identifiying LOAD DATA statement + + DESCRIPTION + Checks whenever we have already seen Create_file event for this file_id. + If yes then returns pointer to it and removes it from array describing + active temporary files. Since this moment caller is responsible for + freeing memory occupied by this event and associated file name. + + RETURN VALUES + Pointer to Create_file event or 0 if there was no such event + with this file_id. + */ Create_file_log_event *grab_event(uint file_id) { + File_name_record *ptr; + Create_file_log_event *res; + if (file_id >= file_names.elements) return 0; - Create_file_log_event **ptr= - (Create_file_log_event**)file_names.buffer + file_id; - Create_file_log_event *res= *ptr; - *ptr= 0; + ptr= dynamic_element(&file_names, file_id, File_name_record*); + if ((res= ptr->event)) + bzero((char *)ptr, sizeof(File_name_record)); + return res; + } + + /* + Obtain file name of temporary file for LOAD DATA statement by its file_id. + + SYNOPSIS + grab_fname() + file_id - file_id identifiying LOAD DATA statement + + DESCRIPTION + Checks whenever we have already seen Begin_load_query event for this + file_id. If yes then returns file name of corresponding temporary file. + Removes record about this file from the array of active temporary files. + Since this moment caller is responsible for freeing memory occupied by + this name. + + RETURN VALUES + String with name of temporary file or 0 if we have not seen Begin_load_query + event with this file_id. + */ + char *grab_fname(uint file_id) + { + File_name_record *ptr; + char *res= 0; + + if (file_id >= file_names.elements) + return 0; + ptr= dynamic_element(&file_names, file_id, File_name_record*); + if (!ptr->event) + { + res= ptr->fname; + bzero((char *)ptr, sizeof(File_name_record)); + } return res; } int process(Create_file_log_event *ce); + int process(Begin_load_query_log_event *ce); int process(Append_block_log_event *ae); File prepare_new_file_for_old_format(Load_log_event *le, char *filename); int load_old_format_file(NET* net, const char *server_fname, uint server_fname_len, File file); + int process_first_event(const char *bname, uint blen, const char *block, + uint block_len, uint file_id, + Create_file_log_event *ce); }; @@ -265,22 +339,42 @@ int Load_log_processor::load_old_format_file(NET* net, const char*server_fname, } -int Load_log_processor::process(Create_file_log_event *ce) +/* + Process first event in the sequence of events representing LOAD DATA + statement. + + SYNOPSIS + process_first_event() + bname - base name for temporary file to be created + blen - base name length + block - first block of data to be loaded + block_len - first block length + file_id - identifies LOAD DATA statement + ce - pointer to Create_file event object if we are processing + this type of event. + + DESCRIPTION + Creates temporary file to be used in LOAD DATA and writes first block of + data to it. Registers its file name (and optional Create_file event) + in the array of active temporary files. + + RETURN VALUES + 0 - success + non-0 - error +*/ + +int Load_log_processor::process_first_event(const char *bname, uint blen, + const char *block, uint block_len, + uint file_id, + Create_file_log_event *ce) { - const char *bname= ce->fname+dirname_length(ce->fname); - uint blen= ce->fname_len - (bname-ce->fname); uint full_len= target_dir_name_len + blen + 9 + 9 + 1; int error= 0; char *fname, *ptr; File file; - DBUG_ENTER("Load_log_processor::process"); + File_name_record rec; + DBUG_ENTER("Load_log_processor::process_first_event"); - if (set_dynamic(&file_names,(gptr)&ce,ce->file_id)) - { - sql_print_error("Could not construct local filename %s%s", - target_dir_name,bname); - DBUG_RETURN(-1); - } if (!(fname= my_malloc(full_len,MYF(MY_WME)))) DBUG_RETURN(-1); @@ -288,7 +382,7 @@ int Load_log_processor::process(Create_file_log_event *ce) ptr= fname + target_dir_name_len; memcpy(ptr,bname,blen); ptr+= blen; - ptr+= my_sprintf(ptr,(ptr,"-%x",ce->file_id)); + ptr+= my_sprintf(ptr, (ptr, "-%x", file_id)); if ((file= create_unique_file(fname,ptr)) < 0) { @@ -296,9 +390,21 @@ int Load_log_processor::process(Create_file_log_event *ce) target_dir_name,bname); DBUG_RETURN(-1); } - ce->set_fname_outside_temp_buf(fname,strlen(fname)); - if (my_write(file,(byte*) ce->block,ce->block_len,MYF(MY_WME|MY_NABP))) + rec.fname= fname; + rec.event= ce; + + if (set_dynamic(&file_names, (gptr)&rec, file_id)) + { + sql_print_error("Could not construct local filename %s%s", + target_dir_name, bname); + DBUG_RETURN(-1); + } + + if (ce) + ce->set_fname_outside_temp_buf(fname, strlen(fname)); + + if (my_write(file, (byte*)block, block_len, MYF(MY_WME|MY_NABP))) error= -1; if (my_close(file, MYF(MY_WME))) error= -1; @@ -306,19 +412,35 @@ int Load_log_processor::process(Create_file_log_event *ce) } +int Load_log_processor::process(Create_file_log_event *ce) +{ + const char *bname= ce->fname + dirname_length(ce->fname); + uint blen= ce->fname_len - (bname-ce->fname); + + return process_first_event(bname, blen, ce->block, ce->block_len, + ce->file_id, ce); +} + + +int Load_log_processor::process(Begin_load_query_log_event *blqe) +{ + return process_first_event("SQL_LOAD_MB", 11, blqe->block, blqe->block_len, + blqe->file_id, 0); +} + + int Load_log_processor::process(Append_block_log_event *ae) { DBUG_ENTER("Load_log_processor::process"); - Create_file_log_event* ce= ((ae->file_id < file_names.elements) ? - *((Create_file_log_event**)file_names.buffer + - ae->file_id) : - 0); + const char* fname= ((ae->file_id < file_names.elements) ? + dynamic_element(&file_names, ae->file_id, + File_name_record*)->fname : 0); - if (ce) + if (fname) { File file; int error= 0; - if (((file= my_open(ce->fname, + if (((file= my_open(fname, O_APPEND|O_BINARY|O_WRONLY,MYF(MY_WME))) < 0)) DBUG_RETURN(-1); if (my_write(file,(byte*)ae->block,ae->block_len,MYF(MY_WME|MY_NABP))) @@ -342,6 +464,14 @@ Create_file event for file_id: %u\n",ae->file_id); Load_log_processor load_processor; +static bool check_database(const char *log_dbname) +{ + return one_database && + (log_dbname != NULL) && + strcmp(log_dbname, database); +} + + /* Process an event @@ -395,29 +525,21 @@ int process_event(LAST_EVENT_INFO *last_event_info, Log_event *ev, switch (ev_type) { case QUERY_EVENT: - if (one_database) - { - const char * log_dbname = ((Query_log_event*)ev)->db; - if ((log_dbname != NULL) && (strcmp(log_dbname, database))) - goto end; - } + if (check_database(((Query_log_event*)ev)->db)) + goto end; ev->print(result_file, short_form, last_event_info); break; case CREATE_FILE_EVENT: { Create_file_log_event* ce= (Create_file_log_event*)ev; - if (one_database) - { - /* - We test if this event has to be ignored. If yes, we don't save - this event; this will have the good side-effect of ignoring all - related Append_block and Exec_load. - Note that Load event from 3.23 is not tested. - */ - const char * log_dbname = ce->db; - if ((log_dbname != NULL) && (strcmp(log_dbname, database))) - goto end; // Next event - } + /* + We test if this event has to be ignored. If yes, we don't save + this event; this will have the good side-effect of ignoring all + related Append_block and Exec_load. + Note that Load event from 3.23 is not tested. + */ + if (check_database(ce->db)) + goto end; // Next event /* We print the event, but with a leading '#': this is just to inform the user of the original command; the command we want to execute @@ -473,6 +595,32 @@ Create_file event for file_id: %u\n",exv->file_id); */ ev= 0; break; + case BEGIN_LOAD_QUERY_EVENT: + ev->print(result_file, short_form, last_event_info); + load_processor.process((Begin_load_query_log_event*) ev); + break; + case EXECUTE_LOAD_QUERY_EVENT: + { + Execute_load_query_log_event *exlq= (Execute_load_query_log_event*)ev; + char *fname= load_processor.grab_fname(exlq->file_id); + + if (check_database(exlq->db)) + { + if (fname) + my_free(fname, MYF(MY_WME)); + goto end; + } + + if (fname) + { + exlq->print(result_file, short_form, last_event_info, fname); + my_free(fname, MYF(MY_WME)); + } + else + fprintf(stderr,"Warning: ignoring Execute_load_query as there is no \ +Begin_load_query event for file_id: %u\n", exlq->file_id); + break; + } default: ev->print(result_file, short_form, last_event_info); } diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index 78672c7fd7b..a734ad78e04 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -523,10 +523,10 @@ create table t2 (c char(30)) charset=ucs2; set @v=convert('abc' using ucs2); reset master; insert into t2 values (@v); -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 User var 1 136 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci -master-bin.000001 136 Query 1 226 use `test`; insert into t2 values (@v) +master-bin.000001 # User var 1 # @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci +master-bin.000001 # Query 1 # use `test`; insert into t2 values (@v) /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; ROLLBACK; diff --git a/mysql-test/r/insert_select.result b/mysql-test/r/insert_select.result index 47f1b18d8a4..13d4b0e22bc 100644 --- a/mysql-test/r/insert_select.result +++ b/mysql-test/r/insert_select.result @@ -74,8 +74,8 @@ insert into t1 select * from t2; ERROR 23000: Duplicate entry '2' for key 1 show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 191 use `test`; insert into t1 select * from t2 +master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 +master-bin.000001 # Query 1 # use `test`; insert into t1 select * from t2 select * from t1; a 1 @@ -88,7 +88,7 @@ create table t2(unique(a)) select a from t1; ERROR 23000: Duplicate entry '1' for key 1 show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 drop table t1; create table t1 (a int not null); create table t2 (a int not null); diff --git a/mysql-test/r/loaddata.result b/mysql-test/r/loaddata.result index c17b96ee60c..d76fff372f5 100644 --- a/mysql-test/r/loaddata.result +++ b/mysql-test/r/loaddata.result @@ -1,4 +1,4 @@ -drop table if exists t1; +drop table if exists t1, t2; 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: @@ -66,3 +66,57 @@ a b 3 row 3 0 drop table t1; +create table t1 (a int default 100, b int, c varchar(60)); +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b); +select * from t1; +a b c +NULL 20 b=10 +NULL 25 b=15 +truncate table t1; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set c= if(a is null,"oops",a); +select * from t1; +a b c +NULL NULL oops +NULL NULL oops +truncate table t1; +set @c:=123; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, b) set c= if(@a is null,@c,b); +select * from t1; +a b c +100 10 123 +100 15 123 +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, @b); +select * from t1; +a b c +100 10 123 +100 15 123 +100 NULL NULL +100 NULL NULL +select @a, @b; +@a @b +NULL 15 +truncate table t1; +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c="Wow"; +select * from t1; +a b c +1 2 Wow +3 4 Wow +5 6 Wow +truncate table t1; +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c=concat(a,"+",b,"+",@c,"+",b,"+",if(c is null,"NIL",c)); +select * from t1; +a b c +1 2 1+2+123+2+NIL +3 4 3+4+123+4+NIL +5 6 5+6+123+6+NIL +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b); +ERROR HY000: Can't load value from file with fixed size rows to variable +create table t2 (num int primary key, str varchar(10)); +insert into t2 values (10,'Ten'), (15,'Fifteen'); +truncate table t1; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n); +select * from t1; +a b c +10 NULL Ten +15 NULL Fifteen +drop table t1, t2; diff --git a/mysql-test/r/mix_innodb_myisam_binlog.result b/mysql-test/r/mix_innodb_myisam_binlog.result index 53cd61f8a2e..a5f4915384d 100644 --- a/mysql-test/r/mix_innodb_myisam_binlog.result +++ b/mysql-test/r/mix_innodb_myisam_binlog.result @@ -6,12 +6,12 @@ begin; insert into t1 values(1); insert into t2 select * from t1; commit; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(1) -master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 348 Xid 1 # COMMIT /* xid=7 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(1) +master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 350 Xid 1 # COMMIT /* xid=7 */ delete from t1; delete from t2; reset master; @@ -21,12 +21,12 @@ insert into t2 select * from t1; rollback; Warnings: Warning 1196 Some non-transactional changed tables couldn't be rolled back -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(2) -master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 348 Query 1 # use `test`; ROLLBACK +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(2) +master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 350 Query 1 # use `test`; ROLLBACK delete from t1; delete from t2; reset master; @@ -39,15 +39,15 @@ rollback to savepoint my_savepoint; Warnings: Warning 1196 Some non-transactional changed tables couldn't be rolled back commit; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(3) -master-bin.000001 253 Query 1 # use `test`; savepoint my_savepoint -master-bin.000001 339 Query 1 # use `test`; insert into t1 values(4) -master-bin.000001 427 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 522 Query 1 # use `test`; rollback to savepoint my_savepoint -master-bin.000001 620 Xid 1 # COMMIT /* xid=24 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(3) +master-bin.000001 255 Query 1 # use `test`; savepoint my_savepoint +master-bin.000001 341 Query 1 # use `test`; insert into t1 values(4) +master-bin.000001 429 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 524 Query 1 # use `test`; rollback to savepoint my_savepoint +master-bin.000001 622 Xid 1 # COMMIT /* xid=24 */ delete from t1; delete from t2; reset master; @@ -65,16 +65,16 @@ select a from t1 order by a; a 5 7 -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(5) -master-bin.000001 253 Query 1 # use `test`; savepoint my_savepoint -master-bin.000001 339 Query 1 # use `test`; insert into t1 values(6) -master-bin.000001 427 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 522 Query 1 # use `test`; rollback to savepoint my_savepoint -master-bin.000001 620 Query 1 # use `test`; insert into t1 values(7) -master-bin.000001 708 Xid 1 # COMMIT /* xid=36 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(5) +master-bin.000001 255 Query 1 # use `test`; savepoint my_savepoint +master-bin.000001 341 Query 1 # use `test`; insert into t1 values(6) +master-bin.000001 429 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 524 Query 1 # use `test`; rollback to savepoint my_savepoint +master-bin.000001 622 Query 1 # use `test`; insert into t1 values(7) +master-bin.000001 710 Xid 1 # COMMIT /* xid=36 */ delete from t1; delete from t2; reset master; @@ -87,43 +87,43 @@ insert into t2 select * from t1; select get_lock("a",10); get_lock("a",10) 1 -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(8) -master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 348 Query 1 # use `test`; ROLLBACK +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(8) +master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 350 Query 1 # use `test`; ROLLBACK delete from t1; delete from t2; reset master; insert into t1 values(9); insert into t2 select * from t1; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; insert into t1 values(9) -master-bin.000001 184 Xid 1 # COMMIT /* xid=59 */ -master-bin.000001 211 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 98 Query 1 # use `test`; insert into t1 values(9) +master-bin.000001 186 Xid 1 # COMMIT /* xid=59 */ +master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1 delete from t1; delete from t2; reset master; insert into t1 values(10); begin; insert into t2 select * from t1; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; insert into t1 values(10) -master-bin.000001 185 Xid 1 # COMMIT /* xid=65 */ -master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10) +master-bin.000001 187 Xid 1 # COMMIT /* xid=65 */ +master-bin.000001 214 Query 1 # use `test`; insert into t2 select * from t1 insert into t1 values(11); commit; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; insert into t1 values(10) -master-bin.000001 185 Xid 1 # COMMIT /* xid=65 */ -master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 307 Query 1 # use `test`; BEGIN -master-bin.000001 376 Query 1 # use `test`; insert into t1 values(11) -master-bin.000001 465 Xid 1 # COMMIT /* xid=67 */ +master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10) +master-bin.000001 187 Xid 1 # COMMIT /* xid=65 */ +master-bin.000001 214 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 309 Query 1 # use `test`; BEGIN +master-bin.000001 378 Query 1 # use `test`; insert into t1 values(11) +master-bin.000001 467 Xid 1 # COMMIT /* xid=67 */ alter table t2 engine=INNODB; delete from t1; delete from t2; @@ -132,12 +132,12 @@ begin; insert into t1 values(12); insert into t2 select * from t1; commit; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(12) -master-bin.000001 254 Query 1 # use `test`; insert into t2 select * from t1 -master-bin.000001 349 Xid 1 # COMMIT /* xid=77 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(12) +master-bin.000001 256 Query 1 # use `test`; insert into t2 select * from t1 +master-bin.000001 351 Xid 1 # COMMIT /* xid=77 */ delete from t1; delete from t2; reset master; @@ -145,7 +145,7 @@ begin; insert into t1 values(13); insert into t2 select * from t1; rollback; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info delete from t1; delete from t2; @@ -157,11 +157,11 @@ insert into t1 values(15); insert into t2 select * from t1; rollback to savepoint my_savepoint; commit; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(14) -master-bin.000001 254 Xid 1 # COMMIT /* xid=93 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(14) +master-bin.000001 256 Xid 1 # COMMIT /* xid=93 */ delete from t1; delete from t2; reset master; @@ -177,12 +177,12 @@ select a from t1 order by a; a 16 18 -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 # use `test`; BEGIN -master-bin.000001 165 Query 1 # use `test`; insert into t1 values(16) -master-bin.000001 254 Query 1 # use `test`; insert into t1 values(18) -master-bin.000001 343 Xid 1 # COMMIT /* xid=104 */ +master-bin.000001 98 Query 1 # use `test`; BEGIN +master-bin.000001 167 Query 1 # use `test`; insert into t1 values(16) +master-bin.000001 256 Query 1 # use `test`; insert into t1 values(18) +master-bin.000001 345 Xid 1 # COMMIT /* xid=104 */ delete from t1; delete from t2; alter table t2 type=MyISAM; diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result index 6fb2f7f2fb4..8765e65f11b 100644 --- a/mysql-test/r/mysqlbinlog.result +++ b/mysql-test/r/mysqlbinlog.result @@ -9,7 +9,6 @@ load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; -load data infile '../../std_data/words.dat' into table t1; insert into t1 values ("Alas"); flush logs; @@ -32,11 +31,14 @@ insert into t1 values ("abirvalg"); SET INSERT_ID=1; SET TIMESTAMP=1000000000; insert into t2 values (); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-1-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-1-0' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-2-0' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-3-0' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-4-0' INTO table t1; ROLLBACK; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; @@ -91,11 +93,14 @@ insert into t1 values ("abirvalg"); SET INSERT_ID=1; SET TIMESTAMP=1000000000; insert into t2 values (); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-1-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); -LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-1-2' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-2-2' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-3-2' INTO table t1; +SET TIMESTAMP=1000000000; +load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-4-2' INTO table t1; ROLLBACK; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 3c99e22cb10..130bda3e5bb 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -1,4 +1,4 @@ -DROP TABLE IF EXISTS t1, `"t"1`, t1aa,t2aa; +DROP TABLE IF EXISTS t1, `"t"1`, t1aa, t2, t2aa; drop database if exists mysqldump_test_db; drop view if exists v1; CREATE TABLE t1(a int); diff --git a/mysql-test/r/rpl000015.result b/mysql-test/r/rpl000015.result index 44d3a844c74..e33201ced93 100644 --- a/mysql-test/r/rpl000015.result +++ b/mysql-test/r/rpl000015.result @@ -1,7 +1,7 @@ reset master; show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 96 +master-bin.000001 98 reset slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master @@ -17,7 +17,7 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 7 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No # +# 127.0.0.1 root MASTER_PORT 7 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No # drop table if exists t1; create table t1 (n int); insert into t1 values (10),(45),(90); diff --git a/mysql-test/r/rpl_change_master.result b/mysql-test/r/rpl_change_master.result index 6ffdb15fcf8..6366a2d0f8f 100644 --- a/mysql-test/r/rpl_change_master.result +++ b/mysql-test/r/rpl_change_master.result @@ -13,11 +13,11 @@ insert into t1 values(2); stop slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 358 # # master-bin.000001 No No 0 0 182 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 360 # # master-bin.000001 No No 0 0 184 # None 0 No # change master to master_user='root'; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 182 # # master-bin.000001 No No 0 0 182 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 184 # # master-bin.000001 No No 0 0 184 # None 0 No # start slave; select * from t1; n diff --git a/mysql-test/r/rpl_charset.result b/mysql-test/r/rpl_charset.result index ce958c15ece..b27acc0972e 100644 --- a/mysql-test/r/rpl_charset.result +++ b/mysql-test/r/rpl_charset.result @@ -103,7 +103,7 @@ a b 1 cp850_general_ci drop database mysqltest2; drop database mysqltest3; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query 1 # drop database if exists mysqltest2 master-bin.000001 # Query 1 # drop database if exists mysqltest3 diff --git a/mysql-test/r/rpl_deadlock.result b/mysql-test/r/rpl_deadlock.result index fd9853a9e5f..809b7950add 100644 --- a/mysql-test/r/rpl_deadlock.result +++ b/mysql-test/r/rpl_deadlock.result @@ -39,9 +39,9 @@ a 22 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No # stop slave; -change master to master_log_pos=534; +change master to master_log_pos=536; begin; select * from t2 for update; a @@ -57,10 +57,10 @@ a 22 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No # set global max_relay_log_size=0; stop slave; -change master to master_log_pos=534; +change master to master_log_pos=536; begin; select * from t2 for update; a @@ -77,5 +77,5 @@ a 22 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No # drop table t1,t2; diff --git a/mysql-test/r/rpl_error_ignored_table.result b/mysql-test/r/rpl_error_ignored_table.result index cf207270ca8..a5e025078b9 100644 --- a/mysql-test/r/rpl_error_ignored_table.result +++ b/mysql-test/r/rpl_error_ignored_table.result @@ -9,7 +9,7 @@ insert into t1 values (1),(1); ERROR 23000: Duplicate entry '1' for key 1 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 288 # # master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 288 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 290 # # master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 290 # None 0 No # show tables like 't1'; Tables_in_test (t1) drop table t1; @@ -26,14 +26,14 @@ select (@id := id) - id from t3; 0 kill @id; drop table t2,t3; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 195 use `test`; create table t1 (a int primary key) -master-bin.000001 195 Query 1 288 use `test`; insert into t1 values (1),(1) -master-bin.000001 288 Query 1 365 use `test`; drop table t1 -master-bin.000001 365 Query 1 464 use `test`; create table t2 (a int primary key) -master-bin.000001 464 Query 1 552 use `test`; insert into t2 values(1) -master-bin.000001 552 Query 1 640 use `test`; create table t3 (id int) -master-bin.000001 640 Query 1 742 use `test`; insert into t3 values(connection_id()) -master-bin.000001 742 Query 1 862 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10) -master-bin.000001 862 Query 1 942 use `test`; drop table t2,t3 +master-bin.000001 # Query 1 # use `test`; create table t1 (a int primary key) +master-bin.000001 # Query 1 # use `test`; insert into t1 values (1),(1) +master-bin.000001 # Query 1 # use `test`; drop table t1 +master-bin.000001 # Query 1 # use `test`; create table t2 (a int primary key) +master-bin.000001 # Query 1 # use `test`; insert into t2 values(1) +master-bin.000001 # Query 1 # use `test`; create table t3 (id int) +master-bin.000001 # Query 1 # use `test`; insert into t3 values(connection_id()) +master-bin.000001 # Query 1 # use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10) +master-bin.000001 # Query 1 # use `test`; drop table t2,t3 diff --git a/mysql-test/r/rpl_flush_log_loop.result b/mysql-test/r/rpl_flush_log_loop.result index d0e1c975312..083db5f440d 100644 --- a/mysql-test/r/rpl_flush_log_loop.result +++ b/mysql-test/r/rpl_flush_log_loop.result @@ -14,4 +14,4 @@ start slave; flush logs; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root SLAVE_PORT 60 slave-bin.000001 207 # # slave-bin.000001 Yes Yes 0 0 207 # None 0 No # +# 127.0.0.1 root SLAVE_PORT 60 slave-bin.000001 209 # # slave-bin.000001 Yes Yes 0 0 209 # None 0 No # diff --git a/mysql-test/r/rpl_flush_tables.result b/mysql-test/r/rpl_flush_tables.result index 0c52344e8a2..ca2e77cac66 100644 --- a/mysql-test/r/rpl_flush_tables.result +++ b/mysql-test/r/rpl_flush_tables.result @@ -14,27 +14,27 @@ rename table t1 to t5, t2 to t1; flush no_write_to_binlog tables; show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: SERVER_VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 183 use `test`; create table t1 (a int) -master-bin.000001 183 Query 1 273 use `test`; insert into t1 values (10) -master-bin.000001 273 Query 1 360 use `test`; create table t2 (a int) -master-bin.000001 360 Query 1 470 use `test`; create table t3 (a int) engine=merge union(t1) -master-bin.000001 470 Query 1 557 use `test`; create table t4 (a int) -master-bin.000001 557 Query 1 652 use `test`; insert into t4 select * from t3 -master-bin.000001 652 Query 1 747 use `test`; rename table t1 to t5, t2 to t1 +master-bin.000001 # Format_desc 1 # Server ver: SERVER_VERSION, Binlog ver: 4 +master-bin.000001 # Query 1 # use `test`; create table t1 (a int) +master-bin.000001 # Query 1 # use `test`; insert into t1 values (10) +master-bin.000001 # Query 1 # use `test`; create table t2 (a int) +master-bin.000001 # Query 1 # use `test`; create table t3 (a int) engine=merge union(t1) +master-bin.000001 # Query 1 # use `test`; create table t4 (a int) +master-bin.000001 # Query 1 # use `test`; insert into t4 select * from t3 +master-bin.000001 # Query 1 # use `test`; rename table t1 to t5, t2 to t1 select * from t3; a flush tables; show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: SERVER_VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 183 use `test`; create table t1 (a int) -master-bin.000001 183 Query 1 273 use `test`; insert into t1 values (10) -master-bin.000001 273 Query 1 360 use `test`; create table t2 (a int) -master-bin.000001 360 Query 1 470 use `test`; create table t3 (a int) engine=merge union(t1) -master-bin.000001 470 Query 1 557 use `test`; create table t4 (a int) -master-bin.000001 557 Query 1 652 use `test`; insert into t4 select * from t3 -master-bin.000001 652 Query 1 747 use `test`; rename table t1 to t5, t2 to t1 -master-bin.000001 747 Query 1 823 use `test`; flush tables +master-bin.000001 # Format_desc 1 # Server ver: SERVER_VERSION, Binlog ver: 4 +master-bin.000001 # Query 1 # use `test`; create table t1 (a int) +master-bin.000001 # Query 1 # use `test`; insert into t1 values (10) +master-bin.000001 # Query 1 # use `test`; create table t2 (a int) +master-bin.000001 # Query 1 # use `test`; create table t3 (a int) engine=merge union(t1) +master-bin.000001 # Query 1 # use `test`; create table t4 (a int) +master-bin.000001 # Query 1 # use `test`; insert into t4 select * from t3 +master-bin.000001 # Query 1 # use `test`; rename table t1 to t5, t2 to t1 +master-bin.000001 # Query 1 # use `test`; flush tables select * from t3; a diff --git a/mysql-test/r/rpl_loaddata.result b/mysql-test/r/rpl_loaddata.result index 32aa02c31e1..4060910c079 100644 --- a/mysql-test/r/rpl_loaddata.result +++ b/mysql-test/r/rpl_loaddata.result @@ -22,7 +22,7 @@ day id category name 2003-03-22 2416 a bbbbb show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -slave-bin.000001 1097 +slave-bin.000001 1292 drop table t1; drop table t2; drop table t3; @@ -33,7 +33,7 @@ set global sql_slave_skip_counter=1; start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1560 # # master-bin.000001 Yes Yes 0 0 1560 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1800 # # master-bin.000001 Yes Yes 0 0 1800 # None 0 No # set sql_log_bin=0; delete from t1; set sql_log_bin=1; @@ -43,7 +43,7 @@ change master to master_user='test'; change master to master_user='root'; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1668 # # master-bin.000001 No No 0 0 1668 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1835 # # master-bin.000001 No No 0 0 1835 # None 0 No # set global sql_slave_skip_counter=1; start slave; set sql_log_bin=0; @@ -64,5 +64,5 @@ terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by ERROR 23000: Duplicate entry '2003-03-22' for key 1 show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 537 +master-bin.000001 441 drop table t2; diff --git a/mysql-test/r/rpl_loaddata_rule_m.result b/mysql-test/r/rpl_loaddata_rule_m.result index 86165d5a2f9..3571c9973ea 100644 --- a/mysql-test/r/rpl_loaddata_rule_m.result +++ b/mysql-test/r/rpl_loaddata_rule_m.result @@ -10,8 +10,10 @@ create database mysqltest; create table t1(a int, b int, unique(b)); use mysqltest; load data infile '../../std_data/rpl_loaddata.dat' into table test.t1; -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 198 drop database if exists mysqltest -master-bin.000001 198 Query 1 292 create database mysqltest +master-bin.000001 # Query 1 # drop database if exists mysqltest +master-bin.000001 # Query 1 # create database mysqltest +master-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=12 +master-bin.000001 # Execute_load_query 1 # use `mysqltest`; load data infile '../../std_data/rpl_loaddata.dat' into table test.t1 ;file_id=1 drop database mysqltest; diff --git a/mysql-test/r/rpl_loaddata_rule_s.result b/mysql-test/r/rpl_loaddata_rule_s.result index 6cd91ea5bf5..16720c81374 100644 --- a/mysql-test/r/rpl_loaddata_rule_s.result +++ b/mysql-test/r/rpl_loaddata_rule_s.result @@ -10,5 +10,5 @@ load data infile '../../std_data/rpl_loaddata.dat' into table test.t1; select count(*) from t1; count(*) 2 -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info diff --git a/mysql-test/r/rpl_loaddatalocal.result b/mysql-test/r/rpl_loaddatalocal.result index b49ea842485..c29825c3c98 100644 --- a/mysql-test/r/rpl_loaddatalocal.result +++ b/mysql-test/r/rpl_loaddatalocal.result @@ -12,3 +12,20 @@ select a,count(*) from t1 group by a; a count(*) 1 10000 drop table t1; +create table t1(a int); +insert into t1 values (1), (2), (2), (3); +select * into outfile '../../var/master-data/rpl_loaddatalocal.select_outfile' from t1; +drop table t1; +create table t1(a int primary key); +load data local infile './var/master-data/rpl_loaddatalocal.select_outfile' into table t1; +select * from t1; +a +1 +2 +3 +select * from t1; +a +1 +2 +3 +drop table t1; diff --git a/mysql-test/r/rpl_log.result b/mysql-test/r/rpl_log.result index 383c13a4747..85b27dcad34 100644 --- a/mysql-test/r/rpl_log.result +++ b/mysql-test/r/rpl_log.result @@ -19,25 +19,25 @@ count(*) drop table t1; show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -master-bin.000001 218 Intvar 1 246 INSERT_ID=1 -master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL) -master-bin.000001 338 Query 1 415 use `test`; drop table t1 -master-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null) -master-bin.000001 519 Create_file 1 1189 db=test;table=t1;file_id=1;block_len=581 -master-bin.000001 1189 Exec_load 1 1212 ;file_id=1 -master-bin.000001 1212 Query 1 1289 use `test`; drop table t1 -show binlog events from 96 limit 1; +master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +master-bin.000001 220 Intvar 1 248 INSERT_ID=1 +master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL) +master-bin.000001 340 Query 1 417 use `test`; drop table t1 +master-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null) +master-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581 +master-bin.000001 1125 Execute_load_query 1 1274 use `test`; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines ;file_id=1 +master-bin.000001 1274 Query 1 1351 use `test`; drop table t1 +show binlog events from 98 limit 1; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -show binlog events from 96 limit 2; +master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +show binlog events from 98 limit 2; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -master-bin.000001 218 Intvar 1 246 INSERT_ID=1 -show binlog events from 96 limit 2,1; +master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +master-bin.000001 220 Intvar 1 248 INSERT_ID=1 +show binlog events from 98 limit 2,1; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL) +master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL) flush logs; create table t5 (a int); drop table t5; @@ -49,24 +49,24 @@ insert into t1 values (1); drop table t1; show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -master-bin.000001 218 Intvar 1 246 INSERT_ID=1 -master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL) -master-bin.000001 338 Query 1 415 use `test`; drop table t1 -master-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null) -master-bin.000001 519 Create_file 1 1189 db=test;table=t1;file_id=1;block_len=581 -master-bin.000001 1189 Exec_load 1 1212 ;file_id=1 -master-bin.000001 1212 Query 1 1289 use `test`; drop table t1 -master-bin.000001 1289 Rotate 1 1333 master-bin.000002;pos=4 +master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +master-bin.000001 220 Intvar 1 248 INSERT_ID=1 +master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL) +master-bin.000001 340 Query 1 417 use `test`; drop table t1 +master-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null) +master-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581 +master-bin.000001 1125 Execute_load_query 1 1274 use `test`; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines ;file_id=1 +master-bin.000001 1274 Query 1 1351 use `test`; drop table t1 +master-bin.000001 1351 Rotate 1 1395 master-bin.000002;pos=4 show binlog events in 'master-bin.000002'; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000002 96 Query 1 183 use `test`; create table t5 (a int) -master-bin.000002 183 Query 1 260 use `test`; drop table t5 -master-bin.000002 260 Query 1 347 use `test`; create table t1 (n int) -master-bin.000002 347 Query 1 436 use `test`; insert into t1 values (1) -master-bin.000002 436 Query 1 513 use `test`; drop table t1 +master-bin.000002 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 +master-bin.000002 98 Query 1 185 use `test`; create table t5 (a int) +master-bin.000002 185 Query 1 262 use `test`; drop table t5 +master-bin.000002 262 Query 1 349 use `test`; create table t1 (n int) +master-bin.000002 349 Query 1 438 use `test`; insert into t1 values (1) +master-bin.000002 438 Query 1 515 use `test`; drop table t1 show binary logs; Log_name master-bin.000001 @@ -78,26 +78,26 @@ slave-bin.000001 slave-bin.000002 show binlog events in 'slave-bin.000001' from 4; Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000001 4 Format_desc 2 96 Server ver: VERSION, Binlog ver: 4 -slave-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -slave-bin.000001 218 Intvar 1 246 INSERT_ID=1 -slave-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL) -slave-bin.000001 338 Query 1 415 use `test`; drop table t1 -slave-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null) -slave-bin.000001 519 Create_file 1 1198 db=test;table=t1;file_id=1;block_len=581 -slave-bin.000001 1198 Exec_load 1 1221 ;file_id=1 -slave-bin.000001 1221 Query 1 1298 use `test`; drop table t1 -slave-bin.000001 1298 Query 1 1385 use `test`; create table t5 (a int) -slave-bin.000001 1385 Query 1 1462 use `test`; drop table t5 -slave-bin.000001 1462 Rotate 2 1505 slave-bin.000002;pos=4 +slave-bin.000001 4 Format_desc 2 98 Server ver: VERSION, Binlog ver: 4 +slave-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +slave-bin.000001 220 Intvar 1 248 INSERT_ID=1 +slave-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL) +slave-bin.000001 340 Query 1 417 use `test`; drop table t1 +slave-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null) +slave-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581 +slave-bin.000001 1125 Execute_load_query 1 1283 use `test`; load data INFILE '../../var/tmp/SQL_LOAD-2-1-1.data' INTO table t1 ignore 1 lines ;file_id=1 +slave-bin.000001 1283 Query 1 1360 use `test`; drop table t1 +slave-bin.000001 1360 Query 1 1447 use `test`; create table t5 (a int) +slave-bin.000001 1447 Query 1 1524 use `test`; drop table t5 +slave-bin.000001 1524 Rotate 2 1567 slave-bin.000002;pos=4 show binlog events in 'slave-bin.000002' from 4; Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 4 Format_desc 2 96 Server ver: VERSION, Binlog ver: 4 -slave-bin.000002 96 Query 1 183 use `test`; create table t1 (n int) -slave-bin.000002 183 Query 1 272 use `test`; insert into t1 values (1) -slave-bin.000002 272 Query 1 349 use `test`; drop table t1 +slave-bin.000002 4 Format_desc 2 98 Server ver: VERSION, Binlog ver: 4 +slave-bin.000002 98 Query 1 185 use `test`; create table t1 (n int) +slave-bin.000002 185 Query 1 274 use `test`; insert into t1 values (1) +slave-bin.000002 274 Query 1 351 use `test`; drop table t1 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 513 # # master-bin.000002 Yes Yes 0 0 513 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 515 # # master-bin.000002 Yes Yes 0 0 515 # None 0 No # show binlog events in 'slave-bin.000005' from 4; ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log diff --git a/mysql-test/r/rpl_log_pos.result b/mysql-test/r/rpl_log_pos.result index 60262c5e227..cf13756966e 100644 --- a/mysql-test/r/rpl_log_pos.result +++ b/mysql-test/r/rpl_log_pos.result @@ -6,10 +6,10 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 96 +master-bin.000001 98 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No # stop slave; change master to master_log_pos=73; start slave; @@ -30,13 +30,13 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File # 127.0.0.1 root MASTER_PORT 1 master-bin.000001 173 # # master-bin.000001 No Yes 0 0 173 # None 0 No # show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 96 +master-bin.000001 98 create table if not exists t1 (n int); drop table if exists t1; create table t1 (n int); insert into t1 values (1),(2),(3); stop slave; -change master to master_log_pos=96; +change master to master_log_pos=98; start slave; select * from t1; n diff --git a/mysql-test/r/rpl_max_relay_size.result b/mysql-test/r/rpl_max_relay_size.result index d56dedbbdca..56cbe4d5ac8 100644 --- a/mysql-test/r/rpl_max_relay_size.result +++ b/mysql-test/r/rpl_max_relay_size.result @@ -16,7 +16,7 @@ select @@global.max_relay_log_size; start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No # stop slave; reset slave; set global max_relay_log_size=(5*4096); @@ -26,7 +26,7 @@ select @@global.max_relay_log_size; start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No # stop slave; reset slave; set global max_relay_log_size=0; @@ -36,7 +36,7 @@ select @@global.max_relay_log_size; start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No # stop slave; reset slave; flush logs; @@ -49,13 +49,13 @@ flush logs; create table t1 (a int); show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73839 # # master-bin.000001 Yes Yes 0 0 73839 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73841 # # master-bin.000001 Yes Yes 0 0 73841 # None 0 No # flush logs; drop table t1; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73916 # # master-bin.000001 Yes Yes 0 0 73916 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73918 # # master-bin.000001 Yes Yes 0 0 73918 # None 0 No # flush logs; show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000002 96 +master-bin.000002 98 diff --git a/mysql-test/r/rpl_multi_query.result b/mysql-test/r/rpl_multi_query.result index e5883ac9299..f2d8ea77536 100644 --- a/mysql-test/r/rpl_multi_query.result +++ b/mysql-test/r/rpl_multi_query.result @@ -19,7 +19,7 @@ n 3 4 5 -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query 1 # drop database if exists mysqltest master-bin.000001 # Query 1 # create database mysqltest diff --git a/mysql-test/r/rpl_relayrotate.result b/mysql-test/r/rpl_relayrotate.result index 581efe52d7c..0135e90dce9 100644 --- a/mysql-test/r/rpl_relayrotate.result +++ b/mysql-test/r/rpl_relayrotate.result @@ -18,5 +18,5 @@ max(a) 8000 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 743186 # # master-bin.000001 Yes Yes 0 0 743186 # None 0 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 743188 # # master-bin.000001 Yes Yes 0 0 743188 # None 0 No # drop table t1; diff --git a/mysql-test/r/rpl_replicate_do.result b/mysql-test/r/rpl_replicate_do.result index ec065c10e48..469504d06b4 100644 --- a/mysql-test/r/rpl_replicate_do.result +++ b/mysql-test/r/rpl_replicate_do.result @@ -28,4 +28,4 @@ ERROR 42S02: Table 'test.t11' doesn't exist drop table if exists t1,t2,t11; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1618 # # master-bin.000001 Yes Yes test.t1 0 0 1618 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1668 # # master-bin.000001 Yes Yes test.t1 0 0 1668 # None 0 No # diff --git a/mysql-test/r/rpl_reset_slave.result b/mysql-test/r/rpl_reset_slave.result index 82e518c355c..ab55423b773 100644 --- a/mysql-test/r/rpl_reset_slave.result +++ b/mysql-test/r/rpl_reset_slave.result @@ -6,12 +6,12 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No # stop slave; change master to master_user='test'; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 test MASTER_PORT 1 master-bin.000001 96 # # master-bin.000001 No No 0 0 96 # None 0 No # +# 127.0.0.1 test MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 No No 0 0 98 # None 0 No # reset slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master @@ -19,7 +19,7 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File start slave; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No # +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No # stop slave; reset slave; start slave; diff --git a/mysql-test/r/rpl_rotate_logs.result b/mysql-test/r/rpl_rotate_logs.result index ec29a01db10..bd2e6dd685f 100644 --- a/mysql-test/r/rpl_rotate_logs.result +++ b/mysql-test/r/rpl_rotate_logs.result @@ -16,7 +16,7 @@ create table t1 (s text); insert into t1 values('Could not break slave'),('Tried hard'); show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 60 master-bin.000001 550 # # master-bin.000001 Yes Yes 0 0 550 # None 0 No # +# 127.0.0.1 root MASTER_PORT 60 master-bin.000001 552 # # master-bin.000001 Yes Yes 0 0 552 # None 0 No # select * from t1; s Could not break slave @@ -57,7 +57,7 @@ master-bin.000003 insert into t2 values (65); show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 60 master-bin.000003 498 # # master-bin.000003 Yes Yes 0 0 498 # None 0 No # +# 127.0.0.1 root MASTER_PORT 60 master-bin.000003 500 # # master-bin.000003 Yes Yes 0 0 500 # None 0 No # select * from t2; m 34 @@ -79,13 +79,13 @@ master-bin.000004 master-bin.000005 show master status; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000005 2051 +master-bin.000005 2146 select * from t4; a testing temporary tables part 2 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_PORT 60 master-bin.000005 2051 # # master-bin.000005 Yes Yes 0 0 2051 # None 0 No # +# 127.0.0.1 root MASTER_PORT 60 master-bin.000005 2146 # # master-bin.000005 Yes Yes 0 0 2146 # None 0 No # lock tables t3 read; select count(*) from t3 where n >= 4; count(*) diff --git a/mysql-test/r/rpl_server_id1.result b/mysql-test/r/rpl_server_id1.result index fd8d73d5444..a3ab6672f69 100644 --- a/mysql-test/r/rpl_server_id1.result +++ b/mysql-test/r/rpl_server_id1.result @@ -10,7 +10,7 @@ stop slave; change master to master_port=SLAVE_PORT; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master - 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 96 None 0 No NULL + 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 98 None 0 No NULL start slave; insert into t1 values (1); show status like "slave_running"; diff --git a/mysql-test/r/rpl_server_id2.result b/mysql-test/r/rpl_server_id2.result index 7ca88521b22..b196646aecc 100644 --- a/mysql-test/r/rpl_server_id2.result +++ b/mysql-test/r/rpl_server_id2.result @@ -10,7 +10,7 @@ stop slave; change master to master_port=SLAVE_PORT; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master - 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 96 None 0 No NULL + 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 98 None 0 No NULL start slave; insert into t1 values (1); select * from t1; diff --git a/mysql-test/r/rpl_temporary.result b/mysql-test/r/rpl_temporary.result index 9394c40c77f..445a330f196 100644 --- a/mysql-test/r/rpl_temporary.result +++ b/mysql-test/r/rpl_temporary.result @@ -38,19 +38,19 @@ f 7 show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 186 use `test`; drop table if exists t1,t2 -master-bin.000001 186 Query 1 272 use `test`; create table t1(f int) -master-bin.000001 272 Query 1 358 use `test`; create table t2(f int) -master-bin.000001 358 Query 1 484 use `test`; insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) -master-bin.000001 484 Query 1 580 use `test`; create temporary table t3(f int) -master-bin.000001 580 Query 1 685 use `test`; insert into t3 select * from t1 where f<6 -master-bin.000001 685 Query 1 781 use `test`; create temporary table t3(f int) -master-bin.000001 781 Query 1 883 use `test`; insert into t2 select count(*) from t3 -master-bin.000001 883 Query 1 989 use `test`; insert into t3 select * from t1 where f>=4 -master-bin.000001 989 Query 1 1076 use `test`; drop temporary table t3 -master-bin.000001 1076 Query 1 1178 use `test`; insert into t2 select count(*) from t3 -master-bin.000001 1178 Query 1 1265 use `test`; drop temporary table t3 +master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 +master-bin.000001 # Query 1 # use `test`; drop table if exists t1,t2 +master-bin.000001 # Query 1 # use `test`; create table t1(f int) +master-bin.000001 # Query 1 # use `test`; create table t2(f int) +master-bin.000001 # Query 1 # use `test`; insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10) +master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int) +master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f<6 +master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int) +master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3 +master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f>=4 +master-bin.000001 # Query 1 # use `test`; drop temporary table t3 +master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3 +master-bin.000001 # Query 1 # use `test`; drop temporary table t3 drop table t1, t2; use test; SET TIMESTAMP=1040323920; diff --git a/mysql-test/r/rpl_timezone.result b/mysql-test/r/rpl_timezone.result index d39b9f242bc..cd2c4d099be 100644 --- a/mysql-test/r/rpl_timezone.result +++ b/mysql-test/r/rpl_timezone.result @@ -32,13 +32,13 @@ t 2004-06-11 09:39:02 show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 189 use `test`; create table t1 (t timestamp) -master-bin.000001 189 Query 1 281 use `test`; create table t2 (t char(32)) -master-bin.000001 281 Query 1 373 use `test`; SET ONE_SHOT TIME_ZONE='UTC' -master-bin.000001 373 Query 1 497 use `test`; insert into t1 values ('20040101000000'), ('20040611093902') -master-bin.000001 497 Query 1 575 use `test`; delete from t1 -master-bin.000001 575 Query 1 699 use `test`; insert into t1 values ('20040101000000'), ('20040611093902') +master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4 +master-bin.000001 # Query 1 # use `test`; create table t1 (t timestamp) +master-bin.000001 # Query 1 # use `test`; create table t2 (t char(32)) +master-bin.000001 # Query 1 # use `test`; SET ONE_SHOT TIME_ZONE='UTC' +master-bin.000001 # Query 1 # use `test`; insert into t1 values ('20040101000000'), ('20040611093902') +master-bin.000001 # Query 1 # use `test`; delete from t1 +master-bin.000001 # Query 1 # use `test`; insert into t1 values ('20040101000000'), ('20040611093902') set time_zone='MET'; insert into t2 (select t from t1); select * from t1; diff --git a/mysql-test/r/rpl_until.result b/mysql-test/r/rpl_until.result index 1e1b1bbd44a..c9f9aa7b029 100644 --- a/mysql-test/r/rpl_until.result +++ b/mysql-test/r/rpl_until.result @@ -14,15 +14,15 @@ insert into t2 values (3),(4); drop table t2; show binlog events; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4 -master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key) -master-bin.000001 218 Query 1 319 use `test`; insert into t1 values (1),(2),(3),(4) -master-bin.000001 319 Query 1 396 use `test`; drop table t1 -master-bin.000001 396 Query 1 518 use `test`; create table t2(n int not null auto_increment primary key) -master-bin.000001 518 Query 1 611 use `test`; insert into t2 values (1),(2) -master-bin.000001 611 Query 1 704 use `test`; insert into t2 values (3),(4) -master-bin.000001 704 Query 1 781 use `test`; drop table t2 -start slave until master_log_file='master-bin.000001', master_log_pos=304; +master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key) +master-bin.000001 220 Query 1 321 use `test`; insert into t1 values (1),(2),(3),(4) +master-bin.000001 321 Query 1 398 use `test`; drop table t1 +master-bin.000001 398 Query 1 520 use `test`; create table t2(n int not null auto_increment primary key) +master-bin.000001 520 Query 1 613 use `test`; insert into t2 values (1),(2) +master-bin.000001 613 Query 1 706 use `test`; insert into t2 values (3),(4) +master-bin.000001 706 Query 1 783 use `test`; drop table t2 +start slave until master_log_file='master-bin.000001', master_log_pos=321; select * from t1; n 1 @@ -31,7 +31,7 @@ n 4 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 319 # Master master-bin.000001 304 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 321 # Master master-bin.000001 321 No # start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291; select * from t1; n @@ -41,21 +41,21 @@ n 4 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 319 # Master master-no-such-bin.000001 291 No # -start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=710; +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 321 # Master master-no-such-bin.000001 291 No # +start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=751; select * from t2; n 1 2 show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 611 # Relay slave-relay-bin.000004 710 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 613 # Relay slave-relay-bin.000004 751 No # start slave; stop slave; -start slave until master_log_file='master-bin.000001', master_log_pos=710; +start slave until master_log_file='master-bin.000001', master_log_pos=783; show slave status; Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master -# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 781 # Master master-bin.000001 710 No # +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 783 # Master master-bin.000001 783 No # start slave until master_log_file='master-bin', master_log_pos=561; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12; @@ -67,6 +67,6 @@ ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UN start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL start slave sql_thread; -start slave until master_log_file='master-bin.000001', master_log_pos=710; +start slave until master_log_file='master-bin.000001', master_log_pos=783; Warnings: Note 1254 Slave is already running diff --git a/mysql-test/r/rpl_user_variables.result b/mysql-test/r/rpl_user_variables.result index 0d6c717442e..4198bbcc154 100644 --- a/mysql-test/r/rpl_user_variables.result +++ b/mysql-test/r/rpl_user_variables.result @@ -76,35 +76,35 @@ abcn1n2 NULL NULL NULL -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000001 96 Query 1 187 use `test`; create table t1(n char(30)) -slave-bin.000001 187 User var 2 230 @`i1`=12345678901234 -slave-bin.000001 230 User var 2 273 @`i2`=-12345678901234 -slave-bin.000001 273 User var 2 316 @`i3`=0 -slave-bin.000001 316 User var 2 359 @`i4`=-1 -slave-bin.000001 359 Query 1 471 use `test`; insert into t1 values (@i1), (@i2), (@i3), (@i4) -slave-bin.000001 471 User var 2 510 @`r1`=12.5 -slave-bin.000001 510 User var 2 549 @`r2`=-12.5 -slave-bin.000001 549 Query 1 647 use `test`; insert into t1 values (@r1), (@r2) -slave-bin.000001 647 User var 2 696 @`s1`=_latin1 0x5468697320697320612074657374 COLLATE latin1_swedish_ci -slave-bin.000001 696 User var 2 731 @`s2`=_latin1 "" COLLATE latin1_swedish_ci -slave-bin.000001 731 User var 2 773 @`s3`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci -slave-bin.000001 773 User var 2 815 @`s4`=_latin1 0x6162635C646566 COLLATE latin1_swedish_ci -slave-bin.000001 815 User var 2 857 @`s5`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci -slave-bin.000001 857 Query 1 976 use `test`; insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5) -slave-bin.000001 976 User var 2 1002 @`n1`=NULL -slave-bin.000001 1002 Query 1 1093 use `test`; insert into t1 values (@n1) -slave-bin.000001 1093 User var 2 1119 @`n2`=NULL -slave-bin.000001 1119 Query 1 1210 use `test`; insert into t1 values (@n2) -slave-bin.000001 1210 Query 1 1327 use `test`; insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1) -slave-bin.000001 1327 User var 2 1369 @`a`=2 -slave-bin.000001 1369 Query 1 1470 use `test`; insert into t1 values (@a+(@b:=@a+1)) -slave-bin.000001 1470 User var 2 1507 @`q`=_latin1 0x616263 COLLATE latin1_swedish_ci -slave-bin.000001 1507 Query 1 1640 use `test`; insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2')) -slave-bin.000001 1640 User var 2 1682 @`a`=5 -slave-bin.000001 1682 Query 1 1777 use `test`; insert into t1 values (@a),(@a) -slave-bin.000001 1777 User var 2 1802 @`a`=NULL -slave-bin.000001 1802 Query 1 1904 use `test`; insert into t1 values (@a),(@a),(@a*5) +slave-bin.000001 # Query 1 # use `test`; create table t1(n char(30)) +slave-bin.000001 # User var 2 # @`i1`=12345678901234 +slave-bin.000001 # User var 2 # @`i2`=-12345678901234 +slave-bin.000001 # User var 2 # @`i3`=0 +slave-bin.000001 # User var 2 # @`i4`=-1 +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@i1), (@i2), (@i3), (@i4) +slave-bin.000001 # User var 2 # @`r1`=12.5 +slave-bin.000001 # User var 2 # @`r2`=-12.5 +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@r1), (@r2) +slave-bin.000001 # User var 2 # @`s1`=_latin1 0x5468697320697320612074657374 COLLATE latin1_swedish_ci +slave-bin.000001 # User var 2 # @`s2`=_latin1 "" COLLATE latin1_swedish_ci +slave-bin.000001 # User var 2 # @`s3`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci +slave-bin.000001 # User var 2 # @`s4`=_latin1 0x6162635C646566 COLLATE latin1_swedish_ci +slave-bin.000001 # User var 2 # @`s5`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5) +slave-bin.000001 # User var 2 # @`n1`=NULL +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@n1) +slave-bin.000001 # User var 2 # @`n2`=NULL +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@n2) +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1) +slave-bin.000001 # User var 2 # @`a`=2 +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a+(@b:=@a+1)) +slave-bin.000001 # User var 2 # @`q`=_latin1 0x616263 COLLATE latin1_swedish_ci +slave-bin.000001 # Query 1 # use `test`; insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2')) +slave-bin.000001 # User var 2 # @`a`=5 +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a),(@a) +slave-bin.000001 # User var 2 # @`a`=NULL +slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a),(@a),(@a*5) drop table t1; stop slave; diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result index 4bc85a10638..4b2eef20a6b 100644 --- a/mysql-test/r/user_var.result +++ b/mysql-test/r/user_var.result @@ -176,13 +176,13 @@ INSERT INTO t1 VALUES(@`a b`); set @var1= "';aaa"; SET @var2=char(ascii('a')); insert into t1 values (@var1),(@var2); -show binlog events from 96; +show binlog events from 98; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 96 User var 1 137 @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci -master-bin.000001 137 Query 1 230 use `test`; INSERT INTO t1 VALUES(@`a b`) -master-bin.000001 230 User var 1 272 @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci -master-bin.000001 272 User var 1 310 @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci -master-bin.000001 310 Query 1 411 use `test`; insert into t1 values (@var1),(@var2) +master-bin.000001 # User var 1 # @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci +master-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES(@`a b`) +master-bin.000001 # User var 1 # @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci +master-bin.000001 # User var 1 # @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci +master-bin.000001 # Query 1 # use `test`; insert into t1 values (@var1),(@var2) /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; ROLLBACK; diff --git a/mysql-test/std_data/loaddata5.dat b/mysql-test/std_data/loaddata5.dat new file mode 100644 index 00000000000..6e1881bd8e2 --- /dev/null +++ b/mysql-test/std_data/loaddata5.dat @@ -0,0 +1,3 @@ +1 2 +3 4 +5 6 diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 7d34c4504bd..151e2cf5464 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -338,7 +338,8 @@ create table t2 (c char(30)) charset=ucs2; set @v=convert('abc' using ucs2); reset master; insert into t2 values (@v); -show binlog events from 96; +--replace_column 2 # 5 # +show binlog events from 98; # more important than SHOW BINLOG EVENTS, mysqlbinlog (where we # absolutely need variables names to be quoted and strings to be # escaped). diff --git a/mysql-test/t/insert_select.test b/mysql-test/t/insert_select.test index a5b163b3533..371df339b57 100644 --- a/mysql-test/t/insert_select.test +++ b/mysql-test/t/insert_select.test @@ -85,6 +85,7 @@ insert into t1 select * from t2; # verify the binlog : let $VERSION=`select version()`; --replace_result $VERSION VERSION +--replace_column 2 # 5 # show binlog events; select * from t1; drop table t1, t2; @@ -99,6 +100,7 @@ create table t2(unique(a)) select a from t1; # The above should produce an error, *and* not appear in the binlog let $VERSION=`select version()`; --replace_result $VERSION VERSION +--replace_column 2 # 5 # show binlog events; drop table t1; diff --git a/mysql-test/t/loaddata.test b/mysql-test/t/loaddata.test index aa0ea0a2f55..14ef749c802 100644 --- a/mysql-test/t/loaddata.test +++ b/mysql-test/t/loaddata.test @@ -3,7 +3,7 @@ # --disable_warnings -drop table if exists t1; +drop table if exists t1, t2; --enable_warnings create table t1 (a date, b date, c date not null, d date); @@ -31,3 +31,46 @@ load data infile '../../std_data/loaddata4.dat' into table t1 fields terminated select * from t1; drop table t1; +# +# Let us test extended LOAD DATA features +# +create table t1 (a int default 100, b int, c varchar(60)); +# we can do something like this +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b); +select * from t1; +truncate table t1; +# we can use filled fields in expressions +# we also assigning NULL value to field with non-NULL default here +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set c= if(a is null,"oops",a); +select * from t1; +truncate table t1; +# we even can use variables in set clause, and missed columns will be set +# with default values +set @c:=123; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, b) set c= if(@a is null,@c,b); +select * from t1; +# let us test side-effect of such load +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, @b); +select * from t1; +select @a, @b; +truncate table t1; +# now going to test fixed field-row file format +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c="Wow"; +select * from t1; +truncate table t1; +# this also should work +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c=concat(a,"+",b,"+",@c,"+",b,"+",if(c is null,"NIL",c)); +select * from t1; +# and this should bark +--error 1409 +load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b); + +# Now let us test LOAD DATA with subselect +create table t2 (num int primary key, str varchar(10)); +insert into t2 values (10,'Ten'), (15,'Fifteen'); +truncate table t1; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n); +select * from t1; + +# cleanup +drop table t1, t2; diff --git a/mysql-test/t/mix_innodb_myisam_binlog.test b/mysql-test/t/mix_innodb_myisam_binlog.test index 08a81c850eb..9894359dfc0 100644 --- a/mysql-test/t/mix_innodb_myisam_binlog.test +++ b/mysql-test/t/mix_innodb_myisam_binlog.test @@ -27,7 +27,7 @@ commit; --replace_column 5 # --replace_result "xid=12" "xid=7" -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -40,7 +40,7 @@ insert into t2 select * from t1; rollback; --replace_column 5 # -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -56,7 +56,7 @@ commit; --replace_column 5 # --replace_result "xid=45" "xid=24" -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -74,7 +74,7 @@ select a from t1 order by a; # check that savepoints work :) --replace_column 5 # --replace_result "xid=67" "xid=36" -show binlog events from 96; +show binlog events from 98; # and when ROLLBACK is not explicit? delete from t1; @@ -95,7 +95,7 @@ connection con2; # logging has been done, we use a user lock. select get_lock("a",10); --replace_column 5 # -show binlog events from 96; +show binlog events from 98; # and when not in a transact1on? delete from t1; @@ -107,7 +107,7 @@ insert into t2 select * from t1; --replace_column 5 # --replace_result "xid=116" "xid=59" -show binlog events from 96; +show binlog events from 98; # Check that when the query updat1ng the MyISAM table is the first in the # transaction, we log it immediately. @@ -120,13 +120,13 @@ begin; insert into t2 select * from t1; --replace_column 5 # --replace_result "xid=130" "xid=65" -show binlog events from 96; +show binlog events from 98; insert into t1 values(11); commit; --replace_column 5 # --replace_result "xid=130" "xid=65" "xid=133" "xid=67" -show binlog events from 96; +show binlog events from 98; # Check that things work like before this BEGIN/ROLLBACK code was added, @@ -145,7 +145,7 @@ commit; --replace_column 5 # --replace_result "xid=152" "xid=77" -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -157,7 +157,7 @@ insert into t2 select * from t1; rollback; --replace_column 5 # -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -173,7 +173,7 @@ commit; --replace_column 5 # --replace_result "xid=184" "xid=93" -show binlog events from 96; +show binlog events from 98; delete from t1; delete from t2; @@ -191,7 +191,7 @@ select a from t1 order by a; # check that savepoints work :) --replace_column 5 # --replace_result "xid=205" "xid=104" -show binlog events from 96; +show binlog events from 98; # Test for BUG#5714, where a MyISAM update in the transaction used to # release row-level locks in InnoDB diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test index 3f2ab2b31ec..df3b0acaa11 100644 --- a/mysql-test/t/mysqlbinlog.test +++ b/mysql-test/t/mysqlbinlog.test @@ -24,7 +24,6 @@ load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; load data infile '../../std_data/words.dat' into table t1; -load data infile '../../std_data/words.dat' into table t1; # simple query to show more in second binlog insert into t1 values ("Alas"); flush logs; @@ -61,7 +60,7 @@ select "--- --database --" as ""; select "--- --position --" as ""; --enable_query_log --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR ---exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --position=119 $MYSQL_TEST_DIR/var/log/master-bin.000002 +--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --position=232 $MYSQL_TEST_DIR/var/log/master-bin.000002 # These are tests for remote binlog. # They should return the same as previous test. @@ -93,7 +92,7 @@ select "--- --database --" as ""; select "--- --position --" as ""; --enable_query_log --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR ---exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --read-from-remote-server --position=119 --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002 +--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --read-from-remote-server --position=232 --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002 # Bug#7853 (mysqlbinlog does not accept input from stdin) --disable_query_log diff --git a/mysql-test/t/mysqlbinlog2.test b/mysql-test/t/mysqlbinlog2.test index f2360d51c16..74ddf4e2be4 100644 --- a/mysql-test/t/mysqlbinlog2.test +++ b/mysql-test/t/mysqlbinlog2.test @@ -46,11 +46,11 @@ select "--- offset --" as ""; --disable_query_log select "--- start-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --start-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001 +--exec $MYSQL_BINLOG --short-form --start-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001 --disable_query_log select "--- stop-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --stop-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001 +--exec $MYSQL_BINLOG --short-form --stop-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001 --disable_query_log select "--- start-datetime --" as ""; --enable_query_log @@ -75,11 +75,11 @@ select "--- offset --" as ""; --disable_query_log select "--- start-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --start-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002 +--exec $MYSQL_BINLOG --short-form --start-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002 --disable_query_log select "--- stop-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --stop-position=124 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002 +--exec $MYSQL_BINLOG --short-form --stop-position=126 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002 --disable_query_log select "--- start-datetime --" as ""; --enable_query_log @@ -102,11 +102,11 @@ select "--- offset --" as ""; --disable_query_log select "--- start-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --start-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 +--exec $MYSQL_BINLOG --short-form --start-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 --disable_query_log select "--- stop-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --stop-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 +--exec $MYSQL_BINLOG --short-form --stop-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 --disable_query_log select "--- start-datetime --" as ""; --enable_query_log @@ -129,11 +129,11 @@ select "--- offset --" as ""; --disable_query_log select "--- start-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --start-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002 +--exec $MYSQL_BINLOG --short-form --start-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002 --disable_query_log select "--- stop-position --" as ""; --enable_query_log ---exec $MYSQL_BINLOG --short-form --stop-position=124 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002 +--exec $MYSQL_BINLOG --short-form --stop-position=126 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002 --disable_query_log select "--- start-datetime --" as ""; --enable_query_log diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 89f578dbb20..7264e6bbc3e 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1,5 +1,5 @@ --disable_warnings -DROP TABLE IF EXISTS t1, `"t"1`, t1aa,t2aa; +DROP TABLE IF EXISTS t1, `"t"1`, t1aa, t2, t2aa; drop database if exists mysqldump_test_db; drop view if exists v1; --enable_warnings diff --git a/mysql-test/t/rpl_charset.test b/mysql-test/t/rpl_charset.test index d2c195dfdbf..ee54bc72a65 100644 --- a/mysql-test/t/rpl_charset.test +++ b/mysql-test/t/rpl_charset.test @@ -107,7 +107,7 @@ connection master; drop database mysqltest2; drop database mysqltest3; --replace_column 2 # 5 # -show binlog events from 96; +show binlog events from 98; sync_slave_with_master; # Check that we can change global.collation_server (since 5.0.3) diff --git a/mysql-test/t/rpl_deadlock.test b/mysql-test/t/rpl_deadlock.test index aa474f79963..a196495e834 100644 --- a/mysql-test/t/rpl_deadlock.test +++ b/mysql-test/t/rpl_deadlock.test @@ -68,7 +68,7 @@ show slave status; # 2) Test lock wait timeout stop slave; -change master to master_log_pos=534; # the BEGIN log event +change master to master_log_pos=536; # the BEGIN log event begin; select * from t2 for update; # hold lock start slave; @@ -89,7 +89,7 @@ set global max_relay_log_size=0; # This is really copy-paste of 2) of above stop slave; -change master to master_log_pos=534; +change master to master_log_pos=536; begin; select * from t2 for update; start slave; diff --git a/mysql-test/t/rpl_error_ignored_table.test b/mysql-test/t/rpl_error_ignored_table.test index a520024b7da..5388b6af8d4 100644 --- a/mysql-test/t/rpl_error_ignored_table.test +++ b/mysql-test/t/rpl_error_ignored_table.test @@ -48,7 +48,8 @@ connection master; --error 0,1053; reap; connection master1; -show binlog events from 96; +--replace_column 2 # 5 # +show binlog events from 98; save_master_pos; connection slave; # SQL slave thread should not have stopped (because table of the killed diff --git a/mysql-test/t/rpl_flush_tables.test b/mysql-test/t/rpl_flush_tables.test index b98235fbed8..eb16ddcd8de 100644 --- a/mysql-test/t/rpl_flush_tables.test +++ b/mysql-test/t/rpl_flush_tables.test @@ -18,6 +18,7 @@ rename table t1 to t5, t2 to t1; flush no_write_to_binlog tables; # Check that it's not in the binlog. --replace_result $SERVER_VERSION SERVER_VERSION +--replace_column 2 # 5 # show binlog events; # Check that the master is not confused. select * from t3; @@ -25,6 +26,7 @@ select * from t3; flush tables; # Check that it's in the binlog. --replace_result $SERVER_VERSION SERVER_VERSION +--replace_column 2 # 5 # show binlog events; save_master_pos; connection slave; diff --git a/mysql-test/t/rpl_loaddata.test b/mysql-test/t/rpl_loaddata.test index 487ad4a7aa6..d1404dea211 100644 --- a/mysql-test/t/rpl_loaddata.test +++ b/mysql-test/t/rpl_loaddata.test @@ -36,8 +36,7 @@ select * from t3; # But we can't simply read this binlog, because as the slave has not been # restarted for this test, the file_id is uncertain (would cause test # failures). So instead, we test if the binlog looks long enough to -# contain LOAD DATA. That is, I (Guilhem) have done SHOW BINLOG EVENTS on my -# machine, saw that the binlog is of size 1068 (in 5.0.0) when things go fine. +# contain LOAD DATA. Since 5.0.3 we assume that binlog of 1292 is ok. # If LOAD DATA was not logged, the binlog would be shorter. show master status; @@ -84,7 +83,9 @@ set sql_log_bin=1; load data infile '../../std_data/rpl_loaddata.dat' into table t1; save_master_pos; connection slave; -# The SQL slave thread should be stopped now. +# The SQL slave thread should be stopped now. +# Exec_Master_Log_Pos should point to the start of Execute event +# for last load data. wait_for_slave_to_stop; # CHANGE MASTER and see if error is cleared in SHOW SLAVE STATUS. diff --git a/mysql-test/t/rpl_loaddata_rule_m.test b/mysql-test/t/rpl_loaddata_rule_m.test index ff00e8f4925..97c984c4369 100644 --- a/mysql-test/t/rpl_loaddata_rule_m.test +++ b/mysql-test/t/rpl_loaddata_rule_m.test @@ -19,5 +19,9 @@ create database mysqltest; create table t1(a int, b int, unique(b)); use mysqltest; load data infile '../../std_data/rpl_loaddata.dat' into table test.t1; -show binlog events from 96; # should be nothing +# Starting from 5.0.3 LOAD DATA is replicated much in the same way as ordinary +# query so "show binlog ..." should show two events (before 5.0.3 no events +# were returned). +--replace_column 2 # 5 # +show binlog events from 98; drop database mysqltest; diff --git a/mysql-test/t/rpl_loaddata_rule_s.test b/mysql-test/t/rpl_loaddata_rule_s.test index 71a3929da32..9802c00d35f 100644 --- a/mysql-test/t/rpl_loaddata_rule_s.test +++ b/mysql-test/t/rpl_loaddata_rule_s.test @@ -17,4 +17,4 @@ save_master_pos; connection slave; sync_with_master; select count(*) from t1; # check that LOAD was replicated -show binlog events from 96; # should be nothing +show binlog events from 98; # should be nothing diff --git a/mysql-test/t/rpl_loaddatalocal.test b/mysql-test/t/rpl_loaddatalocal.test index 70f4ab96b6a..f9325b39af6 100644 --- a/mysql-test/t/rpl_loaddatalocal.test +++ b/mysql-test/t/rpl_loaddatalocal.test @@ -34,3 +34,27 @@ drop table t1; save_master_pos; connection slave; sync_with_master; + +# +# Now let us test how well we replicate LOAD DATA LOCAL in situation when +# we met duplicates in tables to which we are adding rows. +# (It supposed that LOAD DATA LOCAL ignores such errors) +# +connection master; +create table t1(a int); +insert into t1 values (1), (2), (2), (3); +select * into outfile '../../var/master-data/rpl_loaddatalocal.select_outfile' from t1; +drop table t1; +create table t1(a int primary key); +load data local infile './var/master-data/rpl_loaddatalocal.select_outfile' into table t1; +system rm ./var/master-data/rpl_loaddatalocal.select_outfile ; +select * from t1; +save_master_pos; +connection slave; +sync_with_master; +select * from t1; +connection master; +drop table t1; +save_master_pos; +connection slave; +sync_with_master; diff --git a/mysql-test/t/rpl_log.test b/mysql-test/t/rpl_log.test index 055c1a7c93a..8cb99d5432e 100644 --- a/mysql-test/t/rpl_log.test +++ b/mysql-test/t/rpl_log.test @@ -38,9 +38,9 @@ select count(*) from t1; drop table t1; --replace_result $VERSION VERSION show binlog events; -show binlog events from 96 limit 1; -show binlog events from 96 limit 2; -show binlog events from 96 limit 2,1; +show binlog events from 98 limit 1; +show binlog events from 98 limit 2; +show binlog events from 98 limit 2,1; flush logs; # We need an extra update before doing save_master_pos. diff --git a/mysql-test/t/rpl_log_pos.test b/mysql-test/t/rpl_log_pos.test index c9d7056924f..2a03497846b 100644 --- a/mysql-test/t/rpl_log_pos.test +++ b/mysql-test/t/rpl_log_pos.test @@ -38,7 +38,7 @@ insert into t1 values (1),(2),(3); save_master_pos; connection slave; stop slave; -change master to master_log_pos=96; +change master to master_log_pos=98; start slave; sync_with_master; select * from t1; diff --git a/mysql-test/t/rpl_multi_query.test b/mysql-test/t/rpl_multi_query.test index fbe6d8057f5..2ddd61ce7ba 100644 --- a/mysql-test/t/rpl_multi_query.test +++ b/mysql-test/t/rpl_multi_query.test @@ -24,6 +24,6 @@ sync_slave_with_master; select * from mysqltest.t1; connection master; --replace_column 2 # 5 # -show binlog events from 96; +show binlog events from 98; drop database mysqltest; sync_slave_with_master; diff --git a/mysql-test/t/rpl_temporary.test b/mysql-test/t/rpl_temporary.test index f84c9b09aef..e65469de7e0 100644 --- a/mysql-test/t/rpl_temporary.test +++ b/mysql-test/t/rpl_temporary.test @@ -82,6 +82,7 @@ drop temporary table t3; select * from t2; --replace_result $VERSION VERSION +--replace_column 2 # 5 # show binlog events; drop table t1, t2; diff --git a/mysql-test/t/rpl_timezone.test b/mysql-test/t/rpl_timezone.test index ebb58a9c880..3c180ca8849 100644 --- a/mysql-test/t/rpl_timezone.test +++ b/mysql-test/t/rpl_timezone.test @@ -32,6 +32,7 @@ select * from t1; connection master; # We should not see SET ONE_SHOT time_zone before second insert --replace_result $VERSION VERSION +--replace_column 2 # 5 # show binlog events; # diff --git a/mysql-test/t/rpl_until.test b/mysql-test/t/rpl_until.test index 318cca600a3..9ee1dca9c11 100644 --- a/mysql-test/t/rpl_until.test +++ b/mysql-test/t/rpl_until.test @@ -24,7 +24,7 @@ show binlog events; # try to replicate all queries until drop of t1 connection slave; -start slave until master_log_file='master-bin.000001', master_log_pos=304; +start slave until master_log_file='master-bin.000001', master_log_pos=321; sleep 2; # here table should be still not deleted select * from t1; @@ -42,7 +42,7 @@ sleep 2; show slave status; # try replicate all until second insert to t2; -start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=710; +start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=751; sleep 4; select * from t2; --replace_result $MASTER_MYPORT MASTER_MYPORT @@ -58,7 +58,7 @@ sync_with_master; stop slave; # this should stop immediately as we are already there -start slave until master_log_file='master-bin.000001', master_log_pos=710; +start slave until master_log_file='master-bin.000001', master_log_pos=783; # 2 is not enough when running with valgrind real_sleep 4 # here the sql slave thread should be stopped @@ -77,6 +77,6 @@ start slave until master_log_file='master-bin.000001'; start slave until relay_log_file='slave-relay-bin.000002'; --error 1277 start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561; - +# Warning should be given for second command start slave sql_thread; -start slave until master_log_file='master-bin.000001', master_log_pos=710; +start slave until master_log_file='master-bin.000001', master_log_pos=783; diff --git a/mysql-test/t/rpl_user_variables.test b/mysql-test/t/rpl_user_variables.test index 47bc9de37ba..711d83219a6 100644 --- a/mysql-test/t/rpl_user_variables.test +++ b/mysql-test/t/rpl_user_variables.test @@ -46,7 +46,8 @@ save_master_pos; connection slave; sync_with_master; select * from t1; -show binlog events from 96; +--replace_column 2 # 5 # +show binlog events from 98; connection master; drop table t1; save_master_pos; diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test index 07076f1f6f4..d8dfc10bfe4 100644 --- a/mysql-test/t/user_var.test +++ b/mysql-test/t/user_var.test @@ -108,7 +108,8 @@ INSERT INTO t1 VALUES(@`a b`); set @var1= "';aaa"; SET @var2=char(ascii('a')); insert into t1 values (@var1),(@var2); -show binlog events from 96; +--replace_column 2 # 5 # +show binlog events from 98; # more important than SHOW BINLOG EVENTS, mysqlbinlog (where we # absolutely need variables names to be quoted and strings to be # escaped). diff --git a/sql/item_func.cc b/sql/item_func.cc index 680f3608d0d..0a993b6f3d8 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -3294,12 +3294,28 @@ Item_func_set_user_var::fix_length_and_dec() } -bool Item_func_set_user_var::update_hash(void *ptr, uint length, - Item_result type, - CHARSET_INFO *cs, - Derivation dv) +/* + Set value to user variable. + + SYNOPSYS + update_hash() + entry - pointer to structure representing variable + set_null - should we set NULL value ? + ptr - pointer to buffer with new value + length - length of new value + type - type of new value + cs - charset info for new value + dv - derivation for new value + + RETURN VALUE + False - success, True - failure +*/ + +static bool +update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length, + Item_result type, CHARSET_INFO *cs, Derivation dv) { - if ((null_value=args[0]->null_value)) + if (set_null) { char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry)); if (entry->value && entry->value != pos) @@ -3332,7 +3348,7 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length, entry->value=0; if (!(entry->value=(char*) my_realloc(entry->value, length, MYF(MY_ALLOW_ZERO_PTR)))) - goto err; + return 1; } } if (type == STRING_RESULT) @@ -3348,11 +3364,21 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length, entry->collation.set(cs, dv); } return 0; +} - err: - current_thd->fatal_error(); // Probably end of memory - null_value= 1; - return 1; + +bool +Item_func_set_user_var::update_hash(void *ptr, uint length, Item_result type, + CHARSET_INFO *cs, Derivation dv) +{ + if (::update_hash(entry, (null_value= args[0]->null_value), + ptr, length, type, cs, dv)) + { + current_thd->fatal_error(); // Probably end of memory + null_value= 1; + return 1; + } + return 0; } @@ -3878,6 +3904,77 @@ bool Item_func_get_user_var::eq(const Item *item, bool binary_cmp) const } +bool Item_user_var_as_out_param::fix_fields(THD *thd, TABLE_LIST *tables, + Item **ref) +{ + DBUG_ASSERT(fixed == 0); + if (Item::fix_fields(thd, tables, ref) || + !(entry= get_variable(&thd->user_vars, name, 1))) + return TRUE; + entry->type= STRING_RESULT; + /* + Let us set the same collation which is used for loading + of fields in LOAD DATA INFILE. + (Since Item_user_var_as_out_param is used only there). + */ + entry->collation.set(thd->variables.collation_database); + entry->update_query_id= thd->query_id; + return FALSE; +} + + +void Item_user_var_as_out_param::set_null_value(CHARSET_INFO* cs) +{ + if (::update_hash(entry, TRUE, 0, 0, STRING_RESULT, cs, + DERIVATION_IMPLICIT)) + current_thd->fatal_error(); // Probably end of memory +} + + +void Item_user_var_as_out_param::set_value(const char *str, uint length, + CHARSET_INFO* cs) +{ + if (::update_hash(entry, FALSE, (void*)str, length, STRING_RESULT, cs, + DERIVATION_IMPLICIT)) + current_thd->fatal_error(); // Probably end of memory +} + + +double Item_user_var_as_out_param::val_real() +{ + DBUG_ASSERT(0); + return 0.0; +} + + +longlong Item_user_var_as_out_param::val_int() +{ + DBUG_ASSERT(0); + return 0; +} + + +String* Item_user_var_as_out_param::val_str(String *str) +{ + DBUG_ASSERT(0); + return 0; +} + + +my_decimal* Item_user_var_as_out_param::val_decimal(my_decimal *decimal_buffer) +{ + DBUG_ASSERT(0); + return 0; +} + + +void Item_user_var_as_out_param::print(String *str) +{ + str->append('@'); + str->append(name.str,name.length); +} + + longlong Item_func_inet_aton::val_int() { DBUG_ASSERT(fixed == 1); diff --git a/sql/item_func.h b/sql/item_func.h index eb9aa4ca0c7..93633e75619 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1131,6 +1131,35 @@ public: }; +/* + This item represents user variable used as out parameter (e.g in LOAD DATA), + and it is supposed to be used only for this purprose. So it is simplified + a lot. Actually you should never obtain its value. + + The only two reasons for this thing being an Item is possibility to store it + in List<Item> and desire to place this code somewhere near other functions + working with user variables. +*/ +class Item_user_var_as_out_param :public Item +{ + LEX_STRING name; + user_var_entry *entry; +public: + Item_user_var_as_out_param(LEX_STRING a) : name(a) {} + /* We should return something different from FIELD_ITEM here */ + enum Type type() const { return STRING_ITEM;} + double val_real(); + longlong val_int(); + String *val_str(String *str); + my_decimal *val_decimal(my_decimal *decimal_buffer); + /* fix_fields() binds variable name with its entry structure */ + bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref); + void print(String *str); + void set_null_value(CHARSET_INFO* cs); + void set_value(const char *str, uint length, CHARSET_INFO* cs); +}; + + class Item_func_inet_aton : public Item_int_func { public: diff --git a/sql/log_event.cc b/sql/log_event.cc index ff7445029d0..3176cdfd5cb 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -272,6 +272,8 @@ const char* Log_event::get_type_str() case XID_EVENT: return "Xid"; case USER_VAR_EVENT: return "User var"; case FORMAT_DESCRIPTION_EVENT: return "Format_desc"; + case BEGIN_LOAD_QUERY_EVENT: return "Begin_load_query"; + case EXECUTE_LOAD_QUERY_EVENT: return "Execute_load_query"; default: return "Unknown"; /* impossible */ } } @@ -783,10 +785,10 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, switch(buf[EVENT_TYPE_OFFSET]) { case QUERY_EVENT: - ev = new Query_log_event(buf, event_len, description_event); + ev = new Query_log_event(buf, event_len, description_event, QUERY_EVENT); break; case LOAD_EVENT: - ev = new Create_file_log_event(buf, event_len, description_event); + ev = new Load_log_event(buf, event_len, description_event); break; case NEW_LOAD_EVENT: ev = new Load_log_event(buf, event_len, description_event); @@ -832,6 +834,12 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len, case FORMAT_DESCRIPTION_EVENT: ev = new Format_description_log_event(buf, event_len, description_event); break; + case BEGIN_LOAD_QUERY_EVENT: + ev = new Begin_load_query_log_event(buf, event_len, description_event); + break; + case EXECUTE_LOAD_QUERY_EVENT: + ev = new Execute_load_query_log_event(buf, event_len, description_event); + break; default: DBUG_PRINT("error",("Unknown evernt code: %d",(int) buf[EVENT_TYPE_OFFSET])); ev= NULL; @@ -1085,10 +1093,13 @@ bool Query_log_event::write(IO_CACHE* file) Calculate length of whole event The "1" below is the \0 in the db's length */ - event_length= (uint) (start-buf) + db_len + 1 + q_len; + event_length= (uint) (start-buf) + get_post_header_size_for_derived() + db_len + 1 + q_len; return (write_header(file, event_length) || - my_b_safe_write(file, (byte*) buf, (uint) (start-buf)) || + my_b_safe_write(file, (byte*) buf, QUERY_HEADER_LEN) || + write_post_header_for_derived(file) || + my_b_safe_write(file, (byte*) start_of_status, + (uint) (start-start_of_status)) || my_b_safe_write(file, (db) ? (byte*) db : (byte*)"", db_len + 1) || my_b_safe_write(file, (byte*) query, q_len)) ? 1 : 0; } @@ -1150,7 +1161,8 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, */ Query_log_event::Query_log_event(const char* buf, uint event_len, - const Format_description_log_event *description_event) + const Format_description_log_event *description_event, + Log_event_type event_type) :Log_event(buf, description_event), data_buf(0), query(NullS), catalog(NullS), db(NullS), catalog_len(0), status_vars_len(0), flags2_inited(0), sql_mode_inited(0), charset_inited(0), @@ -1163,7 +1175,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, DBUG_ENTER("Query_log_event::Query_log_event(char*,...)"); common_header_len= description_event->common_header_len; - post_header_len= description_event->post_header_len[QUERY_EVENT-1]; + post_header_len= description_event->post_header_len[event_type-1]; DBUG_PRINT("info",("event_len=%ld, common_header_len=%d, post_header_len=%d", event_len, common_header_len, post_header_len)); @@ -1196,13 +1208,12 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, (uint) status_vars_len)); tmp-= 2; } - /* we have parsed everything we know in the post header */ -#ifndef DBUG_OFF - if (tmp) /* this is probably a master newer than us */ - DBUG_PRINT("info", ("Query_log_event has longer post header than we know\ - (%d more bytes)", tmp)); -#endif - + /* + We have parsed everything we know in the post header for QUERY_EVENT, + the rest of post header is either comes from older version MySQL or + dedicated to derived events (e.g. Execute_load_query...) + */ + /* variable-part: the status vars; only in MySQL 5.0 */ start= (char*) (buf+post_header_len); @@ -1281,8 +1292,8 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, */ #ifdef MYSQL_CLIENT -void Query_log_event::print(FILE* file, bool short_form, - LAST_EVENT_INFO* last_event_info) +void Query_log_event::print_query_header(FILE* file, bool short_form, + LAST_EVENT_INFO* last_event_info) { // TODO: print the catalog ?? char buff[40],*end; // Enough for SET TIMESTAMP @@ -1292,8 +1303,8 @@ void Query_log_event::print(FILE* file, bool short_form, if (!short_form) { print_header(file); - fprintf(file, "\tQuery\tthread_id=%lu\texec_time=%lu\terror_code=%d\n", - (ulong) thread_id, (ulong) exec_time, error_code); + fprintf(file, "\t%s\tthread_id=%lu\texec_time=%lu\terror_code=%d\n", + get_type_str(), (ulong) thread_id, (ulong) exec_time, error_code); } if (!(flags & LOG_EVENT_SUPPRESS_USE_F) && db) @@ -1399,7 +1410,13 @@ void Query_log_event::print(FILE* file, bool short_form, memcpy(last_event_info->charset, charset, 6); } } +} + +void Query_log_event::print(FILE* file, bool short_form, + LAST_EVENT_INFO* last_event_info) +{ + print_query_header(file, short_form, last_event_info); my_fwrite(file, (byte*) query, q_len, MYF(MY_NABP | MY_WME)); fputs(";\n", file); } @@ -1413,6 +1430,12 @@ void Query_log_event::print(FILE* file, bool short_form, #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) int Query_log_event::exec_event(struct st_relay_log_info* rli) { + return exec_event(rli, query, q_len); +} + + +int Query_log_event::exec_event(struct st_relay_log_info* rli, const char *query_arg, uint32 q_len_arg) +{ int expected_error,actual_error= 0; /* Colleagues: please never free(thd->catalog) in MySQL. This would lead to @@ -1444,8 +1467,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) { thd->set_time((time_t)when); - thd->query_length= q_len; - thd->query = (char*)query; + thd->query_length= q_len_arg; + thd->query= (char*)query_arg; VOID(pthread_mutex_lock(&LOCK_thread_count)); thd->query_id = next_query_id(); VOID(pthread_mutex_unlock(&LOCK_thread_count)); @@ -1506,7 +1529,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) } /* Execute the query (note that we bypass dispatch_command()) */ - mysql_parse(thd, thd->query, q_len); + mysql_parse(thd, thd->query, thd->query_length); } else @@ -1518,7 +1541,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) we exit gracefully; otherwise we warn about the bad error and tell DBA to check/fix it. */ - if (mysql_test_parse_for_slave(thd, thd->query, q_len)) + if (mysql_test_parse_for_slave(thd, thd->query, thd->query_length)) clear_all_errors(thd, rli); /* Can ignore query */ else { @@ -1560,7 +1583,7 @@ Default database: '%s'. Query: '%s'", expected_error, actual_error ? thd->net.last_error: "no error", actual_error, - print_slave_db_safe(db), query); + print_slave_db_safe(db), query_arg); thd->query_error= 1; } /* @@ -1581,7 +1604,7 @@ Default database: '%s'. Query: '%s'", "Error '%s' on query. Default database: '%s'. Query: '%s'", (actual_error ? thd->net.last_error : "unexpected success or fatal error"), - print_slave_db_safe(thd->db), query); + print_slave_db_safe(thd->db), query_arg); thd->query_error= 1; } @@ -1828,11 +1851,6 @@ int Start_log_event_v3::exec_event(struct st_relay_log_info* rli) server starts or when FLUSH LOGS), or to create artificial events to parse binlogs from MySQL 3.23 or 4.x. When in a client, only the 2nd use is possible. - - TODO - Update this code with the new event for LOAD DATA, once they are pushed (in - 4.1 or 5.0). If it's in 5.0, only the "case 4" block should be updated. - */ Format_description_log_event:: @@ -1866,6 +1884,8 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver) post_header_len[DELETE_FILE_EVENT-1]= DELETE_FILE_HEADER_LEN; post_header_len[NEW_LOAD_EVENT-1]= post_header_len[LOAD_EVENT-1]; post_header_len[FORMAT_DESCRIPTION_EVENT-1]= FORMAT_DESCRIPTION_HEADER_LEN; + post_header_len[BEGIN_LOAD_QUERY_EVENT-1]= post_header_len[APPEND_BLOCK_EVENT-1]; + post_header_len[EXECUTE_LOAD_QUERY_EVENT-1]= EXECUTE_LOAD_QUERY_HEADER_LEN; } break; @@ -2071,12 +2091,9 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli) */ #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) -void Load_log_event::pack_info(Protocol *protocol) +uint Load_log_event::get_query_buffer_length() { - char *buf, *pos; - uint buf_len; - - buf_len= + return 5 + db_len + 3 + // "use DB; " 18 + fname_len + 2 + // "LOAD DATA INFILE 'file''" 7 + // LOCAL @@ -2089,11 +2106,15 @@ void Load_log_event::pack_info(Protocol *protocol) 19 + sql_ex.line_start_len*4 + 2 + // " LINES STARTING BY 'str'" 15 + 22 + // " IGNORE xxx LINES" 3 + (num_fields-1)*2 + field_block_len; // " (field1, field2, ...)" +} - if (!(buf= my_malloc(buf_len, MYF(MY_WME)))) - return; - pos= buf; - if (db && db_len) + +void Load_log_event::print_query(bool need_db, char *buf, + char **end, char **fn_start, char **fn_end) +{ + char *pos= buf; + + if (need_db && db && db_len) { pos= strmov(pos, "use `"); memcpy(pos, db, db_len); @@ -2101,6 +2122,10 @@ void Load_log_event::pack_info(Protocol *protocol) } pos= strmov(pos, "LOAD DATA "); + + if (fn_start) + *fn_start= pos; + if (check_fname_outside_temp_buf()) pos= strmov(pos, "LOCAL "); pos= strmov(pos, "INFILE '"); @@ -2112,7 +2137,12 @@ void Load_log_event::pack_info(Protocol *protocol) else if (sql_ex.opt_flags & IGNORE_FLAG) pos= strmov(pos, " IGNORE "); - pos= strmov(pos ,"INTO TABLE `"); + pos= strmov(pos ,"INTO"); + + if (fn_end) + *fn_end= pos; + + pos= strmov(pos ," TABLE `"); memcpy(pos, table_name, table_name_len); pos+= table_name_len; @@ -2161,7 +2191,18 @@ void Load_log_event::pack_info(Protocol *protocol) *pos++= ')'; } - protocol->store(buf, pos-buf, &my_charset_bin); + *end= pos; +} + + +void Load_log_event::pack_info(Protocol *protocol) +{ + char *buf, *end; + + if (!(buf= my_malloc(get_query_buffer_length(), MYF(MY_WME)))) + return; + print_query(TRUE, buf, &end, 0, 0); + protocol->store(buf, end-buf, &my_charset_bin); my_free(buf, MYF(0)); } #endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */ @@ -2368,11 +2409,6 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, fname_len = strlen(fname); // null termination is accomplished by the caller doing buf[event_len]=0 - /* - In 5.0 this event will have the same format, as we are planning to log LOAD - DATA INFILE in a completely different way (as a plain-text query) since 4.1 - or 5.0 (Dmitri's WL#874) - */ DBUG_RETURN(0); } @@ -2532,7 +2568,6 @@ void Load_log_event::set_fields(const char* affected_db, int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, bool use_rli_only_for_errors) { - char *load_data_query= 0; thd->db_length= db_len; thd->db= (char*) rewrite_db(db, &thd->db_length); DBUG_ASSERT(thd->query == 0); @@ -2594,21 +2629,30 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, else { char llbuff[22]; + char *end; enum enum_duplicates handle_dup; bool ignore= 0; + char *load_data_query; + /* - Make a simplified LOAD DATA INFILE query, for the information of the - user in SHOW PROCESSLIST. Note that db is known in the 'db' column. + Forge LOAD DATA INFILE query which will be used in SHOW PROCESS LIST + and written to slave's binlog if binlogging is on. */ - if ((load_data_query= (char *) my_alloca(18 + strlen(fname) + 14 + - strlen(tables.table_name) + 8))) + if (!(load_data_query= (char *)thd->alloc(get_query_buffer_length() + 1))) { - thd->query_length= (uint)(strxmov(load_data_query, - "LOAD DATA INFILE '", fname, - "' INTO TABLE `", tables.table_name, - "` <...>", NullS) - load_data_query); - thd->query= load_data_query; + /* + This will set thd->fatal_error in case of OOM. So we surely will notice + that something is wrong. + */ + goto error; } + + print_query(FALSE, load_data_query, &end, (char **)&thd->lex->fname_start, + (char **)&thd->lex->fname_end); + *end= 0; + thd->query_length= end - load_data_query; + thd->query= load_data_query; + if (sql_ex.opt_flags & REPLACE_FLAG) handle_dup= DUP_REPLACE; else if (sql_ex.opt_flags & IGNORE_FLAG) @@ -2654,6 +2698,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, List<Item> field_list; set_fields(thd->db,field_list); thd->variables.pseudo_thread_id= thread_id; + List<Item> set_fields; if (net) { // mysql_load will use thd->net to read the file @@ -2663,9 +2708,13 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, */ thd->net.pkt_nr = net->pkt_nr; } - if (mysql_load(thd, &ex, &tables, field_list, handle_dup, ignore, - net != 0, TL_WRITE)) - thd->query_error = 1; + /* + It is safe to use set_fields twice because we are not going to + update it inside mysql_load(). + */ + if (mysql_load(thd, &ex, &tables, field_list, set_fields, set_fields, + handle_dup, ignore, net != 0)) + thd->query_error= 1; if (thd->cuted_fields) { /* log_pos is the position of the LOAD event in the master log */ @@ -2691,7 +2740,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, if (net) skip_load_data_infile(net); } - + +error: thd->net.vio = 0; char *save_db= thd->db; VOID(pthread_mutex_lock(&LOCK_thread_count)); @@ -2700,8 +2750,6 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, thd->query_length= thd->db_length= 0; VOID(pthread_mutex_unlock(&LOCK_thread_count)); close_thread_tables(thd); - if (load_data_query) - my_afree(load_data_query); if (thd->query_error) { /* this err/sql_errno code is copy-paste from net_send_error() */ @@ -4016,8 +4064,8 @@ void Append_block_log_event::print(FILE* file, bool short_form, return; print_header(file); fputc('\n', file); - fprintf(file, "#Append_block: file_id: %d block_len: %d\n", - file_id, block_len); + fprintf(file, "#%s: file_id: %d block_len: %d\n", + get_type_str(), file_id, block_len); } #endif /* MYSQL_CLIENT */ @@ -4036,14 +4084,21 @@ void Append_block_log_event::pack_info(Protocol *protocol) block_len)); protocol->store(buf, length, &my_charset_bin); } -#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */ /* + Append_block_log_event::get_open_mode() +*/ + +int Append_block_log_event::get_open_mode() const +{ + return O_WRONLY | O_APPEND | O_BINARY; +} + +/* Append_block_log_event::exec_event() */ -#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT) int Append_block_log_event::exec_event(struct st_relay_log_info* rli) { char proc_info[17+FN_REFLEN+10], *fname= proc_info+17; @@ -4055,14 +4110,18 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli) memcpy(p, ".data", 6); strnmov(proc_info, "Making temp file ", 17); // no end 0 thd->proc_info= proc_info; - if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0) + if ((fd = my_open(fname, get_open_mode(), MYF(MY_WME))) < 0) { - slave_print_error(rli,my_errno, "Error in Append_block event: could not open file '%s'", fname); + slave_print_error(rli, my_errno, + "Error in %s event: could not open file '%s'", + get_type_str(), fname); goto err; } if (my_write(fd, (byte*) block, block_len, MYF(MY_WME+MY_NABP))) { - slave_print_error(rli,my_errno, "Error in Append_block event: write to '%s' failed", fname); + slave_print_error(rli, my_errno, + "Error in %s event: write to '%s' failed", + get_type_str(), fname); goto err; } error=0; @@ -4335,6 +4394,216 @@ err: /************************************************************************** + Begin_load_query_log_event methods +**************************************************************************/ + +#ifndef MYSQL_CLIENT +Begin_load_query_log_event:: +Begin_load_query_log_event(THD* thd_arg, const char* db_arg, char* block_arg, + uint block_len_arg, bool using_trans) + :Append_block_log_event(thd_arg, db_arg, block_arg, block_len_arg, + using_trans) +{ + file_id= thd_arg->file_id= mysql_bin_log.next_file_id(); +} +#endif + + +Begin_load_query_log_event:: +Begin_load_query_log_event(const char* buf, uint len, + const Format_description_log_event* desc_event) + :Append_block_log_event(buf, len, desc_event) +{ +} + + +#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT) +int Begin_load_query_log_event::get_open_mode() const +{ + return O_CREAT | O_WRONLY | O_BINARY | O_TRUNC; +} +#endif /* defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */ + + +/************************************************************************** + Execute_load_query_log_event methods +**************************************************************************/ + + +#ifndef MYSQL_CLIENT +Execute_load_query_log_event:: +Execute_load_query_log_event(THD* thd_arg, const char* query_arg, + ulong query_length_arg, uint fn_pos_start_arg, + uint fn_pos_end_arg, + enum_load_dup_handling dup_handling_arg, + bool using_trans, bool suppress_use): + Query_log_event(thd_arg, query_arg, query_length_arg, using_trans, + suppress_use), + file_id(thd_arg->file_id), fn_pos_start(fn_pos_start_arg), + fn_pos_end(fn_pos_end_arg), dup_handling(dup_handling_arg) +{ +} +#endif /* !MYSQL_CLIENT */ + + +Execute_load_query_log_event:: +Execute_load_query_log_event(const char* buf, uint event_len, + const Format_description_log_event* desc_event): + Query_log_event(buf, event_len, desc_event, EXECUTE_LOAD_QUERY_EVENT), + file_id(0), fn_pos_start(0), fn_pos_end(0) +{ + if (!Query_log_event::is_valid()) + return; + + buf+= desc_event->common_header_len; + + fn_pos_start= uint4korr(buf + ELQ_FN_POS_START_OFFSET); + fn_pos_end= uint4korr(buf + ELQ_FN_POS_END_OFFSET); + dup_handling= (enum_load_dup_handling)(*(buf + ELQ_DUP_HANDLING_OFFSET)); + + if (fn_pos_start > q_len || fn_pos_end > q_len || + dup_handling > LOAD_DUP_REPLACE) + return; + + file_id= uint4korr(buf + ELQ_FILE_ID_OFFSET); +} + + +ulong Execute_load_query_log_event::get_post_header_size_for_derived() +{ + return EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN; +} + + +bool +Execute_load_query_log_event::write_post_header_for_derived(IO_CACHE* file) +{ + char buf[EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN]; + int4store(buf, file_id); + int4store(buf + 4, fn_pos_start); + int4store(buf + 4 + 4, fn_pos_end); + *(buf + 4 + 4 + 4)= (char)dup_handling; + return my_b_safe_write(file, (byte*) buf, EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN); +} + + +#ifdef MYSQL_CLIENT +void Execute_load_query_log_event::print(FILE* file, bool short_form, + LAST_EVENT_INFO* last_event_info) +{ + print(file, short_form, last_event_info, 0); +} + + +void Execute_load_query_log_event::print(FILE* file, bool short_form, + LAST_EVENT_INFO* last_event_info, + const char *local_fname) +{ + print_query_header(file, short_form, last_event_info); + + if (local_fname) + { + my_fwrite(file, (byte*) query, fn_pos_start, MYF(MY_NABP | MY_WME)); + fprintf(file, " LOCAL INFILE \'"); + fprintf(file, local_fname); + fprintf(file, "\'"); + if (dup_handling == LOAD_DUP_REPLACE) + fprintf(file, " REPLACE"); + fprintf(file, " INTO"); + my_fwrite(file, (byte*) query + fn_pos_end, q_len-fn_pos_end, + MYF(MY_NABP | MY_WME)); + fprintf(file, ";\n"); + } + else + { + my_fwrite(file, (byte*) query, q_len, MYF(MY_NABP | MY_WME)); + fprintf(file, ";\n"); + } + + if (!short_form) + fprintf(file, "# file_id: %d \n", file_id); +} +#endif + + +#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) +void Execute_load_query_log_event::pack_info(Protocol *protocol) +{ + char *buf, *pos; + if (!(buf= my_malloc(9 + db_len + q_len + 10 + 21, MYF(MY_WME)))) + return; + pos= buf; + if (db && db_len) + { + pos= strmov(buf, "use `"); + memcpy(pos, db, db_len); + pos= strmov(pos+db_len, "`; "); + } + if (query && q_len) + { + memcpy(pos, query, q_len); + pos+= q_len; + } + pos= strmov(pos, " ;file_id="); + pos= int10_to_str((long) file_id, pos, 10); + protocol->store(buf, pos-buf, &my_charset_bin); + my_free(buf, MYF(MY_ALLOW_ZERO_PTR)); +} + + +int +Execute_load_query_log_event::exec_event(struct st_relay_log_info* rli) +{ + char *p; + char *buf; + char *fname; + char *fname_end; + int error; + + /* Replace filename and LOCAL keyword in query before executing it */ + if (!(buf = my_malloc(q_len + 1 - (fn_pos_end - fn_pos_start) + + (FN_REFLEN + 10) + 10 + 8 + 5, MYF(MY_WME)))) + { + slave_print_error(rli, my_errno, "Not enough memory"); + return 1; + } + + p= buf; + memcpy(p, query, fn_pos_start); + p+= fn_pos_start; + fname= (p= strmake(p, " INFILE \'", 9)); + p= slave_load_file_stem(p, file_id, server_id); + fname_end= (p= strmake(p, ".data", 5)); + *(p++)='\''; + switch (dup_handling) + { + case LOAD_DUP_IGNORE: + p= strmake(p, " IGNORE", 7); + break; + case LOAD_DUP_REPLACE: + p= strmake(p, " REPLACE", 8); + break; + default: + /* Ordinary load data */ + break; + } + p= strmake(p, " INTO", 5); + p= strmake(p, query+fn_pos_end, q_len-fn_pos_end); + + error= Query_log_event::exec_event(rli, buf, p-buf); + + /* Forging file name for deletion in same buffer */ + *fname_end= 0; + + (void) my_delete(fname, MYF(MY_WME)); + + my_free(buf, MYF(MY_ALLOW_ZERO_PTR)); + return error; +} +#endif + + +/************************************************************************** sql_ex_info methods **************************************************************************/ diff --git a/sql/log_event.h b/sql/log_event.h index 7a041959f92..43a801da851 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -163,10 +163,12 @@ struct sql_ex_info See the #defines below for the format specifics. - The events which really update data are Query_log_event and - Load_log_event/Create_file_log_event/Execute_load_log_event (these 3 act - together to replicate LOAD DATA INFILE, with the help of - Append_block_log_event which prepares temporary files to load into the table). + The events which really update data are Query_log_event, + Execute_load_query_log_event and old Load_log_event and + Execute_load_log_event events (Execute_load_query is used together with + Begin_load_query and Append_block events to replicate LOAD DATA INFILE. + Create_file/Append_block/Execute_load (which includes Load_log_event) + were used to replicate LOAD DATA before the 5.0.3). ****************************************************************************/ @@ -194,6 +196,8 @@ struct sql_ex_info #define EXEC_LOAD_HEADER_LEN 4 #define DELETE_FILE_HEADER_LEN 4 #define FORMAT_DESCRIPTION_HEADER_LEN (START_V3_HEADER_LEN+1+LOG_EVENT_TYPES) +#define EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN (4 + 4 + 4 + 1) +#define EXECUTE_LOAD_QUERY_HEADER_LEN (QUERY_HEADER_LEN + EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN) /* Event header offsets; @@ -284,6 +288,12 @@ struct sql_ex_info /* DF = "Delete File" */ #define DF_FILE_ID_OFFSET 0 +/* ELQ = "Execute Load Query" */ +#define ELQ_FILE_ID_OFFSET QUERY_HEADER_LEN +#define ELQ_FN_POS_START_OFFSET ELQ_FILE_ID_OFFSET + 4 +#define ELQ_FN_POS_END_OFFSET ELQ_FILE_ID_OFFSET + 8 +#define ELQ_DUP_HANDLING_OFFSET ELQ_FILE_ID_OFFSET + 12 + /* 4 bytes which all binlogs should begin with */ #define BINLOG_MAGIC "\xfe\x62\x69\x6e" @@ -387,6 +397,8 @@ enum Log_event_type RAND_EVENT, USER_VAR_EVENT, FORMAT_DESCRIPTION_EVENT, XID_EVENT, + BEGIN_LOAD_QUERY_EVENT, + EXECUTE_LOAD_QUERY_EVENT, /* add new events here - right above this comment! @@ -711,13 +723,17 @@ public: #ifdef HAVE_REPLICATION void pack_info(Protocol* protocol); int exec_event(struct st_relay_log_info* rli); + int exec_event(struct st_relay_log_info* rli, const char *query_arg, + uint32 q_len_arg); #endif /* HAVE_REPLICATION */ #else + void print_query_header(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0); void print(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0); #endif Query_log_event(const char* buf, uint event_len, - const Format_description_log_event *description_event); + const Format_description_log_event *description_event, + Log_event_type event_type); ~Query_log_event() { if (data_buf) @@ -728,6 +744,14 @@ public: Log_event_type get_type_code() { return QUERY_EVENT; } bool write(IO_CACHE* file); bool is_valid() const { return query != 0; } + + /* + Returns number of bytes additionaly written to post header by derived + events (so far it is only Execute_load_query event). + */ + virtual ulong get_post_header_size_for_derived() { return 0; } + /* Writes derived event-specific part of post header. */ + virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; } }; #ifdef HAVE_REPLICATION @@ -779,6 +803,10 @@ public: ****************************************************************************/ class Load_log_event: public Log_event { +private: + uint get_query_buffer_length(); + void print_query(bool need_db, char *buf, char **end, + char **fn_start, char **fn_end); protected: int copy_log_event(const char *buf, ulong event_len, int body_offset, const Format_description_log_event* description_event); @@ -1312,6 +1340,7 @@ public: #ifdef HAVE_REPLICATION int exec_event(struct st_relay_log_info* rli); void pack_info(Protocol* protocol); + virtual int get_open_mode() const; #endif /* HAVE_REPLICATION */ #else void print(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0); @@ -1395,6 +1424,93 @@ public: }; +/*************************************************************************** + + Begin load query Log Event class + + Event for the first block of file to be loaded, its only difference from + Append_block event is that this event creates or truncates existing file + before writing data. + +****************************************************************************/ +class Begin_load_query_log_event: public Append_block_log_event +{ +public: +#ifndef MYSQL_CLIENT + Begin_load_query_log_event(THD* thd_arg, const char *db_arg, + char* block_arg, uint block_len_arg, + bool using_trans); +#ifdef HAVE_REPLICATION + Begin_load_query_log_event(THD* thd); + int get_open_mode() const; +#endif /* HAVE_REPLICATION */ +#endif + Begin_load_query_log_event(const char* buf, uint event_len, + const Format_description_log_event* description_event); + ~Begin_load_query_log_event() {} + Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; } +}; + + +/* + Elements of this enum describe how LOAD DATA handles duplicates. +*/ +enum enum_load_dup_handling { LOAD_DUP_ERROR= 0, LOAD_DUP_IGNORE, + LOAD_DUP_REPLACE }; + +/**************************************************************************** + + Execute load query Log Event class + + Event responsible for LOAD DATA execution, it similar to Query_log_event + but before executing the query it substitutes original filename in LOAD DATA + query with name of temporary file. + +****************************************************************************/ +class Execute_load_query_log_event: public Query_log_event +{ +public: + uint file_id; // file_id of temporary file + uint fn_pos_start; // pointer to the part of the query that should + // be substituted + uint fn_pos_end; // pointer to the end of this part of query + /* + We have to store type of duplicate handling explicitly, because + for LOAD DATA it also depends on LOCAL option. And this part + of query will be rewritten during replication so this information + may be lost... + */ + enum_load_dup_handling dup_handling; + +#ifndef MYSQL_CLIENT + Execute_load_query_log_event(THD* thd, const char* query_arg, + ulong query_length, uint fn_pos_start_arg, + uint fn_pos_end_arg, + enum_load_dup_handling dup_handling_arg, + bool using_trans, bool suppress_use); +#ifdef HAVE_REPLICATION + void pack_info(Protocol* protocol); + int exec_event(struct st_relay_log_info* rli); +#endif /* HAVE_REPLICATION */ +#else + void print(FILE* file, bool short_form = 0, + LAST_EVENT_INFO* last_event_info= 0); + /* Prints the query as LOAD DATA LOCAL and with rewritten filename */ + void print(FILE* file, bool short_form, LAST_EVENT_INFO* last_event_info, + const char *local_fname); +#endif + Execute_load_query_log_event(const char* buf, uint event_len, + const Format_description_log_event *description_event); + ~Execute_load_query_log_event() {} + + Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; } + bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; } + + ulong get_post_header_size_for_derived(); + bool write_post_header_for_derived(IO_CACHE* file); + }; + + #ifdef MYSQL_CLIENT class Unknown_log_event: public Log_event { diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index cd8587f0230..876f932759e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -942,8 +942,10 @@ bool eval_const_cond(COND *cond); /* sql_load.cc */ bool mysql_load(THD *thd, sql_exchange *ex, TABLE_LIST *table_list, - List<Item> &fields, enum enum_duplicates handle_duplicates, - bool ignore, bool local_file, thr_lock_type lock_type); + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values_list, + enum enum_duplicates handle_duplicates, bool ignore, + bool local_file); int write_record(THD *thd, TABLE *table, COPY_INFO *info); /* sql_manager.cc */ diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index f8e246fc45c..d4caeebb70c 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5330,3 +5330,5 @@ ER_SP_BAD_SQLSTATE 42000 eng "Bad SQLSTATE: '%s'" ER_STARTUP eng "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s" +ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR + eng "Can't load value from file with fixed size rows to variable" diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 4cbf9f802d0..afd48943439 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -810,6 +810,12 @@ typedef struct st_lex */ TABLE_LIST **query_tables_own_last; + /* + Pointers to part of LOAD DATA statement that should be rewritten + during replication ("LOCAL 'filename' REPLACE INTO" part). + */ + uchar *fname_start, *fname_end; + st_lex() :result(0), sql_command(SQLCOM_END), query_tables_own_last(0) { extern byte *sp_lex_sp_key(const byte *ptr, uint *plen, my_bool first); diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 174ccdfab5b..e2f7c9d62c8 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -72,18 +72,43 @@ public: }; static int read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, - List<Item> &fields, READ_INFO &read_info, + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values, READ_INFO &read_info, ulong skip_lines, bool ignore_check_option_errors); static int read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, - List<Item> &fields, READ_INFO &read_info, + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values, READ_INFO &read_info, String &enclosed, ulong skip_lines, bool ignore_check_option_errors); + +/* + Execute LOAD DATA query + + SYNOPSYS + mysql_load() + thd - current thread + ex - sql_exchange object representing source file and its parsing rules + table_list - list of tables to which we are loading data + fields_vars - list of fields and variables to which we read + data from file + set_fields - list of fields mentioned in set clause + set_values - expressions to assign to fields in previous list + handle_duplicates - indicates whenever we should emit error or + replace row if we will meet duplicates. + ignore - - indicates whenever we should ignore duplicates + read_file_from_client - is this LOAD DATA LOCAL ? + + RETURN VALUES + TRUE - error / FALSE - success +*/ + bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, - List<Item> &fields, enum enum_duplicates handle_duplicates, - bool ignore, - bool read_file_from_client,thr_lock_type lock_type) + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values, + enum enum_duplicates handle_duplicates, bool ignore, + bool read_file_from_client) { char name[FN_REFLEN]; File file; @@ -117,7 +142,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, MYF(0)); DBUG_RETURN(TRUE); } - table_list->lock_type= lock_type; if (open_and_lock_tables(thd, table_list)) DBUG_RETURN(TRUE); if (setup_tables(thd, table_list, &unused_conds, @@ -130,48 +154,80 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "LOAD"); DBUG_RETURN(TRUE); } + /* + Let us emit an error if we are loading data to table which is used + in subselect in SET clause like we do it for INSERT. + + The main thing to fix to remove this restriction is to ensure that the + table is marked to be 'used for insert' in which case we should never + mark this table as as 'const table' (ie, one that has only one row). + */ + if (unique_table(table_list, table_list->next_global)) + { + my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->table_name); + DBUG_RETURN(TRUE); + } + table= table_list->table; transactional_table= table->file->has_transactions(); - if (!fields.elements) + if (!fields_vars.elements) { Field **field; for (field=table->field; *field ; field++) - fields.push_back(new Item_field(*field)); + fields_vars.push_back(new Item_field(*field)); + table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET; + /* + Let us also prepare SET clause, altough it is probably empty + in this case. + */ + if (setup_fields(thd, 0, table_list, set_fields, 1, 0, 0) || + setup_fields(thd, 0, table_list, set_values, 1, 0, 0)) + DBUG_RETURN(TRUE); } else { // Part field list - thd->dupp_field=0; /* TODO: use this conds for 'WITH CHECK OPTIONS' */ - if (setup_fields(thd, 0, table_list, fields, 1, 0, 0)) + if (setup_fields(thd, 0, table_list, fields_vars, 1, 0, 0) || + setup_fields(thd, 0, table_list, set_fields, 1, 0, 0) || + check_that_all_fields_are_given_values(thd, table)) DBUG_RETURN(TRUE); - if (thd->dupp_field) - { - my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dupp_field->field_name); - DBUG_RETURN(TRUE); - } - if (check_that_all_fields_are_given_values(thd, table)) + /* + Check whenever TIMESTAMP field with auto-set feature specified + explicitly. + */ + if (table->timestamp_field && + table->timestamp_field->query_id == thd->query_id) + table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET; + /* + Fix the expressions in SET clause. This should be done after + check_that_all_fields_are_given_values() and setting use_timestamp + since it may update query_id for some fields. + */ + if (setup_fields(thd, 0, table_list, set_values, 1, 0, 0)) DBUG_RETURN(TRUE); } uint tot_length=0; - bool use_blobs=0,use_timestamp=0; - List_iterator_fast<Item> it(fields); + bool use_blobs= 0, use_vars= 0; + List_iterator_fast<Item> it(fields_vars); + Item *item; - Item_field *field; - while ((field=(Item_field*) it++)) + while ((item= it++)) { - if (field->field->flags & BLOB_FLAG) + if (item->type() == Item::FIELD_ITEM) { - use_blobs=1; - tot_length+=256; // Will be extended if needed + Field *field= ((Item_field*)item)->field; + if (field->flags & BLOB_FLAG) + { + use_blobs= 1; + tot_length+= 256; // Will be extended if needed + } + else + tot_length+= field->field_length; } else - tot_length+=field->field->field_length; - if (!field_term->length() && !(field->field->flags & NOT_NULL_FLAG)) - field->field->set_notnull(); - if (field->field == table->timestamp_field) - use_timestamp=1; + use_vars= 1; } if (use_blobs && !ex->line_term->length() && !field_term->length()) { @@ -179,6 +235,11 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, MYF(0)); DBUG_RETURN(TRUE); } + if (use_vars && !field_term->length() && !enclosed->length()) + { + my_error(ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR, MYF(0)); + DBUG_RETURN(TRUE); + } /* We can't give an error in the middle when using LOCAL files */ if (read_file_from_client && handle_duplicates == DUP_ERROR) @@ -251,12 +312,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, if (mysql_bin_log.is_open()) { lf_info.thd = thd; - lf_info.ex = ex; - lf_info.db = db; - lf_info.table_name = table_list->table_name; - lf_info.fields = &fields; - lf_info.ignore= ignore; - lf_info.handle_dup = handle_duplicates; lf_info.wrote_create_file = 0; lf_info.last_pos_in_file = HA_POS_ERROR; lf_info.log_delayed= transactional_table; @@ -264,8 +319,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, } #endif /*!EMBEDDED_LIBRARY*/ - restore_record(table, s->default_values); - thd->count_cuted_fields= CHECK_FIELD_WARN; /* calc cuted fields */ thd->cuted_fields=0L; /* Skip lines if there is a line terminator */ @@ -282,8 +335,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, if (!(error=test(read_info.error))) { - if (use_timestamp) - table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET; table->next_number_field=table->found_next_number_field; if (ignore || @@ -300,12 +351,13 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, MODE_STRICT_ALL_TABLES))); if (!field_term->length() && !enclosed->length()) - error= read_fixed_length(thd, info, table_list, fields,read_info, + error= read_fixed_length(thd, info, table_list, fields_vars, + set_fields, set_values, read_info, skip_lines, ignore); else - error= read_sep_field(thd, info, table_list, fields, read_info, - *enclosed, skip_lines, - ignore); + error= read_sep_field(thd, info, table_list, fields_vars, + set_fields, set_values, read_info, + *enclosed, skip_lines, ignore); if (table->file->end_bulk_insert()) error=1; /* purecov: inspected */ ha_enable_transaction(thd, TRUE); @@ -380,13 +432,19 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, { /* As already explained above, we need to call end_io_cache() or the last - block will be logged only after Execute_load_log_event (which is wrong), - when read_info is destroyed. + block will be logged only after Execute_load_query_log_event (which is + wrong), when read_info is destroyed. */ read_info.end_io_cache(); if (lf_info.wrote_create_file) { - Execute_load_log_event e(thd, db, transactional_table); + Execute_load_query_log_event e(thd, thd->query, thd->query_length, + (char*)thd->lex->fname_start - (char*)thd->query, + (char*)thd->lex->fname_end - (char*)thd->query, + (handle_duplicates == DUP_REPLACE) ? LOAD_DUP_REPLACE : + (ignore ? LOAD_DUP_IGNORE : + LOAD_DUP_ERROR), + transactional_table, FALSE); mysql_bin_log.write(&e); } } @@ -410,10 +468,11 @@ err: static int read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, - List<Item> &fields, READ_INFO &read_info, ulong skip_lines, - bool ignore_check_option_errors) + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values, READ_INFO &read_info, + ulong skip_lines, bool ignore_check_option_errors) { - List_iterator_fast<Item> it(fields); + List_iterator_fast<Item> it(fields_vars); Item_field *sql_field; TABLE *table= table_list->table; ulonglong id; @@ -421,11 +480,7 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, DBUG_ENTER("read_fixed_length"); id= 0; - - /* No fields can be null in this format. mark all fields as not null */ - while ((sql_field= (Item_field*) it++)) - sql_field->field->set_notnull(); - + while (!read_info.read_fixed_length()) { if (thd->killed) @@ -450,16 +505,28 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, read_info.row_end[0]=0; #endif no_trans_update= !table->file->has_transactions(); + + restore_record(table, s->default_values); + /* + There is no variables in fields_vars list in this format so + this conversion is safe. + */ while ((sql_field= (Item_field*) it++)) { Field *field= sql_field->field; + /* + No fields specified in fields_vars list can be null in this format. + Mark field as not null, we should do this for each row because of + restore_record... + */ + field->set_notnull(); + if (pos == read_info.row_end) { thd->cuted_fields++; /* Not enough fields */ push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_TOO_FEW_RECORDS, ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count); - field->reset(); } else { @@ -483,6 +550,9 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, ER(ER_WARN_TOO_MANY_RECORDS), thd->row_count); } + if (fill_record(thd, set_fields, set_values, ignore_check_option_errors)) + DBUG_RETURN(1); + switch (table_list->view_check_option(thd, ignore_check_option_errors)) { case VIEW_CHECK_SKIP: @@ -527,12 +597,13 @@ continue_loop:; static int read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, - List<Item> &fields, READ_INFO &read_info, + List<Item> &fields_vars, List<Item> &set_fields, + List<Item> &set_values, READ_INFO &read_info, String &enclosed, ulong skip_lines, bool ignore_check_option_errors) { - List_iterator_fast<Item> it(fields); - Item_field *sql_field; + List_iterator_fast<Item> it(fields_vars); + Item *item; TABLE *table= table_list->table; uint enclosed_length; ulonglong id; @@ -550,60 +621,95 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, thd->send_kill_message(); DBUG_RETURN(1); } - while ((sql_field=(Item_field*) it++)) + + restore_record(table, s->default_values); + + while ((item= it++)) { uint length; byte *pos; if (read_info.read_field()) break; + + /* If this line is to be skipped we don't want to fill field or var */ + if (skip_lines) + continue; + pos=read_info.row_start; length=(uint) (read_info.row_end-pos); - Field *field=sql_field->field; if (!read_info.enclosed && (enclosed_length && length == 4 && !memcmp(pos,"NULL",4)) || (length == 1 && read_info.found_null)) { - field->reset(); - field->set_null(); - if (!field->maybe_null()) - { - if (field->type() == FIELD_TYPE_TIMESTAMP) - ((Field_timestamp*) field)->set_time(); - else if (field != table->next_number_field) - field->set_warning((uint) MYSQL_ERROR::WARN_LEVEL_WARN, - ER_WARN_NULL_TO_NOTNULL, 1); + if (item->type() == Item::FIELD_ITEM) + { + Field *field= ((Item_field *)item)->field; + field->reset(); + field->set_null(); + if (!field->maybe_null()) + { + if (field->type() == FIELD_TYPE_TIMESTAMP) + ((Field_timestamp*) field)->set_time(); + else if (field != table->next_number_field) + field->set_warning((uint) MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_NULL_TO_NOTNULL, 1); + } } + else + ((Item_user_var_as_out_param *)item)->set_null_value( + read_info.read_charset); continue; } - field->set_notnull(); - read_info.row_end[0]=0; // Safe to change end marker - field->store((char*) read_info.row_start,length,read_info.read_charset); + + if (item->type() == Item::FIELD_ITEM) + { + Field *field= ((Item_field *)item)->field; + field->set_notnull(); + read_info.row_end[0]=0; // Safe to change end marker + field->store((char*) pos, length, read_info.read_charset); + } + else + ((Item_user_var_as_out_param *)item)->set_value((char*) pos, length, + read_info.read_charset); } if (read_info.error) break; if (skip_lines) { - if (!--skip_lines) - thd->cuted_fields= 0L; // Reset warnings + skip_lines--; continue; } - if (sql_field) - { // Last record - if (sql_field == (Item_field*) fields.head()) + if (item) + { + /* Have not read any field, thus input file is simply ended */ + if (item == fields_vars.head()) break; - for (; sql_field ; sql_field=(Item_field*) it++) + for (; item ; item= it++) { - sql_field->field->set_null(); - sql_field->field->reset(); - thd->cuted_fields++; - push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_WARN_TOO_FEW_RECORDS, - ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count); + if (item->type() == Item::FIELD_ITEM) + { + /* + QQ: We probably should not throw warning for each field. + But how about intention to always have the same number + of warnings in THD::cuted_fields (and get rid of cuted_fields + in the end ?) + */ + thd->cuted_fields++; + push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_WARN_TOO_FEW_RECORDS, + ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count); + } + else + ((Item_user_var_as_out_param *)item)->set_null_value( + read_info.read_charset); } } + if (fill_record(thd, set_fields, set_values, ignore_check_option_errors)) + DBUG_RETURN(1); + switch (table_list->view_check_option(thd, ignore_check_option_errors)) { case VIEW_CHECK_SKIP: diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d5ed8c8efb0..ca8414f9d54 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3337,14 +3337,10 @@ unsent_create_error: { DBUG_ASSERT(first_table == all_tables && first_table != 0); uint privilege= (lex->duplicates == DUP_REPLACE ? - INSERT_ACL | DELETE_ACL : INSERT_ACL); + INSERT_ACL | DELETE_ACL : INSERT_ACL) | + (lex->local_file ? 0 : FILE_ACL); - if (!lex->local_file) - { - if (check_access(thd, privilege | FILE_ACL, first_table->db, 0, 0, 0)) - goto error; - } - else + if (lex->local_file) { if (!(thd->client_capabilities & CLIENT_LOCAL_FILES) || ! opt_local_infile) @@ -3352,12 +3348,14 @@ unsent_create_error: my_message(ER_NOT_ALLOWED_COMMAND, ER(ER_NOT_ALLOWED_COMMAND), MYF(0)); goto error; } - if (check_one_table_access(thd, privilege, all_tables)) - goto error; } + + if (check_one_table_access(thd, privilege, all_tables)) + goto error; + res= mysql_load(thd, lex->exchange, first_table, lex->field_list, - lex->duplicates, lex->ignore, (bool) lex->local_file, - lex->lock_option); + lex->update_list, lex->value_list, lex->duplicates, + lex->ignore, (bool) lex->local_file); break; } diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 0284ab542df..634b6ab0995 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1511,17 +1511,16 @@ int log_loaded_block(IO_CACHE* file) lf_info->last_pos_in_file = file->pos_in_file; if (lf_info->wrote_create_file) { - Append_block_log_event a(lf_info->thd, lf_info->db, buffer, block_len, - lf_info->log_delayed); + Append_block_log_event a(lf_info->thd, lf_info->thd->db, buffer, + block_len, lf_info->log_delayed); mysql_bin_log.write(&a); } else { - Create_file_log_event c(lf_info->thd,lf_info->ex,lf_info->db, - lf_info->table_name, *lf_info->fields, - lf_info->handle_dup, lf_info->ignore, buffer, - block_len, lf_info->log_delayed); - mysql_bin_log.write(&c); + Begin_load_query_log_event b(lf_info->thd, lf_info->thd->db, + buffer, block_len, + lf_info->log_delayed); + mysql_bin_log.write(&b); lf_info->wrote_create_file = 1; DBUG_SYNC_POINT("debug_lock.created_file_event",10); } diff --git a/sql/sql_repl.h b/sql/sql_repl.h index b901d7cfe0c..9eb6456ee20 100644 --- a/sql/sql_repl.h +++ b/sql/sql_repl.h @@ -63,12 +63,7 @@ typedef struct st_load_file_info { THD* thd; my_off_t last_pos_in_file; - sql_exchange* ex; - List <Item> *fields; - enum enum_duplicates handle_dup; - char* db; - char* table_name; - bool wrote_create_file, log_delayed, ignore; + bool wrote_create_file, log_delayed; } LOAD_FILE_INFO; int log_loaded_block(IO_CACHE* file); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 56dd6409eba..ef5cbb3c79b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -686,7 +686,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); text_string opt_gconcat_separator %type <num> - type int_type real_type order_dir opt_field_spec lock_option + type int_type real_type order_dir lock_option udf_type if_exists opt_local opt_table_options table_options table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct @@ -714,6 +714,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); signed_literal now_or_signed_literal opt_escape sp_opt_default simple_ident_nospvar simple_ident_q + field_or_var %type <item_num> NUM_literal @@ -809,6 +810,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); prepare prepare_src execute deallocate statement sp_suid opt_view_list view_list or_replace algorithm sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa + load_data opt_field_or_var_spec fields_or_vars opt_load_data_set_spec END_OF_INPUT %type <NONE> call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt @@ -5703,11 +5705,6 @@ insert_field_spec: } ident_eq_list; -opt_field_spec: - /* empty */ { } - | '(' fields ')' { } - | '(' ')' { }; - fields: fields ',' insert_ident { Lex->field_list.push_back($3); } | insert_ident { Lex->field_list.push_back($1); }; @@ -6409,34 +6406,53 @@ use: USE_SYM ident /* import, export of files */ -load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING_sys +load: LOAD DATA_SYM + { + LEX *lex=Lex; + lex->fname_start= lex->ptr; + } + load_data + {} + | + LOAD TABLE_SYM table_ident FROM MASTER_SYM + { + Lex->sql_command = SQLCOM_LOAD_MASTER_TABLE; + if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING)) + YYABORT; + }; + +load_data: + load_data_lock opt_local INFILE TEXT_STRING_sys { LEX *lex=Lex; lex->sql_command= SQLCOM_LOAD; - lex->lock_option= $3; - lex->local_file= $4; + lex->lock_option= $1; + lex->local_file= $2; lex->duplicates= DUP_ERROR; lex->ignore= 0; - if (!(lex->exchange= new sql_exchange($6.str,0))) - YYABORT; - lex->field_list.empty(); - } - opt_duplicate INTO TABLE_SYM table_ident opt_field_term opt_line_term - opt_ignore_lines opt_field_spec - { - if (!Select->add_table_to_list(YYTHD, $11, NULL, TL_OPTION_UPDATING)) + if (!(lex->exchange= new sql_exchange($4.str, 0))) YYABORT; + } + opt_duplicate INTO + { + LEX *lex=Lex; + lex->fname_end= lex->ptr; } - | - LOAD TABLE_SYM table_ident FROM MASTER_SYM + TABLE_SYM table_ident { - Lex->sql_command = SQLCOM_LOAD_MASTER_TABLE; - if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING)) - YYABORT; - + LEX *lex=Lex; + if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING, + lex->lock_option)) + YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); } + opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec + opt_load_data_set_spec + {} | - LOAD DATA_SYM FROM MASTER_SYM + FROM MASTER_SYM { Lex->sql_command = SQLCOM_LOAD_MASTER_DATA; }; @@ -6516,6 +6532,29 @@ opt_ignore_lines: Lex->exchange->skip_lines= atol($2.str); }; +opt_field_or_var_spec: + /* empty */ { } + | '(' fields_or_vars ')' { } + | '(' ')' { }; + +fields_or_vars: + fields_or_vars ',' field_or_var + { Lex->field_list.push_back($3); } + | field_or_var + { Lex->field_list.push_back($1); } + ; + +field_or_var: + simple_ident_nospvar {$$= $1;} + | '@' ident_or_text + { $$= new Item_user_var_as_out_param($2); } + ; + +opt_load_data_set_spec: + /* empty */ { } + | SET insert_update_list { }; + + /* Common definitions */ text_literal: |