Nice work, Approved!
Dao-Gang.Qu@stripped wrote:
> #At file:///home/daogangqu/mysql/bzrwork1/bug51639/mysql-next-mr-bugfixing/ based on
> revid:aelkin@stripped
>
> 3310 Dao-Gang.Qu@stripped 2010-07-30
> Bug #51639 Some replication filters are case sensitive, some are not!
>
> There is an inconsistency in name comparison of rpl filters.
> Some are case sensitive, while others are not. And they did
> not follow the setting of lower_case_table_names.
>
> To fix the problem to make all the filters follow the setting
> of lower_case_table_name to be case sensitive when setting
> lower_case_table_name=0. Otherwise they will be case insensitive.
> @ mysql-test/suite/rpl/r/rpl_do_filter.result
> Test result for BUG# 51639
> @ mysql-test/suite/rpl/r/rpl_ignore_db_filter.result
> Test result for BUG# 51639
> @ mysql-test/suite/rpl/r/rpl_ignore_table_filter.result
> Test result for BUG# 51639
> @ mysql-test/suite/rpl/r/rpl_rewrite_db_filter.result
> Test result for BUG# 51639
> @ mysql-test/suite/rpl/t/rpl_do_filter.test
> Added test file to verify that 'do db' and 'do table 'filters
> will follow the setting of lower_case_table_name to be case
> insensitive when setting lower_case_table_name > 0
> @ mysql-test/suite/rpl/t/rpl_ignore_db_filter.test
> Added test file to verify that 'ignore db' filter will follow
> the setting of lower_case_table_name to be case insensitive when
> setting lower_case_table_name > 0
> @ mysql-test/suite/rpl/t/rpl_ignore_table_filter.test
> Added test file to verify that 'ignore table' filter will follow
> the setting of lower_case_table_name to be case sensitive when
> setting lower_case_table_name=0
> @ mysql-test/suite/rpl/t/rpl_rewrite_db_filter.test
> Added test file to verify that 'rewrite db' filter will follow
> the setting of lower_case_table_name to be case insensitive
> when setting lower_case_table_name > 0
> @ sql/rpl_filter.cc
> Added code to make filters follow the setting of lower_case_table_name
> to be case sensitive when setting lower_case_table_name=0. Otherwise they
> will be case insensitive.
> @ sql/rpl_filter.h
> Added code to change the data struct from HASH to DYNAMIC_ARRAY
> for do_table and ignore_table in order to the setting of the
> 'do_table' and 'ignore_table' filters is affected by the setting
> of lower_case_table_name regardless of the setting order.
>
> added:
> mysql-test/extra/rpl_tests/rpl_filters.test
> mysql-test/suite/rpl/r/rpl_do_filter.result
> mysql-test/suite/rpl/r/rpl_ignore_db_filter.result
> mysql-test/suite/rpl/r/rpl_ignore_table_filter.result
> mysql-test/suite/rpl/r/rpl_rewrite_db_filter.result
> mysql-test/suite/rpl/t/rpl_do_filter-master.opt
> mysql-test/suite/rpl/t/rpl_do_filter-slave.opt
> mysql-test/suite/rpl/t/rpl_do_filter.test
> mysql-test/suite/rpl/t/rpl_ignore_db_filter-master.opt
> mysql-test/suite/rpl/t/rpl_ignore_db_filter-slave.opt
> mysql-test/suite/rpl/t/rpl_ignore_db_filter.test
> mysql-test/suite/rpl/t/rpl_ignore_table_filter-master.opt
> mysql-test/suite/rpl/t/rpl_ignore_table_filter-slave.opt
> mysql-test/suite/rpl/t/rpl_ignore_table_filter.test
> mysql-test/suite/rpl/t/rpl_rewrite_db_filter-master.opt
> mysql-test/suite/rpl/t/rpl_rewrite_db_filter-slave.opt
> mysql-test/suite/rpl/t/rpl_rewrite_db_filter.test
> modified:
> sql/rpl_filter.cc
> sql/rpl_filter.h
> === added file 'mysql-test/extra/rpl_tests/rpl_filters.test'
> --- a/mysql-test/extra/rpl_tests/rpl_filters.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/extra/rpl_tests/rpl_filters.test 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,22 @@
> +#
> +# Bug #51639
> +# The common part of Bug #51639 to test filters
> +#
> +
> +CREATE DATABASE mydb;
> +USE mydb;
> +CREATE TABLE T1 (a INT) ENGINE= MYISAM;
> +CREATE TABLE t2 (a INT) ENGINE= MYISAM;
> +INSERT INTO T1 VALUES (1);
> +INSERT INTO t2 VALUES (1);
> +-- echo # On master
> +-- source include/show_binlog_events.inc
> +
> +-- sync_slave_with_master
> +-- echo # On slave
> +-- source include/show_binlog_events.inc
> +
> +-- connection master
> +DROP DATABASE mydb;
> +-- sync_slave_with_master
> +
>
> === added file 'mysql-test/suite/rpl/r/rpl_do_filter.result'
> --- a/mysql-test/suite/rpl/r/rpl_do_filter.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_do_filter.result 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,37 @@
> +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;
> +CREATE DATABASE mydb;
> +USE mydb;
> +CREATE TABLE T1 (a INT) ENGINE= MYISAM;
> +CREATE TABLE t2 (a INT) ENGINE= MYISAM;
> +INSERT INTO T1 VALUES (1);
> +INSERT INTO t2 VALUES (1);
> +# On master
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # CREATE DATABASE mydb
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO T1 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +# On slave
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-bin.000001 # Query # # CREATE DATABASE mydb
> +slave-bin.000001 # Query # # use `mydb`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +slave-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +slave-bin.000001 # Query # # BEGIN
> +slave-bin.000001 # Query # # use `mydb`; INSERT INTO T1 VALUES (1)
> +slave-bin.000001 # Query # # COMMIT
> +slave-bin.000001 # Query # # BEGIN
> +slave-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +slave-bin.000001 # Query # # COMMIT
> +DROP DATABASE mydb;
>
> === added file 'mysql-test/suite/rpl/r/rpl_ignore_db_filter.result'
> --- a/mysql-test/suite/rpl/r/rpl_ignore_db_filter.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_ignore_db_filter.result 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,28 @@
> +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;
> +CREATE DATABASE mydb;
> +USE mydb;
> +CREATE TABLE T1 (a INT) ENGINE= MYISAM;
> +CREATE TABLE t2 (a INT) ENGINE= MYISAM;
> +INSERT INTO T1 VALUES (1);
> +INSERT INTO t2 VALUES (1);
> +# On master
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # CREATE DATABASE mydb
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO T1 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +# On slave
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +DROP DATABASE mydb;
>
> === added file 'mysql-test/suite/rpl/r/rpl_ignore_table_filter.result'
> --- a/mysql-test/suite/rpl/r/rpl_ignore_table_filter.result 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/r/rpl_ignore_table_filter.result 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1,33 @@
> +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;
> +CREATE DATABASE mydb;
> +USE mydb;
> +CREATE TABLE T1 (a INT) ENGINE= MYISAM;
> +CREATE TABLE t2 (a INT) ENGINE= MYISAM;
> +INSERT INTO T1 VALUES (1);
> +INSERT INTO t2 VALUES (1);
> +# On master
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # CREATE DATABASE mydb
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO T1 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +# On slave
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-bin.000001 # Query # # CREATE DATABASE mydb
> +slave-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +slave-bin.000001 # Query # # BEGIN
> +slave-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +slave-bin.000001 # Query # # COMMIT
> +DROP DATABASE mydb;
>
> === added file 'mysql-test/suite/rpl/r/rpl_rewrite_db_filter.result'
> --- a/mysql-test/suite/rpl/r/rpl_rewrite_db_filter.result 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/r/rpl_rewrite_db_filter.result 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,40 @@
> +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;
> +CREATE DATABASE rewrite;
> +CREATE DATABASE mydb;
> +USE mydb;
> +CREATE TABLE T1 (a INT) ENGINE= MYISAM;
> +CREATE TABLE t2 (a INT) ENGINE= MYISAM;
> +INSERT INTO T1 VALUES (1);
> +INSERT INTO t2 VALUES (1);
> +# On master
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +master-bin.000001 # Query # # CREATE DATABASE mydb
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # use `mydb`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO T1 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +master-bin.000001 # Query # # BEGIN
> +master-bin.000001 # Query # # use `mydb`; INSERT INTO t2 VALUES (1)
> +master-bin.000001 # Query # # COMMIT
> +# On slave
> +show binlog events from <binlog_start>;
> +Log_name Pos Event_type Server_id End_log_pos Info
> +slave-bin.000001 # Query # # CREATE DATABASE rewrite
> +slave-bin.000001 # Query # # CREATE DATABASE mydb
> +slave-bin.000001 # Query # # use `rewrite`; CREATE TABLE T1 (a INT) ENGINE= MYISAM
> +slave-bin.000001 # Query # # use `rewrite`; CREATE TABLE t2 (a INT) ENGINE= MYISAM
> +slave-bin.000001 # Query # # BEGIN
> +slave-bin.000001 # Query # # use `rewrite`; INSERT INTO T1 VALUES (1)
> +slave-bin.000001 # Query # # COMMIT
> +slave-bin.000001 # Query # # BEGIN
> +slave-bin.000001 # Query # # use `rewrite`; INSERT INTO t2 VALUES (1)
> +slave-bin.000001 # Query # # COMMIT
> +DROP DATABASE mydb;
> +DROP DATABASE rewrite;
>
> === added file 'mysql-test/suite/rpl/t/rpl_do_filter-master.opt'
> --- a/mysql-test/suite/rpl/t/rpl_do_filter-master.opt 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_do_filter-master.opt 2010-07-30 03:09:29 +0000
> @@ -0,0 +1 @@
> +--lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_do_filter-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_do_filter-slave.opt 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_do_filter-slave.opt 2010-07-30 03:09:29 +0000
> @@ -0,0 +1 @@
> +--replicate-do-db=MYDB --replicate-do-table=mydb.T1 --replicate-do-table=mydb.T2
> --lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_do_filter.test'
> --- a/mysql-test/suite/rpl/t/rpl_do_filter.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_do_filter.test 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,12 @@
> +#
> +# Bug #51639
> +# This test verifies that 'do db' and 'do table'filters
> +# will follow the setting of lower_case_table_name to be
> +# case insensitive when setting lower_case_table_name > 0
> +#
> +
> +-- source include/master-slave.inc
> +-- source include/have_binlog_format_statement.inc
> +
> +-- source extra/rpl_tests/rpl_filters.test
> +
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_db_filter-master.opt'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_db_filter-master.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_db_filter-master.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_db_filter-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_db_filter-slave.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_db_filter-slave.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--replicate-ignore-db=MYDB --lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_db_filter.test'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_db_filter.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_db_filter.test 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,11 @@
> +#
> +# Bug #51639
> +# This test verifies that 'ignore db' filter will follow
> +# the setting of lower_case_table_name to be case insensitive
> +# when setting lower_case_table_name > 0
> +#
> +
> +-- source include/master-slave.inc
> +-- source include/have_binlog_format_statement.inc
> +
> +-- source extra/rpl_tests/rpl_filters.test
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_table_filter-master.opt'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_table_filter-master.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_table_filter-master.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--lower_case_table_names=0
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_table_filter-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_table_filter-slave.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_table_filter-slave.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--replicate-do-db=mydb --replicate-wild-ignore-table=my%.T1
> --replicate-wild-ignore-table=my%.T2 --lower_case_table_names=0
>
> === added file 'mysql-test/suite/rpl/t/rpl_ignore_table_filter.test'
> --- a/mysql-test/suite/rpl/t/rpl_ignore_table_filter.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_ignore_table_filter.test 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,12 @@
> +#
> +# Bug #51639
> +# This test verifies that 'ignore table' filter will follow
> +# the setting of lower_case_table_name to be case sensitive
> +# when setting lower_case_table_name=0
> +#
> +
> +-- source include/master-slave.inc
> +-- source include/have_binlog_format_statement.inc
> +
> +-- source extra/rpl_tests/rpl_filters.test
> +
>
> === added file 'mysql-test/suite/rpl/t/rpl_rewrite_db_filter-master.opt'
> --- a/mysql-test/suite/rpl/t/rpl_rewrite_db_filter-master.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_rewrite_db_filter-master.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_rewrite_db_filter-slave.opt'
> --- a/mysql-test/suite/rpl/t/rpl_rewrite_db_filter-slave.opt 1970-01-01 00:00:00
> +0000
> +++ b/mysql-test/suite/rpl/t/rpl_rewrite_db_filter-slave.opt 2010-07-30 03:09:29
> +0000
> @@ -0,0 +1 @@
> +--replicate-rewrite-db=MYDB->rewrite --lower_case_table_names=1
>
> === added file 'mysql-test/suite/rpl/t/rpl_rewrite_db_filter.test'
> --- a/mysql-test/suite/rpl/t/rpl_rewrite_db_filter.test 1970-01-01 00:00:00 +0000
> +++ b/mysql-test/suite/rpl/t/rpl_rewrite_db_filter.test 2010-07-30 03:09:29 +0000
> @@ -0,0 +1,17 @@
> +#
> +# Bug #51639
> +# This test verifies that 'rewrite db' filter will follow
> +# the setting of lower_case_table_name to be case insensitive
> +# when setting lower_case_table_name > 0
> +#
> +
> +-- source include/master-slave.inc
> +-- source include/have_binlog_format_statement.inc
> +connection slave;
> +CREATE DATABASE rewrite;
> +
> +connection master;
> +-- source extra/rpl_tests/rpl_filters.test
> +
> +connection slave;
> +DROP DATABASE rewrite;
>
> === modified file 'sql/rpl_filter.cc'
> --- a/sql/rpl_filter.cc 2010-07-08 21:42:23 +0000
> +++ b/sql/rpl_filter.cc 2010-07-30 03:09:29 +0000
> @@ -35,9 +35,9 @@ Rpl_filter::Rpl_filter() :
> Rpl_filter::~Rpl_filter()
> {
> if (do_table_inited)
> - my_hash_free(&do_table);
> + free_string_array(&do_table);
> if (ignore_table_inited)
> - my_hash_free(&ignore_table);
> + free_string_array(&ignore_table);
> if (wild_do_table_inited)
> free_string_array(&wild_do_table);
> if (wild_ignore_table_inited)
> @@ -106,12 +106,12 @@ Rpl_filter::tables_ok(const char* db, TA
> len= (uint) (strmov(end, tables->table_name) - hash_key);
> if (do_table_inited) // if there are any do's
> {
> - if (my_hash_search(&do_table, (uchar*) hash_key, len))
> + if (find(&do_table, hash_key, len))
> DBUG_RETURN(1);
> }
> if (ignore_table_inited) // if there are any ignores
> {
> - if (my_hash_search(&ignore_table, (uchar*) hash_key, len))
> + if (find(&ignore_table, hash_key, len))
> DBUG_RETURN(0);
> }
> if (wild_do_table_inited &&
> @@ -167,8 +167,13 @@ Rpl_filter::db_ok(const char* db)
>
> while ((tmp=it++))
> {
> - if (!strcmp(tmp->ptr, db))
> - DBUG_RETURN(1); // match
> + /*
> + Filters will follow the setting of lower_case_table_name
> + to be case sensitive when setting lower_case_table_name=0.
> + Otherwise they will be case insensitive.
> + */
> + if (!my_strcasecmp(table_alias_charset, tmp->ptr, db))
> + DBUG_RETURN(1); // match
> }
> DBUG_RETURN(0);
> }
> @@ -179,8 +184,13 @@ Rpl_filter::db_ok(const char* db)
>
> while ((tmp=it++))
> {
> - if (!strcmp(tmp->ptr, db))
> - DBUG_RETURN(0); // match
> + /*
> + Filters will follow the setting of lower_case_table_name
> + to be case sensitive when setting lower_case_table_name=0.
> + Otherwise they will be case insensitive.
> + */
> + if (!my_strcasecmp(table_alias_charset, tmp->ptr, db))
> + DBUG_RETURN(0); // match
> }
> DBUG_RETURN(1);
> }
> @@ -255,23 +265,23 @@ Rpl_filter::is_on()
> }
>
>
> -int
> +int
> Rpl_filter::add_do_table(const char* table_spec)
> {
> DBUG_ENTER("Rpl_filter::add_do_table");
> if (!do_table_inited)
> - init_table_rule_hash(&do_table, &do_table_inited);
> + init_table_rule_array(&do_table, &do_table_inited);
> table_rules_on= 1;
> DBUG_RETURN(add_table_rule(&do_table, table_spec));
> }
> -
>
> -int
> +
> +int
> Rpl_filter::add_ignore_table(const char* table_spec)
> {
> DBUG_ENTER("Rpl_filter::add_ignore_table");
> if (!ignore_table_inited)
> - init_table_rule_hash(&ignore_table, &ignore_table_inited);
> + init_table_rule_array(&ignore_table, &ignore_table_inited);
> table_rules_on= 1;
> DBUG_RETURN(add_table_rule(&ignore_table, table_spec));
> }
> @@ -284,7 +294,7 @@ Rpl_filter::add_wild_do_table(const char
> if (!wild_do_table_inited)
> init_table_rule_array(&wild_do_table, &wild_do_table_inited);
> table_rules_on= 1;
> - DBUG_RETURN(add_wild_table_rule(&wild_do_table, table_spec));
> + DBUG_RETURN(add_table_rule(&wild_do_table, table_spec));
> }
>
>
> @@ -295,7 +305,7 @@ Rpl_filter::add_wild_ignore_table(const
> if (!wild_ignore_table_inited)
> init_table_rule_array(&wild_ignore_table, &wild_ignore_table_inited);
> table_rules_on= 1;
> - DBUG_RETURN(add_wild_table_rule(&wild_ignore_table, table_spec));
> + DBUG_RETURN(add_table_rule(&wild_ignore_table, table_spec));
> }
>
>
> @@ -307,31 +317,12 @@ Rpl_filter::add_db_rewrite(const char* f
> }
>
>
> -int
> -Rpl_filter::add_table_rule(HASH* h, const char* table_spec)
> -{
> - const char* dot = strchr(table_spec, '.');
> - if (!dot) return 1;
> - // len is always > 0 because we know the there exists a '.'
> - uint len = (uint)strlen(table_spec);
> - TABLE_RULE_ENT* e = (TABLE_RULE_ENT*)my_malloc(sizeof(TABLE_RULE_ENT)
> - + len, MYF(MY_WME));
> - if (!e) return 1;
> - e->db= (char*)e + sizeof(TABLE_RULE_ENT);
> - e->tbl_name= e->db + (dot - table_spec) + 1;
> - e->key_len= len;
> - memcpy(e->db, table_spec, len);
> -
> - return my_hash_insert(h, (uchar*)e);
> -}
> -
> -
> /*
> - Add table expression with wildcards to dynamic array
> + Add table expression to dynamic array
> */
>
> -int
> -Rpl_filter::add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec)
> +int
> +Rpl_filter::add_table_rule(DYNAMIC_ARRAY* a, const char* table_spec)
> {
> const char* dot = strchr(table_spec, '.');
> if (!dot) return 1;
> @@ -388,15 +379,6 @@ void free_table_ent(void* a)
>
>
> void
> -Rpl_filter::init_table_rule_hash(HASH* h, bool* h_inited)
> -{
> - my_hash_init(h, system_charset_info,TABLE_RULE_HASH_SIZE,0,0,
> - get_table_key, free_table_ent, 0);
> - *h_inited = 1;
> -}
> -
> -
> -void
> Rpl_filter::init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited)
> {
> my_init_dynamic_array(a, sizeof(TABLE_RULE_ENT*), TABLE_RULE_ARR_SIZE,
> @@ -410,12 +392,17 @@ Rpl_filter::find_wild(DYNAMIC_ARRAY *a,
> {
> uint i;
> const char* key_end= key + len;
> -
> +
> for (i= 0; i < a->elements; i++)
> {
> TABLE_RULE_ENT* e ;
> get_dynamic(a, (uchar*)&e, i);
> - if (!my_wildcmp(system_charset_info, key, key_end,
> + /*
> + Filters will follow the setting of lower_case_table_name
> + to be case sensitive when setting lower_case_table_name=0.
> + Otherwise they will be case insensitive.
> + */
> + if (!my_wildcmp(table_alias_charset, key, key_end,
> (const char*)e->db,
> (const char*)(e->db + e->key_len),
> '\\',wild_one,wild_many))
> @@ -426,47 +413,40 @@ Rpl_filter::find_wild(DYNAMIC_ARRAY *a,
> }
>
>
> -void
> -Rpl_filter::free_string_array(DYNAMIC_ARRAY *a)
> +TABLE_RULE_ENT*
> +Rpl_filter::find(DYNAMIC_ARRAY *a, const char* key, int len)
> {
> uint i;
> +
> for (i= 0; i < a->elements; i++)
> {
> - char* p;
> - get_dynamic(a, (uchar*) &p, i);
> - my_free(p);
> + TABLE_RULE_ENT* e ;
> + get_dynamic(a, (uchar*)&e, i);
> + /*
> + Filters will follow the setting of lower_case_table_name
> + to be case sensitive when setting lower_case_table_name=0.
> + Otherwise they will be case insensitive.
> + */
> + if (!my_strnncoll(table_alias_charset, (const uchar *)key, len,
> + (const uchar *)e->db, e->key_len))
> + return e;
> }
> - delete_dynamic(a);
> -}
>
> + return 0;
> +}
>
> -/*
> - Builds a String from a HASH of TABLE_RULE_ENT. Cannot be used for any other
> - hash, as it assumes that the hash entries are TABLE_RULE_ENT.
> -
> - SYNOPSIS
> - table_rule_ent_hash_to_str()
> - s pointer to the String to fill
> - h pointer to the HASH to read
> -
> - RETURN VALUES
> - none
> -*/
>
> void
> -Rpl_filter::table_rule_ent_hash_to_str(String* s, HASH* h, bool inited)
> +Rpl_filter::free_string_array(DYNAMIC_ARRAY *a)
> {
> - s->length(0);
> - if (inited)
> + uint i;
> + for (i= 0; i < a->elements; i++)
> {
> - for (uint i= 0; i < h->records; i++)
> - {
> - TABLE_RULE_ENT* e= (TABLE_RULE_ENT*) my_hash_element(h, i);
> - if (s->length())
> - s->append(',');
> - s->append(e->db,e->key_len);
> - }
> + char* p;
> + get_dynamic(a, (uchar*) &p, i);
> + my_free(p);
> }
> + delete_dynamic(a);
> }
>
>
> @@ -492,14 +472,14 @@ Rpl_filter::table_rule_ent_dynamic_array
> void
> Rpl_filter::get_do_table(String* str)
> {
> - table_rule_ent_hash_to_str(str, &do_table, do_table_inited);
> + table_rule_ent_dynamic_array_to_str(str, &do_table, do_table_inited);
> }
>
>
> void
> Rpl_filter::get_ignore_table(String* str)
> {
> - table_rule_ent_hash_to_str(str, &ignore_table, ignore_table_inited);
> + table_rule_ent_dynamic_array_to_str(str, &ignore_table, ignore_table_inited);
> }
>
>
> @@ -527,7 +507,12 @@ Rpl_filter::get_rewrite_db(const char* d
>
> while ((tmp=it++))
> {
> - if (!strcmp(tmp->key, db))
> + /*
> + Filters will follow the setting of lower_case_table_name
> + to be case sensitive when setting lower_case_table_name=0.
> + Otherwise they will be case insensitive.
> + */
> + if (!my_strcasecmp(table_alias_charset, tmp->key, db))
> {
> *new_len= strlen(tmp->val);
> return tmp->val;
>
> === modified file 'sql/rpl_filter.h'
> --- a/sql/rpl_filter.h 2010-07-02 18:15:21 +0000
> +++ b/sql/rpl_filter.h 2010-07-30 03:09:29 +0000
> @@ -83,25 +83,23 @@ public:
> private:
> bool table_rules_on;
>
> - void init_table_rule_hash(HASH* h, bool* h_inited);
> void init_table_rule_array(DYNAMIC_ARRAY* a, bool* a_inited);
>
> - int add_table_rule(HASH* h, const char* table_spec);
> - int add_wild_table_rule(DYNAMIC_ARRAY* a, const char* table_spec);
> + int add_table_rule(DYNAMIC_ARRAY* a, const char* table_spec);
>
> void free_string_array(DYNAMIC_ARRAY *a);
>
> - void table_rule_ent_hash_to_str(String* s, HASH* h, bool inited);
> void table_rule_ent_dynamic_array_to_str(String* s, DYNAMIC_ARRAY* a,
> bool inited);
> TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len);
> + TABLE_RULE_ENT* find(DYNAMIC_ARRAY *a, const char* key, int len);
>
> /*
> Those 4 structures below are uninitialized memory unless the
> corresponding *_inited variables are "true".
> */
> - HASH do_table;
> - HASH ignore_table;
> + DYNAMIC_ARRAY do_table;
> + DYNAMIC_ARRAY ignore_table;
> DYNAMIC_ARRAY wild_do_table;
> DYNAMIC_ARRAY wild_ignore_table;
>
>
> text/bzr-bundle 类型 附件
> (bzr/dao-gang.qu@stripped)
> # Bazaar merge directive format 2 (Bazaar 0.90)
> # revision_id: dao-gang.qu@stripped
> # target_branch: file:///home/daogangqu/mysql/bzrwork1/bug51639/mysql-\
> # next-mr-bugfixing/
> # testament_sha1: 3378a9e367636b05cb2c5fa3d362b47fb2551a0d
> # timestamp: 2010-07-30 11:09:46 +0800
> # base_revision_id: aelkin@stripped
> #
> # Begin bundle
> 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
> m8UqZU2WD/4u5IpwoSH5WXSG
>
>