From a5bb4810ff33e89e160e340e9ab56cbb2fa5c605 Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Mon, 21 Mar 2005 11:07:31 +0100 Subject: [PATCH 1/7] BUG#9072 'Max_error_count' system variable cannot be set to zero - Chaned min value in mysqld.cc - Added testcase to warnings.test --- mysql-test/r/warnings.result | 19 +++++++++++++++++++ mysql-test/t/warnings.test | 13 +++++++++++++ sql/mysqld.cc | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/warnings.result b/mysql-test/r/warnings.result index e03d72351d1..d1d96afa153 100644 --- a/mysql-test/r/warnings.result +++ b/mysql-test/r/warnings.result @@ -142,6 +142,25 @@ Warning 1265 Data truncated for column 'b' at row 10 select @@warning_count; @@warning_count 50 +set max_error_count=0; +show variables like 'max_error_count'; +Variable_name Value +max_error_count 0 +update t1 set b='hi'; +Warnings: +select @@warning_count; +@@warning_count +50 +show warnings; +Level Code Message +set max_error_count=65535; +show variables like 'max_error_count'; +Variable_name Value +max_error_count 65535 +set max_error_count=10; +show variables like 'max_error_count'; +Variable_name Value +max_error_count 10 drop table t1; create table t1 (id int) engine=isam; Warnings: diff --git a/mysql-test/t/warnings.test b/mysql-test/t/warnings.test index 23ab5aa1f05..2a90f5f637d 100644 --- a/mysql-test/t/warnings.test +++ b/mysql-test/t/warnings.test @@ -97,6 +97,19 @@ update t1 set b=a; select @@warning_count; --enable_ps_protocol +# Bug#9072 +set max_error_count=0; +show variables like 'max_error_count'; +update t1 set b='hi'; +--disable_ps_protocol +select @@warning_count; +--enable_ps_protocol +show warnings; +set max_error_count=65535; +show variables like 'max_error_count'; +set max_error_count=10; +show variables like 'max_error_count'; + # # Test for handler type # diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 43ccfe2b366..59ab1a5610d 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -5053,7 +5053,7 @@ The minimum value for this variable is 4096.", "Max number of errors/warnings to store for a statement.", (gptr*) &global_system_variables.max_error_count, (gptr*) &max_system_variables.max_error_count, - 0, GET_ULONG, REQUIRED_ARG, DEFAULT_ERROR_COUNT, 1, 65535, 0, 1, 0}, + 0, GET_ULONG, REQUIRED_ARG, DEFAULT_ERROR_COUNT, 0, 65535, 0, 1, 0}, {"max_heap_table_size", OPT_MAX_HEP_TABLE_SIZE, "Don't allow creation of heap tables bigger than this.", (gptr*) &global_system_variables.max_heap_table_size, From 19499229ed912dccdfe8eebe8ab1040804d9dd0d Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Wed, 23 Mar 2005 19:19:36 +0100 Subject: [PATCH 2/7] "After Monty's review" changes to the fix for BUG#8325 "Deadlock in replication thread stops replication": s/sleep/safe_sleep (thread safe); sleep 0/1/2/3/4/5/5/5 (get slave less late); no message on error log (deadlock is too common sometimes), a global counter instead (SHOW STATUS LIKE 'slave_retried_transactions'). Plus a fix for libmysql/Makefile.shared --- BitKeeper/etc/logging_ok | 1 + libmysql/Makefile.shared | 3 ++- mysql-test/r/rpl_deadlock.result | 6 ++++++ mysql-test/t/rpl_deadlock.test | 4 ++++ sql/mysqld.cc | 16 +++++++++++++--- sql/slave.cc | 33 ++++++++++++++++---------------- sql/slave.h | 9 ++++++++- sql/sql_show.cc | 13 +++++++++++++ sql/structs.h | 2 +- 9 files changed, 64 insertions(+), 23 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 1a7799dc442..90e6c3c100d 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -44,6 +44,7 @@ dlenev@build.mysql.com dlenev@jabberwock.localdomain dlenev@mysql.com ejonore@mc03.ndb.mysql.com +gbichot@quadita2.mysql.com gbichot@quadxeon.mysql.com georg@beethoven.local georg@lmy002.wdf.sap.corp diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index 9664fb0abef..23a8201cbf6 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -94,7 +94,8 @@ clean-local: `echo $(sql_cmn_objects) | sed "s;\.lo;.c;g"` \ $(CHARSET_SRCS) $(CHARSET_OBJS) \ $(mystringsextra) $(mysysheaders) $(vioheaders)\ - ../linked_client_sources net.c + ../linked_libmysql_sources ../linked_libmysql_r_sources \ + net.c conf_to_src_SOURCES = conf_to_src.c conf_to_src_LDADD= diff --git a/mysql-test/r/rpl_deadlock.result b/mysql-test/r/rpl_deadlock.result index 366d18f3e05..8808a973855 100644 --- a/mysql-test/r/rpl_deadlock.result +++ b/mysql-test/r/rpl_deadlock.result @@ -8,6 +8,9 @@ create table t1 (a int not null, key(a)) engine=innodb; create table t2 (a int not null, key(a)) engine=innodb; create table t3 (a int) engine=innodb; create table t4 (a int) engine=innodb; +show variables like 'slave_transaction_retries'; +Variable_name Value +slave_transaction_retries 0 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( @@ -20,6 +23,9 @@ t2 CREATE TABLE `t2` ( `a` int(11) NOT NULL default '0', KEY `a` (`a`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 +show variables like 'slave_transaction_retries'; +Variable_name Value +slave_transaction_retries 2 stop slave; begin; insert into t3 select * from t2 for update; diff --git a/mysql-test/t/rpl_deadlock.test b/mysql-test/t/rpl_deadlock.test index 82470e8ebd0..9ad6362f7e7 100644 --- a/mysql-test/t/rpl_deadlock.test +++ b/mysql-test/t/rpl_deadlock.test @@ -7,6 +7,8 @@ # (Guilhem) have seen the test manage to provoke lock wait timeout # error but not deadlock error; that is ok as code deals with the two # errors in exactly the same way. +# We don't 'show status like 'slave_retried_transactions'' because this +# is not repeatable (depends on sleeps). source include/have_innodb.inc; source include/master-slave.inc; @@ -16,10 +18,12 @@ create table t1 (a int not null, key(a)) engine=innodb; create table t2 (a int not null, key(a)) engine=innodb; create table t3 (a int) engine=innodb; create table t4 (a int) engine=innodb; +show variables like 'slave_transaction_retries'; sync_slave_with_master; show create table t1; show create table t2; +show variables like 'slave_transaction_retries'; stop slave; # 1) Test deadlock diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 43ccfe2b366..ccbbe8c4908 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3062,8 +3062,17 @@ we force server id to 2, but this MySQL server will not act as a slave."); #endif if (opt_bootstrap) /* If running with bootstrap, do not start replication. */ opt_skip_slave_start= 1; - /* init_slave() must be called after the thread keys are created */ - init_slave(); + /* + init_slave() must be called after the thread keys are created. + Some parts of the code (e.g. SHOW STATUS LIKE 'slave_running' and other + places) assume that active_mi != 0, so let's fail if it's 0 (out of + memory); a message has already been printed. + */ + if (init_slave() && !active_mi) + { + end_thr_alarm(1); // Don't allow alarms + unireg_abort(1); + } if (opt_bootstrap) { @@ -5494,7 +5503,8 @@ struct show_var_st status_vars[]= { {"Select_range_check", (char*) &select_range_check_count, SHOW_LONG}, {"Select_scan", (char*) &select_scan_count, SHOW_LONG}, {"Slave_open_temp_tables", (char*) &slave_open_temp_tables, SHOW_LONG}, - {"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING}, + {"Slave_running", (char*) 0, SHOW_SLAVE_RUNNING}, + {"Slave_retried_transactions",(char*) 0, SHOW_SLAVE_RETRIED_TRANS}, {"Slow_launch_threads", (char*) &slow_launch_threads, SHOW_LONG}, {"Slow_queries", (char*) &long_query_count, SHOW_LONG}, {"Sort_merge_passes", (char*) &filesort_merge_passes, SHOW_LONG}, diff --git a/sql/slave.cc b/sql/slave.cc index 145f4295075..605f8289946 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -27,6 +27,7 @@ #include #include +#define MAX_SLAVE_RETRY_PAUSE 5 bool use_slave_mask = 0; MY_BITMAP slave_error_mask; @@ -2335,7 +2336,7 @@ st_relay_log_info::st_relay_log_info() ignore_log_space_limit(0), last_master_timestamp(0), slave_skip_counter(0), abort_pos_wait(0), slave_run_id(0), sql_thd(0), last_slave_errno(0), inited(0), abort_slave(0), slave_running(0), until_condition(UNTIL_NONE), - until_log_pos(0) + until_log_pos(0), retried_trans(0) { group_relay_log_name[0]= event_relay_log_name[0]= group_master_log_name[0]= 0; @@ -2980,9 +2981,8 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) init_master_info()). b) init_relay_log_pos(), because the BEGIN may be an older relay log. */ - if (rli->trans_retries--) + if (rli->trans_retries < slave_trans_retries) { - sql_print_information("Slave SQL thread retries transaction"); if (init_master_info(rli->mi, 0, 0, 0, SLAVE_SQL)) sql_print_error("Failed to initialize the master info structure"); else if (init_relay_log_pos(rli, @@ -2994,8 +2994,16 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) else { exec_res= 0; - sleep(2); // chance for concurrent connection to get more locks - } + /* chance for concurrent connection to get more locks */ + safe_sleep(thd, min(rli->trans_retries, MAX_SLAVE_RETRY_PAUSE), + (CHECK_KILLED_FUNC)sql_slave_killed, (void*)rli); + pthread_mutex_lock(&rli->data_lock); // because of SHOW STATUS + rli->trans_retries++; + rli->retried_trans++; + pthread_mutex_unlock(&rli->data_lock); + DBUG_PRINT("info", ("Slave retries transaction " + "rli->trans_retries: %lu", rli->trans_retries)); + } } else sql_print_error("Slave SQL thread retried transaction %lu time(s) " @@ -3004,17 +3012,8 @@ static int exec_relay_log_event(THD* thd, RELAY_LOG_INFO* rli) slave_trans_retries); } if (!((thd->options & OPTION_BEGIN) && opt_using_transactions)) - { - rli->trans_retries= slave_trans_retries; // restart from fresh - /* - TODO: when merged into 5.0, when slave does auto-rollback if - corrupted binlog, this should reset the retry counter too - (any rollback should). In fact it will work, as here we are just out - of a Format_description_log_event::exec_event() which rolled back. - But check repl code in 5.0 for new ha_rollback calls, just in case. - */ - } - } + rli->trans_retries= 0; // restart from fresh + } return exec_res; } else @@ -3426,7 +3425,7 @@ slave_begin: pthread_mutex_lock(&rli->log_space_lock); rli->ignore_log_space_limit= 0; pthread_mutex_unlock(&rli->log_space_lock); - rli->trans_retries= slave_trans_retries; // start from "no error" + rli->trans_retries= 0; // start from "no error" if (init_relay_log_pos(rli, rli->group_relay_log_name, diff --git a/sql/slave.h b/sql/slave.h index fb7560ec738..5a85e26d9ad 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -295,7 +295,14 @@ typedef struct st_relay_log_info UNTIL_LOG_NAMES_CMP_EQUAL= 0, UNTIL_LOG_NAMES_CMP_GREATER= 1 } until_log_names_cmp_result; - ulong trans_retries; + /* + trans_retries varies between 0 to slave_transaction_retries and counts how + many times the slave has retried the present transaction; gets reset to 0 + when the transaction finally succeeds. retried_trans is a cumulative + counter: how many times the slave has retried a transaction (any) since + slave started. + */ + ulong trans_retries, retried_trans; st_relay_log_info(); ~st_relay_log_info(); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 76ea72ef41c..f979b3ca771 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1887,6 +1887,19 @@ int mysqld_show(THD *thd, const char *wild, show_var_st *variables, pthread_mutex_unlock(&LOCK_active_mi); break; } + case SHOW_SLAVE_RETRIED_TRANS: + { + /* + TODO: in 5.1 with multimaster, have one such counter per line in SHOW + SLAVE STATUS, and have the sum over all lines here. + */ + pthread_mutex_lock(&LOCK_active_mi); + pthread_mutex_lock(&active_mi->rli.data_lock); + end= int10_to_str(active_mi->rli.retried_trans, buff, 10); + pthread_mutex_unlock(&active_mi->rli.data_lock); + pthread_mutex_unlock(&LOCK_active_mi); + break; + } #endif /* HAVE_REPLICATION */ case SHOW_OPENTABLES: end= int10_to_str((long) cached_tables(), buff, 10); diff --git a/sql/structs.h b/sql/structs.h index 846b3400fab..ba081b570c1 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -180,7 +180,7 @@ enum SHOW_TYPE SHOW_SSL_CTX_SESS_TIMEOUTS, SHOW_SSL_CTX_SESS_CACHE_FULL, SHOW_SSL_GET_CIPHER_LIST, #endif /* HAVE_OPENSSL */ - SHOW_RPL_STATUS, SHOW_SLAVE_RUNNING, + SHOW_RPL_STATUS, SHOW_SLAVE_RUNNING, SHOW_SLAVE_RETRIED_TRANS, SHOW_KEY_CACHE_LONG, SHOW_KEY_CACHE_CONST_LONG }; From 8200cadeae1b11a48151d17cd907f414f3f234d8 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 24 Mar 2005 10:48:28 +0100 Subject: [PATCH 3/7] Update the version, as 5.0.3 was already cloned, and future changes will go into 5.0.4 --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 79750496d2f..cc8e048d71b 100644 --- a/configure.in +++ b/configure.in @@ -6,7 +6,7 @@ AC_PREREQ(2.50)dnl Minimum Autoconf version required. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # Don't forget to also update the NDB lines below. -AM_INIT_AUTOMAKE(mysql, 5.0.3-beta) +AM_INIT_AUTOMAKE(mysql, 5.0.4-beta) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 From c9d997b98c44efb98199f49810dbdc2ef5f8beb4 Mon Sep 17 00:00:00 2001 From: "joerg@mysql.com" <> Date: Thu, 24 Mar 2005 10:52:29 +0100 Subject: [PATCH 4/7] The separate NDB information must be upgraded, too. --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index cc8e048d71b..ce3110448a3 100644 --- a/configure.in +++ b/configure.in @@ -17,7 +17,7 @@ SHARED_LIB_VERSION=14:0:0 # ndb version NDB_VERSION_MAJOR=5 NDB_VERSION_MINOR=0 -NDB_VERSION_BUILD=3 +NDB_VERSION_BUILD=4 NDB_VERSION_STATUS="beta" # Set all version vars based on $VERSION. How do we do this more elegant ? From fd54ee453976949f67db318bd80fdc2d92129965 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Thu, 24 Mar 2005 15:12:53 +0300 Subject: [PATCH 5/7] Fixes and test cases for Bug#8880 "Commands out of sync error with cursors" and Bug#9159 "Server crash during mysql_stmt_close". The patch adds support for single-row result sets in cursors. --- libmysql/libmysql.c | 11 +++++++ sql/sql_prepare.cc | 14 ++++---- sql/sql_select.h | 2 +- tests/mysql_client_test.c | 69 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 7 deletions(-) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 9746cb222fa..47a15dd3fe3 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -2862,6 +2862,17 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt) mysql->status= MYSQL_STATUS_READY; stmt->read_row_func= stmt_read_row_from_cursor; } + else if (stmt->flags & CURSOR_TYPE_READ_ONLY) + { + /* + This is a single-row result set, a result set with no rows, EXPLAIN, + SHOW VARIABLES, or some other command which either a) bypasses the + cursors framework in the server and writes rows directly to the + network or b) is more efficient if all (few) result set rows are + precached on client and server's resources are freed. + */ + DBUG_RETURN(mysql_stmt_store_result(stmt)); + } else { stmt->mysql->unbuffered_fetch_owner= &stmt->unbuffered_fetch_cancelled; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 7862717bb18..75027b3bb0a 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -1970,6 +1970,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) { ulong stmt_id= uint4korr(packet); ulong flags= (ulong) ((uchar) packet[4]); + Cursor *cursor= 0; /* Query text for binary log, or empty string if the query is not put into binary log. @@ -2007,15 +2008,17 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) statement: we can't open a cursor for it. */ flags= 0; + my_error(ER_SP_BAD_CURSOR_QUERY, MYF(0)); + goto err; } else { DBUG_PRINT("info",("Using READ_ONLY cursor")); if (!stmt->cursor && - !(stmt->cursor= new (&stmt->main_mem_root) Cursor())) + !(cursor= stmt->cursor= new (&stmt->main_mem_root) Cursor())) DBUG_VOID_RETURN; /* If lex->result is set, mysql_execute_command will use it */ - stmt->lex->result= &stmt->cursor->result; + stmt->lex->result= &cursor->result; } } #ifndef EMBEDDED_LIBRARY @@ -2061,11 +2064,10 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length) my_pthread_setprio(pthread_self(), WAIT_PRIOR); thd->protocol= &thd->protocol_simple; // Use normal protocol - if (flags & (ulong) CURSOR_TYPE_READ_ONLY) + if (cursor && cursor->is_open()) { - if (stmt->cursor->is_open()) - stmt->cursor->init_from_thd(thd); - stmt->cursor->state= stmt->state; + cursor->init_from_thd(thd); + cursor->state= stmt->state; } else { diff --git a/sql/sql_select.h b/sql/sql_select.h index 02e1dde8a7f..9667dc24552 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -370,7 +370,7 @@ public: void close(); void set_unit(SELECT_LEX_UNIT *unit_arg) { unit= unit_arg; } - Cursor() :join(0), unit(0) {} + Cursor() :Item_arena(TRUE), join(0), unit(0) {} ~Cursor(); }; diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 073c30b1e4d..342ddd8df55 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -12740,6 +12740,73 @@ static void test_bug8378() mysql_close(lmysql); } + +MYSQL_STMT *open_cursor(char *query) +{ + int rc; + const ulong type= (ulong)CURSOR_TYPE_READ_ONLY; + + MYSQL_STMT *stmt= mysql_stmt_init(mysql); + rc= mysql_stmt_prepare(stmt, query, strlen(query)); + check_execute(stmt, rc); + + mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type); + return stmt; +} + + +static void test_bug8880() +{ + MYSQL_STMT *stmt_list[2], **stmt; + MYSQL_STMT **stmt_list_end= (MYSQL_STMT**) stmt_list + 2; + int rc; + + myheader("test_bug8880"); + + mysql_query(mysql, "drop table if exists t1"); + mysql_query(mysql, "create table t1 (a int not null primary key, b int)"); + rc= mysql_query(mysql, "insert into t1 values (1,1)"); + myquery(rc); /* one check is enough */ + /* + when inserting 2 rows everything works well + mysql_query(mysql, "INSERT INTO t1 VALUES (1,1),(2,2)"); + */ + for (stmt= stmt_list; stmt < stmt_list_end; stmt++) + *stmt= open_cursor("select a from t1"); + for (stmt= stmt_list; stmt < stmt_list_end; stmt++) + { + rc= mysql_stmt_execute(*stmt); + check_execute(*stmt, rc); + } + for (stmt= stmt_list; stmt < stmt_list_end; stmt++) + mysql_stmt_close(*stmt); +} + + +static void test_bug9159() +{ + MYSQL_STMT *stmt; + int rc; + const char *stmt_text= "select a, b from t1"; + const unsigned long type= CURSOR_TYPE_READ_ONLY; + + myheader("test_bug9159"); + + mysql_query(mysql, "drop table if exists t1"); + mysql_query(mysql, "create table t1 (a int not null primary key, b int)"); + rc= mysql_query(mysql, "insert into t1 values (1,1)"); + myquery(rc); + + stmt= mysql_stmt_init(mysql); + mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text)); + mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *)&type); + + mysql_stmt_execute(stmt); + mysql_stmt_close(stmt); + rc= mysql_query(mysql, "drop table if exists t1"); + myquery(rc); +} + /* Read and parse arguments and MySQL options from my.cnf */ @@ -12962,6 +13029,8 @@ static struct my_tests_st my_tests[]= { { "test_bug8330", test_bug8330 }, { "test_bug7990", test_bug7990 }, { "test_bug8378", test_bug8378 }, + { "test_bug8880", test_bug8880 }, + { "test_bug9159", test_bug9159 }, { 0, 0 } }; From 62fc95b985c5cd247c9836cea59f05c00d1cef28 Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Thu, 24 Mar 2005 16:11:58 +0100 Subject: [PATCH 6/7] rpl_deadlock.result: result update (default value changed from 4.1 to 5.0) --- mysql-test/r/rpl_deadlock.result | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/r/rpl_deadlock.result b/mysql-test/r/rpl_deadlock.result index 732979eae0a..74f24b8b180 100644 --- a/mysql-test/r/rpl_deadlock.result +++ b/mysql-test/r/rpl_deadlock.result @@ -10,7 +10,7 @@ create table t3 (a int) engine=innodb; create table t4 (a int) engine=innodb; show variables like 'slave_transaction_retries'; Variable_name Value -slave_transaction_retries 0 +slave_transaction_retries 10 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( From 7b0e872695674dd0383976df994dd971c99449a6 Mon Sep 17 00:00:00 2001 From: "gbichot@quadita2.mysql.com" <> Date: Thu, 24 Mar 2005 16:43:50 +0100 Subject: [PATCH 7/7] testing repl of timezone with LOAD DATA INFILE (hourra!) --- mysql-test/r/rpl_timezone.result | 16 ++++++++++++++++ mysql-test/std_data/rpl_timezone.dat | 2 ++ mysql-test/t/rpl_timezone.test | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 mysql-test/std_data/rpl_timezone.dat diff --git a/mysql-test/r/rpl_timezone.result b/mysql-test/r/rpl_timezone.result index 8975333d1db..85637638f99 100644 --- a/mysql-test/r/rpl_timezone.result +++ b/mysql-test/r/rpl_timezone.result @@ -65,6 +65,22 @@ SET @@session.time_zone='Europe/Moscow'; insert into t1 values ('20040101000000'), ('20040611093902'); ROLLBACK; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +delete from t1; +set time_zone='UTC'; +load data infile '../../std_data/rpl_timezone.dat' into table t1; +select * from t1; +t +2004-01-01 00:00:00 +2004-06-11 09:39:02 +set time_zone='UTC'; +select * from t1; +t +2004-01-01 00:00:00 +2004-06-11 09:39:02 +set time_zone='Europe/Moscow'; +set time_zone='Europe/Moscow'; +delete from t1; +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/std_data/rpl_timezone.dat b/mysql-test/std_data/rpl_timezone.dat new file mode 100644 index 00000000000..2df8a39f1e3 --- /dev/null +++ b/mysql-test/std_data/rpl_timezone.dat @@ -0,0 +1,2 @@ +20040101000000 +20040611093902 diff --git a/mysql-test/t/rpl_timezone.test b/mysql-test/t/rpl_timezone.test index cc8dcb6ce26..a7547f7afc6 100644 --- a/mysql-test/t/rpl_timezone.test +++ b/mysql-test/t/rpl_timezone.test @@ -49,6 +49,24 @@ connection master; --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR --exec $MYSQL_BINLOG --short-form $MYSQL_TEST_DIR/var/log/master-bin.000001 +# Let us check with LOAD DATA INFILE +# (we do it after mysqlbinlog because the temp files names are not constant) +connection master; +delete from t1; +set time_zone='UTC'; +load data infile '../../std_data/rpl_timezone.dat' into table t1; +select * from t1; +sync_slave_with_master; +set time_zone='UTC'; +select * from t1; +set time_zone='Europe/Moscow'; + +# Put back values of before the LOAD +connection master; +set time_zone='Europe/Moscow'; +delete from t1; +insert into t1 values ('20040101000000'), ('20040611093902'); + # # Now let us check how well we replicate statments reading TIMESTAMP fields # (We should see the same data on master and on slave but it should differ