Commit 12c7d0cf authored by Alexander Nozdrin's avatar Alexander Nozdrin

Merge from mysql-5.1.

parents 310833ff 9226c847
...@@ -22,3 +22,4 @@ connection master; ...@@ -22,3 +22,4 @@ connection master;
select * from t1; select * from t1;
commit; commit;
drop table t1; drop table t1;
-- sync_slave_with_master
...@@ -133,6 +133,10 @@ master-bin.000001 # Query # # BEGIN ...@@ -133,6 +133,10 @@ master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t2)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # COMMIT
insert into t1 values(11); insert into t1 values(11);
commit; commit;
show binlog events from <binlog_start>; show binlog events from <binlog_start>;
...@@ -144,6 +148,8 @@ master-bin.000001 # Xid # # COMMIT /* XID */ ...@@ -144,6 +148,8 @@ master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t2) master-bin.000001 # Table_map # # table_id: # (test.t2)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Xid # # COMMIT /* XID */
...@@ -272,6 +278,10 @@ master-bin.000001 # Query # # BEGIN ...@@ -272,6 +278,10 @@ master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Xid # # COMMIT /* XID */
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t2)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # use `test`; drop table t1,t2 master-bin.000001 # Query # # use `test`; drop table t1,t2
master-bin.000001 # Query # # use `test`; create table t0 (n int) master-bin.000001 # Query # # use `test`; create table t0 (n int)
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
...@@ -372,7 +382,7 @@ master-bin.000001 # Query # # use `test`; DROP TABLE if exists t2 ...@@ -372,7 +382,7 @@ master-bin.000001 # Query # # use `test`; DROP TABLE if exists t2
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # ROLLBACK master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS t2 master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS t2
master-bin.000001 # Query # # use `test`; CREATE TABLE t2 (a int, b int, primary key (a)) engine=innodb master-bin.000001 # Query # # use `test`; CREATE TABLE t2 (a int, b int, primary key (a)) engine=innodb
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
...@@ -390,9 +400,11 @@ master-bin.000001 # Query # # use `test`; DROP TABLE t2 ...@@ -390,9 +400,11 @@ master-bin.000001 # Query # # use `test`; DROP TABLE t2
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # ROLLBACK master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
...@@ -400,7 +412,7 @@ master-bin.000001 # Query # # COMMIT ...@@ -400,7 +412,7 @@ master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Query # # ROLLBACK master-bin.000001 # Query # # COMMIT
master-bin.000001 # Query # # use `test`; TRUNCATE table t2 master-bin.000001 # Query # # use `test`; TRUNCATE table t2
master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # BEGIN
master-bin.000001 # Table_map # # table_id: # (test.t1) master-bin.000001 # Table_map # # table_id: # (test.t1)
......
--source include/have_binlog_format_mixed.inc
--source include/have_innodb.inc
--source extra/binlog_tests/binlog_failure_mixing_engines.test
--source include/have_binlog_format_row.inc
--source include/have_innodb.inc
--source extra/binlog_tests/binlog_failure_mixing_engines.test
...@@ -176,7 +176,7 @@ Log_name Pos Event_type Server_id End_log_pos Info ...@@ -176,7 +176,7 @@ Log_name Pos Event_type Server_id End_log_pos Info
# 106 Query # 174 BEGIN # 106 Query # 174 BEGIN
# 174 Table_map # 216 table_id: # (test.t7) # 174 Table_map # 216 table_id: # (test.t7)
# 216 Write_rows # 272 table_id: # flags: STMT_END_F # 216 Write_rows # 272 table_id: # flags: STMT_END_F
# 272 Query # 343 ROLLBACK # 272 Query # 341 COMMIT
SELECT * FROM t7 ORDER BY a,b; SELECT * FROM t7 ORDER BY a,b;
a b a b
1 2 1 2
...@@ -327,7 +327,7 @@ Log_name Pos Event_type Server_id End_log_pos Info ...@@ -327,7 +327,7 @@ Log_name Pos Event_type Server_id End_log_pos Info
# 1329 Query # 1397 BEGIN # 1329 Query # 1397 BEGIN
# 1397 Table_map # 1438 table_id: # (test.t1) # 1397 Table_map # 1438 table_id: # (test.t1)
# 1438 Write_rows # 1482 table_id: # flags: STMT_END_F # 1438 Write_rows # 1482 table_id: # flags: STMT_END_F
# 1482 Query # 1553 ROLLBACK # 1482 Query # 1551 COMMIT
SHOW TABLES; SHOW TABLES;
Tables_in_test Tables_in_test
t1 t1
......
...@@ -102,3 +102,4 @@ Last_IO_Errno # ...@@ -102,3 +102,4 @@ Last_IO_Errno #
Last_IO_Error # Last_IO_Error #
Last_SQL_Errno 0 Last_SQL_Errno 0
Last_SQL_Error Last_SQL_Error
DROP TABLE t1;
...@@ -58,3 +58,4 @@ STOP SLAVE; ...@@ -58,3 +58,4 @@ STOP SLAVE;
# cleanup # cleanup
--connection master --connection master
DROP TABLE t1; DROP TABLE t1;
-- sync_slave_with_master
...@@ -78,3 +78,7 @@ SELECT * FROM t1 ORDER BY a; ...@@ -78,3 +78,7 @@ SELECT * FROM t1 ORDER BY a;
--replace_result $MASTER_MYPORT MASTER_PORT --replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 # --replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # 35 # 36 #
query_vertical SHOW SLAVE STATUS; query_vertical SHOW SLAVE STATUS;
-- connection master
DROP TABLE t1;
-- sync_slave_with_master
...@@ -153,7 +153,7 @@ private: ...@@ -153,7 +153,7 @@ private:
class binlog_trx_data { class binlog_trx_data {
public: public:
binlog_trx_data() binlog_trx_data()
: at_least_one_stmt(0), incident(FALSE), m_pending(0), : at_least_one_stmt_committed(0), incident(FALSE), m_pending(0),
before_stmt_pos(MY_OFF_T_UNDEF) before_stmt_pos(MY_OFF_T_UNDEF)
{ {
trans_log.end_of_file= max_binlog_cache_size; trans_log.end_of_file= max_binlog_cache_size;
...@@ -182,7 +182,10 @@ public: ...@@ -182,7 +182,10 @@ public:
{ {
DBUG_PRINT("info", ("truncating to position %lu", (ulong) pos)); DBUG_PRINT("info", ("truncating to position %lu", (ulong) pos));
DBUG_PRINT("info", ("before_stmt_pos=%lu", (ulong) pos)); DBUG_PRINT("info", ("before_stmt_pos=%lu", (ulong) pos));
if (pending())
{
delete pending(); delete pending();
}
set_pending(0); set_pending(0);
reinit_io_cache(&trans_log, WRITE_CACHE, pos, 0, 0); reinit_io_cache(&trans_log, WRITE_CACHE, pos, 0, 0);
trans_log.end_of_file= max_binlog_cache_size; trans_log.end_of_file= max_binlog_cache_size;
...@@ -192,12 +195,12 @@ public: ...@@ -192,12 +195,12 @@ public:
/* /*
The only valid positions that can be truncated to are at the The only valid positions that can be truncated to are at the
beginning of a statement. We are relying on this fact to be able beginning of a statement. We are relying on this fact to be able
to set the at_least_one_stmt flag correctly. In other word, if to set the at_least_one_stmt_committed flag correctly. In other word, if
we are truncating to the beginning of the transaction cache, we are truncating to the beginning of the transaction cache,
there will be no statements in the cache, otherwhise, we will there will be no statements in the cache, otherwhise, we will
have at least one statement in the transaction cache. have at least one statement in the transaction cache.
*/ */
at_least_one_stmt= (pos > 0); at_least_one_stmt_committed= (pos > 0);
} }
/* /*
...@@ -239,7 +242,7 @@ public: ...@@ -239,7 +242,7 @@ public:
Boolean that is true if there is at least one statement in the Boolean that is true if there is at least one statement in the
transaction cache. transaction cache.
*/ */
bool at_least_one_stmt; bool at_least_one_stmt_committed;
bool incident; bool incident;
private: private:
...@@ -1272,7 +1275,7 @@ static bool stmt_has_updated_trans_table(THD *thd) ...@@ -1272,7 +1275,7 @@ static bool stmt_has_updated_trans_table(THD *thd)
{ {
Ha_trx_info *ha_info; Ha_trx_info *ha_info;
for (ha_info= thd->transaction.stmt.ha_list; ha_info; ha_info= ha_info->next()) for (ha_info= thd->transaction.stmt.ha_list; ha_info && ha_info->is_started(); ha_info= ha_info->next())
{ {
if (ha_info->is_trx_read_write() && ha_info->ht() != binlog_hton) if (ha_info->is_trx_read_write() && ha_info->ht() != binlog_hton)
return (TRUE); return (TRUE);
...@@ -1535,13 +1538,17 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all) ...@@ -1535,13 +1538,17 @@ static int binlog_commit(handlerton *hton, THD *thd, bool all)
YESNO(in_transaction), YESNO(in_transaction),
YESNO(thd->transaction.all.modified_non_trans_table), YESNO(thd->transaction.all.modified_non_trans_table),
YESNO(thd->transaction.stmt.modified_non_trans_table))); YESNO(thd->transaction.stmt.modified_non_trans_table)));
if (!in_transaction || all) if (!in_transaction || all ||
(!all && !trx_data->at_least_one_stmt_committed &&
!stmt_has_updated_trans_table(thd) &&
thd->transaction.stmt.modified_non_trans_table))
{ {
Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, TRUE, 0); Query_log_event qev(thd, STRING_WITH_LEN("COMMIT"), TRUE, TRUE, 0);
error= binlog_end_trans(thd, trx_data, &qev, all); error= binlog_end_trans(thd, trx_data, &qev, all);
goto end;
} }
trx_data->at_least_one_stmt_committed = my_b_tell(&trx_data->trans_log) > 0;
end: end:
if (!all) if (!all)
trx_data->before_stmt_pos = MY_OFF_T_UNDEF; // part of the stmt commit trx_data->before_stmt_pos = MY_OFF_T_UNDEF; // part of the stmt commit
...@@ -1608,15 +1615,18 @@ static int binlog_rollback(handlerton *hton, THD *thd, bool all) ...@@ -1608,15 +1615,18 @@ static int binlog_rollback(handlerton *hton, THD *thd, bool all)
{ {
/* /*
We flush the cache with a rollback, wrapped in a beging/rollback if: We flush the cache with a rollback, wrapped in a beging/rollback if:
. aborting a transcation that modified a non-transactional table or; . aborting a transaction that modified a non-transactional table;
. aborting a statement that modified both transactional and . aborting a statement that modified both transactional and
non-transctional tables but which is not in the boundaries of any non-transactional tables but which is not in the boundaries of any
transaction; transaction or there was no early change;
. the OPTION_KEEP_LOG is activate. . the OPTION_KEEP_LOG is activate.
*/ */
if ((all && thd->transaction.all.modified_non_trans_table) || if ((all && thd->transaction.all.modified_non_trans_table) ||
(!all && thd->transaction.stmt.modified_non_trans_table && (!all && thd->transaction.stmt.modified_non_trans_table &&
!(thd->options & (OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT))) || !(thd->options & (OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT))) ||
(!all && thd->transaction.stmt.modified_non_trans_table &&
!trx_data->at_least_one_stmt_committed &&
thd->current_stmt_binlog_row_based) ||
((thd->options & OPTION_KEEP_LOG))) ((thd->options & OPTION_KEEP_LOG)))
{ {
Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, TRUE, 0); Query_log_event qev(thd, STRING_WITH_LEN("ROLLBACK"), TRUE, TRUE, 0);
......
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