diff options
-rw-r--r-- | mysql-test/r/innodb_mysql_sync.result | 24 | ||||
-rw-r--r-- | mysql-test/t/innodb_mysql_sync.test | 37 | ||||
-rw-r--r-- | sql/sql_table.cc | 16 |
3 files changed, 72 insertions, 5 deletions
diff --git a/mysql-test/r/innodb_mysql_sync.result b/mysql-test/r/innodb_mysql_sync.result index 039d8b74c07..0e75e62b13a 100644 --- a/mysql-test/r/innodb_mysql_sync.result +++ b/mysql-test/r/innodb_mysql_sync.result @@ -24,3 +24,27 @@ Warnings: Error 1030 Got error -1 from storage engine DROP TABLE t1; SET DEBUG_SYNC='RESET'; +# +# Bug#47459 Assertion in Diagnostics_area::set_eof_status on +# OPTIMIZE TABLE +# +DROP TABLE IF EXISTS t1; +CREATE TABLE t1(a INT) ENGINE= InnoDB; +# Connection con1 +SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped"; +# Sending: +OPTIMIZE TABLE t1; +# Connection default +SET DEBUG_SYNC= "now WAIT_FOR opening"; +DROP TABLE t1; +SET DEBUG_SYNC= "now SIGNAL dropped"; +# Connection con1 +# Reaping: OPTIMIZE TABLE t1 +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize error Table 'test.t1' doesn't exist +test.t1 optimize status Operation failed +Warnings: +Error 1146 Table 'test.t1' doesn't exist +# Connection default +SET DEBUG_SYNC= "RESET"; diff --git a/mysql-test/t/innodb_mysql_sync.test b/mysql-test/t/innodb_mysql_sync.test index 3f061e30293..ee92ee9f52e 100644 --- a/mysql-test/t/innodb_mysql_sync.test +++ b/mysql-test/t/innodb_mysql_sync.test @@ -43,6 +43,43 @@ DROP TABLE t1; SET DEBUG_SYNC='RESET'; +--echo # +--echo # Bug#47459 Assertion in Diagnostics_area::set_eof_status on +--echo # OPTIMIZE TABLE +--echo # + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +connect (con1, localhost, root); +connection default; + +CREATE TABLE t1(a INT) ENGINE= InnoDB; + +--echo # Connection con1 +connection con1; +SET DEBUG_SYNC= "ha_admin_open_ltable SIGNAL opening WAIT_FOR dropped"; +--echo # Sending: +--send OPTIMIZE TABLE t1 + +--echo # Connection default +connection default; +SET DEBUG_SYNC= "now WAIT_FOR opening"; +DROP TABLE t1; +SET DEBUG_SYNC= "now SIGNAL dropped"; + +--echo # Connection con1 +connection con1; +--echo # Reaping: OPTIMIZE TABLE t1 +--reap + +--echo # Connection default +connection default; +disconnect con1; +SET DEBUG_SYNC= "RESET"; + + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 2a9e01daf18..5b957cccabd 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5016,11 +5016,17 @@ send_result_message: { /* Clear the ticket released in close_thread_tables(). */ table->mdl_request.ticket= NULL; - if ((table->table= open_ltable(thd, table, lock_type, 0)) && - ((result_code= table->table->file->ha_analyze(thd, check_opt)) > 0)) - result_code= 0; // analyze went ok - if (result_code) // analyze failed - table->table->file->print_error(result_code, MYF(0)); + DEBUG_SYNC(thd, "ha_admin_open_ltable"); + if (table->table= open_ltable(thd, table, lock_type, 0)) + { + result_code= table->table->file->ha_analyze(thd, check_opt); + if (result_code == HA_ADMIN_ALREADY_DONE) + result_code= HA_ADMIN_OK; + else if (result_code) // analyze failed + table->table->file->print_error(result_code, MYF(0)); + } + else + result_code= -1; // open failed } /* Start a new row for the final status row */ protocol->prepare_for_resend(); |