#At file:///home/frazer/bzr/mysql-5.1-telco-6.3/ based on revid:frazer@stripped
3235 Frazer Clement 2010-07-26 [merge]
Merge 6.2->6.3
modified:
mysql-test/suite/ndb/r/ndb_database.result
mysql-test/suite/ndb/t/ndb_database.test
sql/ha_ndbcluster.cc
storage/ndb/src/ndbapi/NdbDictionary.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
=== modified file 'mysql-test/suite/ndb/r/ndb_database.result'
--- a/mysql-test/suite/ndb/r/ndb_database.result 2010-05-04 13:09:06 +0000
+++ b/mysql-test/suite/ndb/r/ndb_database.result 2010-07-26 11:10:10 +0000
@@ -17,3 +17,45 @@ alter offline table `mysqltest.db`.t1 ad
alter online table `mysqltest.db`.t1 add column d int column_format dynamic;
drop table `mysqltest.db`.t1;
drop database `mysqltest.db`;
+create database newdb;
+create table newdb.t1 (a int primary key) engine=myisam;
+create table newdb.t1 (a int primary key,
+b1 blob,
+b2 blob,
+b3 blob,
+b4 blob,
+b5 blob,
+b6 blob,
+b7 blob,
+b8 blob,
+b9 blob,
+b10 blob,
+b11 blob,
+b12 blob,
+b13 blob,
+b14 blob,
+b15 blob,
+b16 blob,
+b17 blob,
+b18 blob,
+b19 blob,
+b20 blob,
+b21 blob,
+b22 blob,
+b23 blob,
+b24 blob,
+b25 blob,
+b26 blob,
+b27 blob,
+b28 blob,
+b29 blob) engine = ndb;
+drop database newdb;
+create database newdb;
+use newdb;
+show tables;
+Tables_in_newdb
+create table newdb.t1(a int primary key) engine=ndb;
+show tables;
+Tables_in_newdb
+t1
+drop database newdb;
=== modified file 'mysql-test/suite/ndb/t/ndb_database.test'
--- a/mysql-test/suite/ndb/t/ndb_database.test 2010-05-04 13:09:06 +0000
+++ b/mysql-test/suite/ndb/t/ndb_database.test 2010-07-26 11:10:10 +0000
@@ -31,3 +31,64 @@ alter offline table `mysqltest.db`.t1 ad
alter online table `mysqltest.db`.t1 add column d int column_format dynamic;
drop table `mysqltest.db`.t1;
drop database `mysqltest.db`;
+#
+# bug# 54788 DROP DATABASE can remove hidden blob tables without removing parent tables
+#
+# Dropping a database on a server where Ndb tables with Blobs were
+# 'occluded' by a local table can result in Blob part tables being
+# deleted, but the main table not being deleted.
+#
+--source include/have_multi_ndb.inc
+--connection server1
+# Create database with occluding table t1
+create database newdb;
+create table newdb.t1 (a int primary key) engine=myisam;
+
+--connection server2
+# Create Ndb table with Blobs
+# Lots of Blobs to increase prob. that Ndb-list-objects returns a
+# Blob part table before the main table.
+create table newdb.t1 (a int primary key,
+ b1 blob,
+ b2 blob,
+ b3 blob,
+ b4 blob,
+ b5 blob,
+ b6 blob,
+ b7 blob,
+ b8 blob,
+ b9 blob,
+ b10 blob,
+ b11 blob,
+ b12 blob,
+ b13 blob,
+ b14 blob,
+ b15 blob,
+ b16 blob,
+ b17 blob,
+ b18 blob,
+ b19 blob,
+ b20 blob,
+ b21 blob,
+ b22 blob,
+ b23 blob,
+ b24 blob,
+ b25 blob,
+ b26 blob,
+ b27 blob,
+ b28 blob,
+ b29 blob) engine = ndb;
+
+--connection server1
+drop database newdb;
+
+--connection server2
+# Now check that the table is gone
+create database newdb;
+use newdb;
+show tables;
+
+# Check that we can reuse the table name etc.
+create table newdb.t1(a int primary key) engine=ndb;
+show tables;
+drop database newdb;
\ No newline at end of file
=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc 2010-07-14 11:01:54 +0000
+++ b/sql/ha_ndbcluster.cc 2010-07-26 11:10:10 +0000
@@ -8764,7 +8764,10 @@ int ndbcluster_drop_database_impl(THD *t
DBUG_PRINT("info", ("Found %s/%s in NDB", elmt.database, elmt.name));
// Add only tables that belongs to db
- if (my_strcasecmp(system_charset_info, elmt.database, dbname))
+ // Ignore Blob part tables - they are deleted when their table
+ // is deleted.
+ if (my_strcasecmp(system_charset_info, elmt.database, dbname) ||
+ IS_NDB_BLOB_PREFIX(elmt.name))
continue;
DBUG_PRINT("info", ("%s must be dropped", elmt.name));
drop_list.push_back(thd->strdup(elmt.name));
=== modified file 'storage/ndb/src/ndbapi/NdbDictionary.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionary.cpp 2010-03-01 13:47:16 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp 2010-07-26 11:10:10 +0000
@@ -1712,7 +1712,16 @@ int
NdbDictionary::Dictionary::createTable(const Table & t)
{
DBUG_ENTER("NdbDictionary::Dictionary::createTable");
- DBUG_RETURN(m_impl.createTable(NdbTableImpl::getImpl(t)));
+ if (likely(! is_ndb_blob_table(t.getName())))
+ {
+ DBUG_RETURN(m_impl.createTable(NdbTableImpl::getImpl(t)));
+ }
+ else
+ {
+ /* 4307 : Invalid table name */
+ m_impl.m_error.code = 4307;
+ DBUG_RETURN(-1);
+ }
}
int
@@ -1734,17 +1743,44 @@ NdbDictionary::Dictionary::optimizeIndex
int
NdbDictionary::Dictionary::dropTable(Table & t){
- return m_impl.dropTable(NdbTableImpl::getImpl(t));
+ if (likely(! is_ndb_blob_table(t.getName())))
+ {
+ return m_impl.dropTable(NdbTableImpl::getImpl(t));
+ }
+ else
+ {
+ /* 4249 : Invalid table */
+ m_impl.m_error.code = 4249;
+ return -1;
+ }
}
int
NdbDictionary::Dictionary::dropTableGlobal(const Table & t){
- return m_impl.dropTableGlobal(NdbTableImpl::getImpl(t));
+ if (likely(! is_ndb_blob_table(t.getName())))
+ {
+ return m_impl.dropTableGlobal(NdbTableImpl::getImpl(t));
+ }
+ else
+ {
+ /* 4249 : Invalid table */
+ m_impl.m_error.code = 4249;
+ return -1;
+ }
}
int
NdbDictionary::Dictionary::dropTable(const char * name){
- return m_impl.dropTable(name);
+ if (likely(! is_ndb_blob_table(name)))
+ {
+ return m_impl.dropTable(name);
+ }
+ else
+ {
+ /* 4307 : Invalid table name */
+ m_impl.m_error.code = 4307;
+ return -1;
+ }
}
bool
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2010-06-11 10:36:04 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp 2010-07-26 11:10:10 +0000
@@ -61,6 +61,19 @@ is_ndb_blob_table(const NdbTableImpl* t)
return is_ndb_blob_table(t->m_internalName.c_str());
}
+bool
+ignore_broken_blob_tables()
+{
+ /* To be able to fix broken blob tables, we must be able
+ * to ignore them when getting the table description
+ */
+ char envBuf[10];
+ const char* v = NdbEnv_GetEnv("NDB_FORCE_IGNORE_BROKEN_BLOB",
+ envBuf,
+ 10);
+ return (v != NULL && *v != 0 && *v != '0' && *v != 'n' && *v != 'N');
+}
+
//#define EVENT_DEBUG
/**
@@ -1902,7 +1915,7 @@ int
NdbDictionaryImpl::getBlobTables(NdbTableImpl &t)
{
unsigned n= t.m_noOfBlobs;
- DBUG_ENTER("NdbDictionaryImpl::addBlobTables");
+ DBUG_ENTER("NdbDictionaryImpl::getBlobTables");
// optimized for blob column being the last one
// and not looking for more than one if not neccessary
for (unsigned i = t.m_columns.size(); i > 0 && n > 0;) {
@@ -1918,7 +1931,14 @@ NdbDictionaryImpl::getBlobTables(NdbTabl
NdbTableImpl* bt =
m_receiver.getTable(btname_internal, m_ndb.usingFullyQualifiedNames());
if (bt == NULL)
+ {
+ if (ignore_broken_blob_tables())
+ {
+ DBUG_PRINT("info", ("Blob table %s not found, continuing", btname));
+ continue;
+ }
DBUG_RETURN(-1);
+ }
// TODO check primary id/version when returned by DICT
@@ -3034,13 +3054,24 @@ NdbDictInterface::compChangeMask(const N
DBUG_ENTER("compChangeMask");
bool found_varpart;
change_mask= 0;
+ Uint32 old_sz= old_impl.m_columns.size();
+ Uint32 sz= impl.m_columns.size();
/* These are the supported properties that may be altered. */
DBUG_PRINT("info", ("old_impl.m_internalName='%s' impl.m_internalName='%s'",
old_impl.m_internalName.c_str(),
impl.m_internalName.c_str()));
if(impl.m_internalName != old_impl.m_internalName)
+ {
+ if (unlikely(is_ndb_blob_table(old_impl.m_externalName.c_str()) ||
+ is_ndb_blob_table(impl.m_externalName.c_str())))
+ {
+ /* Attempt to alter to/from Blob part table name */
+ DBUG_PRINT("info", ("Attempt to alter to/from Blob part table name"));
+ goto invalid_alter_table;
+ }
AlterTableReq::setNameFlag(change_mask, true);
+ }
if(!impl.m_frm.equal(old_impl.m_frm))
AlterTableReq::setFrmFlag(change_mask, true);
if(!impl.m_fd.equal(old_impl.m_fd))
@@ -3053,8 +3084,6 @@ NdbDictInterface::compChangeMask(const N
AlterTableReq::setTsFlag(change_mask, true);
/* No other property can be changed in alter table. */
- Uint32 old_sz= old_impl.m_columns.size();
- Uint32 sz= impl.m_columns.size();
if(impl.m_fragmentCount != old_impl.m_fragmentCount ||
impl.m_logging != old_impl.m_logging ||
impl.m_temporary != old_impl.m_temporary ||
@@ -6137,13 +6166,25 @@ NdbDictionaryImpl::createDefaultNdbRecor
*/
if (col->getBlobType() && col->getPartSize() != 0)
{
- assert(col->m_blobTable != NULL);
-
- int res= createDefaultNdbRecord(col->m_blobTable, NULL);
- if (res != 0)
+ if (likely(col->m_blobTable != NULL))
{
- free(pkMask);
- DBUG_RETURN(-1);
+ int res= createDefaultNdbRecord(col->m_blobTable, NULL);
+ if (res != 0)
+ {
+ free(pkMask);
+ DBUG_RETURN(-1);
+ }
+ }
+ else
+ {
+ if (!ignore_broken_blob_tables())
+ {
+ assert(false);
+ /* 4263 - Invalid blob attributes or invalid blob parts table */
+ m_error.code = 4263;
+ free(pkMask);
+ DBUG_RETURN(-1);
+ }
}
}
}
=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2010-03-01 13:47:16 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp 2010-07-26 11:10:10 +0000
@@ -1209,6 +1209,21 @@ inline
NdbTableImpl *
NdbDictionaryImpl::getTableGlobal(const char * table_name)
{
+ if (unlikely(strchr(table_name, '$') != 0)) {
+ if (is_ndb_blob_table(table_name))
+ {
+ /* Could attempt to get the Blob table here, but
+ * instead we will generate an error.
+ * The non-global getTable() calls can fetch Blob
+ * tables correctly if necessary.
+ *
+ * 4307 Invalid Table name
+ */
+ m_error.code = 4307;
+ return NULL;
+ }
+ }
+
const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
return fetchGlobalTableImplRef(InitTable(internal_tabname));
}
Attachment: [text/bzr-bundle] bzr/frazer@mysql.com-20100726111010-k0ys7qtd4d1k10gu.bundle
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.3 branch (frazer:3235) | Frazer Clement | 26 Jul |