Loading mysql-test/r/rpl_multi_delete2.result +26 −3 Original line number Diff line number Diff line Loading @@ -4,6 +4,26 @@ 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 mysqltest_from; set sql_log_bin=1; create database mysqltest_to; use mysqltest_from; drop table if exists a; CREATE TABLE a (i INT); INSERT INTO a VALUES(1); DELETE alias FROM a alias WHERE alias.i=1; SELECT * FROM a; i insert into a values(2),(3); delete a alias FROM a alias where alias.i=2; select * from a; i 3 use mysqltest_to; select * from a; i 3 create table t1 (a int); create table t2 (a int); insert into t1 values (1); Loading @@ -15,7 +35,10 @@ select * from t2; a 1 select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist ERROR 42S02: Table 'mysqltest_to.t1' doesn't exist select * from t2; ERROR 42S02: Table 'test.t2' doesn't exist drop table t1,t2; ERROR 42S02: Table 'mysqltest_to.t2' doesn't exist set sql_log_bin=0; drop database mysqltest_from; set sql_log_bin=1; drop database mysqltest_to; mysql-test/t/rpl_multi_delete2-slave.opt +1 −1 Original line number Diff line number Diff line --replicate-wild-ignore-table=test.% "--replicate-rewrite-db=mysqltest_from->mysqltest_to" --replicate-do-table=mysqltest_to.a mysql-test/t/rpl_multi_delete2.test +44 −1 Original line number Diff line number Diff line #multi delete replication bugs source include/master-slave.inc; #BUG#11139 - improper wild-table and table rules #checking for multi deletes with an alias connection master; set sql_log_bin=0; create database mysqltest_from; set sql_log_bin=1; connection slave; create database mysqltest_to; connection master; use mysqltest_from; --disable_warnings drop table if exists a; --enable_warnings CREATE TABLE a (i INT); INSERT INTO a VALUES(1); DELETE alias FROM a alias WHERE alias.i=1; SELECT * FROM a; insert into a values(2),(3); delete a alias FROM a alias where alias.i=2; select * from a; save_master_pos; connection slave; use mysqltest_to; sync_with_master; select * from a; # BUG#3461 connection master; create table t1 (a int); create table t2 (a int); Loading @@ -19,7 +56,13 @@ select * from t1; error 1146; select * from t2; # cleanup connection master; drop table t1,t2; set sql_log_bin=0; drop database mysqltest_from; set sql_log_bin=1; connection slave; drop database mysqltest_to; # End of 4.1 tests sql/mysql_priv.h +2 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ void kill_one_thread(THD *thd, ulong id); bool net_request_file(NET* net, const char* fname); char* query_table_status(THD *thd,const char *db,const char *table_name); #define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); } #define safeFree(x) { if(x) { my_free((gptr) x,MYF(0)); x = NULL; } } #define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1)) Loading Loading @@ -464,6 +465,7 @@ void mysql_reset_thd_for_next_command(THD *thd); bool mysql_new_select(LEX *lex, bool move_down); void create_select_for_variable(const char *var_name); void mysql_init_multi_delete(LEX *lex); void fix_multi_delete_lex(LEX* lex); void init_max_user_conn(void); void init_update_queries(void); void free_max_user_conn(void); Loading sql/slave.cc +1 −8 Original line number Diff line number Diff line Loading @@ -746,14 +746,7 @@ static TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len) rules (see code below). For that reason, users should not set conflicting rules because they may get unpredicted results (precedence order is explained in the manual). If no table of the list is marked "updating" (so far this can only happen if the statement is a multi-delete (SQLCOM_DELETE_MULTI) and the "tables" is the tables in the FROM): then we always return 0, because there is no reason we play this statement on this slave if it updates nothing. In the case of SQLCOM_DELETE_MULTI, there will be a second call to tables_ok(), with tables having "updating==TRUE" (those after the DELETE), so this second call will make the decision (because all_tables_not_ok() = !tables_ok(1st_list) && !tables_ok(2nd_list)). RETURN VALUES 0 should not be logged/replicated Loading Loading
mysql-test/r/rpl_multi_delete2.result +26 −3 Original line number Diff line number Diff line Loading @@ -4,6 +4,26 @@ 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 mysqltest_from; set sql_log_bin=1; create database mysqltest_to; use mysqltest_from; drop table if exists a; CREATE TABLE a (i INT); INSERT INTO a VALUES(1); DELETE alias FROM a alias WHERE alias.i=1; SELECT * FROM a; i insert into a values(2),(3); delete a alias FROM a alias where alias.i=2; select * from a; i 3 use mysqltest_to; select * from a; i 3 create table t1 (a int); create table t2 (a int); insert into t1 values (1); Loading @@ -15,7 +35,10 @@ select * from t2; a 1 select * from t1; ERROR 42S02: Table 'test.t1' doesn't exist ERROR 42S02: Table 'mysqltest_to.t1' doesn't exist select * from t2; ERROR 42S02: Table 'test.t2' doesn't exist drop table t1,t2; ERROR 42S02: Table 'mysqltest_to.t2' doesn't exist set sql_log_bin=0; drop database mysqltest_from; set sql_log_bin=1; drop database mysqltest_to;
mysql-test/t/rpl_multi_delete2-slave.opt +1 −1 Original line number Diff line number Diff line --replicate-wild-ignore-table=test.% "--replicate-rewrite-db=mysqltest_from->mysqltest_to" --replicate-do-table=mysqltest_to.a
mysql-test/t/rpl_multi_delete2.test +44 −1 Original line number Diff line number Diff line #multi delete replication bugs source include/master-slave.inc; #BUG#11139 - improper wild-table and table rules #checking for multi deletes with an alias connection master; set sql_log_bin=0; create database mysqltest_from; set sql_log_bin=1; connection slave; create database mysqltest_to; connection master; use mysqltest_from; --disable_warnings drop table if exists a; --enable_warnings CREATE TABLE a (i INT); INSERT INTO a VALUES(1); DELETE alias FROM a alias WHERE alias.i=1; SELECT * FROM a; insert into a values(2),(3); delete a alias FROM a alias where alias.i=2; select * from a; save_master_pos; connection slave; use mysqltest_to; sync_with_master; select * from a; # BUG#3461 connection master; create table t1 (a int); create table t2 (a int); Loading @@ -19,7 +56,13 @@ select * from t1; error 1146; select * from t2; # cleanup connection master; drop table t1,t2; set sql_log_bin=0; drop database mysqltest_from; set sql_log_bin=1; connection slave; drop database mysqltest_to; # End of 4.1 tests
sql/mysql_priv.h +2 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ void kill_one_thread(THD *thd, ulong id); bool net_request_file(NET* net, const char* fname); char* query_table_status(THD *thd,const char *db,const char *table_name); #define x_free(A) { my_free((gptr) (A),MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR)); } #define safeFree(x) { if(x) { my_free((gptr) x,MYF(0)); x = NULL; } } #define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1)) Loading Loading @@ -464,6 +465,7 @@ void mysql_reset_thd_for_next_command(THD *thd); bool mysql_new_select(LEX *lex, bool move_down); void create_select_for_variable(const char *var_name); void mysql_init_multi_delete(LEX *lex); void fix_multi_delete_lex(LEX* lex); void init_max_user_conn(void); void init_update_queries(void); void free_max_user_conn(void); Loading
sql/slave.cc +1 −8 Original line number Diff line number Diff line Loading @@ -746,14 +746,7 @@ static TABLE_RULE_ENT* find_wild(DYNAMIC_ARRAY *a, const char* key, int len) rules (see code below). For that reason, users should not set conflicting rules because they may get unpredicted results (precedence order is explained in the manual). If no table of the list is marked "updating" (so far this can only happen if the statement is a multi-delete (SQLCOM_DELETE_MULTI) and the "tables" is the tables in the FROM): then we always return 0, because there is no reason we play this statement on this slave if it updates nothing. In the case of SQLCOM_DELETE_MULTI, there will be a second call to tables_ok(), with tables having "updating==TRUE" (those after the DELETE), so this second call will make the decision (because all_tables_not_ok() = !tables_ok(1st_list) && !tables_ok(2nd_list)). RETURN VALUES 0 should not be logged/replicated Loading