merge mysql-5.1 (local) --> mysql-5.1
This commit is contained in:
commit
631f5d0ef3
64
mysql-test/extra/rpl_tests/rpl_insert_duplicate.test
Normal file
64
mysql-test/extra/rpl_tests/rpl_insert_duplicate.test
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# BUG#59338 Inconsistency in binlog for statements that don't change any rows STATEMENT SBR
|
||||||
|
# In SBR, if a statement does not fail, it is always written to the binary log,
|
||||||
|
# regardless if rows are changed or not. If there is a failure, a statement is
|
||||||
|
# only written to the binary log if a non-transactional (.e.g. MyIsam) engine
|
||||||
|
# is updated. INSERT ON DUPLICATE KEY UPDATE was not following the rule above
|
||||||
|
# and was not written to the binary log, if then engine was Innodb.
|
||||||
|
#
|
||||||
|
# In this test case, we check if INSERT ON DUPLICATE KEY UPDATE that does not
|
||||||
|
# change anything is still written to the binary log.
|
||||||
|
|
||||||
|
# Prepare environment
|
||||||
|
--connection master
|
||||||
|
|
||||||
|
eval CREATE TABLE t1 (
|
||||||
|
a INT UNSIGNED NOT NULL PRIMARY KEY
|
||||||
|
) ENGINE=$engine_type;
|
||||||
|
|
||||||
|
eval CREATE TABLE t2 (
|
||||||
|
a INT UNSIGNED
|
||||||
|
) ENGINE=$engine_type;
|
||||||
|
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
|
||||||
|
# An insert duplicate that does not update anything must be written to the binary
|
||||||
|
# log in SBR and MIXED modes. We check this property by summing a before and after
|
||||||
|
# the update and comparing the binlog positions. The sum should be the same at both
|
||||||
|
# points and the statement should be in the binary log.
|
||||||
|
--let $binlog_file= query_get_value("SHOW MASTER STATUS", File, 1)
|
||||||
|
--let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1)
|
||||||
|
--let $statement_file=INSERT INTO t1 SELECT t2.a FROM t2 ORDER BY t2.a ON DUPLICATE KEY UPDATE t1.a= t1.a
|
||||||
|
--eval $statement_file
|
||||||
|
|
||||||
|
--let $assert_cond= SUM(a) = 1 FROM t1
|
||||||
|
--let $assert_text= Sum of elements in t1 should be 1.
|
||||||
|
--source include/assert.inc
|
||||||
|
|
||||||
|
if (`SELECT @@BINLOG_FORMAT = 'ROW'`)
|
||||||
|
{
|
||||||
|
--let $binlog_position_cmp= =
|
||||||
|
--let $assert_cond= [SHOW MASTER STATUS, Position, 1] $binlog_position_cmp $binlog_start
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
if (`SELECT @@BINLOG_FORMAT != 'ROW' && UPPER('$engine_type') = UPPER('Innodb')`)
|
||||||
|
{
|
||||||
|
--let $assert_cond= \'[\'SHOW BINLOG EVENTS IN "$binlog_file" FROM $binlog_start LIMIT 1, 1\', Info, 1]\' LIKE \'%$statement_file\'
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
if (`SELECT @@BINLOG_FORMAT != 'ROW' && UPPER('$engine_type') = UPPER('MyIsam')`)
|
||||||
|
{
|
||||||
|
--let $assert_cond= \'[\'SHOW BINLOG EVENTS IN "$binlog_file" FROM $binlog_start LIMIT 0, 1\', Info, 1]\' LIKE \'%$statement_file\'
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
--source include/assert.inc
|
||||||
|
|
||||||
|
# Compare master and slave
|
||||||
|
--sync_slave_with_master
|
||||||
|
--let $diff_tables= master:test.t1 , slave:test.t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
--connection master
|
||||||
|
drop table t1, t2;
|
||||||
|
--sync_slave_with_master
|
@ -5,6 +5,7 @@
|
|||||||
# Slave needs to be started with --innodb to store table in InnoDB.
|
# Slave needs to be started with --innodb to store table in InnoDB.
|
||||||
# Same test for MyISAM (which had no bug).
|
# Same test for MyISAM (which had no bug).
|
||||||
|
|
||||||
|
--connection master
|
||||||
eval CREATE TABLE t1 (
|
eval CREATE TABLE t1 (
|
||||||
a int unsigned not null auto_increment primary key,
|
a int unsigned not null auto_increment primary key,
|
||||||
b int unsigned,
|
b int unsigned,
|
||||||
@ -32,38 +33,49 @@ INSERT INTO t2 VALUES (5, 4);
|
|||||||
INSERT INTO t2 VALUES (6, 6);
|
INSERT INTO t2 VALUES (6, 6);
|
||||||
|
|
||||||
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
||||||
|
--let $assert_cond= COUNT(*) = 6 FROM t1
|
||||||
|
--let $assert_text= Count of elements in t1 should be 6.
|
||||||
|
--source include/assert.inc
|
||||||
|
|
||||||
# Compare results
|
# Compare master and slave
|
||||||
|
--sync_slave_with_master
|
||||||
|
--let $diff_tables= master:test.t1 , slave:test.t1
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
# BUG#59338 Inconsistency in binlog for statements that don't change any rows STATEMENT SBR
|
||||||
|
# An insert ignore that does not update anything must be written to the binary log in SBR
|
||||||
|
# and MIXED modes. We check this property by counting occurrences in t1 before and after
|
||||||
|
# the insert and comparing the binlog positions. The count should be the same in both points
|
||||||
|
# and the statement should be in the binary log.
|
||||||
|
--connection master
|
||||||
|
--let $binlog_file= query_get_value("SHOW MASTER STATUS", File, 1)
|
||||||
|
--let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1)
|
||||||
|
--let $statement_file=INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a
|
||||||
|
--eval $statement_file
|
||||||
|
|
||||||
sync_slave_with_master;
|
--let $assert_cond= COUNT(*) = 6 FROM t1
|
||||||
SELECT * FROM t1 ORDER BY a;
|
--let $assert_text= Count of elements in t1 should be 6.
|
||||||
|
--source include/assert.inc
|
||||||
|
|
||||||
# Now do the same for MyISAM
|
if (`SELECT @@BINLOG_FORMAT = 'ROW'`)
|
||||||
|
{
|
||||||
|
--let $binlog_position_cmp= =
|
||||||
|
--let $assert_cond= [SHOW MASTER STATUS, Position, 1] $binlog_position_cmp $binlog_start
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
if (`SELECT @@BINLOG_FORMAT != 'ROW' && UPPER('$engine_type') = UPPER('Innodb')`)
|
||||||
|
{
|
||||||
|
--let $assert_cond= \'[\'SHOW BINLOG EVENTS IN "$binlog_file" FROM $binlog_start LIMIT 2, 1\', Info, 1]\' LIKE \'%$statement_file\'
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
if (`SELECT @@BINLOG_FORMAT != 'ROW' && UPPER('$engine_type') = UPPER('MyIsam')`)
|
||||||
|
{
|
||||||
|
--let $assert_cond= \'[\'SHOW BINLOG EVENTS IN "$binlog_file" FROM $binlog_start LIMIT 1, 1\', Info, 1]\' LIKE \'%$statement_file\'
|
||||||
|
--let $assert_text= In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.
|
||||||
|
}
|
||||||
|
--source include/assert.inc
|
||||||
|
|
||||||
connection master;
|
# Clean up
|
||||||
drop table t1;
|
--connection master
|
||||||
eval CREATE TABLE t1 (
|
|
||||||
a int unsigned not null auto_increment primary key,
|
|
||||||
b int unsigned,
|
|
||||||
unique (b)
|
|
||||||
) ENGINE=$engine_type2;
|
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (1, 1);
|
|
||||||
INSERT INTO t1 VALUES (2, 2);
|
|
||||||
INSERT INTO t1 VALUES (3, 3);
|
|
||||||
INSERT INTO t1 VALUES (4, 4);
|
|
||||||
|
|
||||||
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
|
||||||
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
|
||||||
|
|
||||||
sync_slave_with_master;
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
|
||||||
|
|
||||||
connection master;
|
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
sync_slave_with_master;
|
--sync_slave_with_master
|
||||||
|
|
||||||
# End of 4.1 tests
|
|
||||||
|
@ -502,16 +502,16 @@ call p_verify_status_increment(2, 2, 2, 2);
|
|||||||
--echo # 12. Read-write statement: IODKU, change 0 rows.
|
--echo # 12. Read-write statement: IODKU, change 0 rows.
|
||||||
--echo #
|
--echo #
|
||||||
insert t1 set a=2 on duplicate key update a=2;
|
insert t1 set a=2 on duplicate key update a=2;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
commit;
|
commit;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
|
|
||||||
--echo # 13. Read-write statement: INSERT IGNORE, change 0 rows.
|
--echo # 13. Read-write statement: INSERT IGNORE, change 0 rows.
|
||||||
--echo #
|
--echo #
|
||||||
insert ignore t1 set a=2;
|
insert ignore t1 set a=2;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
commit;
|
commit;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
|
|
||||||
--echo # 14. Read-write statement: INSERT IGNORE, change 1 row.
|
--echo # 14. Read-write statement: INSERT IGNORE, change 1 row.
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -518,21 +518,21 @@ SUCCESS
|
|||||||
# 12. Read-write statement: IODKU, change 0 rows.
|
# 12. Read-write statement: IODKU, change 0 rows.
|
||||||
#
|
#
|
||||||
insert t1 set a=2 on duplicate key update a=2;
|
insert t1 set a=2 on duplicate key update a=2;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
SUCCESS
|
SUCCESS
|
||||||
|
|
||||||
commit;
|
commit;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
SUCCESS
|
SUCCESS
|
||||||
|
|
||||||
# 13. Read-write statement: INSERT IGNORE, change 0 rows.
|
# 13. Read-write statement: INSERT IGNORE, change 0 rows.
|
||||||
#
|
#
|
||||||
insert ignore t1 set a=2;
|
insert ignore t1 set a=2;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
SUCCESS
|
SUCCESS
|
||||||
|
|
||||||
commit;
|
commit;
|
||||||
call p_verify_status_increment(1, 0, 1, 0);
|
call p_verify_status_increment(2, 2, 1, 0);
|
||||||
SUCCESS
|
SUCCESS
|
||||||
|
|
||||||
# 14. Read-write statement: INSERT IGNORE, change 1 row.
|
# 14. Read-write statement: INSERT IGNORE, change 1 row.
|
||||||
|
29
mysql-test/suite/rpl/r/rpl_insert_duplicate.result
Normal file
29
mysql-test/suite/rpl/r/rpl_insert_duplicate.result
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a INT UNSIGNED NOT NULL PRIMARY KEY
|
||||||
|
) ENGINE=innodb;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a INT UNSIGNED
|
||||||
|
) ENGINE=innodb;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
INSERT INTO t1 SELECT t2.a FROM t2 ORDER BY t2.a ON DUPLICATE KEY UPDATE t1.a= t1.a;
|
||||||
|
include/assert.inc [Sum of elements in t1 should be 1.]
|
||||||
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
||||||
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
||||||
|
drop table t1, t2;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a INT UNSIGNED NOT NULL PRIMARY KEY
|
||||||
|
) ENGINE=myisam;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a INT UNSIGNED
|
||||||
|
) ENGINE=myisam;
|
||||||
|
INSERT INTO t1 VALUES (1);
|
||||||
|
INSERT INTO t2 VALUES (1);
|
||||||
|
INSERT INTO t1 SELECT t2.a FROM t2 ORDER BY t2.a ON DUPLICATE KEY UPDATE t1.a= t1.a;
|
||||||
|
include/assert.inc [Sum of elements in t1 should be 1.]
|
||||||
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
||||||
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
||||||
|
drop table t1, t2;
|
||||||
|
include/rpl_end.inc
|
@ -20,48 +20,36 @@ INSERT INTO t2 VALUES (4, 3);
|
|||||||
INSERT INTO t2 VALUES (5, 4);
|
INSERT INTO t2 VALUES (5, 4);
|
||||||
INSERT INTO t2 VALUES (6, 6);
|
INSERT INTO t2 VALUES (6, 6);
|
||||||
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
||||||
SELECT * FROM t1 ORDER BY a;
|
include/assert.inc [Count of elements in t1 should be 6.]
|
||||||
a b
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
||||||
1 1
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
||||||
2 2
|
include/assert.inc [Count of elements in t1 should be 6.]
|
||||||
3 3
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
||||||
4 4
|
drop table t1, t2;
|
||||||
5 5
|
|
||||||
6 6
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
|
||||||
a b
|
|
||||||
1 1
|
|
||||||
2 2
|
|
||||||
3 3
|
|
||||||
4 4
|
|
||||||
5 5
|
|
||||||
6 6
|
|
||||||
drop table t1;
|
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int unsigned not null auto_increment primary key,
|
a int unsigned not null auto_increment primary key,
|
||||||
b int unsigned,
|
b int unsigned,
|
||||||
unique (b)
|
unique (b)
|
||||||
) ENGINE=myisam;
|
) ENGINE=innodb;
|
||||||
INSERT INTO t1 VALUES (1, 1);
|
CREATE TABLE t2 (
|
||||||
INSERT INTO t1 VALUES (2, 2);
|
a int unsigned, # to force INSERT SELECT to have a certain order
|
||||||
INSERT INTO t1 VALUES (3, 3);
|
b int unsigned
|
||||||
INSERT INTO t1 VALUES (4, 4);
|
) ENGINE=innodb;
|
||||||
|
INSERT INTO t1 VALUES (NULL, 1);
|
||||||
|
INSERT INTO t1 VALUES (NULL, 2);
|
||||||
|
INSERT INTO t1 VALUES (NULL, 3);
|
||||||
|
INSERT INTO t1 VALUES (NULL, 4);
|
||||||
|
INSERT INTO t2 VALUES (1, 1);
|
||||||
|
INSERT INTO t2 VALUES (2, 2);
|
||||||
|
INSERT INTO t2 VALUES (3, 5);
|
||||||
|
INSERT INTO t2 VALUES (4, 3);
|
||||||
|
INSERT INTO t2 VALUES (5, 4);
|
||||||
|
INSERT INTO t2 VALUES (6, 6);
|
||||||
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
||||||
SELECT * FROM t1 ORDER BY a;
|
include/assert.inc [Count of elements in t1 should be 6.]
|
||||||
a b
|
include/diff_tables.inc [master:test.t1 , slave:test.t1]
|
||||||
1 1
|
INSERT IGNORE INTO t1 SELECT NULL, t2.b FROM t2 ORDER BY t2.a;
|
||||||
2 2
|
include/assert.inc [Count of elements in t1 should be 6.]
|
||||||
3 3
|
include/assert.inc [In SBR or MIXED modes, the event in the binlog should be the same that was executed. In RBR mode, binlog position should stay unchanged.]
|
||||||
4 4
|
|
||||||
5 5
|
|
||||||
6 6
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
|
||||||
a b
|
|
||||||
1 1
|
|
||||||
2 2
|
|
||||||
3 3
|
|
||||||
4 4
|
|
||||||
5 5
|
|
||||||
6 6
|
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
include/rpl_end.inc
|
include/rpl_end.inc
|
||||||
|
14
mysql-test/suite/rpl/t/rpl_insert_duplicate.test
Normal file
14
mysql-test/suite/rpl/t/rpl_insert_duplicate.test
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#########################################
|
||||||
|
# Wrapper for rpl_insert_duplicate.test #
|
||||||
|
#########################################
|
||||||
|
-- source include/master-slave.inc
|
||||||
|
-- source include/have_innodb.inc
|
||||||
|
#-- source include/have_binlog_format_mixed_or_statement.inc
|
||||||
|
|
||||||
|
let $engine_type=innodb;
|
||||||
|
-- source extra/rpl_tests/rpl_insert_duplicate.test
|
||||||
|
|
||||||
|
let $engine_type=myisam;
|
||||||
|
-- source extra/rpl_tests/rpl_insert_duplicate.test
|
||||||
|
|
||||||
|
--source include/rpl_end.inc
|
@ -4,7 +4,11 @@
|
|||||||
-- source include/not_ndb_default.inc
|
-- source include/not_ndb_default.inc
|
||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
-- source include/master-slave.inc
|
-- source include/master-slave.inc
|
||||||
let $engine_type=innodb;
|
|
||||||
let $engine_type2=myisam;
|
-- let $engine_type=innodb
|
||||||
-- source extra/rpl_tests/rpl_insert_ignore.test
|
-- source extra/rpl_tests/rpl_insert_ignore.test
|
||||||
|
|
||||||
|
-- let $engine_type=innodb
|
||||||
|
-- source extra/rpl_tests/rpl_insert_ignore.test
|
||||||
|
|
||||||
--source include/rpl_end.inc
|
--source include/rpl_end.inc
|
||||||
|
@ -881,7 +881,7 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||||||
*/
|
*/
|
||||||
query_cache_invalidate3(thd, table_list, 1);
|
query_cache_invalidate3(thd, table_list, 1);
|
||||||
}
|
}
|
||||||
if ((changed && error <= 0) ||
|
if (error <= 0 ||
|
||||||
thd->transaction.stmt.modified_non_trans_table ||
|
thd->transaction.stmt.modified_non_trans_table ||
|
||||||
was_insert_delayed)
|
was_insert_delayed)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user