mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
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.
This commit is contained in:
@@ -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);
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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
|
||||||
|
Reference in New Issue
Block a user