diff --git a/mysql-test/r/create_not_windows.result b/mysql-test/r/create_not_windows.result index 2d7fd30dfddf8602729480630dfecd8727941f30..abe76fd3fbec461b24d5c931428dcce7e5f9984c 100644 --- a/mysql-test/r/create_not_windows.result +++ b/mysql-test/r/create_not_windows.result @@ -12,3 +12,20 @@ about:text CREATE TABLE `about:text` ( PRIMARY KEY (`_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table `about:text`; +use test; +drop table if exists t1; +create table t1(a int) engine=myisam; +insert into t1 values(1); +"We get an error because the table is in the definition cache" +create table t1(a int, b int); +ERROR 42S01: Table 't1' already exists +"Flush the cache and recreate the table anew to be able to drop it" +flush tables; +show open tables like "t%"; +Database Table In_use Name_locked +create table t1(a int, b int, c int); +"Try to select from the table. This should not crash the server" +select count(a) from t1; +count(a) +0 +drop table t1; diff --git a/mysql-test/t/create_not_windows.test b/mysql-test/t/create_not_windows.test index 71ad9ccd7fe64b93387c158143f78fefadd2f58e..2c1700d9e49119c63119ee2c30ba17fe36cb8120 100644 --- a/mysql-test/t/create_not_windows.test +++ b/mysql-test/t/create_not_windows.test @@ -18,3 +18,24 @@ show create table `about:text`; drop table `about:text`; # End of 5.0 tests + +# +# Bug#16532:mysql server assert in debug if table det is removed +# +use test; +--disable_warnings +drop table if exists t1; +--enable_warnings +create table t1(a int) engine=myisam; +insert into t1 values(1); +--system rm -f $MYSQLTEST_VARDIR/master-data/test/t1.frm +--echo "We get an error because the table is in the definition cache" +--error ER_TABLE_EXISTS_ERROR +create table t1(a int, b int); +--echo "Flush the cache and recreate the table anew to be able to drop it" +flush tables; +show open tables like "t%"; +create table t1(a int, b int, c int); +--echo "Try to select from the table. This should not crash the server" +select count(a) from t1; +drop table t1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ccddefab421ab8dfe9be29b5b2d3ede698d9b1f6..098c882f049bb71126d13b31d5becca7b9fa8a34 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3321,7 +3321,19 @@ bool mysql_create_table_internal(THD *thd, my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); goto unlock_and_end; } - DBUG_ASSERT(get_cached_table_share(db, alias) == 0); + /* + We don't assert here, but check the result, because the table could be + in the table definition cache and in the same time the .frm could be + missing from the disk, in case of manual intervention which deletes + the .frm file. The user has to use FLUSH TABLES; to clear the cache. + Then she could create the table. This case is pretty obscure and + therefore we don't introduce a new error message only for it. + */ + if (get_cached_table_share(db, alias)) + { + my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name); + goto unlock_and_end; + } } /*