From: Marc Alff Date: June 2 2010 8:42am Subject: bzr commit into mysql-next-mr-wl5291 branch (marc.alff:3148) List-Archive: http://lists.mysql.com/commits/109880 Message-Id: <201006020844.o527PMdY010621@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3895594363348119640==" --===============3895594363348119640== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/malff/BZR_TREE/mysql-next-mr-wl5291/ based on revid:marc.alff@stripped 3148 Marc Alff 2010-06-02 [merge] merge mysql-next-mr --> mysql-next-mr-wl5291 added: mysql-test/include/mysqlbinlog_raw_mode.inc mysql-test/r/mysqlbinlog_raw_mode.result mysql-test/r/mysqlbinlog_raw_mode_win.result mysql-test/t/mysqlbinlog_raw_mode.test mysql-test/t/mysqlbinlog_raw_mode_win.test modified: client/Makefile.am client/client_priv.h client/mysqlbinlog.cc === modified file 'client/Makefile.am' --- a/client/Makefile.am 2010-05-19 13:00:23 +0000 +++ b/client/Makefile.am 2010-05-20 17:20:23 +0000 @@ -57,14 +57,10 @@ mysql_LDADD = @readline_link@ @TERMCAP $(LDADD) $(CXXLDFLAGS) mysqladmin_SOURCES = mysqladmin.cc -mysqlbinlog_SOURCES = mysqlbinlog.cc \ - $(top_srcdir)/mysys/mf_tempdir.c \ - $(top_srcdir)/mysys/my_new.cc \ - $(top_srcdir)/mysys/my_bit.c \ - $(top_srcdir)/mysys/my_bitmap.c \ - $(top_srcdir)/mysys/my_vle.c \ - $(top_srcdir)/mysys/base64.c -mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS) +mysqlbinlog_SOURCES = mysqlbinlog.cc +mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \ + $(LIBMYSQLCLIENT_LA) @CLIENT_EXTRA_LDFLAGS@ \ + $(top_builddir)/mysys/libmysys.a mysqldump_SOURCES= mysqldump.c \ my_user.c \ === modified file 'client/client_priv.h' --- a/client/client_priv.h 2010-03-31 14:05:33 +0000 +++ b/client/client_priv.h 2010-05-11 10:37:34 +0000 @@ -84,6 +84,7 @@ enum options_client OPT_DEBUG_INFO, OPT_DEBUG_CHECK, OPT_COLUMN_TYPES, OPT_ERROR_LOG_FILE, OPT_WRITE_BINLOG, OPT_DUMP_DATE, OPT_INIT_COMMAND, + OPT_RAW_OUTPUT, OPT_WAIT_SERVER_ID, OPT_STOP_NEVER, OPT_MAX_CLIENT_OPTION }; === modified file 'client/mysqlbinlog.cc' --- a/client/mysqlbinlog.cc 2010-04-22 15:07:50 +0000 +++ b/client/mysqlbinlog.cc 2010-05-28 07:26:32 +0000 @@ -32,6 +32,8 @@ #include /* That one is necessary for defines of OPTION_NO_FOREIGN_KEY_CHECKS etc */ #include "sql_priv.h" +#include +#include #include "log_event.h" #include "sql_common.h" @@ -51,6 +53,7 @@ ulong open_files_limit; uint test_flags = 0; static uint opt_protocol= 0; static FILE *result_file; +char **defaults_argv; #ifndef DBUG_OFF static const char* default_dbug_option = "d:t:o,/tmp/mysqlbinlog.trace"; @@ -60,7 +63,7 @@ static const char *load_default_groups[] static void error(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2); static void warning(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2); -static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0; +static bool one_database=0, disable_log_bin= 0; static bool opt_hexdump= 0; const char *base64_output_mode_names[]= {"NEVER", "AUTO", "ALWAYS", "UNSPEC", "DECODE-ROWS", NullS}; @@ -70,10 +73,13 @@ TYPELIB base64_output_mode_typelib= static enum_base64_output_mode opt_base64_output_mode= BASE64_OUTPUT_UNSPEC; static const char *opt_base64_output_mode_str= NullS; static const char* database= 0; +static const char* output_file= 0; static my_bool force_opt= 0, short_form= 0, remote_opt= 0; static my_bool debug_info_flag, debug_check_flag; -static my_bool force_if_open_opt= 1; +static my_bool force_if_open_opt= 1, raw_mode= 0; +static my_bool to_last_remote_log= 0, stop_never= 0; static ulonglong offset = 0; +static ulonglong stop_never_server_id= 1; static const char* host = 0; static int port= 0; static uint my_end_arg; @@ -125,6 +131,10 @@ static Exit_status dump_remote_log_entri static Exit_status dump_log_entries(const char* logname); static Exit_status safe_connect(); +static void force_quit(int param); +static void quit(Exit_status retval); +static void init_signals(void); +static int args_post_process(void); class Load_log_processor { @@ -1081,6 +1091,14 @@ static struct my_option my_long_options[ {"read-from-remote-server", 'R', "Read binary logs from a MySQL server.", (uchar**) &remote_opt, (uchar**) &remote_opt, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"raw", OPT_RAW_OUTPUT, "Requires -R. Output raw binlog data instead of SQL \ +statements, output is to log files.", + (uchar**) &raw_mode, (uchar**) &raw_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, + 0, 0}, + {"result-file", 'r', "Direct output to a given file. With --raw this is a \ +prefix for the file names. Cannot use with --result-dir.", + (uchar**) &output_file, (uchar**) &output_file, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, {"result-file", 'r', "Direct output to a given file.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"server-id", OPT_SERVER_ID, @@ -1128,6 +1146,15 @@ static struct my_option my_long_options[ "(you should probably use quotes for your shell to set it properly).", (uchar**) &stop_datetime_str, (uchar**) &stop_datetime_str, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"stop-never", OPT_STOP_NEVER, "Wait for more data from the server \ +instead of stopping at the end of the last log. Implicitly sets \ +--to-last-log but instead of stopping at the end of the last log it continues \ +to wait till the server disconnects.", + (uchar**) &stop_never, (uchar**) &stop_never, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"stop-never-slave-server-id", OPT_WAIT_SERVER_ID, + "The slave server ID used for stop-never", (uchar**) &stop_never_server_id, + (uchar**) &stop_never_server_id, 0, GET_ULONG, REQUIRED_ARG, 65535, 1, 65535, 0, 0, 0}, {"stop-position", OPT_STOP_POSITION, "Stop reading the binlog at position N. Applies to the last binlog " "passed on the command line.", @@ -1317,10 +1344,6 @@ get_one_option(int optid, const struct m else tty_password=1; break; - case 'r': - if (!(result_file = my_fopen(argument, O_WRONLY | O_BINARY, MYF(MY_WME)))) - exit(1); - break; case 'R': remote_opt= 1; break; @@ -1352,6 +1375,10 @@ get_one_option(int optid, const struct m case 'V': print_version(); exit(0); + case OPT_STOP_NEVER: + /* wait-for-data implicitly sets to-last-log */ + to_last_remote_log= 1; + break; case '?': usage(); exit(0); @@ -1436,7 +1463,10 @@ static Exit_status dump_log_entries(cons Set safe delimiter, to dump things like CREATE PROCEDURE safely */ - fprintf(result_file, "DELIMITER /*!*/;\n"); + if (!raw_mode) + { + fprintf(result_file, "DELIMITER /*!*/;\n"); + } strmov(print_event_info.delimiter, "/*!*/;"); print_event_info.verbose= short_form ? 0 : verbose; @@ -1445,8 +1475,11 @@ static Exit_status dump_log_entries(cons dump_local_log_entries(&print_event_info, logname)); /* Set delimiter back to semicolon */ - fprintf(result_file, "DELIMITER ;\n"); - strmov(print_event_info.delimiter, ";"); + if (!raw_mode) + { + fprintf(result_file, "DELIMITER ;\n"); + strmov(print_event_info.delimiter, ";"); + } return rc; } @@ -1546,9 +1579,11 @@ static Exit_status dump_remote_log_entri uchar buf[128]; ulong len; uint logname_len; + uint server_id; NET* net; my_off_t old_off= start_position_mot; char fname[FN_REFLEN+1]; + char log_file_name[FN_REFLEN+1]; Exit_status retval= OK_CONTINUE; DBUG_ENTER("dump_remote_log_entries"); @@ -1578,7 +1613,14 @@ static Exit_status dump_remote_log_entri DBUG_RETURN(ERROR_STOP); } logname_len = (uint) tlen; - int4store(buf + 6, 0); + /* + Fake a server ID to log continously. + This will show as a slave on the mysql server. + */ + server_id= ((to_last_remote_log && stop_never) ? + stop_never_server_id : 0); + + int4store(buf + 6, server_id); memcpy(buf + 10, logname, logname_len); if (simple_command(mysql, COM_BINLOG_DUMP, buf, logname_len + 10, 1)) { @@ -1601,20 +1643,28 @@ static Exit_status dump_remote_log_entri break; // end of data DBUG_PRINT("info",( "len: %lu net->read_pos[5]: %d\n", len, net->read_pos[5])); - if (!(ev= Log_event::read_log_event((const char*) net->read_pos + 1 , - len - 1, &error_msg, - glob_description_event))) - { - error("Could not construct log event object: %s", error_msg); - DBUG_RETURN(ERROR_STOP); - } /* - If reading from a remote host, ensure the temp_buf for the - Log_event class is pointing to the incoming stream. + In raw mode We only need the full event details if it is a + ROTATE_EVENT or FORMAT_DESCRIPTION_EVENT */ - ev->register_temp_buf((char *) net->read_pos + 1); - Log_event_type type= ev->get_type_code(); + Log_event_type type= (Log_event_type) *(((const char*) net->read_pos + 1) + EVENT_TYPE_OFFSET); + if (!raw_mode || (type == ROTATE_EVENT) || + (type == FORMAT_DESCRIPTION_EVENT)) + { + if (!(ev= Log_event::read_log_event((const char*) net->read_pos + 1 , + len - 1, &error_msg, + glob_description_event))) + { + error("Could not construct log event object: %s", error_msg); + DBUG_RETURN(ERROR_STOP); + } + /* + If reading from a remote host, ensure the temp_buf for the + Log_event class is pointing to the incoming stream. + */ + ev->register_temp_buf((char *) net->read_pos + 1); + } if (glob_description_event->binlog_version >= 3 || (type != LOAD_EVENT && type != CREATE_FILE_EVENT)) { @@ -1637,6 +1687,19 @@ static Exit_status dump_remote_log_entri part of our log) and then we will stop when we receive the fake one soon. */ + if (raw_mode) + { + if (output_file != 0) + { + my_snprintf(log_file_name, sizeof(log_file_name), "%s%s", + output_file, rev->new_log_ident); + } + else + { + strmov(log_file_name, rev->new_log_ident); + } + } + if (rev->when == 0) { if (!to_last_remote_log) @@ -1666,10 +1729,45 @@ static Exit_status dump_remote_log_entri don't increment old_off. Real Format_description_log_event always starts from BIN_LOG_HEADER_SIZE position. */ - if (old_off != BIN_LOG_HEADER_SIZE) - len= 1; // fake event, don't increment old_off + // fake event when not in raw mode, don't increment old_off + if ((old_off != BIN_LOG_HEADER_SIZE) && (!raw_mode)) + len= 1; + if (raw_mode) + { + my_fclose(result_file, MYF(0)); + if (!(result_file = my_fopen(log_file_name, O_WRONLY | O_BINARY, + MYF(MY_WME)))) + { + error("Could not create log file '%s'", log_file_name); + DBUG_RETURN(ERROR_STOP); + } + fprintf(result_file,"%s", BINLOG_MAGIC); + /* + Need to handle these events correctly in raw mode too + or this could get messy + */ + delete glob_description_event; + glob_description_event= (Format_description_log_event*) ev; + print_event_info->common_header_len= glob_description_event->common_header_len; + ev->temp_buf= 0; + ev= 0; + } + } + + if (raw_mode) + { + my_fwrite(result_file, net->read_pos + 1 , len - 1, MYF(0)); + if (ev) + { + ev->temp_buf=0; + delete ev; + } } - Exit_status retval= process_event(print_event_info, ev, old_off, logname); + else + { + retval= process_event(print_event_info, ev, old_off, logname); + } + if (retval != OK_CONTINUE) DBUG_RETURN(retval); } @@ -1679,7 +1777,6 @@ static Exit_status dump_remote_log_entri const char *old_fname= le->fname; uint old_len= le->fname_len; File file; - Exit_status retval; if ((file= load_processor.prepare_new_file_for_old_format(le,fname)) < 0) DBUG_RETURN(ERROR_STOP); @@ -2012,16 +2109,61 @@ end: return retval; } +/* Post processing of arguments to check for conflicts and other setups */ +static int args_post_process(void) +{ + DBUG_ENTER("args_post_process"); + MY_STAT stat_info; + int err; + + if ((raw_mode != 0) && (one_database != 0)) + { + warning("The --database option is ignored with --raw mode"); + } + + if ((remote_opt == 0) && (raw_mode != 0)) + { + error("You need to set --read-from-remote-server for --raw mode"); + DBUG_RETURN(ERROR_STOP); + } + + if ((raw_mode) && (stop_position != (ulonglong)(~(my_off_t)0))) + { + warning("The --stop-position option is ignored in raw mode"); + } + + if ((raw_mode) && (stop_datetime != MY_TIME_T_MAX)) + { + warning("The --stop-datetime option is ignored in raw mode"); + } + + /* + Make this last of the post-option tests so we don't exit with a + file open + */ + + if ((output_file != 0) && (!raw_mode)) + { + if (!(result_file = my_fopen(output_file, O_WRONLY | O_BINARY, MYF(MY_WME)))) + { + error("Could not create log file '%s'", output_file); + DBUG_RETURN(ERROR_STOP); + } + } + DBUG_RETURN(OK_CONTINUE); +} + int main(int argc, char** argv) { - char **defaults_argv; - Exit_status retval= OK_CONTINUE; + Exit_status retval= OK_STOP; ulonglong save_stop_position; MY_INIT(argv[0]); DBUG_ENTER("main"); DBUG_PROCESS(argv[0]); + init_signals(); + my_init_time(); // for time functions if (load_defaults("my", load_default_groups, &argc, &argv)) @@ -2032,10 +2174,14 @@ int main(int argc, char** argv) if (!argc) { usage(); - free_defaults(defaults_argv); - exit(1); + quit(ERROR_STOP); } + /* Check for argument conflicts and do any post-processing */ + if (args_post_process() == ERROR_STOP) + quit(ERROR_STOP); + + if (opt_base64_output_mode == BASE64_OUTPUT_UNSPEC) opt_base64_output_mode= BASE64_OUTPUT_AUTO; @@ -2057,27 +2203,30 @@ int main(int argc, char** argv) else load_processor.init_by_cur_dir(); - fprintf(result_file, - "/*!40019 SET @@session.max_insert_delayed_threads=0*/;\n"); - - if (disable_log_bin) + if (!raw_mode) + { fprintf(result_file, - "/*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/;\n"); + "/*!40019 SET @@session.max_insert_delayed_threads=0*/;\n"); - /* - In mysqlbinlog|mysql, don't want mysql to be disconnected after each - transaction (which would be the case with GLOBAL.COMPLETION_TYPE==2). - */ - fprintf(result_file, - "/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE," - "COMPLETION_TYPE=0*/;\n"); + if (disable_log_bin) + fprintf(result_file, + "/*!32316 SET @OLD_SQL_LOG_BIN=@@SQL_LOG_BIN, SQL_LOG_BIN=0*/;\n"); - if (charset) + /* + In mysqlbinlog|mysql, don't want mysql to be disconnected after each + transaction (which would be the case with GLOBAL.COMPLETION_TYPE==2). + */ fprintf(result_file, - "\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" - "\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" - "\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" - "\n/*!40101 SET NAMES %s */;\n", charset); + "/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE," + "COMPLETION_TYPE=0*/;\n"); + + if (charset) + fprintf(result_file, + "\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" + "\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" + "\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" + "\n/*!40101 SET NAMES %s */;\n", charset); + } for (save_stop_position= stop_position, stop_position= ~(my_off_t)0 ; (--argc >= 0) ; ) @@ -2091,36 +2240,57 @@ int main(int argc, char** argv) start_position= BIN_LOG_HEADER_SIZE; } - /* - Issue a ROLLBACK in case the last printed binlog was crashed and had half - of transaction. - */ - fprintf(result_file, + if (!raw_mode) + { + /* + Issue a ROLLBACK in case the last printed binlog was crashed and had half + of transaction. + */ + fprintf(result_file, "# End of log file\nROLLBACK /* added by mysqlbinlog */;\n" "/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;\n"); - if (disable_log_bin) - fprintf(result_file, "/*!32316 SET SQL_LOG_BIN=@OLD_SQL_LOG_BIN*/;\n"); + if (disable_log_bin) + fprintf(result_file, "/*!32316 SET SQL_LOG_BIN=@OLD_SQL_LOG_BIN*/;\n"); - if (charset) - fprintf(result_file, - "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n" - "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n" - "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"); + if (charset) + fprintf(result_file, + "/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n" + "/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n" + "/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"); + } if (tmpdir.list) free_tmpdir(&tmpdir); + quit(retval); +} + +/* Catch all these signals so that we can close files safely when exiting */ +static void init_signals(void) +{ + int signals[] = {SIGINT,SIGTERM}; + + for (uint i=0 ; i < sizeof(signals)/sizeof(int) ; i++) + signal(signals[i], force_quit); +} + +static void force_quit(int param) +{ + quit(OK_STOP); +} + +static void quit(Exit_status retval) +{ if (result_file != stdout) my_fclose(result_file, MYF(0)); cleanup(); - free_defaults(defaults_argv); + if (defaults_argv) + free_defaults(defaults_argv); my_free_open_file_info(); load_processor.destroy(); /* We cannot free DBUG, it is used in global destructors after exit(). */ my_end(my_end_arg | MY_DONT_FREE_DBUG); exit(retval == ERROR_STOP ? 1 : 0); - /* Keep compilers happy. */ - DBUG_RETURN(retval == ERROR_STOP ? 1 : 0); } /* === added file 'mysql-test/include/mysqlbinlog_raw_mode.inc' --- a/mysql-test/include/mysqlbinlog_raw_mode.inc 1970-01-01 00:00:00 +0000 +++ b/mysql-test/include/mysqlbinlog_raw_mode.inc 2010-05-21 21:48:20 +0000 @@ -0,0 +1,388 @@ +# Tests for new raw mode features in mysqlbinlog, row mode +# TODO: Test --wait-for-data + +# Delete all the binary logs +reset master; + +# we need this for getting fixed timestamps inside of this test +set timestamp=1000000000; + +--disable_warnings +drop table if exists t1; +--enable_warnings +CREATE TABLE t1 (c01 BIT); +INSERT INTO t1 VALUES (0); +INSERT INTO t1 VALUES (1); +DROP TABLE t1; + +CREATE TABLE t1 (c01 BIT(7)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (64); +INSERT INTO t1 VALUES (127); +DELETE FROM t1 WHERE c01=127; +UPDATE t1 SET c01=15 WHERE c01=16; +DROP TABLE t1; + +CREATE TABLE t1 (a BIT(20), b CHAR(2)); +INSERT INTO t1 VALUES (b'00010010010010001001', 'ab'); +DROP TABLE t1; + +CREATE TABLE t1 (c02 BIT(64)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (128); +INSERT INTO t1 VALUES (b'1111111111111111111111111111111111111111111111111111111111111111'); +DROP TABLE t1; + + +CREATE TABLE t1 (c03 TINYINT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t1 VALUES (-128); +UPDATE t1 SET c03=2 WHERE c03=1; +DELETE FROM t1 WHERE c03=-128; +DROP TABLE t1; + +CREATE TABLE t1 (c04 TINYINT UNSIGNED); +INSERT INTO t1 VALUES (128), (255); +UPDATE t1 SET c04=2 WHERE c04=1; +DELETE FROM t1 WHERE c04=255; +DROP TABLE t1; + +CREATE TABLE t1 (c06 BOOL); +INSERT INTO t1 VALUES (TRUE); +DELETE FROM t1 WHERE c06=TRUE; +DROP TABLE t1; + +CREATE TABLE t1 (c07 SMALLINT); +INSERT INTO t1 VALUES (1234); +DELETE FROM t1 WHERE c07=1234; +DROP TABLE t1; + +CREATE TABLE t1 (c08 SMALLINT UNSIGNED); +INSERT INTO t1 VALUES (32768), (65535); +UPDATE t1 SET c08=2 WHERE c08=32768; +DELETE FROM t1 WHERE c08=65535; +DROP TABLE t1; + +CREATE TABLE t1 (c10 MEDIUMINT); +INSERT INTO t1 VALUES (12345); +DELETE FROM t1 WHERE c10=12345; +DROP TABLE t1; + +CREATE TABLE t1 (c11 MEDIUMINT UNSIGNED); +INSERT INTO t1 VALUES (8388608), (16777215); +UPDATE t1 SET c11=2 WHERE c11=8388608; +DELETE FROM t1 WHERE c11=16777215; +DROP TABLE t1; + +CREATE TABLE t1 (c13 INT); +INSERT INTO t1 VALUES (123456); +DELETE FROM t1 WHERE c13=123456; +DROP TABLE t1; + +CREATE TABLE t1 (c14 INT UNSIGNED); +INSERT INTO t1 VALUES (2147483648), (4294967295); +UPDATE t1 SET c14=2 WHERE c14=2147483648; +DELETE FROM t1 WHERE c14=4294967295; +DROP TABLE t1; + +CREATE TABLE t1 (c16 BIGINT); +INSERT INTO t1 VALUES (1234567890); +DELETE FROM t1 WHERE c16=1234567890; +DROP TABLE t1; + +CREATE TABLE t1 (c17 BIGINT UNSIGNED); +INSERT INTO t1 VALUES (9223372036854775808), (18446744073709551615); +UPDATE t1 SET c17=2 WHERE c17=9223372036854775808; +DELETE FROM t1 WHERE c17=18446744073709551615; +DROP TABLE t1; + +CREATE TABLE t1 (c19 FLOAT); +INSERT INTO t1 VALUES (123.2234); +DELETE FROM t1 WHERE c19>123; +DROP TABLE t1; + +CREATE TABLE t1 (c22 DOUBLE); +INSERT INTO t1 VALUES (123434.22344545); +DELETE FROM t1 WHERE c22>123434; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c25 DECIMAL(10,5)); +INSERT INTO t1 VALUES (124.45); +INSERT INTO t1 VALUES (-543.21); +DELETE FROM t1 WHERE c25=124.45; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c28 DATE); +INSERT INTO t1 VALUES ('2001-02-03'); +DELETE FROM t1 WHERE c28='2001-02-03'; +DROP TABLE t1; + +CREATE TABLE t1 (c29 DATETIME); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c29='2001-02-03 10:20:30'; +DROP TABLE t1; + +CREATE TABLE t1 (c30 TIMESTAMP); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c30='2001-02-03 10:20:30'; +DROP TABLE t1; + +CREATE TABLE t1 (c31 TIME); +INSERT INTO t1 VALUES ('11:22:33'); +DELETE FROM t1 WHERE c31='11:22:33'; +DROP TABLE t1; + +CREATE TABLE t1 (c32 YEAR); +INSERT INTO t1 VALUES ('2001'); +DELETE FROM t1 WHERE c32=2001; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c33 CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c33='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c34 CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c34=''; +DROP TABLE t1; + +CREATE TABLE t1 (c35 CHAR(1)); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c35='b'; +DROP TABLE t1; + +CREATE TABLE t1 (c36 CHAR(255)); +INSERT INTO t1 VALUES (repeat('c',255)); +DELETE FROM t1 WHERE c36>'c'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c37 NATIONAL CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c37='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c38 NATIONAL CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c38=''; +DROP TABLE t1; + +CREATE TABLE t1 (c39 NATIONAL CHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c39='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c40 NATIONAL CHAR(255)); +INSERT INTO t1 VALUES (repeat('a', 255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c40>'a'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c45 VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c45=''; +DROP TABLE t1; + +CREATE TABLE t1 (c46 VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c46='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c47 VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +DELETE FROM t1 WHERE c47>'a'; +DROP TABLE t1; + +CREATE TABLE t1 (c48 VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +DELETE FROM t1 WHERE c48>'a'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c49 NATIONAL VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c49=''; +DROP TABLE t1; + +CREATE TABLE t1 (c50 NATIONAL VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c50='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c51 NATIONAL VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c51>'a'; +DROP TABLE t1; + +CREATE TABLE t1 (c52 NATIONAL VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 261)); +DELETE FROM t1 WHERE c52>'a'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c57 BINARY); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c57='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c58 BINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c58=''; +DROP TABLE t1; + +CREATE TABLE t1 (c59 BINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c59='a'; +DROP TABLE t1; + +CREATE TABLE t1 (c60 BINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c60<0x02; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c61 VARBINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c61=''; +DROP TABLE t1; + +CREATE TABLE t1 (c62 VARBINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c62=0x02; +DROP TABLE t1; + +CREATE TABLE t1 (c63 VARBINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c63=0x02; +DROP TABLE t1; + +# +flush logs; + +CREATE TABLE t1 (c65 TINYBLOB); +INSERT INTO t1 VALUES ('tinyblob1'); +DELETE FROM t1 WHERE c65='tinyblob1'; +DROP TABLE t1; + +CREATE TABLE t1 (c68 BLOB); +INSERT INTO t1 VALUES ('blob1'); +DELETE FROM t1 WHERE c68='blob1'; +DROP TABLE t1; + +CREATE TABLE t1 (c71 MEDIUMBLOB); +INSERT INTO t1 VALUES ('mediumblob1'); +DELETE FROM t1 WHERE c71='mediumblob1'; +DROP TABLE t1; + +CREATE TABLE t1 (c74 LONGBLOB); +INSERT INTO t1 VALUES ('longblob1'); +DELETE FROM t1 WHERE c74='longblob1'; +DROP TABLE t1; + +CREATE TABLE t1 (c66 TINYTEXT); +INSERT INTO t1 VALUES ('tinytext1'); +DELETE FROM t1 WHERE c66='tinytext1'; +DROP TABLE t1; + +CREATE TABLE t1 (c69 TEXT); +INSERT INTO t1 VALUES ('text1'); +DELETE FROM t1 WHERE c69='text1'; +DROP TABLE t1; + +CREATE TABLE t1 (c72 MEDIUMTEXT); +INSERT INTO t1 VALUES ('mediumtext1'); +DELETE FROM t1 WHERE c72='mediumtext1'; +DROP TABLE t1; + +CREATE TABLE t1 (c75 LONGTEXT); +INSERT INTO t1 VALUES ('longtext1'); +DELETE FROM t1 WHERE c75='longtext1'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c77 ENUM('a','b','c')); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c77='b'; +DROP TABLE t1; + +# + +CREATE TABLE t1 (c78 SET('a','b','c','d','e','f')); +INSERT INTO t1 VALUES ('a,b'); +INSERT INTO t1 VALUES ('a,c'); +INSERT INTO t1 VALUES ('b,c'); +INSERT INTO t1 VALUES ('a,b,c'); +INSERT INTO t1 VALUES ('a,b,c,d'); +INSERT INTO t1 VALUES ('a,b,c,d,e'); +INSERT INTO t1 VALUES ('a,b,c,d,e,f'); +DELETE FROM t1 WHERE c78='a,b'; +DROP TABLE t1; + +# +# Check multi-table update +# +CREATE TABLE t1 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +CREATE TABLE t2 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +INSERT INTO t1 SET a=1; +INSERT INTO t1 SET b=1; +INSERT INTO t2 SET a=1; +INSERT INTO t2 SET b=1; +UPDATE t1, t2 SET t1.a=10, t2.a=20; +DROP TABLE t1,t2; + +flush logs; + +let $MYSQLD_DATADIR= `select @@datadir`; + +# Test reading one file in raw mode +--exec $MYSQL_BINLOG --raw --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --result-file=$MYSQLTEST_VARDIR/tmp/ master-bin.000001 +--diff_files $MYSQLTEST_VARDIR/tmp/master-bin.000001 $MYSQLD_DATADIR/master-bin.000001 +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000001 + +# Test reading all files in raw mode +# Don't test the end file since this is still open with mysqld so will be different +--exec $MYSQL_BINLOG --raw --read-from-remote-server --to-last-log --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --result-file=$MYSQLTEST_VARDIR/tmp/ master-bin.000001 +--diff_files $MYSQLTEST_VARDIR/tmp/master-bin.000001 $MYSQLD_DATADIR/master-bin.000001 +--diff_files $MYSQLTEST_VARDIR/tmp/master-bin.000002 $MYSQLD_DATADIR/master-bin.000002 + +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000001 +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000002 +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000003 + + +# Test output to different filename +--exec $MYSQL_BINLOG --raw --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --result-file=$MYSQLTEST_VARDIR/tmp/server1- master-bin.000001 +--diff_files $MYSQLTEST_VARDIR/tmp/server1-master-bin.000001 $MYSQLD_DATADIR/master-bin.000001 +--remove_file $MYSQLTEST_VARDIR/tmp/server1-master-bin.000001 === added file 'mysql-test/r/mysqlbinlog_raw_mode.result' --- a/mysql-test/r/mysqlbinlog_raw_mode.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/mysqlbinlog_raw_mode.result 2010-05-21 21:48:20 +0000 @@ -0,0 +1,280 @@ +reset master; +set timestamp=1000000000; +drop table if exists t1; +CREATE TABLE t1 (c01 BIT); +INSERT INTO t1 VALUES (0); +INSERT INTO t1 VALUES (1); +DROP TABLE t1; +CREATE TABLE t1 (c01 BIT(7)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (64); +INSERT INTO t1 VALUES (127); +DELETE FROM t1 WHERE c01=127; +UPDATE t1 SET c01=15 WHERE c01=16; +DROP TABLE t1; +CREATE TABLE t1 (a BIT(20), b CHAR(2)); +INSERT INTO t1 VALUES (b'00010010010010001001', 'ab'); +DROP TABLE t1; +CREATE TABLE t1 (c02 BIT(64)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (128); +INSERT INTO t1 VALUES (b'1111111111111111111111111111111111111111111111111111111111111111'); +DROP TABLE t1; +CREATE TABLE t1 (c03 TINYINT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t1 VALUES (-128); +UPDATE t1 SET c03=2 WHERE c03=1; +DELETE FROM t1 WHERE c03=-128; +DROP TABLE t1; +CREATE TABLE t1 (c04 TINYINT UNSIGNED); +INSERT INTO t1 VALUES (128), (255); +UPDATE t1 SET c04=2 WHERE c04=1; +DELETE FROM t1 WHERE c04=255; +DROP TABLE t1; +CREATE TABLE t1 (c06 BOOL); +INSERT INTO t1 VALUES (TRUE); +DELETE FROM t1 WHERE c06=TRUE; +DROP TABLE t1; +CREATE TABLE t1 (c07 SMALLINT); +INSERT INTO t1 VALUES (1234); +DELETE FROM t1 WHERE c07=1234; +DROP TABLE t1; +CREATE TABLE t1 (c08 SMALLINT UNSIGNED); +INSERT INTO t1 VALUES (32768), (65535); +UPDATE t1 SET c08=2 WHERE c08=32768; +DELETE FROM t1 WHERE c08=65535; +DROP TABLE t1; +CREATE TABLE t1 (c10 MEDIUMINT); +INSERT INTO t1 VALUES (12345); +DELETE FROM t1 WHERE c10=12345; +DROP TABLE t1; +CREATE TABLE t1 (c11 MEDIUMINT UNSIGNED); +INSERT INTO t1 VALUES (8388608), (16777215); +UPDATE t1 SET c11=2 WHERE c11=8388608; +DELETE FROM t1 WHERE c11=16777215; +DROP TABLE t1; +CREATE TABLE t1 (c13 INT); +INSERT INTO t1 VALUES (123456); +DELETE FROM t1 WHERE c13=123456; +DROP TABLE t1; +CREATE TABLE t1 (c14 INT UNSIGNED); +INSERT INTO t1 VALUES (2147483648), (4294967295); +UPDATE t1 SET c14=2 WHERE c14=2147483648; +DELETE FROM t1 WHERE c14=4294967295; +DROP TABLE t1; +CREATE TABLE t1 (c16 BIGINT); +INSERT INTO t1 VALUES (1234567890); +DELETE FROM t1 WHERE c16=1234567890; +DROP TABLE t1; +CREATE TABLE t1 (c17 BIGINT UNSIGNED); +INSERT INTO t1 VALUES (9223372036854775808), (18446744073709551615); +UPDATE t1 SET c17=2 WHERE c17=9223372036854775808; +DELETE FROM t1 WHERE c17=18446744073709551615; +DROP TABLE t1; +CREATE TABLE t1 (c19 FLOAT); +INSERT INTO t1 VALUES (123.2234); +DELETE FROM t1 WHERE c19>123; +DROP TABLE t1; +CREATE TABLE t1 (c22 DOUBLE); +INSERT INTO t1 VALUES (123434.22344545); +DELETE FROM t1 WHERE c22>123434; +DROP TABLE t1; +CREATE TABLE t1 (c25 DECIMAL(10,5)); +INSERT INTO t1 VALUES (124.45); +INSERT INTO t1 VALUES (-543.21); +DELETE FROM t1 WHERE c25=124.45; +DROP TABLE t1; +CREATE TABLE t1 (c28 DATE); +INSERT INTO t1 VALUES ('2001-02-03'); +DELETE FROM t1 WHERE c28='2001-02-03'; +DROP TABLE t1; +CREATE TABLE t1 (c29 DATETIME); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c29='2001-02-03 10:20:30'; +DROP TABLE t1; +CREATE TABLE t1 (c30 TIMESTAMP); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c30='2001-02-03 10:20:30'; +DROP TABLE t1; +CREATE TABLE t1 (c31 TIME); +INSERT INTO t1 VALUES ('11:22:33'); +DELETE FROM t1 WHERE c31='11:22:33'; +DROP TABLE t1; +CREATE TABLE t1 (c32 YEAR); +INSERT INTO t1 VALUES ('2001'); +DELETE FROM t1 WHERE c32=2001; +DROP TABLE t1; +CREATE TABLE t1 (c33 CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c33='a'; +DROP TABLE t1; +CREATE TABLE t1 (c34 CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c34=''; +DROP TABLE t1; +CREATE TABLE t1 (c35 CHAR(1)); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c35='b'; +DROP TABLE t1; +CREATE TABLE t1 (c36 CHAR(255)); +INSERT INTO t1 VALUES (repeat('c',255)); +DELETE FROM t1 WHERE c36>'c'; +DROP TABLE t1; +CREATE TABLE t1 (c37 NATIONAL CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c37='a'; +DROP TABLE t1; +CREATE TABLE t1 (c38 NATIONAL CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c38=''; +DROP TABLE t1; +CREATE TABLE t1 (c39 NATIONAL CHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c39='a'; +DROP TABLE t1; +CREATE TABLE t1 (c40 NATIONAL CHAR(255)); +INSERT INTO t1 VALUES (repeat('a', 255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c40>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c45 VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c45=''; +DROP TABLE t1; +CREATE TABLE t1 (c46 VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c46='a'; +DROP TABLE t1; +CREATE TABLE t1 (c47 VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +DELETE FROM t1 WHERE c47>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c48 VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +DELETE FROM t1 WHERE c48>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c49 NATIONAL VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c49=''; +DROP TABLE t1; +CREATE TABLE t1 (c50 NATIONAL VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c50='a'; +DROP TABLE t1; +CREATE TABLE t1 (c51 NATIONAL VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c51>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c52 NATIONAL VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 261)); +DELETE FROM t1 WHERE c52>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c57 BINARY); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c57='a'; +DROP TABLE t1; +CREATE TABLE t1 (c58 BINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c58=''; +DROP TABLE t1; +CREATE TABLE t1 (c59 BINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c59='a'; +DROP TABLE t1; +CREATE TABLE t1 (c60 BINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c60<0x02; +DROP TABLE t1; +CREATE TABLE t1 (c61 VARBINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c61=''; +DROP TABLE t1; +CREATE TABLE t1 (c62 VARBINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c62=0x02; +DROP TABLE t1; +CREATE TABLE t1 (c63 VARBINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c63=0x02; +DROP TABLE t1; +flush logs; +CREATE TABLE t1 (c65 TINYBLOB); +INSERT INTO t1 VALUES ('tinyblob1'); +DELETE FROM t1 WHERE c65='tinyblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c68 BLOB); +INSERT INTO t1 VALUES ('blob1'); +DELETE FROM t1 WHERE c68='blob1'; +DROP TABLE t1; +CREATE TABLE t1 (c71 MEDIUMBLOB); +INSERT INTO t1 VALUES ('mediumblob1'); +DELETE FROM t1 WHERE c71='mediumblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c74 LONGBLOB); +INSERT INTO t1 VALUES ('longblob1'); +DELETE FROM t1 WHERE c74='longblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c66 TINYTEXT); +INSERT INTO t1 VALUES ('tinytext1'); +DELETE FROM t1 WHERE c66='tinytext1'; +DROP TABLE t1; +CREATE TABLE t1 (c69 TEXT); +INSERT INTO t1 VALUES ('text1'); +DELETE FROM t1 WHERE c69='text1'; +DROP TABLE t1; +CREATE TABLE t1 (c72 MEDIUMTEXT); +INSERT INTO t1 VALUES ('mediumtext1'); +DELETE FROM t1 WHERE c72='mediumtext1'; +DROP TABLE t1; +CREATE TABLE t1 (c75 LONGTEXT); +INSERT INTO t1 VALUES ('longtext1'); +DELETE FROM t1 WHERE c75='longtext1'; +DROP TABLE t1; +CREATE TABLE t1 (c77 ENUM('a','b','c')); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c77='b'; +DROP TABLE t1; +CREATE TABLE t1 (c78 SET('a','b','c','d','e','f')); +INSERT INTO t1 VALUES ('a,b'); +INSERT INTO t1 VALUES ('a,c'); +INSERT INTO t1 VALUES ('b,c'); +INSERT INTO t1 VALUES ('a,b,c'); +INSERT INTO t1 VALUES ('a,b,c,d'); +INSERT INTO t1 VALUES ('a,b,c,d,e'); +INSERT INTO t1 VALUES ('a,b,c,d,e,f'); +DELETE FROM t1 WHERE c78='a,b'; +DROP TABLE t1; +CREATE TABLE t1 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +CREATE TABLE t2 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +INSERT INTO t1 SET a=1; +INSERT INTO t1 SET b=1; +INSERT INTO t2 SET a=1; +INSERT INTO t2 SET b=1; +UPDATE t1, t2 SET t1.a=10, t2.a=20; +DROP TABLE t1,t2; +flush logs; +CREATE TABLE raw_mode_exit (exit_code INT); +SELECT ((@id := id) - id) from information_schema.processlist where processlist.command like '%Binlog%' and state like '%Master has sent%'; +((@id := id) - id) +0 +kill @id; +DROP TABLE raw_mode_exit; +End of tests === added file 'mysql-test/r/mysqlbinlog_raw_mode_win.result' --- a/mysql-test/r/mysqlbinlog_raw_mode_win.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/mysqlbinlog_raw_mode_win.result 2010-05-21 21:48:20 +0000 @@ -0,0 +1,274 @@ +reset master; +set timestamp=1000000000; +drop table if exists t1; +CREATE TABLE t1 (c01 BIT); +INSERT INTO t1 VALUES (0); +INSERT INTO t1 VALUES (1); +DROP TABLE t1; +CREATE TABLE t1 (c01 BIT(7)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (4); +INSERT INTO t1 VALUES (8); +INSERT INTO t1 VALUES (16); +INSERT INTO t1 VALUES (32); +INSERT INTO t1 VALUES (64); +INSERT INTO t1 VALUES (127); +DELETE FROM t1 WHERE c01=127; +UPDATE t1 SET c01=15 WHERE c01=16; +DROP TABLE t1; +CREATE TABLE t1 (a BIT(20), b CHAR(2)); +INSERT INTO t1 VALUES (b'00010010010010001001', 'ab'); +DROP TABLE t1; +CREATE TABLE t1 (c02 BIT(64)); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (128); +INSERT INTO t1 VALUES (b'1111111111111111111111111111111111111111111111111111111111111111'); +DROP TABLE t1; +CREATE TABLE t1 (c03 TINYINT); +INSERT INTO t1 VALUES (1),(2),(3); +INSERT INTO t1 VALUES (-128); +UPDATE t1 SET c03=2 WHERE c03=1; +DELETE FROM t1 WHERE c03=-128; +DROP TABLE t1; +CREATE TABLE t1 (c04 TINYINT UNSIGNED); +INSERT INTO t1 VALUES (128), (255); +UPDATE t1 SET c04=2 WHERE c04=1; +DELETE FROM t1 WHERE c04=255; +DROP TABLE t1; +CREATE TABLE t1 (c06 BOOL); +INSERT INTO t1 VALUES (TRUE); +DELETE FROM t1 WHERE c06=TRUE; +DROP TABLE t1; +CREATE TABLE t1 (c07 SMALLINT); +INSERT INTO t1 VALUES (1234); +DELETE FROM t1 WHERE c07=1234; +DROP TABLE t1; +CREATE TABLE t1 (c08 SMALLINT UNSIGNED); +INSERT INTO t1 VALUES (32768), (65535); +UPDATE t1 SET c08=2 WHERE c08=32768; +DELETE FROM t1 WHERE c08=65535; +DROP TABLE t1; +CREATE TABLE t1 (c10 MEDIUMINT); +INSERT INTO t1 VALUES (12345); +DELETE FROM t1 WHERE c10=12345; +DROP TABLE t1; +CREATE TABLE t1 (c11 MEDIUMINT UNSIGNED); +INSERT INTO t1 VALUES (8388608), (16777215); +UPDATE t1 SET c11=2 WHERE c11=8388608; +DELETE FROM t1 WHERE c11=16777215; +DROP TABLE t1; +CREATE TABLE t1 (c13 INT); +INSERT INTO t1 VALUES (123456); +DELETE FROM t1 WHERE c13=123456; +DROP TABLE t1; +CREATE TABLE t1 (c14 INT UNSIGNED); +INSERT INTO t1 VALUES (2147483648), (4294967295); +UPDATE t1 SET c14=2 WHERE c14=2147483648; +DELETE FROM t1 WHERE c14=4294967295; +DROP TABLE t1; +CREATE TABLE t1 (c16 BIGINT); +INSERT INTO t1 VALUES (1234567890); +DELETE FROM t1 WHERE c16=1234567890; +DROP TABLE t1; +CREATE TABLE t1 (c17 BIGINT UNSIGNED); +INSERT INTO t1 VALUES (9223372036854775808), (18446744073709551615); +UPDATE t1 SET c17=2 WHERE c17=9223372036854775808; +DELETE FROM t1 WHERE c17=18446744073709551615; +DROP TABLE t1; +CREATE TABLE t1 (c19 FLOAT); +INSERT INTO t1 VALUES (123.2234); +DELETE FROM t1 WHERE c19>123; +DROP TABLE t1; +CREATE TABLE t1 (c22 DOUBLE); +INSERT INTO t1 VALUES (123434.22344545); +DELETE FROM t1 WHERE c22>123434; +DROP TABLE t1; +CREATE TABLE t1 (c25 DECIMAL(10,5)); +INSERT INTO t1 VALUES (124.45); +INSERT INTO t1 VALUES (-543.21); +DELETE FROM t1 WHERE c25=124.45; +DROP TABLE t1; +CREATE TABLE t1 (c28 DATE); +INSERT INTO t1 VALUES ('2001-02-03'); +DELETE FROM t1 WHERE c28='2001-02-03'; +DROP TABLE t1; +CREATE TABLE t1 (c29 DATETIME); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c29='2001-02-03 10:20:30'; +DROP TABLE t1; +CREATE TABLE t1 (c30 TIMESTAMP); +INSERT INTO t1 VALUES ('2001-02-03 10:20:30'); +DELETE FROM t1 WHERE c30='2001-02-03 10:20:30'; +DROP TABLE t1; +CREATE TABLE t1 (c31 TIME); +INSERT INTO t1 VALUES ('11:22:33'); +DELETE FROM t1 WHERE c31='11:22:33'; +DROP TABLE t1; +CREATE TABLE t1 (c32 YEAR); +INSERT INTO t1 VALUES ('2001'); +DELETE FROM t1 WHERE c32=2001; +DROP TABLE t1; +CREATE TABLE t1 (c33 CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c33='a'; +DROP TABLE t1; +CREATE TABLE t1 (c34 CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c34=''; +DROP TABLE t1; +CREATE TABLE t1 (c35 CHAR(1)); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c35='b'; +DROP TABLE t1; +CREATE TABLE t1 (c36 CHAR(255)); +INSERT INTO t1 VALUES (repeat('c',255)); +DELETE FROM t1 WHERE c36>'c'; +DROP TABLE t1; +CREATE TABLE t1 (c37 NATIONAL CHAR); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c37='a'; +DROP TABLE t1; +CREATE TABLE t1 (c38 NATIONAL CHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c38=''; +DROP TABLE t1; +CREATE TABLE t1 (c39 NATIONAL CHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c39='a'; +DROP TABLE t1; +CREATE TABLE t1 (c40 NATIONAL CHAR(255)); +INSERT INTO t1 VALUES (repeat('a', 255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c40>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c45 VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c45=''; +DROP TABLE t1; +CREATE TABLE t1 (c46 VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c46='a'; +DROP TABLE t1; +CREATE TABLE t1 (c47 VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +DELETE FROM t1 WHERE c47>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c48 VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +DELETE FROM t1 WHERE c48>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c49 NATIONAL VARCHAR(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c49=''; +DROP TABLE t1; +CREATE TABLE t1 (c50 NATIONAL VARCHAR(1)); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c50='a'; +DROP TABLE t1; +CREATE TABLE t1 (c51 NATIONAL VARCHAR(255)); +INSERT INTO t1 VALUES (repeat('a',255)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 255)); +DELETE FROM t1 WHERE c51>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c52 NATIONAL VARCHAR(261)); +INSERT INTO t1 VALUES (repeat('a',261)); +INSERT INTO t1 VALUES (repeat(_latin1 0xDF, 261)); +DELETE FROM t1 WHERE c52>'a'; +DROP TABLE t1; +CREATE TABLE t1 (c57 BINARY); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c57='a'; +DROP TABLE t1; +CREATE TABLE t1 (c58 BINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c58=''; +DROP TABLE t1; +CREATE TABLE t1 (c59 BINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c59='a'; +DROP TABLE t1; +CREATE TABLE t1 (c60 BINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c60<0x02; +DROP TABLE t1; +CREATE TABLE t1 (c61 VARBINARY(0)); +INSERT INTO t1 VALUES (''); +DELETE FROM t1 WHERE c61=''; +DROP TABLE t1; +CREATE TABLE t1 (c62 VARBINARY(1)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES ('a'); +DELETE FROM t1 WHERE c62=0x02; +DROP TABLE t1; +CREATE TABLE t1 (c63 VARBINARY(255)); +INSERT INTO t1 VALUES (0x00); +INSERT INTO t1 VALUES (0x02); +INSERT INTO t1 VALUES (repeat('a\0',120)); +DELETE FROM t1 WHERE c63=0x02; +DROP TABLE t1; +flush logs; +CREATE TABLE t1 (c65 TINYBLOB); +INSERT INTO t1 VALUES ('tinyblob1'); +DELETE FROM t1 WHERE c65='tinyblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c68 BLOB); +INSERT INTO t1 VALUES ('blob1'); +DELETE FROM t1 WHERE c68='blob1'; +DROP TABLE t1; +CREATE TABLE t1 (c71 MEDIUMBLOB); +INSERT INTO t1 VALUES ('mediumblob1'); +DELETE FROM t1 WHERE c71='mediumblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c74 LONGBLOB); +INSERT INTO t1 VALUES ('longblob1'); +DELETE FROM t1 WHERE c74='longblob1'; +DROP TABLE t1; +CREATE TABLE t1 (c66 TINYTEXT); +INSERT INTO t1 VALUES ('tinytext1'); +DELETE FROM t1 WHERE c66='tinytext1'; +DROP TABLE t1; +CREATE TABLE t1 (c69 TEXT); +INSERT INTO t1 VALUES ('text1'); +DELETE FROM t1 WHERE c69='text1'; +DROP TABLE t1; +CREATE TABLE t1 (c72 MEDIUMTEXT); +INSERT INTO t1 VALUES ('mediumtext1'); +DELETE FROM t1 WHERE c72='mediumtext1'; +DROP TABLE t1; +CREATE TABLE t1 (c75 LONGTEXT); +INSERT INTO t1 VALUES ('longtext1'); +DELETE FROM t1 WHERE c75='longtext1'; +DROP TABLE t1; +CREATE TABLE t1 (c77 ENUM('a','b','c')); +INSERT INTO t1 VALUES ('b'); +DELETE FROM t1 WHERE c77='b'; +DROP TABLE t1; +CREATE TABLE t1 (c78 SET('a','b','c','d','e','f')); +INSERT INTO t1 VALUES ('a,b'); +INSERT INTO t1 VALUES ('a,c'); +INSERT INTO t1 VALUES ('b,c'); +INSERT INTO t1 VALUES ('a,b,c'); +INSERT INTO t1 VALUES ('a,b,c,d'); +INSERT INTO t1 VALUES ('a,b,c,d,e'); +INSERT INTO t1 VALUES ('a,b,c,d,e,f'); +DELETE FROM t1 WHERE c78='a,b'; +DROP TABLE t1; +CREATE TABLE t1 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +CREATE TABLE t2 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0); +INSERT INTO t1 SET a=1; +INSERT INTO t1 SET b=1; +INSERT INTO t2 SET a=1; +INSERT INTO t2 SET b=1; +UPDATE t1, t2 SET t1.a=10, t2.a=20; +DROP TABLE t1,t2; +flush logs; +End of tests === added file 'mysql-test/t/mysqlbinlog_raw_mode.test' --- a/mysql-test/t/mysqlbinlog_raw_mode.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/mysqlbinlog_raw_mode.test 2010-05-21 21:48:20 +0000 @@ -0,0 +1,28 @@ +--source include/have_log_bin.inc +--source include/not_windows.inc + +-- source include/mysqlbinlog_raw_mode.inc + +# Test --stop-never +# If exit code is good or bad then entry in raw_mode_exit table will be created +# Anything above exit code 1 is bad. We wait for this +CREATE TABLE raw_mode_exit (exit_code INT); +--system `$MYSQL_BINLOG --raw --read-from-remote-server --stop-never --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --result-file=$MYSQLTEST_VARDIR/tmp/ master-bin.000001 ; [ \$? -le 1 ]` && $MYSQL -e "use test; INSERT INTO raw_mode_exit VALUES (1);" & + +let $wait_condition= SELECT id from information_schema.processlist where processlist.command like '%Binlog%' and state like '%Master has sent%'; +--source include/wait_condition.inc +--diff_files $MYSQLTEST_VARDIR/tmp/master-bin.000001 $MYSQLD_DATADIR/master-bin.000001 +--diff_files $MYSQLTEST_VARDIR/tmp/master-bin.000002 $MYSQLD_DATADIR/master-bin.000002 + +SELECT ((@id := id) - id) from information_schema.processlist where processlist.command like '%Binlog%' and state like '%Master has sent%'; +# Test killing from mysql server +kill @id; +--let $wait_condition= SELECT count(*) = 1 FROM raw_mode_exit WHERE exit_code = 1; +--source include/wait_condition.inc + +DROP TABLE raw_mode_exit; +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000001 +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000002 +--remove_file $MYSQLTEST_VARDIR/tmp/master-bin.000003 + +--echo End of tests === added file 'mysql-test/t/mysqlbinlog_raw_mode_win.test' --- a/mysql-test/t/mysqlbinlog_raw_mode_win.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/mysqlbinlog_raw_mode_win.test 2010-05-21 21:48:20 +0000 @@ -0,0 +1,10 @@ +-- source include/have_log_bin.inc +-- source include/windows.inc + +# +# WL#4783 +# + +-- source include/mysqlbinlog_raw_mode.inc + +-- echo End of tests --===============3895594363348119640== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/marc.alff@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: marc.alff@stripped # target_branch: file:///Users/malff/BZR_TREE/mysql-next-mr-wl5291/ # testament_sha1: d1aeee23da97e94316372739613e85ae4fe35600 # timestamp: 2010-06-02 02:42:50 -0600 # source_branch: file:///Users/malff/BZR_TREE/mysql-next-mr/ # base_revision_id: marc.alff@stripped\ # p7gbgdrm544wy941 # # Begin bundle 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 --===============3895594363348119640==--