mirror of
https://github.com/MariaDB/server.git
synced 2025-06-15 00:02:46 +03:00
merged
This commit is contained in:
@ -4,6 +4,26 @@ reset master;
|
|||||||
reset slave;
|
reset slave;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
start slave;
|
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 t1 (a int);
|
||||||
create table t2 (a int);
|
create table t2 (a int);
|
||||||
insert into t1 values (1);
|
insert into t1 values (1);
|
||||||
@ -15,7 +35,10 @@ select * from t2;
|
|||||||
a
|
a
|
||||||
1
|
1
|
||||||
select * from t1;
|
select * from t1;
|
||||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
ERROR 42S02: Table 'mysqltest_to.t1' doesn't exist
|
||||||
select * from t2;
|
select * from t2;
|
||||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
ERROR 42S02: Table 'mysqltest_to.t2' doesn't exist
|
||||||
drop table t1,t2;
|
set sql_log_bin=0;
|
||||||
|
drop database mysqltest_from;
|
||||||
|
set sql_log_bin=1;
|
||||||
|
drop database mysqltest_to;
|
||||||
|
@ -1 +1 @@
|
|||||||
--replicate-wild-ignore-table=test.%
|
"--replicate-rewrite-db=mysqltest_from->mysqltest_to" --replicate-do-table=mysqltest_to.a
|
||||||
|
@ -1,4 +1,41 @@
|
|||||||
|
#multi delete replication bugs
|
||||||
|
|
||||||
|
|
||||||
source include/master-slave.inc;
|
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 t1 (a int);
|
||||||
create table t2 (a int);
|
create table t2 (a int);
|
||||||
|
|
||||||
@ -19,7 +56,13 @@ select * from t1;
|
|||||||
error 1146;
|
error 1146;
|
||||||
select * from t2;
|
select * from t2;
|
||||||
|
|
||||||
|
# cleanup
|
||||||
connection master;
|
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
|
# 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 (see code below). For that reason, users should not set conflicting
|
||||||
rules because they may get unpredicted results (precedence order is
|
rules because they may get unpredicted results (precedence order is
|
||||||
explained in the manual).
|
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
|
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
|
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)
|
inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables)
|
||||||
{
|
{
|
||||||
return (table_rules_on && tables && !tables_ok(thd,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)));
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -348,7 +345,7 @@ int check_user(THD *thd, enum enum_server_command command,
|
|||||||
/* We have to read very specific packet size */
|
/* We have to read very specific packet size */
|
||||||
if (send_old_password_request(thd) ||
|
if (send_old_password_request(thd) ||
|
||||||
my_net_read(net) != SCRAMBLE_LENGTH_323 + 1)
|
my_net_read(net) != SCRAMBLE_LENGTH_323 + 1)
|
||||||
{
|
{
|
||||||
inc_host_errors(&thd->remote.sin_addr);
|
inc_host_errors(&thd->remote.sin_addr);
|
||||||
DBUG_RETURN(ER_HANDSHAKE_ERROR);
|
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");
|
target_tbl->table_name, "MULTI DELETE");
|
||||||
DBUG_RETURN(TRUE);
|
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;
|
walk->lock_type= target_tbl->lock_type;
|
||||||
target_tbl->correspondent_table= walk; // Remember corresponding table
|
target_tbl->correspondent_table= walk; // Remember corresponding table
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user