Commit 7c9d15af authored by unknown's avatar unknown

Fix for bug#16532 mysql server assert in debug if table definition is removed

Emit an error instead of doing ASSERT


mysql-test/r/create_not_windows.result:
  update result
mysql-test/t/create_not_windows.test:
  Add test case for bug #16532: mysql server assert in debug if table definition is removed
sql/sql_table.cc:
  it could happen that an user deletes the frm file on OS level.
  In addition if the table was already opened, the file system level
  check for existance of table.frm will pass but get_cached_table_share()
  will return non-NULL value. In this case we will emit the standard
  error that the table exist. The error case is quite obscure but error
  message is better than a sigabort.
parent d090462a
...@@ -12,3 +12,20 @@ about:text CREATE TABLE `about:text` ( ...@@ -12,3 +12,20 @@ about:text CREATE TABLE `about:text` (
PRIMARY KEY (`_id`) PRIMARY KEY (`_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table `about:text`; 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;
...@@ -18,3 +18,24 @@ show create table `about:text`; ...@@ -18,3 +18,24 @@ show create table `about:text`;
drop table `about:text`; drop table `about:text`;
# End of 5.0 tests # 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;
...@@ -3321,7 +3321,19 @@ bool mysql_create_table_internal(THD *thd, ...@@ -3321,7 +3321,19 @@ bool mysql_create_table_internal(THD *thd,
my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name); my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
goto unlock_and_end; 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;
}
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment