mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge romeo.(none):/home/bkroot/mysql-5.1-new-rpl
into romeo.(none):/home/bk/b19033-mysql-5.1-new-rpl
This commit is contained in:
@ -413,3 +413,14 @@ select * from t1;
|
|||||||
insert into t1 values ('abc');
|
insert into t1 values ('abc');
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#25815 Data truncated for column TEXT
|
||||||
|
#
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a text) default character set cp932;
|
||||||
|
insert into t1 values (_utf8 0xE38182);
|
||||||
|
show warnings;
|
||||||
|
select * from t1;
|
||||||
|
select hex(a) from t1;
|
||||||
|
drop table t1;
|
||||||
|
86
mysql-test/extra/rpl_tests/rpl_insert_delayed.test
Normal file
86
mysql-test/extra/rpl_tests/rpl_insert_delayed.test
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
# The two bugs below (BUG#25507 and BUG#26116) existed only in
|
||||||
|
# statement-based binlogging; we test that now they are fixed;
|
||||||
|
# we also test that mixed and row-based binlogging work too,
|
||||||
|
# for completeness.
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
--disable_warnings
|
||||||
|
CREATE SCHEMA IF NOT EXISTS mysqlslap;
|
||||||
|
USE mysqlslap;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
select @@global.binlog_format;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#25507 "multi-row insert delayed + auto increment causes
|
||||||
|
# duplicate key entries on slave";
|
||||||
|
# happened only in statement-based binlogging.
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
|
||||||
|
let $query = "INSERT DELAYED INTO t1 VALUES (null, 'Dr. No'), (null, 'From Russia With Love'), (null, 'Goldfinger'), (null, 'Thunderball'), (null, 'You Only Live Twice')";
|
||||||
|
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=200 --query=$query --delimiter=";"
|
||||||
|
|
||||||
|
FLUSH TABLE t1; # another way to be sure INSERT DELAYED has inserted
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
# when bug existed slave failed below ("duplicate key" error at random INSERT)
|
||||||
|
sync_slave_with_master;
|
||||||
|
use mysqlslap;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#26116 "If multi-row INSERT DELAYED has errors,
|
||||||
|
# statement-based binlogging breaks";
|
||||||
|
# happened only in statement-based binlogging.
|
||||||
|
#
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
truncate table t1;
|
||||||
|
# first scenario: duplicate on first row
|
||||||
|
insert delayed into t1 values(10, "my name");
|
||||||
|
if ($binlog_format_statement)
|
||||||
|
{
|
||||||
|
# statement below will be converted to non-delayed INSERT and so
|
||||||
|
# will stop at first error, guaranteeing replication.
|
||||||
|
--error ER_DUP_ENTRY
|
||||||
|
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
|
||||||
|
}
|
||||||
|
if (!$binlog_format_statement)
|
||||||
|
{
|
||||||
|
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
|
||||||
|
}
|
||||||
|
flush table t1; # to wait for INSERT DELAYED to be done
|
||||||
|
select * from t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
# when bug existed in statement-based binlogging, t1 on slave had
|
||||||
|
# different content from on master
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
# second scenario: duplicate on second row
|
||||||
|
connection master;
|
||||||
|
delete from t1 where id!=10;
|
||||||
|
if ($binlog_format_statement)
|
||||||
|
{
|
||||||
|
# statement below will be converted to non-delayed INSERT and so
|
||||||
|
# will be binlogged with its ER_DUP_ENTRY error code, guaranteeing
|
||||||
|
# replication (slave will hit the same error code and so be fine).
|
||||||
|
--error ER_DUP_ENTRY
|
||||||
|
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
|
||||||
|
}
|
||||||
|
if (!$binlog_format_statement)
|
||||||
|
{
|
||||||
|
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
|
||||||
|
}
|
||||||
|
flush table t1; # to wait for INSERT DELAYED to be done
|
||||||
|
select * from t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
# when bug existed in statement-based binlogging, query was binlogged
|
||||||
|
# with error_code=0 so slave stopped
|
||||||
|
select * from t1;
|
||||||
|
|
||||||
|
# clean up
|
||||||
|
connection master;
|
||||||
|
USE test;
|
||||||
|
DROP SCHEMA mysqlslap;
|
||||||
|
sync_slave_with_master;
|
||||||
|
connection master;
|
@ -209,7 +209,7 @@ connection master;
|
|||||||
|
|
||||||
drop function bug15728;
|
drop function bug15728;
|
||||||
drop function bug15728_insert;
|
drop function bug15728_insert;
|
||||||
drop table t1;
|
drop table t1,t2;
|
||||||
drop procedure foo;
|
drop procedure foo;
|
||||||
|
|
||||||
# test of BUG#20188 REPLACE or ON DUPLICATE KEY UPDATE in
|
# test of BUG#20188 REPLACE or ON DUPLICATE KEY UPDATE in
|
||||||
@ -276,6 +276,59 @@ connection master;
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#24432 "INSERT... ON DUPLICATE KEY UPDATE skips auto_increment values"
|
||||||
|
#
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
# testcase with INSERT VALUES
|
||||||
|
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||||
|
UNIQUE(b));
|
||||||
|
INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
# tescase with INSERT SELECT
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id bigint(20) unsigned NOT NULL auto_increment,
|
||||||
|
field_1 int(10) unsigned NOT NULL,
|
||||||
|
field_2 varchar(255) NOT NULL,
|
||||||
|
field_3 varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY field_1 (field_1, field_2)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
field_a int(10) unsigned NOT NULL,
|
||||||
|
field_b varchar(255) NOT NULL,
|
||||||
|
field_c varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (4, 'd', '4d');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (5, 'e', '5e');
|
||||||
|
# Updating table t1 based on values from table t2
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
# Inserting new record into t2
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (6, 'f', '6f');
|
||||||
|
# Updating t1 again
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
connection master;
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
#
|
#
|
||||||
# BUG#20339: stored procedure using LAST_INSERT_ID() does not
|
# BUG#20339: stored procedure using LAST_INSERT_ID() does not
|
||||||
|
@ -11353,3 +11353,15 @@ a
|
|||||||
a
|
a
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a text) default character set cp932;
|
||||||
|
insert into t1 values (_utf8 0xE38182);
|
||||||
|
show warnings;
|
||||||
|
Level Code Message
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
あ
|
||||||
|
select hex(a) from t1;
|
||||||
|
hex(a)
|
||||||
|
82A0
|
||||||
|
drop table t1;
|
||||||
|
@ -11353,3 +11353,15 @@ a
|
|||||||
a
|
a
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
create table t1 (a text) default character set cp932;
|
||||||
|
insert into t1 values (_utf8 0xE38182);
|
||||||
|
show warnings;
|
||||||
|
Level Code Message
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
あ
|
||||||
|
select hex(a) from t1;
|
||||||
|
hex(a)
|
||||||
|
82A0
|
||||||
|
drop table t1;
|
||||||
|
@ -2,11 +2,11 @@ drop table if exists t1;
|
|||||||
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb;
|
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
c1 c2 stamp
|
c1 c2 stamp
|
||||||
replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12");
|
replace delayed into t1 (c1, c2) values ( "text1","11");
|
||||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||||
select * from t1;
|
select * from t1;
|
||||||
c1 c2 stamp
|
c1 c2 stamp
|
||||||
replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" );
|
replace delayed into t1 (c1, c2) values ( "text1","12");
|
||||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||||
select * from t1;
|
select * from t1;
|
||||||
c1 c2 stamp
|
c1 c2 stamp
|
||||||
|
@ -196,7 +196,7 @@ id last_id
|
|||||||
3 5
|
3 5
|
||||||
drop function bug15728;
|
drop function bug15728;
|
||||||
drop function bug15728_insert;
|
drop function bug15728_insert;
|
||||||
drop table t1;
|
drop table t1,t2;
|
||||||
drop procedure foo;
|
drop procedure foo;
|
||||||
create table t1 (n int primary key auto_increment not null,
|
create table t1 (n int primary key auto_increment not null,
|
||||||
b int, unique(b));
|
b int, unique(b));
|
||||||
@ -263,6 +263,64 @@ n b
|
|||||||
2 100
|
2 100
|
||||||
3 350
|
3 350
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||||
|
UNIQUE(b));
|
||||||
|
INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
2 2
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
2 2
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id bigint(20) unsigned NOT NULL auto_increment,
|
||||||
|
field_1 int(10) unsigned NOT NULL,
|
||||||
|
field_2 varchar(255) NOT NULL,
|
||||||
|
field_3 varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY field_1 (field_1, field_2)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
field_a int(10) unsigned NOT NULL,
|
||||||
|
field_b varchar(255) NOT NULL,
|
||||||
|
field_c varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (4, 'd', '4d');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (5, 'e', '5e');
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (6, 'f', '6f');
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
id field_1 field_2 field_3
|
||||||
|
1 1 a 1a
|
||||||
|
2 2 b 2b
|
||||||
|
3 3 c 3c
|
||||||
|
4 4 d 4d
|
||||||
|
5 5 e 5e
|
||||||
|
6 6 f 6f
|
||||||
|
SELECT * FROM t1;
|
||||||
|
id field_1 field_2 field_3
|
||||||
|
1 1 a 1a
|
||||||
|
2 2 b 2b
|
||||||
|
3 3 c 3c
|
||||||
|
4 4 d 4d
|
||||||
|
5 5 e 5e
|
||||||
|
6 6 f 6f
|
||||||
|
drop table t1, t2;
|
||||||
DROP PROCEDURE IF EXISTS p1;
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
DROP TABLE IF EXISTS t1, t2;
|
DROP TABLE IF EXISTS t1, t2;
|
||||||
SELECT LAST_INSERT_ID(0);
|
SELECT LAST_INSERT_ID(0);
|
||||||
|
133
mysql-test/r/rpl_known_bugs_detection.result
Normal file
133
mysql-test/r/rpl_known_bugs_detection.result
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
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 TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||||
|
UNIQUE(b));
|
||||||
|
INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
1 10
|
||||||
|
2 2
|
||||||
|
show slave status;;
|
||||||
|
Slave_IO_State #
|
||||||
|
Master_Host 127.0.0.1
|
||||||
|
Master_User root
|
||||||
|
Master_Port #
|
||||||
|
Connect_Retry 1
|
||||||
|
Master_Log_File master-bin.000001
|
||||||
|
Read_Master_Log_Pos #
|
||||||
|
Relay_Log_File #
|
||||||
|
Relay_Log_Pos #
|
||||||
|
Relay_Master_Log_File master-bin.000001
|
||||||
|
Slave_IO_Running Yes
|
||||||
|
Slave_SQL_Running No
|
||||||
|
Replicate_Do_DB
|
||||||
|
Replicate_Ignore_DB
|
||||||
|
Replicate_Do_Table
|
||||||
|
Replicate_Ignore_Table
|
||||||
|
Replicate_Wild_Do_Table
|
||||||
|
Replicate_Wild_Ignore_Table
|
||||||
|
Last_Errno 1105
|
||||||
|
Last_Error Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10'
|
||||||
|
Skip_Counter 0
|
||||||
|
Exec_Master_Log_Pos 242
|
||||||
|
Relay_Log_Space #
|
||||||
|
Until_Condition None
|
||||||
|
Until_Log_File
|
||||||
|
Until_Log_Pos 0
|
||||||
|
Master_SSL_Allowed No
|
||||||
|
Master_SSL_CA_File
|
||||||
|
Master_SSL_CA_Path
|
||||||
|
Master_SSL_Cert
|
||||||
|
Master_SSL_Cipher
|
||||||
|
Master_SSL_Key
|
||||||
|
Seconds_Behind_Master #
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a b
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
reset master;
|
||||||
|
drop table t1;
|
||||||
|
start slave;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id bigint(20) unsigned NOT NULL auto_increment,
|
||||||
|
field_1 int(10) unsigned NOT NULL,
|
||||||
|
field_2 varchar(255) NOT NULL,
|
||||||
|
field_3 varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY field_1 (field_1, field_2)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
field_a int(10) unsigned NOT NULL,
|
||||||
|
field_b varchar(255) NOT NULL,
|
||||||
|
field_c varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (4, 'd', '4d');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (5, 'e', '5e');
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (6, 'f', '6f');
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
id field_1 field_2 field_3
|
||||||
|
1 1 a 1a
|
||||||
|
2 2 b 2b
|
||||||
|
3 3 c 3c
|
||||||
|
4 4 d 4d
|
||||||
|
5 5 e 5e
|
||||||
|
6 6 f 6f
|
||||||
|
show slave status;;
|
||||||
|
Slave_IO_State #
|
||||||
|
Master_Host 127.0.0.1
|
||||||
|
Master_User root
|
||||||
|
Master_Port #
|
||||||
|
Connect_Retry 1
|
||||||
|
Master_Log_File master-bin.000001
|
||||||
|
Read_Master_Log_Pos #
|
||||||
|
Relay_Log_File #
|
||||||
|
Relay_Log_Pos #
|
||||||
|
Relay_Master_Log_File master-bin.000001
|
||||||
|
Slave_IO_Running Yes
|
||||||
|
Slave_SQL_Running No
|
||||||
|
Replicate_Do_DB
|
||||||
|
Replicate_Ignore_DB
|
||||||
|
Replicate_Do_Table
|
||||||
|
Replicate_Ignore_Table
|
||||||
|
Replicate_Wild_Do_Table
|
||||||
|
Replicate_Wild_Ignore_Table
|
||||||
|
Last_Errno 1105
|
||||||
|
Last_Error Error 'master may suffer from http://bugs.mysql.com/bug.php?id=24432 so slave stops; check error log on slave for more info' on query. Default database: 'test'. Query: 'INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c'
|
||||||
|
Skip_Counter 0
|
||||||
|
Exec_Master_Log_Pos 1274
|
||||||
|
Relay_Log_Space #
|
||||||
|
Until_Condition None
|
||||||
|
Until_Log_File
|
||||||
|
Until_Log_Pos 0
|
||||||
|
Master_SSL_Allowed No
|
||||||
|
Master_SSL_CA_File
|
||||||
|
Master_SSL_CA_Path
|
||||||
|
Master_SSL_Cert
|
||||||
|
Master_SSL_Cipher
|
||||||
|
Master_SSL_Key
|
||||||
|
Seconds_Behind_Master #
|
||||||
|
SELECT * FROM t1;
|
||||||
|
id field_1 field_2 field_3
|
||||||
|
drop table t1, t2;
|
||||||
|
drop table t1, t2;
|
48
mysql-test/r/rpl_row_insert_delayed.result
Normal file
48
mysql-test/r/rpl_row_insert_delayed.result
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
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 @old_global_binlog_format = @@global.binlog_format;
|
||||||
|
set @@global.binlog_format = row;
|
||||||
|
CREATE SCHEMA IF NOT EXISTS mysqlslap;
|
||||||
|
USE mysqlslap;
|
||||||
|
select @@global.binlog_format;
|
||||||
|
@@global.binlog_format
|
||||||
|
ROW
|
||||||
|
CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
use mysqlslap;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
truncate table t1;
|
||||||
|
insert delayed into t1 values(10, "my name");
|
||||||
|
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 James Bond
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 James Bond
|
||||||
|
delete from t1 where id!=10;
|
||||||
|
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
USE test;
|
||||||
|
DROP SCHEMA mysqlslap;
|
||||||
|
set @@global.binlog_format = @old_global_binlog_format;
|
88
mysql-test/r/rpl_stm_insert_delayed.result
Normal file
88
mysql-test/r/rpl_stm_insert_delayed.result
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
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 @old_global_binlog_format = @@global.binlog_format;
|
||||||
|
set @@global.binlog_format = statement;
|
||||||
|
CREATE SCHEMA IF NOT EXISTS mysqlslap;
|
||||||
|
USE mysqlslap;
|
||||||
|
select @@global.binlog_format;
|
||||||
|
@@global.binlog_format
|
||||||
|
STATEMENT
|
||||||
|
CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
use mysqlslap;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
truncate table t1;
|
||||||
|
insert delayed into t1 values(10, "my name");
|
||||||
|
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
|
||||||
|
ERROR 23000: Duplicate entry '10' for key 'PRIMARY'
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
delete from t1 where id!=10;
|
||||||
|
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
|
||||||
|
ERROR 23000: Duplicate entry '10' for key 'PRIMARY'
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
USE test;
|
||||||
|
DROP SCHEMA mysqlslap;
|
||||||
|
set @@global.binlog_format = mixed;
|
||||||
|
CREATE SCHEMA IF NOT EXISTS mysqlslap;
|
||||||
|
USE mysqlslap;
|
||||||
|
select @@global.binlog_format;
|
||||||
|
@@global.binlog_format
|
||||||
|
MIXED
|
||||||
|
CREATE TABLE t1 (id INT primary key auto_increment, name VARCHAR(64));
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
use mysqlslap;
|
||||||
|
SELECT COUNT(*) FROM t1;
|
||||||
|
COUNT(*)
|
||||||
|
5000
|
||||||
|
truncate table t1;
|
||||||
|
insert delayed into t1 values(10, "my name");
|
||||||
|
insert delayed into t1 values(10, "is Bond"), (20, "James Bond");
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 James Bond
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 James Bond
|
||||||
|
delete from t1 where id!=10;
|
||||||
|
insert delayed into t1 values(20, "is Bond"), (10, "James Bond");
|
||||||
|
flush table t1;
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
select * from t1;
|
||||||
|
id name
|
||||||
|
10 my name
|
||||||
|
20 is Bond
|
||||||
|
USE test;
|
||||||
|
DROP SCHEMA mysqlslap;
|
||||||
|
set @@global.binlog_format = @old_global_binlog_format;
|
@ -38,4 +38,5 @@ synchronization : Bug#24529 Test 'synchronization' fails on Mac pushb
|
|||||||
|
|
||||||
flush2 : Bug#24805 Pushbuild can't handle test with --disable-log-bin
|
flush2 : Bug#24805 Pushbuild can't handle test with --disable-log-bin
|
||||||
mysql_upgrade : Bug#25074 mysql_upgrade gives inconsisten results
|
mysql_upgrade : Bug#25074 mysql_upgrade gives inconsisten results
|
||||||
|
rpl_insert_id : Guilhem will enable as soon as replication team tree has merged with main tree and so got version number 5.1.16
|
||||||
|
|
||||||
|
@ -12,10 +12,10 @@ drop table if exists t1;
|
|||||||
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb;
|
create table t1 (c1 char(5) unique not null, c2 int, stamp timestamp) engine=innodb;
|
||||||
select * from t1;
|
select * from t1;
|
||||||
--error 1031
|
--error 1031
|
||||||
replace delayed into t1 (c1, c2) values ( "text1","11"),( "text2","12");
|
replace delayed into t1 (c1, c2) values ( "text1","11");
|
||||||
select * from t1;
|
select * from t1;
|
||||||
--error 1031
|
--error 1031
|
||||||
replace delayed into t1 (c1, c2) values ( "text1","12"),( "text2","13"),( "text3","14", "a" ),( "text4","15", "b" );
|
replace delayed into t1 (c1, c2) values ( "text1","12");
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
1
mysql-test/t/rpl_known_bugs_detection-master.opt
Normal file
1
mysql-test/t/rpl_known_bugs_detection-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--loose-debug=d,pretend_version_50034_in_binlog
|
93
mysql-test/t/rpl_known_bugs_detection.test
Normal file
93
mysql-test/t/rpl_known_bugs_detection.test
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
# Test to see if slave can detect certain known bugs present
|
||||||
|
# on the master, and appropriately decides to stop
|
||||||
|
# (assuming the bug is fixed in the slave, slave cannot of course
|
||||||
|
# imitate the bug, so it has to stop).
|
||||||
|
|
||||||
|
source include/have_debug.inc;
|
||||||
|
source include/master-slave.inc;
|
||||||
|
|
||||||
|
# Currently only statement-based-specific bugs are here
|
||||||
|
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is to test that slave properly detects if
|
||||||
|
# master may suffer from:
|
||||||
|
# BUG#24432 "INSERT... ON DUPLICATE KEY UPDATE skips auto_increment values"
|
||||||
|
# (i.e. on master, INSERT ON DUPLICATE KEY UPDATE is used and manipulates
|
||||||
|
# an auto_increment column, and is binlogged statement-based).
|
||||||
|
#
|
||||||
|
|
||||||
|
# testcase with INSERT VALUES
|
||||||
|
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||||
|
UNIQUE(b));
|
||||||
|
sync_slave_with_master;
|
||||||
|
connection master;
|
||||||
|
INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
connection slave;
|
||||||
|
wait_for_slave_to_stop;
|
||||||
|
# show the error message
|
||||||
|
--replace_column 1 # 4 # 7 # 8 # 9 # 23 # 33 #
|
||||||
|
--query_vertical show slave status;
|
||||||
|
# show that it was not replicated
|
||||||
|
SELECT * FROM t1;
|
||||||
|
|
||||||
|
# restart replication for the next testcase
|
||||||
|
stop slave;
|
||||||
|
reset slave;
|
||||||
|
connection master;
|
||||||
|
reset master;
|
||||||
|
drop table t1;
|
||||||
|
connection slave;
|
||||||
|
start slave;
|
||||||
|
|
||||||
|
# testcase with INSERT SELECT
|
||||||
|
connection master;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
id bigint(20) unsigned NOT NULL auto_increment,
|
||||||
|
field_1 int(10) unsigned NOT NULL,
|
||||||
|
field_2 varchar(255) NOT NULL,
|
||||||
|
field_3 varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (id),
|
||||||
|
UNIQUE KEY field_1 (field_1, field_2)
|
||||||
|
);
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
field_a int(10) unsigned NOT NULL,
|
||||||
|
field_b varchar(255) NOT NULL,
|
||||||
|
field_c varchar(255) NOT NULL
|
||||||
|
);
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (4, 'd', '4d');
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (5, 'e', '5e');
|
||||||
|
sync_slave_with_master;
|
||||||
|
connection master;
|
||||||
|
# Updating table t1 based on values from table t2
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
# Inserting new record into t2
|
||||||
|
INSERT INTO t2 (field_a, field_b, field_c) VALUES (6, 'f', '6f');
|
||||||
|
# Updating t1 again
|
||||||
|
INSERT INTO t1 (field_1, field_2, field_3)
|
||||||
|
SELECT t2.field_a, t2.field_b, t2.field_c
|
||||||
|
FROM t2
|
||||||
|
ON DUPLICATE KEY UPDATE
|
||||||
|
t1.field_3 = t2.field_c;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
connection slave;
|
||||||
|
wait_for_slave_to_stop;
|
||||||
|
# show the error message
|
||||||
|
--replace_column 1 # 4 # 7 # 8 # 9 # 23 # 33 #
|
||||||
|
--query_vertical show slave status;
|
||||||
|
# show that it was not replicated
|
||||||
|
SELECT * FROM t1;
|
||||||
|
connection master;
|
||||||
|
drop table t1, t2;
|
||||||
|
connection slave;
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
# End of 5.0 tests
|
14
mysql-test/t/rpl_row_insert_delayed.test
Normal file
14
mysql-test/t/rpl_row_insert_delayed.test
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
--source include/have_binlog_format_row.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
--source include/not_windows.inc
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
set @old_global_binlog_format = @@global.binlog_format;
|
||||||
|
|
||||||
|
let $binlog_format_statement=0;
|
||||||
|
set @@global.binlog_format = row;
|
||||||
|
--source extra/rpl_tests/rpl_insert_delayed.test
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
set @@global.binlog_format = @old_global_binlog_format;
|
20
mysql-test/t/rpl_stm_insert_delayed.test
Normal file
20
mysql-test/t/rpl_stm_insert_delayed.test
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# we run first in statement-based then in mixed binlogging
|
||||||
|
|
||||||
|
--source include/have_binlog_format_mixed_or_statement.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
--source include/not_windows.inc
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
set @old_global_binlog_format = @@global.binlog_format;
|
||||||
|
|
||||||
|
let $binlog_format_statement=1;
|
||||||
|
set @@global.binlog_format = statement;
|
||||||
|
--source extra/rpl_tests/rpl_insert_delayed.test
|
||||||
|
|
||||||
|
let $binlog_format_statement=0;
|
||||||
|
set @@global.binlog_format = mixed;
|
||||||
|
--source extra/rpl_tests/rpl_insert_delayed.test
|
||||||
|
|
||||||
|
connection master;
|
||||||
|
set @@global.binlog_format = @old_global_binlog_format;
|
@ -7213,7 +7213,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
|
|||||||
cannot_convert_error_pos, from + length))
|
cannot_convert_error_pos, from + length))
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
if (copy_length < length)
|
if (from_end_pos < from + length)
|
||||||
{
|
{
|
||||||
report_data_too_long(this);
|
report_data_too_long(this);
|
||||||
return 2;
|
return 2;
|
||||||
|
@ -4528,7 +4528,7 @@ int TC_LOG_MMAP::open(const char *opt_name)
|
|||||||
goto err;
|
goto err;
|
||||||
if (using_heuristic_recover())
|
if (using_heuristic_recover())
|
||||||
return 1;
|
return 1;
|
||||||
if ((fd= my_create(logname, O_RDWR, 0, MYF(MY_WME))) < 0)
|
if ((fd= my_create(logname, CREATE_MODE, O_RDWR, MYF(MY_WME))) < 0)
|
||||||
goto err;
|
goto err;
|
||||||
inited=1;
|
inited=1;
|
||||||
file_length= opt_tc_log_size;
|
file_length= opt_tc_log_size;
|
||||||
|
@ -2254,6 +2254,8 @@ Start_log_event_v3::Start_log_event_v3(const char* buf,
|
|||||||
binlog_version= uint2korr(buf+ST_BINLOG_VER_OFFSET);
|
binlog_version= uint2korr(buf+ST_BINLOG_VER_OFFSET);
|
||||||
memcpy(server_version, buf+ST_SERVER_VER_OFFSET,
|
memcpy(server_version, buf+ST_SERVER_VER_OFFSET,
|
||||||
ST_SERVER_VER_LEN);
|
ST_SERVER_VER_LEN);
|
||||||
|
// prevent overrun if log is corrupted on disk
|
||||||
|
server_version[ST_SERVER_VER_LEN-1]= 0;
|
||||||
created= uint4korr(buf+ST_CREATED_OFFSET);
|
created= uint4korr(buf+ST_CREATED_OFFSET);
|
||||||
/* We use log_pos to mark if this was an artificial event or not */
|
/* We use log_pos to mark if this was an artificial event or not */
|
||||||
artificial_event= (log_pos == 0);
|
artificial_event= (log_pos == 0);
|
||||||
@ -2377,6 +2379,8 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver)
|
|||||||
switch (binlog_ver) {
|
switch (binlog_ver) {
|
||||||
case 4: /* MySQL 5.0 */
|
case 4: /* MySQL 5.0 */
|
||||||
memcpy(server_version, ::server_version, ST_SERVER_VER_LEN);
|
memcpy(server_version, ::server_version, ST_SERVER_VER_LEN);
|
||||||
|
DBUG_EXECUTE_IF("pretend_version_50034_in_binlog",
|
||||||
|
strmov(server_version, "5.0.34"););
|
||||||
common_header_len= LOG_EVENT_HEADER_LEN;
|
common_header_len= LOG_EVENT_HEADER_LEN;
|
||||||
number_of_event_types= LOG_EVENT_TYPES;
|
number_of_event_types= LOG_EVENT_TYPES;
|
||||||
/* we'll catch my_malloc() error in is_valid() */
|
/* we'll catch my_malloc() error in is_valid() */
|
||||||
@ -2467,6 +2471,7 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver)
|
|||||||
post_header_len= 0; /* will make is_valid() fail */
|
post_header_len= 0; /* will make is_valid() fail */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
calc_server_version_split();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2506,6 +2511,7 @@ Format_description_log_event(const char* buf,
|
|||||||
post_header_len= (uint8*) my_memdup((byte*)buf+ST_COMMON_HEADER_LEN_OFFSET+1,
|
post_header_len= (uint8*) my_memdup((byte*)buf+ST_COMMON_HEADER_LEN_OFFSET+1,
|
||||||
number_of_event_types*
|
number_of_event_types*
|
||||||
sizeof(*post_header_len), MYF(0));
|
sizeof(*post_header_len), MYF(0));
|
||||||
|
calc_server_version_split();
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2606,6 +2612,37 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Splits the event's 'server_version' string into three numeric pieces stored
|
||||||
|
into 'server_version_split':
|
||||||
|
X.Y.Zabc (X,Y,Z numbers, a not a digit) -> {X,Y,Z}
|
||||||
|
X.Yabc -> {X,Y,0}
|
||||||
|
Xabc -> {X,0,0}
|
||||||
|
'server_version_split' is then used for lookups to find if the server which
|
||||||
|
created this event has some known bug.
|
||||||
|
*/
|
||||||
|
void Format_description_log_event::calc_server_version_split()
|
||||||
|
{
|
||||||
|
char *p= server_version, *r;
|
||||||
|
ulong number;
|
||||||
|
for (uint i= 0; i<=2; i++)
|
||||||
|
{
|
||||||
|
number= strtoul(p, &r, 10);
|
||||||
|
server_version_split[i]= (uchar)number;
|
||||||
|
DBUG_ASSERT(number < 256); // fit in uchar
|
||||||
|
p= r;
|
||||||
|
DBUG_ASSERT(!((i == 0) && (*r != '.'))); // should be true in practice
|
||||||
|
if (*r == '.')
|
||||||
|
p++; // skip the dot
|
||||||
|
}
|
||||||
|
DBUG_PRINT("info",("Format_description_log_event::server_version_split:"
|
||||||
|
" '%s' %d %d %d", server_version,
|
||||||
|
server_version_split[0],
|
||||||
|
server_version_split[1], server_version_split[2]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Load_log_event methods
|
Load_log_event methods
|
||||||
General note about Load_log_event: the binlogging of LOAD DATA INFILE is
|
General note about Load_log_event: the binlogging of LOAD DATA INFILE is
|
||||||
|
@ -1153,6 +1153,7 @@ public:
|
|||||||
uint8 number_of_event_types;
|
uint8 number_of_event_types;
|
||||||
/* The list of post-headers' lengthes */
|
/* The list of post-headers' lengthes */
|
||||||
uint8 *post_header_len;
|
uint8 *post_header_len;
|
||||||
|
uchar server_version_split[3];
|
||||||
|
|
||||||
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
|
Format_description_log_event(uint8 binlog_ver, const char* server_ver=0);
|
||||||
|
|
||||||
@ -1184,6 +1185,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
return FORMAT_DESCRIPTION_HEADER_LEN;
|
return FORMAT_DESCRIPTION_HEADER_LEN;
|
||||||
}
|
}
|
||||||
|
void calc_server_version_split();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -3308,7 +3308,7 @@ server.");
|
|||||||
(TC_LOG *) &tc_log_mmap) :
|
(TC_LOG *) &tc_log_mmap) :
|
||||||
(TC_LOG *) &tc_log_dummy);
|
(TC_LOG *) &tc_log_dummy);
|
||||||
|
|
||||||
if (tc_log->open(opt_bin_logname))
|
if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file))
|
||||||
{
|
{
|
||||||
sql_print_error("Can't init tc log");
|
sql_print_error("Can't init tc log");
|
||||||
unireg_abort(1);
|
unireg_abort(1);
|
||||||
@ -7486,7 +7486,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
case (int) OPT_STANDALONE: /* Dummy option for NT */
|
case (int) OPT_STANDALONE: /* Dummy option for NT */
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
The following change issues a deprecation warning if the slave
|
The following change issues a deprecation warning if the slave
|
||||||
configuration is specified either in the my.cnf file or on
|
configuration is specified either in the my.cnf file or on
|
||||||
the command-line. See BUG#21490.
|
the command-line. See BUG#21490.
|
||||||
|
64
sql/slave.cc
64
sql/slave.cc
@ -3651,6 +3651,70 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Detects, based on master's version (as found in the relay log), if master
|
||||||
|
has a certain bug.
|
||||||
|
@param rli RELAY_LOG_INFO which tells the master's version
|
||||||
|
@param bug_id Number of the bug as found in bugs.mysql.com
|
||||||
|
@return TRUE if master has the bug, FALSE if it does not.
|
||||||
|
*/
|
||||||
|
bool rpl_master_has_bug(RELAY_LOG_INFO *rli, uint bug_id)
|
||||||
|
{
|
||||||
|
struct st_version_range_for_one_bug {
|
||||||
|
uint bug_id;
|
||||||
|
const uchar introduced_in[3]; // first version with bug
|
||||||
|
const uchar fixed_in[3]; // first version with fix
|
||||||
|
};
|
||||||
|
static struct st_version_range_for_one_bug versions_for_all_bugs[]=
|
||||||
|
{
|
||||||
|
{24432, { 5, 0, 24 }, { 5, 0, 36 } },
|
||||||
|
{24432, { 5, 1, 12 }, { 5, 1, 16 } }
|
||||||
|
};
|
||||||
|
const uchar *master_ver=
|
||||||
|
rli->relay_log.description_event_for_exec->server_version_split;
|
||||||
|
|
||||||
|
DBUG_ASSERT(sizeof(rli->relay_log.description_event_for_exec->server_version_split) == 3);
|
||||||
|
|
||||||
|
for (uint i= 0;
|
||||||
|
i < sizeof(versions_for_all_bugs)/sizeof(*versions_for_all_bugs);i++)
|
||||||
|
{
|
||||||
|
const uchar *introduced_in= versions_for_all_bugs[i].introduced_in,
|
||||||
|
*fixed_in= versions_for_all_bugs[i].fixed_in;
|
||||||
|
if ((versions_for_all_bugs[i].bug_id == bug_id) &&
|
||||||
|
(memcmp(introduced_in, master_ver, 3) <= 0) &&
|
||||||
|
(memcmp(fixed_in, master_ver, 3) > 0))
|
||||||
|
{
|
||||||
|
// a short message for SHOW SLAVE STATUS (message length constraints)
|
||||||
|
my_printf_error(ER_UNKNOWN_ERROR, "master may suffer from"
|
||||||
|
" http://bugs.mysql.com/bug.php?id=%u"
|
||||||
|
" so slave stops; check error log on slave"
|
||||||
|
" for more info", MYF(0), bug_id);
|
||||||
|
// a verbose message for the error log
|
||||||
|
slave_print_msg(ERROR_LEVEL, rli, ER_UNKNOWN_ERROR,
|
||||||
|
"According to the master's version ('%s'),"
|
||||||
|
" it is probable that master suffers from this bug:"
|
||||||
|
" http://bugs.mysql.com/bug.php?id=%u"
|
||||||
|
" and thus replicating the current binary log event"
|
||||||
|
" may make the slave's data become different from the"
|
||||||
|
" master's data."
|
||||||
|
" To take no risk, slave refuses to replicate"
|
||||||
|
" this event and stops."
|
||||||
|
" We recommend that all updates be stopped on the"
|
||||||
|
" master and slave, that the data of both be"
|
||||||
|
" manually synchronized,"
|
||||||
|
" that master's binary logs be deleted,"
|
||||||
|
" that master be upgraded to a version at least"
|
||||||
|
" equal to '%d.%d.%d'. Then replication can be"
|
||||||
|
" restarted.",
|
||||||
|
rli->relay_log.description_event_for_exec->server_version,
|
||||||
|
bug_id,
|
||||||
|
fixed_in[0], fixed_in[1], fixed_in[2]);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||||
template class I_List_iterator<i_string>;
|
template class I_List_iterator<i_string>;
|
||||||
template class I_List_iterator<i_string_pair>;
|
template class I_List_iterator<i_string_pair>;
|
||||||
|
@ -161,6 +161,7 @@ int fetch_master_table(THD* thd, const char* db_name, const char* table_name,
|
|||||||
|
|
||||||
bool show_master_info(THD* thd, MASTER_INFO* mi);
|
bool show_master_info(THD* thd, MASTER_INFO* mi);
|
||||||
bool show_binlog_info(THD* thd);
|
bool show_binlog_info(THD* thd);
|
||||||
|
bool rpl_master_has_bug(RELAY_LOG_INFO *rli, uint bug_id);
|
||||||
|
|
||||||
const char *print_slave_db_safe(const char *db);
|
const char *print_slave_db_safe(const char *db);
|
||||||
int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int error_code);
|
int check_expected_error(THD* thd, RELAY_LOG_INFO* rli, int error_code);
|
||||||
|
@ -59,6 +59,7 @@
|
|||||||
#include "sql_trigger.h"
|
#include "sql_trigger.h"
|
||||||
#include "sql_select.h"
|
#include "sql_select.h"
|
||||||
#include "sql_show.h"
|
#include "sql_show.h"
|
||||||
|
#include "slave.h"
|
||||||
|
|
||||||
static int check_null_fields(THD *thd,TABLE *entry);
|
static int check_null_fields(THD *thd,TABLE *entry);
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
@ -341,6 +342,36 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
(duplic == DUP_UPDATE))
|
(duplic == DUP_UPDATE))
|
||||||
lock_type=TL_WRITE;
|
lock_type=TL_WRITE;
|
||||||
#endif
|
#endif
|
||||||
|
if ((lock_type == TL_WRITE_DELAYED) &&
|
||||||
|
(global_system_variables.binlog_format == BINLOG_FORMAT_STMT) &&
|
||||||
|
log_on && mysql_bin_log.is_open() &&
|
||||||
|
(values_list.elements > 1))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Statement-based binary logging does not work in this case, because:
|
||||||
|
a) two concurrent statements may have their rows intermixed in the
|
||||||
|
queue, leading to autoincrement replication problems on slave (because
|
||||||
|
the values generated used for one statement don't depend only on the
|
||||||
|
value generated for the first row of this statement, so are not
|
||||||
|
replicable)
|
||||||
|
b) if first row of the statement has an error the full statement is
|
||||||
|
not binlogged, while next rows of the statement may be inserted.
|
||||||
|
c) if first row succeeds, statement is binlogged immediately with a
|
||||||
|
zero error code (i.e. "no error"), if then second row fails, query
|
||||||
|
will fail on slave too and slave will stop (wrongly believing that the
|
||||||
|
master got no error).
|
||||||
|
So we fallback to non-delayed INSERT.
|
||||||
|
Note that to be fully correct, we should test the "binlog format which
|
||||||
|
the delayed thread is going to use for this row". But in the common case
|
||||||
|
where the global binlog format is not changed and the session binlog
|
||||||
|
format may be changed, that is equal to the global binlog format.
|
||||||
|
We test it without mutex for speed reasons (condition rarely true), and
|
||||||
|
in the common case (global not changed) it is as good as without mutex;
|
||||||
|
if global value is changed, anyway there is uncertainty as the delayed
|
||||||
|
thread may be old and use the before-the-change value.
|
||||||
|
*/
|
||||||
|
lock_type= TL_WRITE;
|
||||||
|
}
|
||||||
table_list->lock_type= lock_type;
|
table_list->lock_type= lock_type;
|
||||||
|
|
||||||
#ifndef EMBEDDED_LIBRARY
|
#ifndef EMBEDDED_LIBRARY
|
||||||
@ -454,6 +485,14 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
thd->cuted_fields = 0L;
|
thd->cuted_fields = 0L;
|
||||||
table->next_number_field=table->found_next_number_field;
|
table->next_number_field=table->found_next_number_field;
|
||||||
|
|
||||||
|
#ifdef HAVE_REPLICATION
|
||||||
|
if (thd->slave_thread &&
|
||||||
|
(info.handle_duplicates == DUP_UPDATE) &&
|
||||||
|
(table->next_number_field != NULL) &&
|
||||||
|
rpl_master_has_bug(&active_mi->rli, 24432))
|
||||||
|
goto abort;
|
||||||
|
#endif
|
||||||
|
|
||||||
error=0;
|
error=0;
|
||||||
thd->proc_info="update";
|
thd->proc_info="update";
|
||||||
if (duplic != DUP_ERROR || ignore)
|
if (duplic != DUP_ERROR || ignore)
|
||||||
@ -1146,13 +1185,13 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||||||
if (res == VIEW_CHECK_ERROR)
|
if (res == VIEW_CHECK_ERROR)
|
||||||
goto before_trg_err;
|
goto before_trg_err;
|
||||||
|
|
||||||
|
table->file->restore_auto_increment(prev_insert_id);
|
||||||
if ((error=table->file->ha_update_row(table->record[1],
|
if ((error=table->file->ha_update_row(table->record[1],
|
||||||
table->record[0])))
|
table->record[0])))
|
||||||
{
|
{
|
||||||
if (info->ignore &&
|
if (info->ignore &&
|
||||||
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
|
!table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
|
||||||
{
|
{
|
||||||
table->file->restore_auto_increment(prev_insert_id);
|
|
||||||
goto ok_or_after_trg_err;
|
goto ok_or_after_trg_err;
|
||||||
}
|
}
|
||||||
goto err;
|
goto err;
|
||||||
@ -2489,6 +2528,15 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||||||
}
|
}
|
||||||
restore_record(table,s->default_values); // Get empty record
|
restore_record(table,s->default_values); // Get empty record
|
||||||
table->next_number_field=table->found_next_number_field;
|
table->next_number_field=table->found_next_number_field;
|
||||||
|
|
||||||
|
#ifdef HAVE_REPLICATION
|
||||||
|
if (thd->slave_thread &&
|
||||||
|
(info.handle_duplicates == DUP_UPDATE) &&
|
||||||
|
(table->next_number_field != NULL) &&
|
||||||
|
rpl_master_has_bug(&active_mi->rli, 24432))
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
thd->cuted_fields=0;
|
thd->cuted_fields=0;
|
||||||
if (info.ignore || info.handle_duplicates != DUP_ERROR)
|
if (info.ignore || info.handle_duplicates != DUP_ERROR)
|
||||||
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
|
table->file->extra(HA_EXTRA_IGNORE_DUP_KEY);
|
||||||
|
Reference in New Issue
Block a user