mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug#6031 - To drop database you have to execute DROP DATABASE command twice.
DROP DATABASE failed because of file ext not in TYPELIB of known extensions. General solution - construct a TYPELIB at runtime instead of a static list.
This commit is contained in:
@ -400,6 +400,13 @@ b attr1
|
|||||||
9413 9412
|
9413 9412
|
||||||
drop table test.t1, t2;
|
drop table test.t1, t2;
|
||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
|
drop database if exists ndbtest1;
|
||||||
|
create database ndbtest1;
|
||||||
|
use ndbtest1;
|
||||||
|
create table t1(id int) engine=ndbcluster;
|
||||||
|
drop database ndbtest1;
|
||||||
|
drop database ndbtest1;
|
||||||
|
ERROR HY000: Can't drop database 'ndbtest1'; database doesn't exist
|
||||||
use test;
|
use test;
|
||||||
create table t1 (a int primary key, b char(0));
|
create table t1 (a int primary key, b char(0));
|
||||||
insert into t1 values (1,"");
|
insert into t1 values (1,"");
|
||||||
|
@ -360,6 +360,21 @@ select b,test.t1.attr1 from test.t1, t2 where test.t1.pk1 < a;
|
|||||||
drop table test.t1, t2;
|
drop table test.t1, t2;
|
||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#6031 - DROP DATABASE doesn't drop database on first try
|
||||||
|
#
|
||||||
|
|
||||||
|
--disable_warnings
|
||||||
|
drop database if exists ndbtest1;
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
|
create database ndbtest1;
|
||||||
|
use ndbtest1;
|
||||||
|
create table t1(id int) engine=ndbcluster;
|
||||||
|
drop database ndbtest1;
|
||||||
|
--error 1008
|
||||||
|
drop database ndbtest1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# test support of char(0)
|
# test support of char(0)
|
||||||
#
|
#
|
||||||
|
@ -2777,7 +2777,7 @@ int ha_ndbcluster::reset()
|
|||||||
|
|
||||||
|
|
||||||
const char **ha_ndbcluster::bas_ext() const
|
const char **ha_ndbcluster::bas_ext() const
|
||||||
{ static const char *ext[]= { ".ndb", NullS }; return ext; }
|
{ static const char *ext[]= { ha_ndb_ext, NullS }; return ext; }
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -109,6 +109,8 @@ const char *tx_isolation_names[] =
|
|||||||
TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
|
TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
|
||||||
tx_isolation_names, NULL};
|
tx_isolation_names, NULL};
|
||||||
|
|
||||||
|
static TYPELIB known_extensions= {0,"known_exts", NULL, NULL};
|
||||||
|
|
||||||
enum db_type ha_resolve_by_name(const char *name, uint namelen)
|
enum db_type ha_resolve_by_name(const char *name, uint namelen)
|
||||||
{
|
{
|
||||||
THD *thd=current_thd;
|
THD *thd=current_thd;
|
||||||
@ -1633,3 +1635,57 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns a list of all known extensions.
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
ha_known_exts()
|
||||||
|
|
||||||
|
NOTES
|
||||||
|
No mutexes, worst case race is a minor surplus memory allocation
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
pointer pointer to TYPELIB structure
|
||||||
|
*/
|
||||||
|
TYPELIB *ha_known_exts(void)
|
||||||
|
{
|
||||||
|
if (!known_extensions.type_names)
|
||||||
|
{
|
||||||
|
show_table_type_st *types;
|
||||||
|
List<char> found_exts;
|
||||||
|
List_iterator_fast<char> it(found_exts);
|
||||||
|
const char *e, **ext;
|
||||||
|
|
||||||
|
found_exts.push_back(".db");
|
||||||
|
for (types= sys_table_types; types->type; types++)
|
||||||
|
{
|
||||||
|
if (*types->value == SHOW_OPTION_YES)
|
||||||
|
{
|
||||||
|
handler *file= get_new_handler(0,(enum db_type) types->db_type);
|
||||||
|
for (ext= file->bas_ext(); *ext; ext++)
|
||||||
|
{
|
||||||
|
while (e=it++)
|
||||||
|
if (e == *ext)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!e)
|
||||||
|
found_exts.push_back((char *)*ext);
|
||||||
|
|
||||||
|
it.rewind();
|
||||||
|
}
|
||||||
|
delete file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ext= (const char **)my_once_alloc(sizeof(char *)*
|
||||||
|
(found_exts.elements+1), MYF(MY_WME));
|
||||||
|
|
||||||
|
DBUG_ASSERT(ext);
|
||||||
|
for (uint i=0; e=it++; i++)
|
||||||
|
ext[i]= e;
|
||||||
|
ext[found_exts.elements]= 0;
|
||||||
|
|
||||||
|
known_extensions.count= found_exts.elements;
|
||||||
|
known_extensions.type_names= ext;
|
||||||
|
}
|
||||||
|
return &known_extensions;
|
||||||
|
}
|
||||||
|
@ -567,5 +567,5 @@ int ha_discover(THD* thd, const char* dbname, const char* name,
|
|||||||
int ha_find_files(THD *thd,const char *db,const char *path,
|
int ha_find_files(THD *thd,const char *db,const char *path,
|
||||||
const char *wild, bool dir,List<char>* files);
|
const char *wild, bool dir,List<char>* files);
|
||||||
int ha_table_exists(THD* thd, const char* db, const char* name);
|
int ha_table_exists(THD* thd, const char* db, const char* name);
|
||||||
|
TYPELIB *ha_known_exts(void);
|
||||||
|
|
||||||
|
@ -30,11 +30,6 @@ const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS};
|
|||||||
static TYPELIB deletable_extentions=
|
static TYPELIB deletable_extentions=
|
||||||
{array_elements(del_exts)-1,"del_exts", del_exts, NULL};
|
{array_elements(del_exts)-1,"del_exts", del_exts, NULL};
|
||||||
|
|
||||||
const char *known_exts[]=
|
|
||||||
{".ISM",".ISD",".ISM",".MRG",".MYI",".MYD",".db", ".ibd", NullS};
|
|
||||||
static TYPELIB known_extentions=
|
|
||||||
{array_elements(known_exts)-1,"known_exts", known_exts, NULL};
|
|
||||||
|
|
||||||
static long mysql_rm_known_files(THD *thd, MY_DIR *dirp,
|
static long mysql_rm_known_files(THD *thd, MY_DIR *dirp,
|
||||||
const char *db, const char *path,
|
const char *db, const char *path,
|
||||||
uint level);
|
uint level);
|
||||||
@ -737,7 +732,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
|
|||||||
extension= fn_ext(file->name);
|
extension= fn_ext(file->name);
|
||||||
if (find_type(extension, &deletable_extentions,1+2) <= 0)
|
if (find_type(extension, &deletable_extentions,1+2) <= 0)
|
||||||
{
|
{
|
||||||
if (find_type(extension, &known_extentions,1+2) <= 0)
|
if (find_type(extension, ha_known_exts(),1+2) <= 0)
|
||||||
found_other_files++;
|
found_other_files++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user