diff --git a/mysql-test/r/stat_tables_rbr.result b/mysql-test/r/stat_tables_rbr.result new file mode 100644 index 00000000000..7a0d23193e7 --- /dev/null +++ b/mysql-test/r/stat_tables_rbr.result @@ -0,0 +1,10 @@ +# +# Bug mdev-463: assertion failure when running ANALYZE with RBR on +# +SET GLOBAL use_stat_tables = PREFERABLY; +CREATE TABLE t1 (i INT) ENGINE=InnoDB; +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +DROP TABLE t1; +SET GLOBAL use_stat_tables = DEFAULT; diff --git a/mysql-test/t/stat_tables_rbr.test b/mysql-test/t/stat_tables_rbr.test new file mode 100644 index 00000000000..5297bccf2f4 --- /dev/null +++ b/mysql-test/t/stat_tables_rbr.test @@ -0,0 +1,18 @@ +--source include/have_binlog_format_row.inc +--source include/have_innodb.inc + +--echo # +--echo # Bug mdev-463: assertion failure when running ANALYZE with RBR on +--echo # + +SET GLOBAL use_stat_tables = PREFERABLY; + +--connect (con1,localhost,root,,) +CREATE TABLE t1 (i INT) ENGINE=InnoDB; +ANALYZE TABLE t1; + +# Cleanup +DROP TABLE t1; +SET GLOBAL use_stat_tables = DEFAULT; +--disconnect con1 + diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 047b8bac94e..e00b35a19db 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -322,6 +322,8 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, int result_code; int compl_result_code; bool need_repair_or_alter= 0; + bool save_binlog_row_based= 0; + DBUG_ENTER("mysql_admin_table"); DBUG_PRINT("enter", ("extra_open_options: %u", extra_open_options)); @@ -415,6 +417,11 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, */ open_error= open_and_lock_tables(thd, table, TRUE, 0); + if (lex->sql_command == SQLCOM_ANALYZE) + { + if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row())) + thd->clear_current_stmt_binlog_format_row(); + } } thd->prepare_derived_at_open= FALSE; @@ -954,6 +961,8 @@ send_result_message: trans_commit_stmt(thd); trans_commit_implicit(thd); close_thread_tables(thd); + if (save_binlog_row_based) + thd->set_current_stmt_binlog_format_row(); thd->mdl_context.release_transactional_locks(); /* @@ -986,6 +995,8 @@ err: trans_rollback_stmt(thd); trans_rollback(thd); close_thread_tables(thd); // Shouldn't be needed + if (save_binlog_row_based) + thd->set_current_stmt_binlog_format_row(); thd->mdl_context.release_transactional_locks(); if (table) table->table=0;