From: Date: July 3 2009 12:24pm Subject: bzr commit into mysql-5.4 branch (luis.soares:2804) Bug#37656 List-Archive: http://lists.mysql.com/commits/77870 X-Bug: 37656 Message-Id: <0KM7006LLBK4ZY10@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_BTp/YEBBIuKVdvXyuk2icA)" --Boundary_(ID_BTp/YEBBIuKVdvXyuk2icA) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/lsoares/Workspace/mysql-server/bugfix/b37656/mysql-azalea-bugfixing/ based on revid:alik@stripped 2804 Luis Soares 2009-07-03 BUG#37656: lower_case_table_names=1 doesn't convert database names in replicated statements This bug revealed itself while using case sensitive filesystems and exhibited two symptoms: 1. If setting lower_case_table_names=1 on the slave, but not on the master, this setting will not convert database name in replicated statements, ultimately breaking replication; 2. The same problem for symptom 1. surfaced in RBR, but this time for table names, as these would not be converted to lower case for row based replication events. Symptom 1. is addressed by conditionally converting to lower case, database name on Query_log_event constructor and Load_log_event::do_apply_event. Symptom 2. is addressed by conditionally converting to lower case database name and table name when processing Table_map_log_event. On top of these two fixes, this patch also provides functionality to automatically turn into down case user defined replication filtering rules. For example, if lower_case_table_names=1 is used simultaneously with any replication filtering rule, say --replicate-do-db=TEST, then all rules are automatically and implicitly translated to lower case, in this example it would turn do-db rule into --replicate-do-db=test. This was accomplished by extending the Rpl_filter class with a to_lower_case public method that gets called on mysqld startup if lower_case_table_names=1 is set. @ sql/log_event.cc Changed Query_log_event constructor, Load_log_event::do_apply_event and Table_map_log_event::do_apply_event to automatically turn database and table names to down case. @ sql/mysqld.cc Added check to mysqld option initialization so that whenever lower_case_table_names==1 filtering rules are turned into lower case. @ sql/rpl_filter.cc Extended Rpl_filter class by adding a to_lower_case public method that turns all internal filter rules into lower case. Used in mysqld.cc @ sql/rpl_filter.h Added to_lower_case(CHARSET_INFO * cs_info); to Rpl_filter interface. added: mysql-test/extra/rpl_tests/rpl_lower_case_table_names.test mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_db.result mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_table.result mysql-test/suite/rpl/r/rpl_lower_case_table_names_rewrite_db.result mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db-slave.opt mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db.test mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table-slave.opt mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table.test mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db-slave.opt mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db.test modified: sql/log_event.cc sql/mysqld.cc sql/rpl_filter.cc sql/rpl_filter.h === added file 'mysql-test/extra/rpl_tests/rpl_lower_case_table_names.test' --- a/mysql-test/extra/rpl_tests/rpl_lower_case_table_names.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_lower_case_table_names.test 2009-07-03 10:23:57 +0000 @@ -0,0 +1,79 @@ +# BUG#37656 +# +# This test aims at checking whether lower_case_table_names=1 option works +# for database names and table names (on row mode logging). +# +# This test checks the following (when lower_case_table_names=1 is set on slave): +# (i) creating a database on upper case on master results in lower case +# database name on slave +# (ii) creating tables with upper case names on master results in lower case +# table names on slave +# (iii) loading data infile into capitalized table name on master replicates to +# lower case table name on slave +# (iv) Propagating changes from upper case table names on into correspondent +# lower case table names on slave works. + + +# setup: create database and tables +-- echo ******** [ MASTER ] ******** +-- let $dbname_upper= BUG_37656 +-- let $dbname_lower= `SELECT LOWER('$dbname_upper')` +-- eval CREATE DATABASE $dbname_upper +-- eval use $dbname_upper + +# assert: database names are in upper case in master and lower +# case in slave +-- eval show databases like '$dbname_upper' +sync_slave_with_master; +-- echo ******** [ SLAVE ] ******** +--eval show databases like '$dbname_lower' + +-- connection master +-- echo ******** [ MASTER ] ******** +CREATE TABLE T1 (a int); +-- eval CREATE TABLE T2 (b int) ENGINE=$engine +CREATE TABLE T3 (txt TEXT); + +# assert: that tables exist on master with upper case names +show tables; + +# assert: that tables exist on slave but with lower case names +-- sync_slave_with_master +-- echo ******** [ SLAVE ] ******** +-- eval use $dbname_lower +show tables; + +# action: fill data into tables +-- connection master +-- echo ******** [ MASTER ] ******** +-- eval use $dbname_upper +INSERT INTO T1 VALUES (1); +INSERT INTO T2 VALUES (1); +use test; +-- eval INSERT INTO $dbname_upper.T1 VALUES (2) +-- eval INSERT INTO $dbname_upper.T2 VALUES (2) +-- eval LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE $dbname_upper.T3 + +# assert: lower case tables on lower case database on slave +# get updates from upper case tables on upper case +# database on master +-- sync_slave_with_master +-- echo ******** [ SLAVE ] ******** + +-- let $diff_table_1=master:$dbname_upper.T1 +-- let $diff_table_2=slave:$dbname_lower.t1 +-- source include/diff_tables.inc + +-- let $diff_table_1=master:$dbname_upper.T2 +-- let $diff_table_2=slave:$dbname_lower.t2 +-- source include/diff_tables.inc + +-- let $diff_table_1=master:$dbname_upper.T3 +-- let $diff_table_2=slave:$dbname_lower.t3 +-- source include/diff_tables.inc + +# clean up +-- connection master +-- echo ******** [ MASTER ] ******** +-- eval DROP DATABASE $dbname_upper +-- sync_slave_with_master === added file 'mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_db.result' --- a/mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_db.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_db.result 2009-07-03 10:23:57 +0000 @@ -0,0 +1,56 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +SHOW DATABASES; +Database +information_schema +mtr +mysql +test +CREATE TABLE T1 (a int); +INSERT INTO T1 VALUES (1); +Comparing tables master:test.T1 and slave:test.t1 +DROP TABLE T1; +******** [ MASTER ] ******** +CREATE DATABASE BUG_37656; +use BUG_37656; +show databases like 'BUG_37656'; +Database (BUG_37656) +BUG_37656 +******** [ SLAVE ] ******** +show databases like 'bug_37656'; +Database (bug_37656) +bug_37656 +******** [ MASTER ] ******** +CREATE TABLE T1 (a int); +CREATE TABLE T2 (b int) ENGINE=InnoDB; +CREATE TABLE T3 (txt TEXT); +show tables; +Tables_in_BUG_37656 +T1 +T2 +T3 +******** [ SLAVE ] ******** +use bug_37656; +show tables; +Tables_in_bug_37656 +t1 +t2 +t3 +******** [ MASTER ] ******** +use BUG_37656; +INSERT INTO T1 VALUES (1); +INSERT INTO T2 VALUES (1); +use test; +INSERT INTO BUG_37656.T1 VALUES (2); +INSERT INTO BUG_37656.T2 VALUES (2); +LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE BUG_37656.T3; +******** [ SLAVE ] ******** +Comparing tables master:BUG_37656.T1 and slave:bug_37656.t1 +Comparing tables master:BUG_37656.T2 and slave:bug_37656.t2 +Comparing tables master:BUG_37656.T3 and slave:bug_37656.t3 +******** [ MASTER ] ******** +DROP DATABASE BUG_37656; === added file 'mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_table.result' --- a/mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_table.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_lower_case_table_names_do_table.result 2009-07-03 10:23:57 +0000 @@ -0,0 +1,46 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +******** [ MASTER ] ******** +CREATE DATABASE BUG_37656; +use BUG_37656; +show databases like 'BUG_37656'; +Database (BUG_37656) +BUG_37656 +******** [ SLAVE ] ******** +show databases like 'bug_37656'; +Database (bug_37656) +bug_37656 +******** [ MASTER ] ******** +CREATE TABLE T1 (a int); +CREATE TABLE T2 (b int) ENGINE=InnoDB; +CREATE TABLE T3 (txt TEXT); +show tables; +Tables_in_BUG_37656 +T1 +T2 +T3 +******** [ SLAVE ] ******** +use bug_37656; +show tables; +Tables_in_bug_37656 +t1 +t2 +t3 +******** [ MASTER ] ******** +use BUG_37656; +INSERT INTO T1 VALUES (1); +INSERT INTO T2 VALUES (1); +use test; +INSERT INTO BUG_37656.T1 VALUES (2); +INSERT INTO BUG_37656.T2 VALUES (2); +LOAD DATA INFILE '../../std_data/words.dat' INTO TABLE BUG_37656.T3; +******** [ SLAVE ] ******** +Comparing tables master:BUG_37656.T1 and slave:bug_37656.t1 +Comparing tables master:BUG_37656.T2 and slave:bug_37656.t2 +Comparing tables master:BUG_37656.T3 and slave:bug_37656.t3 +******** [ MASTER ] ******** +DROP DATABASE BUG_37656; === added file 'mysql-test/suite/rpl/r/rpl_lower_case_table_names_rewrite_db.result' --- a/mysql-test/suite/rpl/r/rpl_lower_case_table_names_rewrite_db.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_lower_case_table_names_rewrite_db.result 2009-07-03 10:23:57 +0000 @@ -0,0 +1,26 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +SET SQL_LOG_BIN=0; +CREATE DATABASE B37656; +SET SQL_LOG_BIN=1; +CREATE DATABASE bug37656; +USE B37656; +CREATE TABLE T1 (a int); +INSERT INTO T1 VALUES (1); +### assertion: master contains capitalized case table +SHOW TABLES; +Tables_in_B37656 +T1 +use bug37656; +### assertion: slave contains lowered case table +SHOW TABLES; +Tables_in_bug37656 +t1 +### assertion: master and slave tables do not differ +Comparing tables master:B37656.T1 and slave:bug37656.t1 +DROP DATABASE B37656; +DROP DATABASE bug37656; === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db-slave.opt 2009-07-03 10:23:57 +0000 @@ -0,0 +1 @@ +--replicate-do-db=BuG_37656 --replicate-do-db=TESt --lower-case-table-names=1 === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db.test' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_db.test 2009-07-03 10:23:57 +0000 @@ -0,0 +1,41 @@ +# BUG#37656 +# +# For details look into extra/rpl_tests/rpl_lower_case_table_names.test +# +# Apart from the assertions present in the included file, this test also does +# an extra assertion. Check below. + +-- source include/master-slave.inc +-- source include/have_innodb.inc +-- source include/not_windows.inc + +# assertion: assert that test.T1 replicates to test.t1 despite +# --replicate-do-db=TESt is set (meaning that names of databases +# are lowered case when using lower_case_table_names=1) +# +# The same check is done for the included file, because +# --replicate-db-db=BuG_37656 is set + +SHOW DATABASES; +CREATE TABLE T1 (a int); +INSERT INTO T1 VALUES (1); + +-- sync_slave_with_master + +-- let $diff_table_1=master:test.T1 +-- let $diff_table_2=slave:test.t1 +-- source include/diff_tables.inc + +-- connection master + +DROP TABLE T1; + +-- sync_slave_with_master + +-- connection master + +# check test details inside extra/rpl_tests/rpl_lower_case_table_names.test +# + +-- let $engine=InnoDB +-- source extra/rpl_tests/rpl_lower_case_table_names.test === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table-slave.opt 2009-07-03 10:23:57 +0000 @@ -0,0 +1 @@ +--replicate-do-table=bug_37656.t1 --replicate-do-table=bug_37656.T2 --replicate-do-table=Bug_37656.t3 --lower-case-table-names=1 === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table.test' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_do_table.test 2009-07-03 10:23:57 +0000 @@ -0,0 +1,17 @@ +# BUG#37656 +# +# For details look into extra/rpl_tests/rpl_lower_case_table_names.test +# +# Apart from the assertions present in the included file, this test also: +# +# (i) implicitly, checks that filter rules are turned to lower case +# when lower_case_table_names=1 is used. Check -slave.opt file for +# rule definition. +# + +-- source include/master-slave.inc +-- source include/have_innodb.inc +-- source include/not_windows.inc + +-- let $engine=InnoDB +-- source extra/rpl_tests/rpl_lower_case_table_names.test === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db-slave.opt 2009-07-03 10:23:57 +0000 @@ -0,0 +1 @@ +--lower-case-table-names=1 "--replicate-rewrite-db=b37656->BuG37656" === added file 'mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db.test' --- a/mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_lower_case_table_names_rewrite_db.test 2009-07-03 10:23:57 +0000 @@ -0,0 +1,58 @@ +# BUG#37656 +# +# DESCRIPTION +# +# +# This test case is tests whether replication works properly when +# slave is configured with --lower-case-table-names=1 and replication +# rewrite rules are in effect. +# +# It checks four issues: +# +# (i) master contains capitalized table name +# +# (ii) slave contains lowered case table name +# +# (iii) master and slave tables do not differ +# +# (iv) implicitly, checks that rewrite rules are turned to lowercase +# when lower_case_table_names=1 on slave. Check -slave.opt file +# for rewrite rule: b37656->BuG37656 + +-- source include/master-slave.inc +-- source include/not_windows.inc + +SET SQL_LOG_BIN=0; +CREATE DATABASE B37656; +SET SQL_LOG_BIN=1; + +-- connection slave +CREATE DATABASE bug37656; + +-- connection master +USE B37656; +CREATE TABLE T1 (a int); +INSERT INTO T1 VALUES (1); + +-- echo ### assertion: master contains capitalized case table +SHOW TABLES; + +-- sync_slave_with_master + +use bug37656; + +-- echo ### assertion: slave contains lowered case table +SHOW TABLES; + + +-- echo ### assertion: master and slave tables do not differ +let $diff_table_1=master:B37656.T1; +let $diff_table_2=slave:bug37656.t1; + +-- source include/diff_tables.inc + +-- connection master +DROP DATABASE B37656; + +-- sync_slave_with_master +DROP DATABASE bug37656; === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2009-06-09 16:53:34 +0000 +++ b/sql/log_event.cc 2009-07-03 10:23:57 +0000 @@ -2939,6 +2939,8 @@ int Query_log_event::do_apply_event(Rela int Query_log_event::do_apply_event(Relay_log_info const *rli, const char *query_arg, uint32 q_len_arg) { + char db_buf[NAME_LEN + 1]; + strmov(db_buf, db); LEX_STRING new_db; int expected_error,actual_error= 0; /* @@ -2950,7 +2952,9 @@ int Query_log_event::do_apply_event(Rela */ thd->catalog= catalog_len ? (char *) catalog : (char *)""; new_db.length= db_len; - new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length); + if (lower_case_table_names == 1) + my_casedn_str(system_charset_info, db_buf); + new_db.str= (char *) rpl_filter->get_rewrite_db(db_buf, &new_db.length); thd->set_db(new_db.str, new_db.length); /* allocates a copy of 'db' */ thd->variables.auto_increment_increment= auto_increment_increment; thd->variables.auto_increment_offset= auto_increment_offset; @@ -4445,9 +4449,13 @@ void Load_log_event::set_fields(const ch int Load_log_event::do_apply_event(NET* net, Relay_log_info const *rli, bool use_rli_only_for_errors) { + char db_buf[NAME_LEN + 1]; + strmov(db_buf, db); LEX_STRING new_db; new_db.length= db_len; - new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length); + if (lower_case_table_names == 1) + my_casedn_str(system_charset_info, db_buf); + new_db.str= (char *) rpl_filter->get_rewrite_db(db_buf, &new_db.length); thd->set_db(new_db.str, new_db.length); DBUG_ASSERT(thd->query == 0); thd->query_length= 0; // Should not be needed @@ -4505,9 +4513,13 @@ int Load_log_event::do_apply_event(NET* thd->warning_info->opt_clear_warning_info(thd->query_id); TABLE_LIST tables; + char table_buf[NAME_LEN + 1]; + strmov(table_buf, table_name); + if (lower_case_table_names == 1) + my_casedn_str(system_charset_info, table_buf); bzero((char*) &tables,sizeof(tables)); tables.db= thd->strmake(thd->db, thd->db_length); - tables.alias = tables.table_name = (char*) table_name; + tables.alias = tables.table_name = table_buf; tables.lock_type = TL_WRITE; tables.updating= 1; @@ -8051,7 +8063,7 @@ Table_map_log_event::~Table_map_log_even int Table_map_log_event::do_apply_event(Relay_log_info const *rli) { RPL_TABLE_LIST *table_list; - char *db_mem, *tname_mem; + char *db_mem, *tname_mem, *ptr; MDL_request *mdl_request; size_t dummy_len; void *memory; @@ -8078,8 +8090,18 @@ int Table_map_log_event::do_apply_event( table_list->next_global= table_list->next_local= 0; table_list->table_id= m_table_id; table_list->updating= 1; - strmov(table_list->db, rpl_filter->get_rewrite_db(m_dbnam, &dummy_len)); + strmov(table_list->db, m_dbnam); strmov(table_list->table_name, m_tblnam); + if (lower_case_table_names == 1) + { + my_casedn_str(system_charset_info, table_list->db); + my_casedn_str(system_charset_info, table_list->table_name); + } + + /* rewrite rules changed the database. */ + if ((ptr= (char*) rpl_filter->get_rewrite_db(table_list->db, &dummy_len)) != + table_list->db) + strmov(table_list->db, ptr); mdl_request->init(0, table_list->db, table_list->table_name); table_list->mdl_request= mdl_request; === modified file 'sql/mysqld.cc' --- a/sql/mysqld.cc 2009-06-17 07:30:19 +0000 +++ b/sql/mysqld.cc 2009-07-03 10:23:57 +0000 @@ -3696,6 +3696,12 @@ You should consider changing lower_case_ (test_if_case_insensitive(mysql_real_data_home) == 1); } + if (lower_case_table_names == 1) + { + rpl_filter->to_lower_case(system_charset_info); + binlog_filter->to_lower_case(system_charset_info); + } + /* Reset table_alias_charset, now that lower_case_table_names is set. */ table_alias_charset= (lower_case_table_names ? files_charset_info : === modified file 'sql/rpl_filter.cc' --- a/sql/rpl_filter.cc 2009-04-29 03:50:14 +0000 +++ b/sql/rpl_filter.cc 2009-07-03 10:23:57 +0000 @@ -299,7 +299,9 @@ Rpl_filter::add_wild_ignore_table(const void Rpl_filter::add_db_rewrite(const char* from_db, const char* to_db) { - i_string_pair *db_pair = new i_string_pair(from_db, to_db); + char *from_db_cp= my_strdup(from_db, MYF(MY_WME | ME_FATALERROR)); + char *to_db_cp= my_strdup(to_db, MYF(MY_WME | ME_FATALERROR)); + i_string_pair *db_pair = new i_string_pair(from_db_cp, to_db_cp); rewrite_db.push_back(db_pair); } @@ -348,7 +350,8 @@ void Rpl_filter::add_do_db(const char* table_spec) { DBUG_ENTER("Rpl_filter::add_do_db"); - i_string *db = new i_string(table_spec); + char *tbl_spec_cp= my_strdup(table_spec, MYF(MY_WME | ME_FATALERROR)); + i_string *db = new i_string(tbl_spec_cp); do_db.push_back(db); DBUG_VOID_RETURN; } @@ -358,7 +361,8 @@ void Rpl_filter::add_ignore_db(const char* table_spec) { DBUG_ENTER("Rpl_filter::add_ignore_db"); - i_string *db = new i_string(table_spec); + char *tbl_spec_cp= my_strdup(table_spec, MYF(MY_WME | ME_FATALERROR)); + i_string *db = new i_string(tbl_spec_cp); ignore_db.push_back(db); DBUG_VOID_RETURN; } @@ -546,3 +550,72 @@ Rpl_filter::get_ignore_db() { return &ignore_db; } + +void +Rpl_filter::to_lower_case(CHARSET_INFO *cs_info, DYNAMIC_ARRAY* a) +{ + for (uint i= 0; i < a->elements; i++) + { + TABLE_RULE_ENT* e; + get_dynamic(a, (uchar*)&e, i); + my_casedn_str(cs_info, e->db); + my_casedn_str(cs_info, e->tbl_name); + } +} + +void +Rpl_filter::to_lower_case(CHARSET_INFO *cs_info, HASH* h) +{ + for (uint i= 0; i < h->records; i++) + { + TABLE_RULE_ENT* e= (TABLE_RULE_ENT*) my_hash_element(h, i); + my_casedn_str(cs_info, e->db); + my_casedn_str(cs_info, e->tbl_name); + } +} + +void +Rpl_filter::to_lower_case(CHARSET_INFO *cs_info, I_List* l) +{ + I_List_iterator it(*l); + i_string *tmp= NULL; + + while ((tmp=it++)) + my_casedn_str(cs_info, const_cast(tmp->ptr)); +} + +void +Rpl_filter::to_lower_case(CHARSET_INFO * cs_info) +{ + // rewrite_db + if (!rewrite_db.is_empty()) + { + I_List_iterator it(rewrite_db); + i_string_pair* tmp= NULL; + + while ((tmp=it++)) + { + my_casedn_str(cs_info, const_cast(tmp->key)); + my_casedn_str(cs_info, const_cast(tmp->val)); + } + } + + if (!do_db.is_empty()) + to_lower_case(cs_info, &do_db); + + if (!ignore_db.is_empty()) + to_lower_case(cs_info, &ignore_db); + + if (do_table_inited) + to_lower_case(cs_info, &do_table); + + if (ignore_table_inited) + to_lower_case(cs_info, &ignore_table); + + if (wild_do_table_inited) + to_lower_case(cs_info, &wild_do_table); + + if (wild_ignore_table_inited) + to_lower_case(cs_info, &wild_ignore_table); + +} === modified file 'sql/rpl_filter.h' --- a/sql/rpl_filter.h 2007-05-10 09:59:39 +0000 +++ b/sql/rpl_filter.h 2009-07-03 10:23:57 +0000 @@ -74,6 +74,13 @@ public: I_List* get_do_db(); I_List* get_ignore_db(); + /* + To lower case method. + + This method will down case all filter contents. + */ + void to_lower_case(CHARSET_INFO * cs_info); + private: bool table_rules_on; @@ -90,6 +97,10 @@ private: bool inited); TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len); + void to_lower_case(CHARSET_INFO *cs_info, I_List* l); + void to_lower_case(CHARSET_INFO *cs_info, HASH* h); + void to_lower_case(CHARSET_INFO *cs_info, DYNAMIC_ARRAY* a); + /* Those 4 structures below are uninitialized memory unless the corresponding *_inited variables are "true". --Boundary_(ID_BTp/YEBBIuKVdvXyuk2icA) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/luis.soares@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/luis.soares@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: luis.soares@stripped # target_branch: file:///home/lsoares/Workspace/mysql-\ # server/bugfix/b37656/mysql-azalea-bugfixing/ # testament_sha1: aced6bc275c4fb372ac58db31d79c8581264fa49 # timestamp: 2009-07-03 11:24:02 +0100 # base_revision_id: alik@stripped # # Begin bundle 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 --Boundary_(ID_BTp/YEBBIuKVdvXyuk2icA)--