summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/skip_log_bin.result6
-rw-r--r--mysql-test/t/skip_log_bin-master.opt1
-rw-r--r--mysql-test/t/skip_log_bin.test25
-rw-r--r--sql/sql_insert.cc12
4 files changed, 39 insertions, 5 deletions
diff --git a/mysql-test/r/skip_log_bin.result b/mysql-test/r/skip_log_bin.result
new file mode 100644
index 00000000000..2fdd88ff526
--- /dev/null
+++ b/mysql-test/r/skip_log_bin.result
@@ -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;
diff --git a/mysql-test/t/skip_log_bin-master.opt b/mysql-test/t/skip_log_bin-master.opt
new file mode 100644
index 00000000000..9ebccecc95e
--- /dev/null
+++ b/mysql-test/t/skip_log_bin-master.opt
@@ -0,0 +1 @@
+--loose-skip-log-bin
diff --git a/mysql-test/t/skip_log_bin.test b/mysql-test/t/skip_log_bin.test
new file mode 100644
index 00000000000..6175b2cf7d3
--- /dev/null
+++ b/mysql-test/t/skip_log_bin.test
@@ -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;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9e3c591ae2a..7d66ab487f4 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -3523,7 +3523,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
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(TABLE **tables, uint count)
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<Item> &values)