summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/storage_engine/alter_tablespace.result2
-rw-r--r--mysql-test/suite/storage_engine/alter_tablespace.test1
-rw-r--r--mysql-test/suite/storage_engine/have_engine.inc2
-rw-r--r--mysql-test/suite/storage_engine/misc.result5
-rw-r--r--mysql-test/suite/storage_engine/obfuscate.inc2
-rw-r--r--mysql-test/suite/storage_engine/parts/repair_table.result2
-rw-r--r--sql/log_event.cc1
-rw-r--r--sql/rpl_parallel.cc143
-rw-r--r--sql/rpl_parallel.h7
-rw-r--r--sql/rpl_rli.h3
-rw-r--r--sql/slave.cc3
-rw-r--r--sql/sql_class.cc28
-rw-r--r--storage/innobase/mysql-test/storage_engine/alter_tablespace.rdiff11
-rw-r--r--storage/innobase/mysql-test/storage_engine/fulltext_search.rdiff4
-rw-r--r--storage/innobase/mysql-test/storage_engine/index_enable_disable.rdiff6
-rw-r--r--storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff2
-rw-r--r--storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff2
-rw-r--r--storage/innobase/mysql-test/storage_engine/vcol.rdiff2
-rw-r--r--storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff2
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/handler.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff6
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff2
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/vcol.rdiff2
26 files changed, 175 insertions, 79 deletions
diff --git a/mysql-test/suite/storage_engine/alter_tablespace.result b/mysql-test/suite/storage_engine/alter_tablespace.result
index 71ef910b222..5bbfe00e94b 100644
--- a/mysql-test/suite/storage_engine/alter_tablespace.result
+++ b/mysql-test/suite/storage_engine/alter_tablespace.result
@@ -10,7 +10,7 @@ a
2
ALTER TABLE t1 DISCARD TABLESPACE;
SELECT a FROM t1;
-ERROR HY000: Got error -1 from storage engine
+ERROR HY000: Got error -1 "Internal error < 0 (Not system error)" from storage engine <STORAGE_ENGINE>
ALTER TABLE t1 IMPORT TABLESPACE;
SELECT a FROM t1;
a
diff --git a/mysql-test/suite/storage_engine/alter_tablespace.test b/mysql-test/suite/storage_engine/alter_tablespace.test
index ac206b8e328..9ac7f400e28 100644
--- a/mysql-test/suite/storage_engine/alter_tablespace.test
+++ b/mysql-test/suite/storage_engine/alter_tablespace.test
@@ -63,6 +63,7 @@ EOF
--source alter_table.inc
--let $error_codes = ER_GET_ERRNO
+ --replace_result $storage_engine <STORAGE_ENGINE>
SELECT a FROM t1;
--source check_errors.inc
if ($mysql_errname != ER_GET_ERRNO)
diff --git a/mysql-test/suite/storage_engine/have_engine.inc b/mysql-test/suite/storage_engine/have_engine.inc
index 5a6f05f42af..6f95716f488 100644
--- a/mysql-test/suite/storage_engine/have_engine.inc
+++ b/mysql-test/suite/storage_engine/have_engine.inc
@@ -38,7 +38,7 @@ let $default_char_type = CHAR(8);
if (!$ENGINE)
{
- --skip ERROR: Storage engine under test is not defined, export ENGINE env variable or set it in define_engine.inc
+ --skip Storage engine under test is not defined, export ENGINE env variable or set it in define_engine.inc
}
# Check that the storage engine is loaded. Here we don't need to worry about the case,
diff --git a/mysql-test/suite/storage_engine/misc.result b/mysql-test/suite/storage_engine/misc.result
index b79c78172ed..8b1d951a73e 100644
--- a/mysql-test/suite/storage_engine/misc.result
+++ b/mysql-test/suite/storage_engine/misc.result
@@ -42,6 +42,8 @@ db User NULL NULL
event db NULL NULL
event name NULL NULL
func name NULL NULL
+gtid_slave_pos domain_id NULL NULL
+gtid_slave_pos sub_id NULL NULL
help_category help_category_id NULL NULL
help_category name NULL NULL
help_keyword help_keyword_id NULL NULL
@@ -70,6 +72,9 @@ proxies_priv Host NULL NULL
proxies_priv Proxied_host NULL NULL
proxies_priv Proxied_user NULL NULL
proxies_priv User NULL NULL
+roles_mapping Host NULL NULL
+roles_mapping Role NULL NULL
+roles_mapping User NULL NULL
servers Server_name NULL NULL
table_stats db_name NULL NULL
table_stats table_name NULL NULL
diff --git a/mysql-test/suite/storage_engine/obfuscate.inc b/mysql-test/suite/storage_engine/obfuscate.inc
index 96c9e5a2956..e1a8a5bede0 100644
--- a/mysql-test/suite/storage_engine/obfuscate.inc
+++ b/mysql-test/suite/storage_engine/obfuscate.inc
@@ -1,4 +1,4 @@
let $storage_engine_search_string = ENGINE=$storage_engine;
---replace_result ' ' ' ' ' ,' ',' ' )' ')' '( ' '(' $default_tbl_opts <CUSTOM_TABLE_OPTIONS> $int_indexed_col <INT_COLUMN> $char_indexed_col <CHAR_COLUMN> $int_col <INT_COLUMN> $char_col <CHAR_COLUMN> $default_col_indexed_opts <CUSTOM_COL_OPTIONS> $default_col_opts <CUSTOM_COL_OPTIONS> $storage_engine_search_string ENGINE=<STORAGE_ENGINE> $default_index <CUSTOM_INDEX>
+--replace_result ' ' ' ' ' ,' ',' ' )' ')' '( ' '(' $default_tbl_opts <CUSTOM_TABLE_OPTIONS> $int_indexed_col <INT_COLUMN> $char_indexed_col <CHAR_COLUMN> $int_col <INT_COLUMN> $char_col <CHAR_COLUMN> $default_col_indexed_opts <CUSTOM_COL_OPTIONS> $default_col_opts <CUSTOM_COL_OPTIONS> $storage_engine_search_string ENGINE=<STORAGE_ENGINE> $storage_engine <STORAGE_ENGINE> $default_index <CUSTOM_INDEX>
diff --git a/mysql-test/suite/storage_engine/parts/repair_table.result b/mysql-test/suite/storage_engine/parts/repair_table.result
index 8b08ee15fd0..d9ac215797b 100644
--- a/mysql-test/suite/storage_engine/parts/repair_table.result
+++ b/mysql-test/suite/storage_engine/parts/repair_table.result
@@ -74,7 +74,6 @@ ERROR HY000: Failed to read from the .par file
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check Error Failed to read from the .par file
-test.t1 check Error Incorrect information in file: './test/t1.frm'
test.t1 check error Corrupt
SELECT a,b FROM t1;
ERROR HY000: Failed to read from the .par file
@@ -83,7 +82,6 @@ ERROR HY000: Failed to read from the .par file
REPAIR TABLE t1;
Table Op Msg_type Msg_text
test.t1 repair Error Failed to read from the .par file
-test.t1 repair Error Incorrect information in file: './test/t1.frm'
test.t1 repair error Corrupt
DROP TABLE t1, t2;
call mtr.add_suppression("Got an error from thread_id=.*");
diff --git a/sql/log_event.cc b/sql/log_event.cc
index dfb28f7197a..70e7476fcfd 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -358,7 +358,6 @@ static void clear_all_errors(THD *thd, Relay_log_info *rli)
{
thd->is_slave_error = 0;
thd->clear_error();
- rli->clear_error();
}
inline int idempotent_error_code(int err_code)
diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc
index 582f0e4a65f..ca3711ae041 100644
--- a/sql/rpl_parallel.cc
+++ b/sql/rpl_parallel.cc
@@ -120,6 +120,64 @@ sql_worker_killed(THD *thd, rpl_group_info *rgi, bool in_event_group)
}
+static void
+finish_event_group(THD *thd, int err, uint64 sub_id,
+ rpl_parallel_entry *entry, wait_for_commit *wfc)
+{
+ /*
+ Remove any left-over registration to wait for a prior commit to
+ complete. Normally, such wait would already have been removed at
+ this point by wait_for_prior_commit() called from within COMMIT
+ processing. However, in case of MyISAM and no binlog, we might not
+ have any commit processing, and so we need to do the wait here,
+ before waking up any subsequent commits, to preserve correct
+ order of event execution. Also, in the error case we might have
+ skipped waiting and thus need to remove it explicitly.
+
+ It is important in the non-error case to do a wait, not just an
+ unregister. Because we might be last in a group-commit that is
+ replicated in parallel, and the following event will then wait
+ for us to complete and rely on this also ensuring that any other
+ event in the group has completed.
+
+ But in the error case, we have to abort anyway, and it seems best
+ to just complete as quickly as possible with unregister. Anyone
+ waiting for us will in any case receive the error back from their
+ wait_for_prior_commit() call.
+ */
+ if (err)
+ wfc->unregister_wait_for_prior_commit();
+ else
+ wfc->wait_for_prior_commit();
+ thd->wait_for_commit_ptr= NULL;
+
+ /*
+ Record that this event group has finished (eg. transaction is
+ committed, if transactional), so other event groups will no longer
+ attempt to wait for us to commit. Once we have increased
+ entry->last_committed_sub_id, no other threads will execute
+ register_wait_for_prior_commit() against us. Thus, by doing one
+ extra (usually redundant) wakeup_subsequent_commits() we can ensure
+ that no register_wait_for_prior_commit() can ever happen without a
+ subsequent wakeup_subsequent_commits() to wake it up.
+
+ We can race here with the next transactions, but that is fine, as
+ long as we check that we do not decrease last_committed_sub_id. If
+ this commit is done, then any prior commits will also have been
+ done and also no longer need waiting for.
+ */
+ mysql_mutex_lock(&entry->LOCK_parallel_entry);
+ if (entry->last_committed_sub_id < sub_id)
+ {
+ entry->last_committed_sub_id= sub_id;
+ mysql_cond_broadcast(&entry->COND_parallel_entry);
+ }
+ mysql_mutex_unlock(&entry->LOCK_parallel_entry);
+
+ wfc->wakeup_subsequent_commits(err);
+}
+
+
pthread_handler_t
handle_rpl_parallel_thread(void *arg)
{
@@ -128,6 +186,7 @@ handle_rpl_parallel_thread(void *arg)
struct rpl_parallel_thread::queued_event *events;
bool group_standalone= true;
bool in_event_group= false;
+ rpl_group_info *group_rgi= NULL;
uint64 event_gtid_sub_id= 0;
int err;
@@ -173,7 +232,8 @@ handle_rpl_parallel_thread(void *arg)
thd->ENTER_COND(&rpt->COND_rpl_thread, &rpt->LOCK_rpl_thread,
&stage_waiting_for_work_from_sql_thread, &old_stage);
- while (!(events= rpt->event_queue) && !rpt->stop && !thd->killed)
+ while (!(events= rpt->event_queue) && !rpt->stop && !thd->killed &&
+ !(rpt->current_entry && rpt->current_entry->force_abort))
mysql_cond_wait(&rpt->COND_rpl_thread, &rpt->LOCK_rpl_thread);
rpt->dequeue(events);
thd->EXIT_COND(&old_stage);
@@ -199,6 +259,7 @@ handle_rpl_parallel_thread(void *arg)
}
err= 0;
+ group_rgi= rgi;
/* Handle a new event group, which will be initiated by a GTID event. */
if ((event_type= events->ev->get_type_code()) == GTID_EVENT)
{
@@ -294,41 +355,10 @@ handle_rpl_parallel_thread(void *arg)
if (end_of_group)
{
in_event_group= false;
-
- /*
- Remove any left-over registration to wait for a prior commit to
- complete. Normally, such wait would already have been removed at
- this point by wait_for_prior_commit(), but eg. in error case we
- might have skipped waiting, so we would need to remove it explicitly.
- */
- rgi->commit_orderer.unregister_wait_for_prior_commit();
- thd->wait_for_commit_ptr= NULL;
-
- /*
- Record that this event group has finished (eg. transaction is
- committed, if transactional), so other event groups will no longer
- attempt to wait for us to commit. Once we have increased
- entry->last_committed_sub_id, no other threads will execute
- register_wait_for_prior_commit() against us. Thus, by doing one
- extra (usually redundant) wakeup_subsequent_commits() we can ensure
- that no register_wait_for_prior_commit() can ever happen without a
- subsequent wakeup_subsequent_commits() to wake it up.
-
- We can race here with the next transactions, but that is fine, as
- long as we check that we do not decrease last_committed_sub_id. If
- this commit is done, then any prior commits will also have been
- done and also no longer need waiting for.
- */
- mysql_mutex_lock(&entry->LOCK_parallel_entry);
- if (entry->last_committed_sub_id < event_gtid_sub_id)
- {
- entry->last_committed_sub_id= event_gtid_sub_id;
- mysql_cond_broadcast(&entry->COND_parallel_entry);
- }
- mysql_mutex_unlock(&entry->LOCK_parallel_entry);
-
- rgi->commit_orderer.wakeup_subsequent_commits(err);
+ finish_event_group(thd, err, event_gtid_sub_id, entry,
+ &rgi->commit_orderer);
delete rgi;
+ group_rgi= rgi= NULL;
}
events= next;
@@ -348,6 +378,27 @@ handle_rpl_parallel_thread(void *arg)
goto more_events;
}
+ if (in_event_group && group_rgi->parallel_entry->force_abort)
+ {
+ /*
+ We are asked to abort, without getting the remaining events in the
+ current event group.
+
+ We have to rollback the current transaction and update the last
+ sub_id value so that SQL thread will know we are done with the
+ half-processed event group.
+ */
+ mysql_mutex_unlock(&rpt->LOCK_rpl_thread);
+ group_rgi->is_error= true;
+ finish_event_group(thd, 1, group_rgi->gtid_sub_id,
+ group_rgi->parallel_entry, &group_rgi->commit_orderer);
+ group_rgi->cleanup_context(thd, true);
+ group_rgi->rli->abort_slave= true;
+ in_event_group= false;
+ delete group_rgi;
+ group_rgi= NULL;
+ mysql_mutex_lock(&rpt->LOCK_rpl_thread);
+ }
if (!in_event_group)
{
rpt->current_entry= NULL;
@@ -645,6 +696,8 @@ rpl_parallel::find(uint32 domain_id)
MY_MUTEX_INIT_FAST);
mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL);
}
+ else
+ e->force_abort= false;
return e;
}
@@ -656,6 +709,25 @@ rpl_parallel::wait_for_done()
struct rpl_parallel_entry *e;
uint32 i;
+ /*
+ First signal all workers that they must force quit; no more events will
+ be queued to complete any partial event groups executed.
+ */
+ for (i= 0; i < domain_hash.records; ++i)
+ {
+ rpl_parallel_thread *rpt;
+
+ e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i);
+ e->force_abort= true;
+ if ((rpt= e->rpl_thread))
+ {
+ mysql_mutex_lock(&rpt->LOCK_rpl_thread);
+ if (rpt->current_entry == e)
+ mysql_cond_signal(&rpt->COND_rpl_thread);
+ mysql_mutex_unlock(&rpt->LOCK_rpl_thread);
+ }
+ }
+
for (i= 0; i < domain_hash.records; ++i)
{
e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i);
@@ -891,6 +963,7 @@ rpl_parallel::do_event(rpl_group_info *serial_rgi, Log_event *ev,
qev->future_event_master_log_pos= log_pos;
if (!current)
{
+ rli->event_relay_log_pos= rli->future_event_relay_log_pos;
handle_queued_pos_update(rli->sql_driver_thd, qev);
my_free(qev);
return false;
diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h
index 0b9619e5e83..0e88e09652b 100644
--- a/sql/rpl_parallel.h
+++ b/sql/rpl_parallel.h
@@ -76,6 +76,13 @@ struct rpl_parallel_entry {
uint64 last_seq_no;
uint64 last_commit_id;
bool active;
+ /*
+ Set when SQL thread is shutting down, and no more events can be processed,
+ so worker threads must force abort any current transactions without
+ waiting for event groups to complete.
+ */
+ bool force_abort;
+
rpl_parallel_thread *rpl_thread;
/*
The sub_id of the last transaction to commit within this domain_id.
diff --git a/sql/rpl_rli.h b/sql/rpl_rli.h
index a3dcf7ad7e9..390936114bc 100644
--- a/sql/rpl_rli.h
+++ b/sql/rpl_rli.h
@@ -688,8 +688,7 @@ public:
inline void inc_event_relay_log_pos()
{
- if (!is_parallel_exec ||
- rli->event_relay_log_pos < future_event_relay_log_pos)
+ if (!is_parallel_exec)
rli->event_relay_log_pos= future_event_relay_log_pos;
}
};
diff --git a/sql/slave.cc b/sql/slave.cc
index 8780debb375..a50e0f7ed8c 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -6037,6 +6037,7 @@ static Log_event* next_event(rpl_group_info *rgi, ulonglong *event_size)
The other case is much simpler:
We just have a read only log that nobody else will be updating.
*/
+ ulonglong old_pos;
bool hot_log;
if ((hot_log = (cur_log != &rli->cache_buf)))
{
@@ -6088,12 +6089,12 @@ static Log_event* next_event(rpl_group_info *rgi, ulonglong *event_size)
But if the relay log is created by new_file(): then the solution is:
MYSQL_BIN_LOG::open() will write the buffered description event.
*/
+ old_pos= rli->event_relay_log_pos;
if ((ev= Log_event::read_log_event(cur_log,0,
rli->relay_log.description_event_for_exec,
opt_slave_sql_verify_checksum)))
{
- ulonglong old_pos= rli->future_event_relay_log_pos;
/*
read it while we have a lock, to avoid a mutex lock in
inc_event_relay_log_pos()
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index a7b78a215a0..7ed27e2620e 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -6064,6 +6064,27 @@ wait_for_commit::wait_for_commit()
wait_for_commit::~wait_for_commit()
{
+ /*
+ Since we do a dirty read of the waiting_for_commit flag in
+ wait_for_prior_commit() and in unregister_wait_for_prior_commit(), we need
+ to take extra care before freeing the wait_for_commit object.
+
+ It is possible for the waitee to be pre-empted inside wakeup(), just after
+ it has cleared the waiting_for_commit flag and before it has released the
+ LOCK_wait_commit mutex. And then it is possible for the waiter to find the
+ flag cleared in wait_for_prior_commit() and go finish up things and
+ de-allocate the LOCK_wait_commit and COND_wait_commit objects before the
+ waitee has time to be re-scheduled and finish unlocking the mutex and
+ signalling the condition. This would lead to the waitee accessing no
+ longer valid memory.
+
+ To prevent this, we do an extra lock/unlock of the mutex here before
+ deallocation; this makes certain that any waitee has completed wakeup()
+ first.
+ */
+ mysql_mutex_lock(&LOCK_wait_commit);
+ mysql_mutex_unlock(&LOCK_wait_commit);
+
mysql_mutex_destroy(&LOCK_wait_commit);
mysql_cond_destroy(&COND_wait_commit);
}
@@ -6087,8 +6108,13 @@ wait_for_commit::wakeup(int wakeup_error)
mysql_mutex_lock(&LOCK_wait_commit);
waiting_for_commit= false;
this->wakeup_error= wakeup_error;
- mysql_mutex_unlock(&LOCK_wait_commit);
+ /*
+ Note that it is critical that the mysql_cond_signal() here is done while
+ still holding the mutex. As soon as we release the mutex, the waiter might
+ deallocate the condition object.
+ */
mysql_cond_signal(&COND_wait_commit);
+ mysql_mutex_unlock(&LOCK_wait_commit);
}
diff --git a/storage/innobase/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/innobase/mysql-test/storage_engine/alter_tablespace.rdiff
deleted file mode 100644
index 0cbe1fa48ae..00000000000
--- a/storage/innobase/mysql-test/storage_engine/alter_tablespace.rdiff
+++ /dev/null
@@ -1,11 +0,0 @@
---- suite/storage_engine/alter_tablespace.result 2013-01-13 01:03:49.133994000 +0400
-+++ suite/storage_engine/alter_tablespace.reject 2013-01-13 01:04:04.398937286 +0400
-@@ -10,7 +10,7 @@
- 2
- ALTER TABLE t1 DISCARD TABLESPACE;
- SELECT * FROM t1;
--ERROR HY000: Got error -1 from storage engine
-+ERROR HY000: Got error -1 "Internal error < 0 (Not system error)" from storage engine
- ALTER TABLE t1 IMPORT TABLESPACE;
- SELECT * FROM t1;
- a
diff --git a/storage/innobase/mysql-test/storage_engine/fulltext_search.rdiff b/storage/innobase/mysql-test/storage_engine/fulltext_search.rdiff
index f668e44109c..21bcf1a611d 100644
--- a/storage/innobase/mysql-test/storage_engine/fulltext_search.rdiff
+++ b/storage/innobase/mysql-test/storage_engine/fulltext_search.rdiff
@@ -62,7 +62,7 @@
-v0 rating
-text1 178.11756896972656
-DROP TABLE t1;
-+ERROR HY000: The used table type doesn't support FULLTEXT indexes
++ERROR HY000: The storage engine <STORAGE_ENGINE> doesn't support FULLTEXT indexes
+# ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
@@ -139,7 +139,7 @@
-text1 190.56150817871094
-text4 1.1758291721343994
-DROP TABLE t1;
-+ERROR HY000: The used table type doesn't support FULLTEXT indexes
++ERROR HY000: The storage engine <STORAGE_ENGINE> doesn't support FULLTEXT indexes
+# ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
diff --git a/storage/innobase/mysql-test/storage_engine/index_enable_disable.rdiff b/storage/innobase/mysql-test/storage_engine/index_enable_disable.rdiff
index 23aa66d2568..f8e812e7edb 100644
--- a/storage/innobase/mysql-test/storage_engine/index_enable_disable.rdiff
+++ b/storage/innobase/mysql-test/storage_engine/index_enable_disable.rdiff
@@ -5,7 +5,7 @@
t1 1 a 1 a # # NULL NULL YES BTREE
ALTER TABLE t1 DISABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine <STORAGE_ENGINE> of the table `test`.`t1` doesn't have this option
SHOW INDEX IN t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
-t1 1 a 1 a # # NULL NULL YES BTREE disabled
@@ -18,7 +18,7 @@
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
ALTER TABLE t1 ENABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine <STORAGE_ENGINE> of the table `test`.`t1` doesn't have this option
SHOW INDEX IN t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
t1 1 a 1 a # # NULL NULL YES BTREE
@@ -27,7 +27,7 @@
(21),(22),(23),(24),(25),(26),(27),(28),(29);
ALTER TABLE t1 DISABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine <STORAGE_ENGINE> of the table `test`.`t1` doesn't have this option
INSERT INTO t1 (a) VALUES (29);
ERROR 23000: Duplicate entry '29' for key 'a'
# Statement ended with one of expected results (ER_DUP_ENTRY,ER_DUP_KEY).
diff --git a/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff b/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff
index 8bf84115a52..43178f00615 100644
--- a/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff
+++ b/storage/innobase/mysql-test/storage_engine/tbl_opt_row_format.rdiff
@@ -4,7 +4,7 @@
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> ROW_FORMAT=FIXED;
+Warnings:
-+Warning 140 InnoDB: assuming ROW_FORMAT=COMPACT.
++Warning 140 <STORAGE_ENGINE>: assuming ROW_FORMAT=COMPACT.
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff b/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff
index 04572ee03be..d3fb59e6ce3 100644
--- a/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff
+++ b/storage/innobase/mysql-test/storage_engine/type_spatial_indexes.rdiff
@@ -698,7 +698,7 @@
-WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
-count(*)
-1
-+ERROR HY000: The used table type doesn't support SPATIAL indexes
++ERROR HY000: The storage engine <STORAGE_ENGINE> doesn't support SPATIAL indexes
+# ERROR: Statement ended with errno 1464, errname ER_TABLE_CANT_HANDLE_SPKEYS (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# [ CREATE TABLE gis_point (fid INT(11) /*!*/ /*Custom column options*/, g POINT NOT NULL, SPATIAL INDEX(g)) ENGINE=InnoDB /*!*/ /*Custom table options*/ ]
diff --git a/storage/innobase/mysql-test/storage_engine/vcol.rdiff b/storage/innobase/mysql-test/storage_engine/vcol.rdiff
index 23b26a52228..46cee5f836b 100644
--- a/storage/innobase/mysql-test/storage_engine/vcol.rdiff
+++ b/storage/innobase/mysql-test/storage_engine/vcol.rdiff
@@ -70,7 +70,7 @@
-3 4
-4 5
-DROP TABLE t1;
-+ERROR HY000: InnoDB storage engine does not support computed columns
++ERROR HY000: <STORAGE_ENGINE> storage engine does not support computed columns
+# ERROR: Statement ended with errno 1910, errname ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/ GENERATED ALWAYS AS (a+1)) ENGINE=InnoDB /*!*/ /*Custom table options*/ ]
diff --git a/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff
index 07c03fc8d3e..bbbe6826494 100644
--- a/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff
+++ b/storage/myisam/mysql-test/storage_engine/alter_tablespace.rdiff
@@ -13,13 +13,13 @@
-2
-ALTER TABLE t1 DISCARD TABLESPACE;
-SELECT a FROM t1;
--ERROR HY000: Got error -1 from storage engine
+-ERROR HY000: Got error -1 "Internal error < 0 (Not system error)" from storage engine <STORAGE_ENGINE>
-ALTER TABLE t1 IMPORT TABLESPACE;
-SELECT a FROM t1;
-a
-1
-2
-+ERROR HY000: Table storage engine for 't1' doesn't have this option
++ERROR HY000: Storage engine <STORAGE_ENGINE> of the table `test`.`t1` doesn't have this option
+# ERROR: Statement ended with errno 1031, errname ER_ILLEGAL_HA (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# [ ALTER TABLE t1 DISCARD TABLESPACE ]
diff --git a/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff
index 1091d6250b9..d66c6015596 100644
--- a/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff
@@ -13,7 +13,7 @@
-2
-ALTER TABLE t1 DISCARD TABLESPACE;
-SELECT a FROM t1;
--ERROR HY000: Got error -1 from storage engine
+-ERROR HY000: Got error -1 "Internal error < 0 (Not system error)" from storage engine <STORAGE_ENGINE>
-ALTER TABLE t1 IMPORT TABLESPACE;
-SELECT a FROM t1;
-a
diff --git a/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff b/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff
index 7234cdfd2fa..c96b697167c 100644
--- a/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff
@@ -62,7 +62,7 @@
-v0 rating
-text1 178.11756896972656
-DROP TABLE t1;
-+ERROR HY000: The used table type doesn't support FULLTEXT indexes
++ERROR HY000: The storage engine MRG_MyISAM doesn't support FULLTEXT indexes
+# ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
@@ -139,7 +139,7 @@
-text1 190.56150817871094
-text4 1.1758291721343994
-DROP TABLE t1;
-+ERROR HY000: The used table type doesn't support FULLTEXT indexes
++ERROR HY000: The storage engine MRG_MyISAM doesn't support FULLTEXT indexes
+# ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
diff --git a/storage/myisammrg/mysql-test/storage_engine/handler.rdiff b/storage/myisammrg/mysql-test/storage_engine/handler.rdiff
index c56cfae0e3a..9e9117e04fc 100644
--- a/storage/myisammrg/mysql-test/storage_engine/handler.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/handler.rdiff
@@ -47,7 +47,7 @@
-foobar 1000
-HANDLER t1 CLOSE;
-ERROR 42S02: Unknown table 't1' in HANDLER
-+ERROR HY000: Table storage engine for 'h1' doesn't have this option
++ERROR HY000: Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_ILLEGAL_HA.
+# Functionality or the syntax or the mix could be unsupported.
@@ -84,5 +84,5 @@
-a b
-200 b
-HANDLER h1 CLOSE;
-+ERROR HY000: Table storage engine for 'h1' doesn't have this option
++ERROR HY000: Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
DROP TABLE t1;
diff --git a/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff b/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff
index 7b89e177ffb..357d4e931d2 100644
--- a/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff
@@ -5,7 +5,7 @@
t1 1 a 1 a # # NULL NULL YES BTREE
ALTER TABLE t1 DISABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
SHOW INDEX IN t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
-t1 1 a 1 a # # NULL NULL YES BTREE disabled
@@ -18,7 +18,7 @@
(11),(12),(13),(14),(15),(16),(17),(18),(19),(20);
ALTER TABLE t1 ENABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
SHOW INDEX IN t1;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
t1 1 a 1 a # # NULL NULL YES BTREE
@@ -27,7 +27,7 @@
(21),(22),(23),(24),(25),(26),(27),(28),(29);
ALTER TABLE t1 DISABLE KEYS;
+Warnings:
-+Note 1031 Table storage engine for 't1' doesn't have this option
++Note 1031 Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
INSERT INTO t1 (a) VALUES (29);
ERROR 23000: Duplicate entry '29' for key 'a'
# Statement ended with one of expected results (ER_DUP_ENTRY,ER_DUP_KEY).
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff
index 2b5d5f68346..59ebb4de421 100644
--- a/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff
@@ -1,6 +1,6 @@
--- repair_table.result 2013-01-23 01:35:44.388267080 +0400
+++ repair_table.reject 2013-01-23 03:16:26.468307847 +0400
-@@ -1,236 +1,114 @@
+@@ -1,234 +1,114 @@
call mtr.add_suppression("Table '.*t1.*' is marked as crashed and should be repaired");
DROP TABLE IF EXISTS t1, t2;
CREATE TABLE t1 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY HASH(a) PARTITIONS 2;
@@ -123,7 +123,6 @@
CHECK TABLE t1;
Table Op Msg_type Msg_text
-test.t1 check Error Failed to read from the .par file
--test.t1 check Error Incorrect information in file: './test/t1.frm'
-test.t1 check error Corrupt
+test.t1 check Error Table 'test.t1' doesn't exist
+test.t1 check status Operation failed
@@ -136,7 +135,6 @@
REPAIR TABLE t1;
Table Op Msg_type Msg_text
-test.t1 repair Error Failed to read from the .par file
--test.t1 repair Error Incorrect information in file: './test/t1.frm'
-test.t1 repair error Corrupt
+test.t1 repair Error Table 'test.t1' doesn't exist
+test.t1 repair status Operation failed
diff --git a/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff
index e4de81bae70..bb2e5585910 100644
--- a/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff
@@ -37,7 +37,7 @@
-HANDLER t1 OPEN AS h2;
-HANDLER h2 READ FIRST;
-a b
-+ERROR HY000: Table storage engine for 'h1' doesn't have this option
++ERROR HY000: Storage engine MRG_MyISAM of the table `test`.`t1` doesn't have this option
+# ------------ UNEXPECTED RESULT ------------
+# The statement|command finished with ER_ILLEGAL_HA.
+# HANDLER or the syntax or the mix could be unsupported.
diff --git a/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff
index 8b2710be221..c7372326fad 100644
--- a/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff
+++ b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff
@@ -70,7 +70,7 @@
-3 4
-4 5
-DROP TABLE t1;
-+ERROR HY000: MRG_MYISAM storage engine does not support computed columns
++ERROR HY000: MRG_MyISAM storage engine does not support computed columns
+# ERROR: Statement ended with errno 1910, errname ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS (expected to succeed)
+# ------------ UNEXPECTED RESULT ------------
+# [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/ GENERATED ALWAYS AS (a+1)) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST ]