#At file:///home/bzr/b36763-mysql-5.1-bugteam/
2655 Mats Kindahl 2008-06-19
Bug #36763: TRUNCATE TABLE fails to replicate when stmt-based binlogging is
not supported.
When executing a TRUNCATE TABLE under MIXED mode, the TRUNCATE statement was
not written to the binary log. The reason for this was that the statement
was assumed to be a "row query type", meaning that the statement is logged
only if the current statement is not row-based. Since InnoDB forces row-based
logging for statements in READ UNCOMMITTED isolation level, this caused the
statement to not be logged.
The problem is fixed by deliberately marking TRUNCATE TABLE statements to be
"statement query types", meaning that they are always logged as statements.
modified:
mysql-test/suite/rpl/r/rpl_truncate_3innodb.result
mysql-test/suite/rpl/t/rpl_truncate_3innodb.test
sql/sql_delete.cc
=== modified file 'mysql-test/suite/rpl/r/rpl_truncate_3innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_truncate_3innodb.result 2007-12-14 13:40:45 +0000
+++ b/mysql-test/suite/rpl/r/rpl_truncate_3innodb.result 2008-06-19 09:21:35 +0000
@@ -260,3 +260,14 @@ master-bin.000001 # Delete_rows # # tabl
master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Query # # use `test`; DROP TABLE t1
RESET MASTER;
+[on master]
+CREATE TABLE t1 (a INT) ENGINE=INNODB;
+INSERT INTO t1 VALUES (1),(2),(3);
+SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
+TRUNCATE TABLE t1;
+SELECT * FROM t1;
+a
+[on slave]
+SELECT * FROM t1;
+a
+DROP TABLE t1;
=== modified file 'mysql-test/suite/rpl/t/rpl_truncate_3innodb.test'
--- a/mysql-test/suite/rpl/t/rpl_truncate_3innodb.test 2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/t/rpl_truncate_3innodb.test 2008-06-19 09:21:35 +0000
@@ -4,3 +4,38 @@
let $engine=InnoDB;
--source extra/rpl_tests/rpl_truncate.test
+
+# Resetting master and slave
+disable_query_log;
+connection slave;
+STOP SLAVE;
+source include/wait_for_slave_to_stop.inc;
+connection master;
+RESET MASTER;
+connection slave;
+RESET SLAVE;
+START SLAVE;
+source include/wait_for_slave_to_start.inc;
+enable_query_log;
+
+# BUG #36763: TRUNCATE TABLE fails to replicate when stmt-based
+# binlogging is not supported.
+
+# TRUNCATE TABLE should be treated as a DDL (DROP TABLE + CREATE
+# TABLE), so it should replicate fine in all replication modes without
+# any form of warning or error.
+
+--echo [on master]
+connection master;
+CREATE TABLE t1 (a INT) ENGINE=INNODB;
+INSERT INTO t1 VALUES (1),(2),(3);
+SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
+TRUNCATE TABLE t1;
+SELECT * FROM t1;
+--echo [on slave]
+sync_slave_with_master;
+SELECT * FROM t1;
+
+connection master;
+DROP TABLE t1;
+sync_slave_with_master;
=== modified file 'sql/sql_delete.cc'
--- a/sql/sql_delete.cc 2008-03-27 12:07:01 +0000
+++ b/sql/sql_delete.cc 2008-06-19 09:21:35 +0000
@@ -382,7 +382,10 @@ cleanup:
statement-based; otherwise, 'ha_delete_row()' was used to
delete specific rows which we might log row-based.
*/
- int log_result= thd->binlog_query(THD::ROW_QUERY_TYPE,
+ THD::enum_binlog_query_type query_type=
+ thd->lex->sql_command == SQLCOM_TRUNCATE ?
+ THD::STMT_QUERY_TYPE : THD::ROW_QUERY_TYPE;
+ int log_result= thd->binlog_query(query_type,
thd->query, thd->query_length,
transactional_table, FALSE, killed_status);