mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fix for bug#16532 mysql server assert in debug if table definition is removed
Emit an error instead of doing ASSERT
This commit is contained in:
@ -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`;
|
|||||||
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,
|
|||||||
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user