From: Date: August 29 2008 4:31pm Subject: bzr push into mysql-5.1 branch (aelkin:2725) Bug#38798 List-Archive: http://lists.mysql.com/commits/52915 X-Bug: 38798 Message-Id: <200808291431.m7TEVCo2023048@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 2725 Andrei Elkin 2008-08-29 Bug #38798 Assertion mysql_bin_log.is_open() failed in binlog_trans_log_savepos() The assert is about binlogging must have been activated, but it was not actually according to the reported how-to-repeat instuctions. Analysis revealed that binlog_start_trans_and_stmt() was called without prior testing if binlogging is ON. Fixed with avoing entering binlog_start_trans_and_stmt() if binlog is not activated. added: mysql-test/r/skip_log_bin.result mysql-test/t/skip_log_bin-master.opt mysql-test/t/skip_log_bin.test modified: sql/sql_insert.cc === added file 'mysql-test/r/skip_log_bin.result' --- a/mysql-test/r/skip_log_bin.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/skip_log_bin.result 2008-08-29 14:20:08 +0000 @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS t1, t2; +set @@session.binlog_format=row; +create table t1 (a int); +insert into t1 values (1); +create table t2 select * from t1; +drop table t1, t2; === added file 'mysql-test/t/skip_log_bin-master.opt' --- a/mysql-test/t/skip_log_bin-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/skip_log_bin-master.opt 2008-08-29 14:20:08 +0000 @@ -0,0 +1 @@ +--loose-skip-log-bin === added file 'mysql-test/t/skip_log_bin.test' --- a/mysql-test/t/skip_log_bin.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/skip_log_bin.test 2008-08-29 14:20:08 +0000 @@ -0,0 +1,25 @@ +# +# binlog_off.test purpose is to verify that the --skip-log-bin flag +# works correctly +# + +--disable_warnings +DROP TABLE IF EXISTS t1, t2; +--enable_warnings + +# +# Bug #38798 Assertion mysql_bin_log.is_open() failed in +# binlog_trans_log_savepos() +# Testing that there is no crash. +# Before BUG#38798, the code for CREATE...SELECT called an internal function to +# binlog the statement, even with --skip-log-bin. This caused an assertion +# to be thrown since the binlog was not open. + +set @@session.binlog_format=row; + +create table t1 (a int); +insert into t1 values (1); +create table t2 select * from t1; + +# clean-up +drop table t1, t2; === modified file 'sql/sql_insert.cc' --- a/sql/sql_insert.cc 2008-07-11 18:51:10 +0000 +++ b/sql/sql_insert.cc 2008-08-29 14:20:08 +0000 @@ -3523,7 +3523,8 @@ select_create::prepare(List &value temporary table, we need to start a statement transaction. */ if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 && - thd->current_stmt_binlog_row_based) + thd->current_stmt_binlog_row_based && + mysql_bin_log.is_open()) { thd->binlog_start_trans_and_stmt(); } @@ -3619,10 +3620,11 @@ select_create::binlog_show_create_table( result= store_create_info(thd, &tmp_table_list, &query, create_info); DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */ - thd->binlog_query(THD::STMT_QUERY_TYPE, - query.ptr(), query.length(), - /* is_trans */ TRUE, - /* suppress_use */ FALSE); + if (mysql_bin_log.is_open()) + thd->binlog_query(THD::STMT_QUERY_TYPE, + query.ptr(), query.length(), + /* is_trans */ TRUE, + /* suppress_use */ FALSE); } void select_create::store_values(List &values)