Commit 44b82b3e authored by Andrei Elkin's avatar Andrei Elkin

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.
parent a627a472
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;
#
# 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;
...@@ -3523,7 +3523,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) ...@@ -3523,7 +3523,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
temporary table, we need to start a statement transaction. temporary table, we need to start a statement transaction.
*/ */
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 && 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(); thd->binlog_start_trans_and_stmt();
} }
...@@ -3619,10 +3620,11 @@ select_create::binlog_show_create_table(TABLE **tables, uint count) ...@@ -3619,10 +3620,11 @@ select_create::binlog_show_create_table(TABLE **tables, uint count)
result= store_create_info(thd, &tmp_table_list, &query, create_info); result= store_create_info(thd, &tmp_table_list, &query, create_info);
DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */ DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */
thd->binlog_query(THD::STMT_QUERY_TYPE, if (mysql_bin_log.is_open())
query.ptr(), query.length(), thd->binlog_query(THD::STMT_QUERY_TYPE,
/* is_trans */ TRUE, query.ptr(), query.length(),
/* suppress_use */ FALSE); /* is_trans */ TRUE,
/* suppress_use */ FALSE);
} }
void select_create::store_values(List<Item> &values) void select_create::store_values(List<Item> &values)
......
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