Commit e6e4003d authored by unknown's avatar unknown

merged

parents 093f60cd f03d54f1
......@@ -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);
......@@ -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;
--replicate-wild-ignore-table=test.%
"--replicate-rewrite-db=mysqltest_from->mysqltest_to" --replicate-do-table=mysqltest_to.a
#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);
......@@ -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
......@@ -861,14 +861,6 @@ 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)).
Thought which arose from a question of a big customer "I want to include
all tables like "abc.%" except the "%.EFG"". This can't be done now. If we
......
......@@ -179,10 +179,7 @@ static bool begin_trans(THD *thd)
*/
inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables)
{
return (table_rules_on && tables && !tables_ok(thd,tables) &&
((thd->lex->sql_command != SQLCOM_DELETE_MULTI) ||
!tables_ok(thd,
(TABLE_LIST *)thd->lex->auxilliary_table_list.first)));
return table_rules_on && tables && !tables_ok(thd,tables);
}
#endif
......@@ -348,7 +345,7 @@ int check_user(THD *thd, enum enum_server_command command,
/* We have to read very specific packet size */
if (send_old_password_request(thd) ||
my_net_read(net) != SCRAMBLE_LENGTH_323 + 1)
{
{
inc_host_errors(&thd->remote.sin_addr);
DBUG_RETURN(ER_HANDSHAKE_ERROR);
}
......@@ -7178,6 +7175,9 @@ bool multi_delete_set_locks_and_link_aux_tables(LEX *lex)
target_tbl->table_name, "MULTI DELETE");
DBUG_RETURN(TRUE);
}
target_tbl->table_name= walk->table_name;
target_tbl->table_name_length= walk->table_name_length;
walk->updating= target_tbl->updating;
walk->lock_type= target_tbl->lock_type;
target_tbl->correspondent_table= walk; // Remember corresponding table
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment