diff options
-rw-r--r-- | mysql-test/r/ndb_basic.result | 7 | ||||
-rw-r--r-- | mysql-test/t/ndb_basic.test | 15 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 2 | ||||
-rw-r--r-- | sql/handler.cc | 56 | ||||
-rw-r--r-- | sql/handler.h | 2 | ||||
-rw-r--r-- | sql/sql_db.cc | 7 |
6 files changed, 81 insertions, 8 deletions
diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result index ba8ee820ad9..6ec5338acbe 100644 --- a/mysql-test/r/ndb_basic.result +++ b/mysql-test/r/ndb_basic.result @@ -400,6 +400,13 @@ b attr1 9413 9412 drop table test.t1, t2; 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; create table t1 (a int primary key, b char(0)); insert into t1 values (1,""); diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test index b62d2a8e0e1..2671223ada8 100644 --- a/mysql-test/t/ndb_basic.test +++ b/mysql-test/t/ndb_basic.test @@ -361,6 +361,21 @@ drop table test.t1, t2; 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) # diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 5971c1a6c2a..d9545d5cbb8 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -2777,7 +2777,7 @@ int ha_ndbcluster::reset() 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; } /* diff --git a/sql/handler.cc b/sql/handler.cc index f7a1a6ef0bf..2c274c7989e 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -109,6 +109,8 @@ const char *tx_isolation_names[] = TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"", 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) { THD *thd=current_thd; @@ -1633,3 +1635,57 @@ int handler::index_read_idx(byte * buf, uint index, const byte * key, 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; +} diff --git a/sql/handler.h b/sql/handler.h index a7ce4e708fd..54a416d80ad 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -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, const char *wild, bool dir,List<char>* files); int ha_table_exists(THD* thd, const char* db, const char* name); - +TYPELIB *ha_known_exts(void); diff --git a/sql/sql_db.cc b/sql/sql_db.cc index e50796f2a33..350a7432990 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -30,11 +30,6 @@ const char *del_exts[]= {".frm", ".BAK", ".TMD",".opt", NullS}; static TYPELIB deletable_extentions= {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, const char *db, const char *path, 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); 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++; continue; } |