diff options
author | unknown <bar@mysql.com/bar.intranet.mysql.r18.ru> | 2006-11-28 16:26:15 +0400 |
---|---|---|
committer | unknown <bar@mysql.com/bar.intranet.mysql.r18.ru> | 2006-11-28 16:26:15 +0400 |
commit | 36c7cfd71ea4645597cd0ca6d9279e0b14140a4e (patch) | |
tree | 37cbb0e7432a46e8e098901a69b7624eca5a2b36 /client/mysqlbinlog.cc | |
parent | d553728bfbf4ea4cbdf0532326c4873f4cdcae78 (diff) | |
download | mariadb-git-36c7cfd71ea4645597cd0ca6d9279e0b14140a4e.tar.gz |
Bug#20396 Bin Log does not get DELIMETER cmd - Recover StoredProc fails
Problem: when loading mysqlbinlog dumps, CREATE PROCEDURE having semicolons
in their bodies failed.
Fix: Using safe delimiter "/*!*/;" to dump log entries.
client/mysqlbinlog.cc:
- Adding PRINT_EVENT_INFO argument to dump_xxx_log_entries()
- Setting delimiter to "/*!*/;" before calling dump functions
mysql-test/r/ctype_ucs_binlog.result:
Fixing test results
mysql-test/r/mix_innodb_myisam_binlog.result:
Fixing test results
mysql-test/r/mysqlbinlog.result:
Fixing test results
Adding test case
mysql-test/r/mysqlbinlog2.result:
Fixing test results
mysql-test/r/rpl_charset.result:
Fixing test results
mysql-test/r/rpl_timezone.result:
Fixing test results
mysql-test/r/user_var-binlog.result:
Fixing test results
mysql-test/t/mix_innodb_myisam_binlog.test:
Fixing LIKE expression
mysql-test/t/mysqlbinlog.test:
Adding test case
sql/log_event.cc:
Using print_event_info->delimiter instead of
hard-coded semicolon as a query end marker.
sql/log_event.h:
Adding new member to store delimiter.
Diffstat (limited to 'client/mysqlbinlog.cc')
-rw-r--r-- | client/mysqlbinlog.cc | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index c04c2ecabd6..7c9e52611f6 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -94,8 +94,10 @@ static bool stop_passed= 0; */ Format_description_log_event* description_event; -static int dump_local_log_entries(const char* logname); -static int dump_remote_log_entries(const char* logname); +static int dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, + const char* logname); +static int dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info, + const char* logname); static int dump_log_entries(const char* logname); static int dump_remote_file(NET* net, const char* fname); static void die(const char* fmt, ...); @@ -950,8 +952,22 @@ static MYSQL* safe_connect() static int dump_log_entries(const char* logname) { - return (remote_opt ? dump_remote_log_entries(logname) : - dump_local_log_entries(logname)); + int rc; + PRINT_EVENT_INFO print_event_info; + /* + Set safe delimiter, to dump things + like CREATE PROCEDURE safely + */ + fprintf(result_file, "DELIMITER /*!*/;\n"); + strcpy(print_event_info.delimiter, "/*!*/;"); + + rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) : + dump_local_log_entries(&print_event_info, logname)); + + /* Set delimiter back to semicolon */ + fprintf(result_file, "DELIMITER ;\n"); + strcpy(print_event_info.delimiter, ";"); + return rc; } @@ -1016,11 +1032,11 @@ static int check_master_version(MYSQL* mysql, } -static int dump_remote_log_entries(const char* logname) +static int dump_remote_log_entries(PRINT_EVENT_INFO *print_event_info, + const char* logname) { char buf[128]; - PRINT_EVENT_INFO print_event_info; ulong len; uint logname_len; NET* net; @@ -1143,7 +1159,7 @@ could be out of memory"); len= 1; // fake Rotate, so don't increment old_off } } - if ((error= process_event(&print_event_info, ev, old_off))) + if ((error= process_event(print_event_info, ev, old_off))) { error= ((error < 0) ? 0 : 1); goto err; @@ -1162,7 +1178,7 @@ could be out of memory"); goto err; } - if ((error= process_event(&print_event_info, ev, old_off))) + if ((error= process_event(print_event_info, ev, old_off))) { my_close(file,MYF(MY_WME)); error= ((error < 0) ? 0 : 1); @@ -1288,11 +1304,11 @@ at offset %lu ; this could be a log format error or read error", } -static int dump_local_log_entries(const char* logname) +static int dump_local_log_entries(PRINT_EVENT_INFO *print_event_info, + const char* logname) { File fd = -1; IO_CACHE cache,*file= &cache; - PRINT_EVENT_INFO print_event_info; byte tmp_buff[BIN_LOG_HEADER_SIZE]; int error= 0; @@ -1364,7 +1380,7 @@ static int dump_local_log_entries(const char* logname) // file->error == 0 means EOF, that's OK, we break in this case break; } - if ((error= process_event(&print_event_info, ev, old_off))) + if ((error= process_event(print_event_info, ev, old_off))) { if (error < 0) error= 0; |