summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/ndb_basic.result7
-rw-r--r--mysql-test/t/ndb_basic.test15
-rw-r--r--sql/ha_ndbcluster.cc2
-rw-r--r--sql/handler.cc56
-rw-r--r--sql/handler.h2
-rw-r--r--sql/sql_db.cc7
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;
}