1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00

Bug#55091: Server crashes on ADD PARTITION after a failed attempt

In case of failure in ALTER ... PARTITION under LOCK TABLE
the server could crash, due to it had modified the locked
table object, which was not reverted in case of failure,
resulting in a bad table definition used after the failed
command.

Solved by always closing the LOCKED TABLE, even in case
of error.

Note: this is a 5.1-only fix, bug#56172 fixed it in 5.5+

mysql-test/r/partition_innodb_plugin.result:
  updated result
mysql-test/t/disabled.def:
  Only disabled valgrind instead.
mysql-test/t/partition_innodb_plugin.test:
  Added test
sql/sql_partition.cc:
  close_thread_tables do not close LOCKED TABLEs
  and destroys the table object (including part_info),
  so to avoid it to be reused, always close the table
  regardless of any previous failure.
This commit is contained in:
Mattias Jonsson
2010-10-05 14:57:51 +02:00
parent bd09e49843
commit dd1d7ff161
4 changed files with 159 additions and 2 deletions

View File

@@ -5934,6 +5934,12 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt)
int err;
if (lpt->thd->locked_tables)
{
/*
Close the table if open, to remove/destroy the already altered
table->part_info object, so that it is not reused.
*/
if (lpt->table->db_stat)
abort_and_upgrade_lock_and_close_table(lpt);
/*
When we have the table locked, it is necessary to reopen the table
since all table objects were closed and removed as part of the
@@ -6436,7 +6442,20 @@ uint fast_alter_partition_table(THD *thd, TABLE *table,
table, table_list, FALSE, NULL,
written_bin_log));
err:
close_thread_tables(thd);
if (thd->locked_tables)
{
/*
table->part_info was altered in prep_alter_part_table and must be
destroyed and recreated, since otherwise it will be reused, since
we are under LOCK TABLE.
*/
alter_partition_lock_handling(lpt);
}
else
{
/* Force the table to be closed to avoid reuse of the table->part_info */
close_thread_tables(thd);
}
DBUG_RETURN(TRUE);
}
#endif