Commit 7952f772 authored by Monty's avatar Monty

MDEV-10748 Server crashes in ha_maria::implicit_commit

Problem was in a combination of LOCK TABLES on several Aria
tables followed by an ALTER TABLE. After the ALTER TABLE there
was a force close + reopen of the alter table. The close failed
because the table was still part of a transaction.

Fixed by calling extra(HA_EXTRA_PREPARE_FOR_FORCED_CLOSE) as
part of closing the table, which ensures that the table is not
anymore part of the current transaction.
parent 4d147855
...@@ -109,4 +109,16 @@ ALTER TABLE t1 ADD UNIQUE KEY (f1); ...@@ -109,4 +109,16 @@ ALTER TABLE t1 ADD UNIQUE KEY (f1);
ERROR 23000: Duplicate entry 'foo' for key 'f1' ERROR 23000: Duplicate entry 'foo' for key 'f1'
ALTER TABLE t1 ADD KEY (f2); ALTER TABLE t1 ADD KEY (f2);
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-10748 Server crashes in ha_maria::implicit_commit upon ALTER TABLE
#
CREATE TABLE t1 (a INT, b INT) ENGINE=Aria;
SELECT * FROM t1;
a b
CREATE TABLE t2 (c INT) ENGINE=Aria;
LOCK TABLE t2 READ, t1 WRITE;
ALTER TABLE t1 CHANGE b a INT;
ERROR 42S21: Duplicate column name 'a'
UNLOCK TABLES;
DROP TABLE t1, t2;
# End of 10.2 tests # End of 10.2 tests
...@@ -118,4 +118,21 @@ ALTER TABLE t1 ADD UNIQUE KEY (f1); ...@@ -118,4 +118,21 @@ ALTER TABLE t1 ADD UNIQUE KEY (f1);
ALTER TABLE t1 ADD KEY (f2); ALTER TABLE t1 ADD KEY (f2);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-10748 Server crashes in ha_maria::implicit_commit upon ALTER TABLE
--echo #
CREATE TABLE t1 (a INT, b INT) ENGINE=Aria;
SELECT * FROM t1;
CREATE TABLE t2 (c INT) ENGINE=Aria;
LOCK TABLE t2 READ, t1 WRITE;
--error ER_DUP_FIELDNAME
ALTER TABLE t1 CHANGE b a INT;
# Cleanup
UNLOCK TABLES;
DROP TABLE t1, t2;
--echo # End of 10.2 tests --echo # End of 10.2 tests
...@@ -2426,9 +2426,17 @@ Locked_tables_list::reopen_tables(THD *thd, bool need_reopen) ...@@ -2426,9 +2426,17 @@ Locked_tables_list::reopen_tables(THD *thd, bool need_reopen)
{ {
if (!table_list->table || !table_list->table->needs_reopen()) if (!table_list->table || !table_list->table->needs_reopen())
continue; continue;
/* no need to remove the table from the TDC here, thus (TABLE*)1 */ for (TABLE **prev= &thd->open_tables; *prev; prev= &(*prev)->next)
close_all_tables_for_name(thd, table_list->table->s, {
HA_EXTRA_NOT_USED, (TABLE*)1); if (*prev == table_list->table)
{
thd->locked_tables_list.unlink_from_list(thd, table_list, false);
mysql_lock_remove(thd, thd->lock, *prev);
(*prev)->file->extra(HA_EXTRA_PREPARE_FOR_FORCED_CLOSE);
close_thread_table(thd, prev);
break;
}
}
DBUG_ASSERT(table_list->table == NULL); DBUG_ASSERT(table_list->table == NULL);
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment