Below is the list of changes that have just been committed into a local
5.0 repository of bar. When bar does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2006-12-07 09:31:53+04:00, bar@stripped +7 -0
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@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +20 -0
Fixing results
mysql-test/r/rpl_locale.result@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +4 -0
Fixing results
mysql-test/t/disabled.def@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +0 -1
Enabling rpl_locale
mysql-test/t/mysqlbinlog.test@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +19 -0
Check "mysqlbinlog | mysql" reproduces lc_time_names correctly.
mysql-test/t/rpl_locale.test@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +2 -0
Adding new test: that setting lc_time_names back to en_US works fine.
sql/log_event.cc@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +34 -3
Implementing event based replication of LC_TIME_NAMES for 5.0
(as a replacement of previously made ONE_SHOT replication)
sql/log_event.h@stripped, 2006-12-07 09:31:48+04:00, bar@stripped +6 -1
Adding new Q_*_CODE
Adding "lc_time_names_number" members into Query_log_event and PRINT_EVENT_INFO
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: bar
# Host: bar.intranet.mysql.r18.ru
# Root: /usr/home/bar/mysql-5.0.b22645
--- 1.216/sql/log_event.cc 2006-12-07 09:32:02 +04:00
+++ 1.217/sql/log_event.cc 2006-12-07 09:32:02 +04:00
@@ -1088,7 +1088,8 @@ bool Query_log_event::write(IO_CACHE* fi
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* fi
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* th
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 c
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 c
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
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 s
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);
--- 1.126/sql/log_event.h 2006-12-07 09:32:02 +04:00
+++ 1.127/sql/log_event.h 2006-12-07 09:32:02 +04:00
@@ -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
--- 1.1/mysql-test/r/rpl_locale.result 2006-12-07 09:32:02 +04:00
+++ 1.2/mysql-test/r/rpl_locale.result 2006-12-07 09:32:02 +04:00
@@ -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;
--- 1.1/mysql-test/t/rpl_locale.test 2006-12-07 09:32:02 +04:00
+++ 1.2/mysql-test/t/rpl_locale.test 2006-12-07 09:32:02 +04:00
@@ -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;
--- 1.24/mysql-test/r/mysqlbinlog.result 2006-12-07 09:32:02 +04:00
+++ 1.25/mysql-test/r/mysqlbinlog.result 2006-12-07 09:32:02 +04:00
@@ -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;
--- 1.33/mysql-test/t/mysqlbinlog.test 2006-12-07 09:32:02 +04:00
+++ 1.34/mysql-test/t/mysqlbinlog.test 2006-12-07 09:32:02 +04:00
@@ -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;
--- 1.35/mysql-test/t/disabled.def 2006-12-07 09:32:02 +04:00
+++ 1.36/mysql-test/t/disabled.def 2006-12-07 09:32:02 +04:00
@@ -11,6 +11,5 @@
##############################################################################
ndb_load : Bug#17233
-rpl_locale : Bug#22645
user_limits : Bug#23921 random failure of user_limits.test
| Thread |
|---|
| • bk commit into 5.0 tree (bar:1.2312) BUG#22645 | bar | 7 Dec |