diff options
author | unknown <bar@mysql.com/bar.intranet.mysql.r18.ru> | 2006-12-07 09:31:53 +0400 |
---|---|---|
committer | unknown <bar@mysql.com/bar.intranet.mysql.r18.ru> | 2006-12-07 09:31:53 +0400 |
commit | c423ecc0a755646fd3ed4a2fc03450dbc49c528e (patch) | |
tree | 39292b039b689d83b3dd56224b5c49aa033e7702 | |
parent | 21b9187ab95bd2a9e7575899643c997b08560f52 (diff) | |
download | mariadb-git-c423ecc0a755646fd3ed4a2fc03450dbc49c528e.tar.gz |
Bug#22645 LC_TIME_NAMES: Statement not replicated
Implementing event based replication of LC_TIME_NAMES for 5.0
(as a replacement of previously made ONE_SHOT replication)
mysql-test/r/mysqlbinlog.result:
Fixing results
mysql-test/r/rpl_locale.result:
Fixing results
mysql-test/t/disabled.def:
Enabling rpl_locale
mysql-test/t/mysqlbinlog.test:
Check "mysqlbinlog | mysql" reproduces lc_time_names correctly.
mysql-test/t/rpl_locale.test:
Adding new test: that setting lc_time_names back to en_US works fine.
sql/log_event.cc:
Implementing event based replication of LC_TIME_NAMES for 5.0
(as a replacement of previously made ONE_SHOT replication)
sql/log_event.h:
Adding new Q_*_CODE
Adding "lc_time_names_number" members into Query_log_event and PRINT_EVENT_INFO
-rw-r--r-- | mysql-test/r/mysqlbinlog.result | 20 | ||||
-rw-r--r-- | mysql-test/r/rpl_locale.result | 4 | ||||
-rw-r--r-- | mysql-test/t/disabled.def | 1 | ||||
-rw-r--r-- | mysql-test/t/mysqlbinlog.test | 19 | ||||
-rw-r--r-- | mysql-test/t/rpl_locale.test | 2 | ||||
-rw-r--r-- | sql/log_event.cc | 37 | ||||
-rw-r--r-- | sql/log_event.h | 7 |
7 files changed, 85 insertions, 5 deletions
diff --git a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result index c3be791b523..0b8e84188ef 100644 --- a/mysql-test/r/mysqlbinlog.result +++ b/mysql-test/r/mysqlbinlog.result @@ -194,4 +194,24 @@ select * from t5 /* must be (1),(1) */; a 1 1 +flush logs; +drop table if exists t5; +create table t5 (c1 int, c2 varchar(128) character set latin1 not null); +insert into t5 values (1, date_format('2001-01-01','%W')); +set lc_time_names=de_DE; +insert into t5 values (2, date_format('2001-01-01','%W')); +set lc_time_names=en_US; +insert into t5 values (3, date_format('2001-01-01','%W')); +select * from t5 order by c1; +c1 c2 +1 Monday +2 Montag +3 Monday +flush logs; +drop table t5; +select * from t5 order by c1; +c1 c2 +1 Monday +2 Montag +3 Monday drop table t1, t2, t03, t04, t3, t4, t5; diff --git a/mysql-test/r/rpl_locale.result b/mysql-test/r/rpl_locale.result index 5de5bab9a0b..b7396084663 100644 --- a/mysql-test/r/rpl_locale.result +++ b/mysql-test/r/rpl_locale.result @@ -7,10 +7,14 @@ start slave; create table t1 (s1 char(10)); set lc_time_names= 'de_DE'; insert into t1 values (date_format('2001-01-01','%W')); +set lc_time_names= 'en_US'; +insert into t1 values (date_format('2001-01-01','%W')); select * from t1; s1 Montag +Monday select * from t1; s1 Montag +Monday drop table t1; diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index bff70a306b3..eaea7c710b0 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -11,6 +11,5 @@ ############################################################################## ndb_load : Bug#17233 -rpl_locale : Bug#22645 user_limits : Bug#23921 random failure of user_limits.test diff --git a/mysql-test/t/mysqlbinlog.test b/mysql-test/t/mysqlbinlog.test index 0691cb7c76b..c2fe0e3e8e0 100644 --- a/mysql-test/t/mysqlbinlog.test +++ b/mysql-test/t/mysqlbinlog.test @@ -134,6 +134,25 @@ flush logs; --exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/log/master-bin.000006 | $MYSQL select * from t5 /* must be (1),(1) */; +# +# Bug#22645 LC_TIME_NAMES: Statement not replicated +# Check that a dump created by mysqlbinlog reproduces +# lc_time_names dependent values correctly +# +flush logs; +drop table if exists t5; +create table t5 (c1 int, c2 varchar(128) character set latin1 not null); +insert into t5 values (1, date_format('2001-01-01','%W')); +set lc_time_names=de_DE; +insert into t5 values (2, date_format('2001-01-01','%W')); +set lc_time_names=en_US; +insert into t5 values (3, date_format('2001-01-01','%W')); +select * from t5 order by c1; +flush logs; +drop table t5; +--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/log/master-bin.000007 | $MYSQL +select * from t5 order by c1; + # clean up drop table t1, t2, t03, t04, t3, t4, t5; diff --git a/mysql-test/t/rpl_locale.test b/mysql-test/t/rpl_locale.test index 530a3d77636..2f2d637e1b4 100644 --- a/mysql-test/t/rpl_locale.test +++ b/mysql-test/t/rpl_locale.test @@ -9,6 +9,8 @@ connection master; create table t1 (s1 char(10)); set lc_time_names= 'de_DE'; insert into t1 values (date_format('2001-01-01','%W')); +set lc_time_names= 'en_US'; +insert into t1 values (date_format('2001-01-01','%W')); select * from t1; sync_slave_with_master; connection slave; diff --git a/sql/log_event.cc b/sql/log_event.cc index 30490f75c0f..9eea2387e54 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1088,7 +1088,8 @@ bool Query_log_event::write(IO_CACHE* file) 1+1+FN_REFLEN+ // code of catalog and catalog length and catalog 1+4+ // code of autoinc and the 2 autoinc variables 1+6+ // code of charset and charset - 1+1+MAX_TIME_ZONE_NAME_LENGTH // code of tz and tz length and tz name + 1+1+MAX_TIME_ZONE_NAME_LENGTH+ // code of tz and tz length and tz name + 1+2 // code of lc_time_names and lc_time_names ], *start, *start_of_status; ulong event_length; @@ -1200,6 +1201,13 @@ bool Query_log_event::write(IO_CACHE* file) memcpy(start, time_zone_str, time_zone_len); start+= time_zone_len; } + if (lc_time_names_number) + { + DBUG_ASSERT(lc_time_names_number <= 0xFFFF); + *start++= Q_LC_TIME_NAMES_CODE; + int2store(start, lc_time_names_number); + start+= 2; + } /* Here there could be code like if (command-line-option-which-says-"log_this_variable" && inited) @@ -1264,7 +1272,8 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, flags2_inited(1), sql_mode_inited(1), charset_inited(1), sql_mode(thd_arg->variables.sql_mode), auto_increment_increment(thd_arg->variables.auto_increment_increment), - auto_increment_offset(thd_arg->variables.auto_increment_offset) + auto_increment_offset(thd_arg->variables.auto_increment_offset), + lc_time_names_number(thd_arg->variables.lc_time_names->number) { time_t end_time; time(&end_time); @@ -1334,7 +1343,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, db(NullS), catalog_len(0), status_vars_len(0), flags2_inited(0), sql_mode_inited(0), charset_inited(0), auto_increment_increment(1), auto_increment_offset(1), - time_zone_len(0) + time_zone_len(0), lc_time_names_number(0) { ulong data_len; uint32 tmp; @@ -1435,6 +1444,10 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, pos+= catalog_len+2; // leap over end 0 catalog_nz= 0; // catalog has end 0 in event break; + case Q_LC_TIME_NAMES_CODE: + lc_time_names_number= uint2korr(pos); + pos+= 2; + break; default: /* That's why you must write status vars in growing order of code */ DBUG_PRINT("info",("Query_log_event has unknown status vars (first has\ @@ -1619,6 +1632,11 @@ void Query_log_event::print_query_header(FILE* file, memcpy(print_event_info->time_zone_str, time_zone_str, time_zone_len+1); } } + if (lc_time_names_number != print_event_info->lc_time_names_number) + { + fprintf(file, "SET @@session.lc_time_names=%d;\n", lc_time_names_number); + print_event_info->lc_time_names_number= lc_time_names_number; + } } @@ -1771,6 +1789,19 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli, goto compare_errors; } } + if (lc_time_names_number) + { + if (!(thd->variables.lc_time_names= + my_locale_by_number(lc_time_names_number))) + { + my_printf_error(ER_UNKNOWN_ERROR, + "Unknown locale: '%d'", MYF(0), lc_time_names_number); + thd->variables.lc_time_names= &my_locale_en_US; + goto compare_errors; + } + } + else + thd->variables.lc_time_names= &my_locale_en_US; /* Execute the query (note that we bypass dispatch_command()) */ mysql_parse(thd, thd->query, thd->query_length); diff --git a/sql/log_event.h b/sql/log_event.h index 247e1962776..18be3c761b6 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -271,6 +271,8 @@ struct sql_ex_info */ #define Q_CATALOG_NZ_CODE 6 +#define Q_LC_TIME_NAMES_CODE 7 + /* Intvar event post-header */ #define I_TYPE_OFFSET 0 @@ -507,9 +509,11 @@ typedef struct st_print_event_info bool charset_inited; char charset[6]; // 3 variables, each of them storable in 2 bytes char time_zone_str[MAX_TIME_ZONE_NAME_LENGTH]; + uint lc_time_names_number; st_print_event_info() :flags2_inited(0), sql_mode_inited(0), - auto_increment_increment(1),auto_increment_offset(1), charset_inited(0) + auto_increment_increment(1),auto_increment_offset(1), charset_inited(0), + lc_time_names_number(0) { /* Currently we only use static PRINT_EVENT_INFO objects, so zeroed at @@ -784,6 +788,7 @@ public: char charset[6]; uint time_zone_len; /* 0 means uninited */ const char *time_zone_str; + uint lc_time_names_number; /* 0 means en_US */ #ifndef MYSQL_CLIENT |