Loading mysql-test/r/rpl_switch_stm_row_mixed.result +29 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ start slave; drop database if exists mysqltest1; create database mysqltest1; use mysqltest1; set session binlog_format=row; set global binlog_format=row; show global variables like "binlog_format%"; Variable_name Value binlog_format ROW Loading Loading @@ -334,6 +336,26 @@ count(*) select count(*) from t5; count(*) 58 SET SESSION BINLOG_FORMAT=STATEMENT; CREATE TABLE t11 (song VARCHAR(255)); LOCK TABLES t11 WRITE; SET SESSION BINLOG_FORMAT=ROW; INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict'); SET SESSION BINLOG_FORMAT=STATEMENT; INSERT INTO t11 VALUES('Careful With That Axe, Eugene'); UNLOCK TABLES; SELECT * FROM t11; song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict song Careful With That Axe, Eugene USE mysqltest1; SELECT * FROM t11; song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict song Careful With That Axe, Eugene SET SESSION BINLOG_FORMAT=MIXED; CREATE TABLE t12 (data LONG); LOCK TABLES t12 WRITE; INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; select count(*) from t11; count(*) 8 Loading Loading @@ -463,6 +485,13 @@ master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t11 (song VARCHAR(255)) master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Query 1 # use `mysqltest1`; INSERT INTO t11 VALUES('Careful With That Axe, Eugene') master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t12 (data LONG) master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t12) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) Loading mysql-test/t/rpl_switch_stm_row_mixed.test +35 −1 Original line number Diff line number Diff line -- source include/have_binlog_format_row.inc -- source include/have_row_based.inc -- source include/master-slave.inc connection master; Loading @@ -8,6 +8,9 @@ create database mysqltest1; --enable_warnings use mysqltest1; set session binlog_format=row; set global binlog_format=row; show global variables like "binlog_format%"; show session variables like "binlog_format%"; select @@global.binlog_format, @@session.binlog_format; Loading Loading @@ -461,7 +464,38 @@ if ($you_want_to_test_UDF) select count(*) from t9; } # # Bug#20863 If binlog format is changed between update and unlock of # tables, wrong binlog # connection master; SET SESSION BINLOG_FORMAT=STATEMENT; CREATE TABLE t11 (song VARCHAR(255)); LOCK TABLES t11 WRITE; SET SESSION BINLOG_FORMAT=ROW; INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict'); SET SESSION BINLOG_FORMAT=STATEMENT; INSERT INTO t11 VALUES('Careful With That Axe, Eugene'); UNLOCK TABLES; --query_vertical SELECT * FROM t11 sync_slave_with_master; USE mysqltest1; --query_vertical SELECT * FROM t11 connection master; SET SESSION BINLOG_FORMAT=MIXED; CREATE TABLE t12 (data LONG); LOCK TABLES t12 WRITE; INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; --replace_column 2 # 5 # --replace_regex /table_id: [0-9]+/table_id: #/ show binlog events from 102; sync_slave_with_master; # as we're using UUID we don't SELECT but use "diff" like in rpl_row_UUID --exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql --exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_slave.sql Loading sql/log.cc +1 −1 Original line number Diff line number Diff line Loading @@ -3165,7 +3165,7 @@ int MYSQL_BIN_LOG:: flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event) { DBUG_ENTER("MYSQL_BIN_LOG::flush_and_set_pending_rows_event(event)"); DBUG_ASSERT(thd->current_stmt_binlog_row_based && mysql_bin_log.is_open()); DBUG_ASSERT(mysql_bin_log.is_open()); DBUG_PRINT("enter", ("event=%p", event)); int error= 0; Loading sql/sql_class.cc +21 −19 Original line number Diff line number Diff line Loading @@ -2652,7 +2652,12 @@ int THD::binlog_delete_row(TABLE* table, bool is_trans, int THD::binlog_flush_pending_rows_event(bool stmt_end) { DBUG_ENTER("THD::binlog_flush_pending_rows_event"); if (!current_stmt_binlog_row_based || !mysql_bin_log.is_open()) /* We shall flush the pending event even if we are not in row-based mode: it might be the case that we left row-based mode before flushing anything (e.g., if we have explicitly locked tables). */ if (!mysql_bin_log.is_open()) DBUG_RETURN(0); /* Loading Loading @@ -2718,6 +2723,21 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, DBUG_PRINT("enter", ("qtype=%d, query='%s'", qtype, query)); DBUG_ASSERT(query && mysql_bin_log.is_open()); /* If we are not in prelocked mode, mysql_unlock_tables() will be called after this binlog_query(), so we have to flush the pending rows event with the STMT_END_F set to unlock all tables at the slave side as well. If we are in prelocked mode, the flushing will be done inside the top-most close_thread_tables(). */ #ifdef HAVE_ROW_BASED_REPLICATION if (this->prelocked_mode == NON_PRELOCKED) if (int error= binlog_flush_pending_rows_event(TRUE)) DBUG_RETURN(error); #endif /*HAVE_ROW_BASED_REPLICATION*/ switch (qtype) { case THD::MYSQL_QUERY_TYPE: /* Loading @@ -2731,25 +2751,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, case THD::ROW_QUERY_TYPE: #ifdef HAVE_ROW_BASED_REPLICATION if (current_stmt_binlog_row_based) { /* If thd->lock is set, then we are not inside a stored function. In that case, mysql_unlock_tables() will be called after this binlog_query(), so we have to flush the pending rows event with the STMT_END_F set to unlock all tables at the slave side as well. We will not flush the pending event, if thd->lock is NULL. This means that we are inside a stored function or trigger, so the flushing will be done inside the top-most close_thread_tables(). */ #ifdef HAVE_ROW_BASED_REPLICATION if (this->lock) DBUG_RETURN(binlog_flush_pending_rows_event(TRUE)); #endif /*HAVE_ROW_BASED_REPLICATION*/ DBUG_RETURN(0); } #endif /* Otherwise, we fall through */ case THD::STMT_QUERY_TYPE: Loading Loading
mysql-test/r/rpl_switch_stm_row_mixed.result +29 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,8 @@ start slave; drop database if exists mysqltest1; create database mysqltest1; use mysqltest1; set session binlog_format=row; set global binlog_format=row; show global variables like "binlog_format%"; Variable_name Value binlog_format ROW Loading Loading @@ -334,6 +336,26 @@ count(*) select count(*) from t5; count(*) 58 SET SESSION BINLOG_FORMAT=STATEMENT; CREATE TABLE t11 (song VARCHAR(255)); LOCK TABLES t11 WRITE; SET SESSION BINLOG_FORMAT=ROW; INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict'); SET SESSION BINLOG_FORMAT=STATEMENT; INSERT INTO t11 VALUES('Careful With That Axe, Eugene'); UNLOCK TABLES; SELECT * FROM t11; song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict song Careful With That Axe, Eugene USE mysqltest1; SELECT * FROM t11; song Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict song Careful With That Axe, Eugene SET SESSION BINLOG_FORMAT=MIXED; CREATE TABLE t12 (data LONG); LOCK TABLES t12 WRITE; INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; select count(*) from t11; count(*) 8 Loading Loading @@ -463,6 +485,13 @@ master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t11 (song VARCHAR(255)) master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t11) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Query 1 # use `mysqltest1`; INSERT INTO t11 VALUES('Careful With That Axe, Eugene') master-bin.000001 # Query 1 # use `mysqltest1`; CREATE TABLE t12 (data LONG) master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t12) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F master-bin.000001 # Table_map 1 # table_id: # (mysqltest1.t1) Loading
mysql-test/t/rpl_switch_stm_row_mixed.test +35 −1 Original line number Diff line number Diff line -- source include/have_binlog_format_row.inc -- source include/have_row_based.inc -- source include/master-slave.inc connection master; Loading @@ -8,6 +8,9 @@ create database mysqltest1; --enable_warnings use mysqltest1; set session binlog_format=row; set global binlog_format=row; show global variables like "binlog_format%"; show session variables like "binlog_format%"; select @@global.binlog_format, @@session.binlog_format; Loading Loading @@ -461,7 +464,38 @@ if ($you_want_to_test_UDF) select count(*) from t9; } # # Bug#20863 If binlog format is changed between update and unlock of # tables, wrong binlog # connection master; SET SESSION BINLOG_FORMAT=STATEMENT; CREATE TABLE t11 (song VARCHAR(255)); LOCK TABLES t11 WRITE; SET SESSION BINLOG_FORMAT=ROW; INSERT INTO t11 VALUES('Several Species of Small Furry Animals Gathered Together in a Cave and Grooving With a Pict'); SET SESSION BINLOG_FORMAT=STATEMENT; INSERT INTO t11 VALUES('Careful With That Axe, Eugene'); UNLOCK TABLES; --query_vertical SELECT * FROM t11 sync_slave_with_master; USE mysqltest1; --query_vertical SELECT * FROM t11 connection master; SET SESSION BINLOG_FORMAT=MIXED; CREATE TABLE t12 (data LONG); LOCK TABLES t12 WRITE; INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; --replace_column 2 # 5 # --replace_regex /table_id: [0-9]+/table_id: #/ show binlog events from 102; sync_slave_with_master; # as we're using UUID we don't SELECT but use "diff" like in rpl_row_UUID --exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql --exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info mysqltest1 > $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_slave.sql Loading
sql/log.cc +1 −1 Original line number Diff line number Diff line Loading @@ -3165,7 +3165,7 @@ int MYSQL_BIN_LOG:: flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event) { DBUG_ENTER("MYSQL_BIN_LOG::flush_and_set_pending_rows_event(event)"); DBUG_ASSERT(thd->current_stmt_binlog_row_based && mysql_bin_log.is_open()); DBUG_ASSERT(mysql_bin_log.is_open()); DBUG_PRINT("enter", ("event=%p", event)); int error= 0; Loading
sql/sql_class.cc +21 −19 Original line number Diff line number Diff line Loading @@ -2652,7 +2652,12 @@ int THD::binlog_delete_row(TABLE* table, bool is_trans, int THD::binlog_flush_pending_rows_event(bool stmt_end) { DBUG_ENTER("THD::binlog_flush_pending_rows_event"); if (!current_stmt_binlog_row_based || !mysql_bin_log.is_open()) /* We shall flush the pending event even if we are not in row-based mode: it might be the case that we left row-based mode before flushing anything (e.g., if we have explicitly locked tables). */ if (!mysql_bin_log.is_open()) DBUG_RETURN(0); /* Loading Loading @@ -2718,6 +2723,21 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, DBUG_PRINT("enter", ("qtype=%d, query='%s'", qtype, query)); DBUG_ASSERT(query && mysql_bin_log.is_open()); /* If we are not in prelocked mode, mysql_unlock_tables() will be called after this binlog_query(), so we have to flush the pending rows event with the STMT_END_F set to unlock all tables at the slave side as well. If we are in prelocked mode, the flushing will be done inside the top-most close_thread_tables(). */ #ifdef HAVE_ROW_BASED_REPLICATION if (this->prelocked_mode == NON_PRELOCKED) if (int error= binlog_flush_pending_rows_event(TRUE)) DBUG_RETURN(error); #endif /*HAVE_ROW_BASED_REPLICATION*/ switch (qtype) { case THD::MYSQL_QUERY_TYPE: /* Loading @@ -2731,25 +2751,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, case THD::ROW_QUERY_TYPE: #ifdef HAVE_ROW_BASED_REPLICATION if (current_stmt_binlog_row_based) { /* If thd->lock is set, then we are not inside a stored function. In that case, mysql_unlock_tables() will be called after this binlog_query(), so we have to flush the pending rows event with the STMT_END_F set to unlock all tables at the slave side as well. We will not flush the pending event, if thd->lock is NULL. This means that we are inside a stored function or trigger, so the flushing will be done inside the top-most close_thread_tables(). */ #ifdef HAVE_ROW_BASED_REPLICATION if (this->lock) DBUG_RETURN(binlog_flush_pending_rows_event(TRUE)); #endif /*HAVE_ROW_BASED_REPLICATION*/ DBUG_RETURN(0); } #endif /* Otherwise, we fall through */ case THD::STMT_QUERY_TYPE: Loading