Skip to content

Commit

Permalink
MDEV-5309 - RENAME TABLE does not check for existence of the table's …
Browse files Browse the repository at this point in the history
…engine

When RENAME TABLE is executed, it apparently does not check whether the engine
is available (unlike ALTER TABLE .. RENAME, which does). It means that if the
engine in question was not loaded on some reason, the table might become
unusable, since the engine won't know about the change.

With this patch RENAME TABLE fails if storage engine is not available.
  • Loading branch information
svoj committed Jun 16, 2015
1 parent b988553 commit 909f760
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 9 deletions.
10 changes: 10 additions & 0 deletions mysql-test/r/plugin.result
Original file line number Diff line number Diff line change
Expand Up @@ -321,3 +321,13 @@ UNUSABLE
uninstall soname 'ha_example';
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';
plugin_name
#
# MDEV-5309 - RENAME TABLE does not check for existence of the table's
# engine
#
INSTALL PLUGIN example SONAME 'ha_example';
CREATE TABLE t1(a INT) ENGINE=EXAMPLE;
UNINSTALL PLUGIN example;
RENAME TABLE t1 TO t2;
ERROR 42S02: Table 'test.t1' doesn't exist
DROP TABLE t1;
11 changes: 11 additions & 0 deletions mysql-test/t/plugin.test
Original file line number Diff line number Diff line change
Expand Up @@ -252,3 +252,14 @@ select plugin_name from information_schema.plugins where plugin_library like 'ha
uninstall soname 'ha_example';
select plugin_name from information_schema.plugins where plugin_library like 'ha_example%';


--echo #
--echo # MDEV-5309 - RENAME TABLE does not check for existence of the table's
--echo # engine
--echo #
INSTALL PLUGIN example SONAME 'ha_example';
CREATE TABLE t1(a INT) ENGINE=EXAMPLE;
UNINSTALL PLUGIN example;
--error ER_NO_SUCH_TABLE
RENAME TABLE t1 TO t2;
DROP TABLE t1;
9 changes: 2 additions & 7 deletions sql/sql_rename.cc
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
{
int rc= 1;
handlerton *hton;
bool new_exists, old_exists;
const char *new_alias, *old_alias;
DBUG_ENTER("do_rename");

Expand All @@ -254,17 +253,13 @@ do_rename(THD *thd, TABLE_LIST *ren_table, char *new_db, char *new_table_name,
}
DBUG_ASSERT(new_alias);

new_exists= ha_table_exists(thd, new_db, new_alias);

if (new_exists)
if (ha_table_exists(thd, new_db, new_alias))
{
my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias);
DBUG_RETURN(1); // This can't be skipped
}

old_exists= ha_table_exists(thd, ren_table->db, old_alias, &hton);

if (old_exists)
if (ha_table_exists(thd, ren_table->db, old_alias, &hton) && hton)
{
DBUG_ASSERT(!thd->locked_tables_mode);
tdc_remove_table(thd, TDC_RT_REMOVE_ALL,
Expand Down
4 changes: 2 additions & 2 deletions sql/sql_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5149,15 +5149,15 @@ mysql_rename_table(handlerton *base, const char *old_db,
ulonglong save_bits= thd->variables.option_bits;
int length;
DBUG_ENTER("mysql_rename_table");
DBUG_ASSERT(base);
DBUG_PRINT("enter", ("old: '%s'.'%s' new: '%s'.'%s'",
old_db, old_name, new_db, new_name));

// Temporarily disable foreign key checks
if (flags & NO_FK_CHECKS)
thd->variables.option_bits|= OPTION_NO_FOREIGN_KEY_CHECKS;

file= (base == NULL ? 0 :
get_new_handler((TABLE_SHARE*) 0, thd->mem_root, base));
file= get_new_handler((TABLE_SHARE*) 0, thd->mem_root, base);

build_table_filename(from, sizeof(from) - 1, old_db, old_name, "",
flags & FN_FROM_IS_TMP);
Expand Down

0 comments on commit 909f760

Please sign in to comment.