Commit 97af0a0e authored by unknown's avatar unknown

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.


mysql-test/r/ndb_basic.result:
  Bug#6031
    New test for bug
mysql-test/t/ndb_basic.test:
  Bug#6031
    New test for bug
sql/ha_ndbcluster.cc:
  Cosmetic fix
sql/handler.cc:
  Bug#6031
    New function - ha_known_exts()
    We can construct TYPELIB of known db file extensions.
sql/handler.h:
  Bug#6031
    New function - ha_known_exts()
sql/sql_db.cc:
  Bug#6031
    We use a constructed list of known extensions instead of a static list
parent 81880bab
...@@ -400,6 +400,13 @@ b attr1 ...@@ -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; ...@@ -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() ...@@ -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[] = ...@@ -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, ...@@ -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, ...@@ -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}; ...@@ -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, ...@@ -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;
} }
......
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