summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <mskold@mysql.com>2005-04-22 15:28:23 +0200
committerunknown <mskold@mysql.com>2005-04-22 15:28:23 +0200
commit639d4295c69dbe32076979c0854ac40b42820223 (patch)
treea8af3475b78c7c08f7ce31b2bde9079f8920cec3
parente2f5671064639b4dfe22fda07349fa00220a9af2 (diff)
downloadmariadb-git-639d4295c69dbe32076979c0854ac40b42820223.tar.gz
Fix for Bug #9318 drop database does not drop ndb tables
-rw-r--r--mysql-test/r/ndb_database.result27
-rw-r--r--mysql-test/t/ndb_database.test50
-rw-r--r--sql/ha_ndbcluster.cc123
-rw-r--r--sql/ha_ndbcluster.h6
4 files changed, 154 insertions, 52 deletions
diff --git a/mysql-test/r/ndb_database.result b/mysql-test/r/ndb_database.result
new file mode 100644
index 00000000000..566a3eaf3dd
--- /dev/null
+++ b/mysql-test/r/ndb_database.result
@@ -0,0 +1,27 @@
+drop table if exists t1;
+drop database if exists mysqltest;
+drop table if exists t1;
+drop database if exists mysqltest;
+create database mysqltest;
+create database mysqltest;
+create table mysqltest.t1 (a int primary key, b int) engine=ndb;
+use mysqltest;
+show tables;
+Tables_in_mysqltest
+t1
+drop database mysqltest;
+use mysqltest;
+show tables;
+Tables_in_mysqltest
+create database mysqltest;
+create table mysqltest.t1 (c int, d int primary key) engine=ndb;
+use mysqltest;
+show tables;
+Tables_in_mysqltest
+t1
+drop database mysqltest;
+use mysqltest;
+show tables;
+Tables_in_mysqltest
+drop table if exists t1;
+drop database if exists mysqltest;
diff --git a/mysql-test/t/ndb_database.test b/mysql-test/t/ndb_database.test
new file mode 100644
index 00000000000..1264c3fa73b
--- /dev/null
+++ b/mysql-test/t/ndb_database.test
@@ -0,0 +1,50 @@
+-- source include/have_ndb.inc
+-- source include/have_multi_ndb.inc
+-- source include/not_embedded.inc
+
+--disable_warnings
+connection server1;
+drop table if exists t1;
+drop database if exists mysqltest;
+connection server2;
+drop table if exists t1;
+drop database if exists mysqltest;
+--enable_warnings
+
+#
+# Check that all tables in a database are dropped when database is dropped
+#
+
+connection server1;
+create database mysqltest;
+
+connection server2;
+create database mysqltest;
+create table mysqltest.t1 (a int primary key, b int) engine=ndb;
+use mysqltest;
+show tables;
+
+connection server1;
+drop database mysqltest;
+
+connection server2;
+use mysqltest;
+show tables;
+
+connection server1;
+create database mysqltest;
+create table mysqltest.t1 (c int, d int primary key) engine=ndb;
+use mysqltest;
+show tables;
+
+connection server2;
+drop database mysqltest;
+
+connection server1;
+use mysqltest;
+show tables;
+
+--disable_warnings
+drop table if exists t1;
+drop database if exists mysqltest;
+--enable_warnings
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index bf8db96c76f..230ca2826b2 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -3965,18 +3965,6 @@ int ha_ndbcluster::drop_table()
}
-/*
- Drop a database in NDB Cluster
- */
-
-int ndbcluster_drop_database(const char *path)
-{
- DBUG_ENTER("ndbcluster_drop_database");
- // TODO drop all tables for this database
- DBUG_RETURN(1);
-}
-
-
longlong ha_ndbcluster::get_auto_increment()
{
DBUG_ENTER("get_auto_increment");
@@ -4325,6 +4313,53 @@ extern "C" byte* tables_get_key(const char *entry, uint *length,
}
+/*
+ Drop a database in NDB Cluster
+ */
+
+int ndbcluster_drop_database(const char *path)
+{
+ DBUG_ENTER("ndbcluster_drop_database");
+ THD *thd= current_thd;
+ char dbname[FN_HEADLEN];
+ Ndb* ndb;
+ NdbDictionary::Dictionary::List list;
+ uint i;
+ char *tabname;
+ List<char> drop_list;
+ ha_ndbcluster::set_dbname(path, (char *)&dbname);
+ DBUG_PRINT("enter", ("db: %s", dbname));
+
+ if (!(ndb= check_ndb_in_thd(thd)))
+ DBUG_RETURN(HA_ERR_NO_CONNECTION);
+
+ // List tables in NDB
+ NDBDICT *dict= ndb->getDictionary();
+ if (dict->listObjects(list,
+ NdbDictionary::Object::UserTable) != 0)
+ ERR_RETURN(dict->getNdbError());
+ for (i= 0 ; i < list.count ; i++)
+ {
+ NdbDictionary::Dictionary::List::Element& t= list.elements[i];
+ DBUG_PRINT("info", ("Found %s/%s in NDB", t.database, t.name));
+
+ // Add only tables that belongs to db
+ if (my_strcasecmp(system_charset_info, t.database, dbname))
+ continue;
+ DBUG_PRINT("info", ("%s must be dropped", t.name));
+ drop_list.push_back(thd->strdup(t.name));
+ }
+ // Drop any tables belonging to database
+ ndb->setDatabaseName(dbname);
+ List_iterator_fast<char> it(drop_list);
+ while ((tabname=it++))
+ if (dict->dropTable(tabname))
+ ERR_RETURN(dict->getNdbError());
+
+ DBUG_RETURN(0);
+}
+
+
int ndbcluster_find_files(THD *thd,const char *db,const char *path,
const char *wild, bool dir, List<char> *files)
{
@@ -4595,26 +4630,31 @@ void ndbcluster_print_error(int error, const NdbOperation *error_op)
DBUG_VOID_RETURN;
}
-/*
- Set m_tabname from full pathname to table file
+/**
+ * Set a given location from full pathname to database name
+ *
*/
-
-void ha_ndbcluster::set_tabname(const char *path_name)
+void ha_ndbcluster::set_dbname(const char *path_name, char *dbname)
{
char *end, *ptr;
/* Scan name from the end */
- end= strend(path_name)-1;
- ptr= end;
+ ptr= strend(path_name)-1;
+ while (ptr >= path_name && *ptr != '\\' && *ptr != '/') {
+ ptr--;
+ }
+ ptr--;
+ end= ptr;
while (ptr >= path_name && *ptr != '\\' && *ptr != '/') {
ptr--;
}
uint name_len= end - ptr;
- memcpy(m_tabname, ptr + 1, end - ptr);
- m_tabname[name_len]= '\0';
+ memcpy(dbname, ptr + 1, name_len);
+ dbname[name_len]= '\0';
#ifdef __WIN__
/* Put to lower case */
- ptr= m_tabname;
+
+ ptr= dbname;
while (*ptr != '\0') {
*ptr= tolower(*ptr);
@@ -4623,6 +4663,15 @@ void ha_ndbcluster::set_tabname(const char *path_name)
#endif
}
+/*
+ Set m_dbname from full pathname to table file
+ */
+
+void ha_ndbcluster::set_dbname(const char *path_name)
+{
+ set_dbname(path_name, m_dbname);
+}
+
/**
* Set a given location from full pathname to table file
*
@@ -4652,39 +4701,13 @@ ha_ndbcluster::set_tabname(const char *path_name, char * tabname)
#endif
}
-
/*
- Set m_dbname from full pathname to table file
-
+ Set m_tabname from full pathname to table file
*/
-void ha_ndbcluster::set_dbname(const char *path_name)
+void ha_ndbcluster::set_tabname(const char *path_name)
{
- char *end, *ptr;
-
- /* Scan name from the end */
- ptr= strend(path_name)-1;
- while (ptr >= path_name && *ptr != '\\' && *ptr != '/') {
- ptr--;
- }
- ptr--;
- end= ptr;
- while (ptr >= path_name && *ptr != '\\' && *ptr != '/') {
- ptr--;
- }
- uint name_len= end - ptr;
- memcpy(m_dbname, ptr + 1, name_len);
- m_dbname[name_len]= '\0';
-#ifdef __WIN__
- /* Put to lower case */
-
- ptr= m_dbname;
-
- while (*ptr != '\0') {
- *ptr= tolower(*ptr);
- ptr++;
- }
-#endif
+ set_tabname(path_name, m_tabname);
}
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 9fab34448ce..ac2d27b9ec7 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -147,7 +147,10 @@ class ha_ndbcluster: public handler
static Thd_ndb* seize_thd_ndb();
static void release_thd_ndb(Thd_ndb* thd_ndb);
uint8 table_cache_type();
-
+
+ static void set_dbname(const char *pathname, char *dbname);
+ static void set_tabname(const char *pathname, char *tabname);
+
private:
int alter_table_name(const char *to);
int drop_table();
@@ -183,7 +186,6 @@ class ha_ndbcluster: public handler
void set_dbname(const char *pathname);
void set_tabname(const char *pathname);
- void set_tabname(const char *pathname, char *tabname);
bool set_hidden_key(NdbOperation*,
uint fieldnr, const byte* field_ptr);