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