1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Merge remote-tracking branch 'origin/10.0' into 10.1

This commit is contained in:
Sergey Vojtovich
2019-03-11 22:50:24 +04:00
3 changed files with 36 additions and 12 deletions

View File

@ -87,3 +87,16 @@ drop table t3;
drop table t2; drop table t2;
drop table t1; drop table t1;
set debug_sync='reset'; set debug_sync='reset';
#
# MDEV-17595 - Server crashes in copy_data_between_tables or
# Assertion `thd->transaction.stmt.is_empty() ||
# (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)'
# fails in close_tables_for_reopen upon concurrent
# ALTER TABLE and FLUSH
#
CREATE TABLE t1 (a INT, KEY(a)) ENGINE=InnoDB;
INSERT INTO t1 VALUES(1),(2);
CREATE TABLE t2 (b INT, KEY(b)) ENGINE=InnoDB;
INSERT INTO t2 VALUES(2);
ALTER TABLE t2 ADD FOREIGN KEY(b) REFERENCES t1(a), LOCK=EXCLUSIVE;
DROP TABLE t2, t1;

View File

@ -111,3 +111,18 @@ drop table t3;
drop table t2; drop table t2;
drop table t1; drop table t1;
set debug_sync='reset'; set debug_sync='reset';
--echo #
--echo # MDEV-17595 - Server crashes in copy_data_between_tables or
--echo # Assertion `thd->transaction.stmt.is_empty() ||
--echo # (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)'
--echo # fails in close_tables_for_reopen upon concurrent
--echo # ALTER TABLE and FLUSH
--echo #
CREATE TABLE t1 (a INT, KEY(a)) ENGINE=InnoDB;
INSERT INTO t1 VALUES(1),(2);
CREATE TABLE t2 (b INT, KEY(b)) ENGINE=InnoDB;
INSERT INTO t2 VALUES(2);
ALTER TABLE t2 ADD FOREIGN KEY(b) REFERENCES t1(a), LOCK=EXCLUSIVE;
DROP TABLE t2, t1;

View File

@ -9150,6 +9150,8 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
new_table->file->get_foreign_key_list(thd, &fk_list); new_table->file->get_foreign_key_list(thd, &fk_list);
while ((fk= fk_list_it++)) while ((fk= fk_list_it++))
{ {
MDL_request mdl_request;
if (lower_case_table_names) if (lower_case_table_names)
{ {
char buf[NAME_LEN]; char buf[NAME_LEN];
@ -9161,20 +9163,14 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
len = my_casedn_str(files_charset_info, buf); len = my_casedn_str(files_charset_info, buf);
thd->make_lex_string(fk->referenced_table, buf, len); thd->make_lex_string(fk->referenced_table, buf, len);
} }
if (table_already_fk_prelocked(table_list, fk->referenced_db,
fk->referenced_table, TL_READ_NO_INSERT))
continue;
TABLE_LIST *tl= (TABLE_LIST *) thd->alloc(sizeof(TABLE_LIST)); mdl_request.init(MDL_key::TABLE,
tl->init_one_table_for_prelocking(fk->referenced_db->str, fk->referenced_db->length, fk->referenced_db->str, fk->referenced_table->str,
fk->referenced_table->str, fk->referenced_table->length, MDL_SHARED_NO_WRITE, MDL_TRANSACTION);
NULL, TL_READ_NO_INSERT, false, NULL, 0, if (thd->mdl_context.acquire_lock(&mdl_request,
&thd->lex->query_tables_last); thd->variables.lock_wait_timeout))
goto err_new_table_cleanup;
} }
if (open_tables(thd, &table_list->next_global, &tables_opened, 0,
&alter_prelocking_strategy))
goto err_new_table_cleanup;
} }
} }
/* /*