MDEV-10424 - Assertion `ticket == __null' failed in MDL_request::set_type
Reexecution of prepared "ANALYZE TABLE merge_table, table" may miss to reinitialize "table" for subsequent execution and trigger assertion failure. This happens because MERGE engine may adjust table->next_global chain, which gets cleared by close_thread_tables()/ha_myisammrg::detach_children() later. Since reinitilization iterates next_global chain, it won't see tables following merge table. Fixed by appending saved next_global chain after merge children.
This commit is contained in:
parent
09cb64682b
commit
723488bba1
@ -3832,4 +3832,21 @@ test.m1 repair error Corrupt
|
|||||||
# Clean-up.
|
# Clean-up.
|
||||||
drop tables m1, t1, t4;
|
drop tables m1, t1, t4;
|
||||||
drop view t3;
|
drop view t3;
|
||||||
|
#
|
||||||
|
# MDEV-10424 - Assertion `ticket == __null' failed in
|
||||||
|
# MDL_request::set_type
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 INT) ENGINE=MyISAM;
|
||||||
|
CREATE TABLE tmerge (f1 INT) ENGINE=MERGE UNION=(t1);
|
||||||
|
PREPARE stmt FROM "ANALYZE TABLE tmerge, t1";
|
||||||
|
EXECUTE stmt;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.tmerge analyze note The storage engine for the table doesn't support analyze
|
||||||
|
test.t1 analyze status Table is already up to date
|
||||||
|
EXECUTE stmt;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.tmerge analyze note The storage engine for the table doesn't support analyze
|
||||||
|
test.t1 analyze status Table is already up to date
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1, tmerge;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
|
@ -2880,6 +2880,19 @@ drop tables m1, t1, t4;
|
|||||||
drop view t3;
|
drop view t3;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-10424 - Assertion `ticket == __null' failed in
|
||||||
|
--echo # MDL_request::set_type
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (f1 INT) ENGINE=MyISAM;
|
||||||
|
CREATE TABLE tmerge (f1 INT) ENGINE=MERGE UNION=(t1);
|
||||||
|
PREPARE stmt FROM "ANALYZE TABLE tmerge, t1";
|
||||||
|
EXECUTE stmt;
|
||||||
|
EXECUTE stmt;
|
||||||
|
DEALLOCATE PREPARE stmt;
|
||||||
|
DROP TABLE t1, tmerge;
|
||||||
|
|
||||||
|
|
||||||
--echo End of 5.5 tests
|
--echo End of 5.5 tests
|
||||||
|
|
||||||
--disable_result_log
|
--disable_result_log
|
||||||
|
@ -441,7 +441,19 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||||||
}
|
}
|
||||||
thd->prepare_derived_at_open= FALSE;
|
thd->prepare_derived_at_open= FALSE;
|
||||||
|
|
||||||
table->next_global= save_next_global;
|
/*
|
||||||
|
MERGE engine may adjust table->next_global chain, thus we have to
|
||||||
|
append save_next_global after merge children.
|
||||||
|
*/
|
||||||
|
if (save_next_global)
|
||||||
|
{
|
||||||
|
TABLE_LIST *table_list_iterator= table;
|
||||||
|
while (table_list_iterator->next_global)
|
||||||
|
table_list_iterator= table_list_iterator->next_global;
|
||||||
|
table_list_iterator->next_global= save_next_global;
|
||||||
|
save_next_global->prev_global= &table_list_iterator->next_global;
|
||||||
|
}
|
||||||
|
|
||||||
table->next_local= save_next_local;
|
table->next_local= save_next_local;
|
||||||
thd->open_options&= ~extra_open_options;
|
thd->open_options&= ~extra_open_options;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user