diff --git a/mysql-test/r/ndb_autodiscover.result b/mysql-test/r/ndb_autodiscover.result index 4a2bc6e9d90..23f089b9bc0 100644 --- a/mysql-test/r/ndb_autodiscover.result +++ b/mysql-test/r/ndb_autodiscover.result @@ -332,7 +332,7 @@ Handler_discover 0 drop table t6; show tables; Tables_in_test -create table t1 (a int) engine=ndb; +create table t1 (a int,b longblob) engine=ndb; show tables; Tables_in_test t1 @@ -342,10 +342,10 @@ show tables; Tables_in_test2 select * from t1; ERROR 42S02: Table 'test2.t1' doesn't exist -create table t2 (b int) engine=ndb; +create table t2 (b int,c longblob) engine=ndb; use test; select * from t1; -a +a b show tables; Tables_in_test t1 diff --git a/mysql-test/t/ndb_autodiscover.test b/mysql-test/t/ndb_autodiscover.test index f828b009af0..95b616fc7b2 100644 --- a/mysql-test/t/ndb_autodiscover.test +++ b/mysql-test/t/ndb_autodiscover.test @@ -434,14 +434,14 @@ drop table t6; show tables; -create table t1 (a int) engine=ndb; +create table t1 (a int,b longblob) engine=ndb; show tables; create database test2; use test2; show tables; --error 1146 select * from t1; -create table t2 (b int) engine=ndb; +create table t2 (b int,c longblob) engine=ndb; use test; select * from t1; show tables; diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp index dab57948822..be8ba86c817 100644 --- a/ndb/src/ndbapi/Ndb.cpp +++ b/ndb/src/ndbapi/Ndb.cpp @@ -770,7 +770,8 @@ Ndb::getAutoIncrementValue(const char* aTableName, Uint32 cacheSize) { DEBUG_TRACE("getAutoIncrementValue"); const char * internalTableName = internalizeTableName(aTableName); - Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName); + Ndb_local_table_info *info= + theDictionary->get_local_table_info(internalTableName, false); if (info == 0) return ~0; const NdbTableImpl *table= info->m_table_impl; @@ -851,7 +852,8 @@ Ndb::setAutoIncrementValue(const char* aTableName, Uint64 val, bool increase) { DEBUG_TRACE("setAutoIncrementValue " << val); const char * internalTableName= internalizeTableName(aTableName); - Ndb_local_table_info *info= theDictionary->get_local_table_info(internalTableName); + Ndb_local_table_info *info= + theDictionary->get_local_table_info(internalTableName, false); if (info == 0) { theError= theDictionary->getNdbError(); return false; diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/ndb/src/ndbapi/NdbDictionaryImpl.cpp index ef92d07cb0c..5e640cdebd5 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -653,7 +653,8 @@ NdbDictionaryImpl::fetchGlobalTableImpl(const char * internalTableName) m_globalHash->unlock(); if (impl == 0){ - impl = m_receiver.getTable(internalTableName, m_ndb.usingFullyQualifiedNames()); + impl = m_receiver.getTable(internalTableName, + m_ndb.usingFullyQualifiedNames()); m_globalHash->lock(); m_globalHash->put(internalTableName, impl); m_globalHash->unlock(); @@ -663,15 +664,14 @@ NdbDictionaryImpl::fetchGlobalTableImpl(const char * internalTableName) } } - Ndb_local_table_info *info= Ndb_local_table_info::create(impl, m_local_table_data_size); + Ndb_local_table_info *info= + Ndb_local_table_info::create(impl, m_local_table_data_size); m_localHash.put(internalTableName, info); m_ndb.theFirstTupleId[impl->getTableId()] = ~0; m_ndb.theLastTupleId[impl->getTableId()] = ~0; - addBlobTables(*impl); - return info; } @@ -1333,12 +1333,13 @@ NdbDictionaryImpl::createTable(NdbTableImpl &t) if (t.m_noOfBlobs == 0) return 0; // update table def from DICT - NdbTableImpl * tp = getTable(t.m_externalName.c_str()); - if (tp == NULL) { + Ndb_local_table_info *info= + get_local_table_info(t.m_internalName.c_str(),false); + if (info == NULL) { m_error.code = 709; return -1; } - if (createBlobTables(* tp) != 0) { + if (createBlobTables(*(info->m_table_impl)) != 0) { int save_code = m_error.code; (void)dropTable(t); m_error.code = save_code; @@ -1359,8 +1360,12 @@ NdbDictionaryImpl::createBlobTables(NdbTableImpl &t) if (createTable(bt) != 0) return -1; // Save BLOB table handle - NdbTableImpl * cachedBlobTable = getTable(bt.m_externalName.c_str()); - c.m_blobTable = cachedBlobTable; + Ndb_local_table_info *info= + get_local_table_info(bt.m_internalName.c_str(),false); + if (info == 0) { + return -1; + } + c.m_blobTable = info->m_table_impl; } return 0; @@ -1369,14 +1374,22 @@ NdbDictionaryImpl::createBlobTables(NdbTableImpl &t) int NdbDictionaryImpl::addBlobTables(NdbTableImpl &t) { - for (unsigned i = 0; i < t.m_columns.size(); i++) { + unsigned n= t.m_noOfBlobs; + // 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;) { + i--; NdbColumnImpl & c = *t.m_columns[i]; if (! c.getBlobType() || c.getPartSize() == 0) continue; + n--; char btname[NdbBlob::BlobTableNameSize]; NdbBlob::getBlobTableName(btname, &t, &c); // Save BLOB table handle - NdbTableImpl * cachedBlobTable = getTable(btname);; + NdbTableImpl * cachedBlobTable = getTable(btname); + if (cachedBlobTable == 0) { + return -1; + } c.m_blobTable = cachedBlobTable; } @@ -1587,7 +1600,8 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb, : createTable(&tSignal, ptr); if (!alter && haveAutoIncrement) { - if (!ndb.setAutoIncrementValue(impl.m_externalName.c_str(), autoIncrementValue)) { + if (!ndb.setAutoIncrementValue(impl.m_externalName.c_str(), + autoIncrementValue)) { if (ndb.theError.code == 0) { m_error.code = 4336; ndb.theError = m_error; @@ -1607,7 +1621,6 @@ NdbDictInterface::createTable(NdbApiSignal* signal, LinearSectionPtr ptr[3]) SimplePropertiesLinearReader r(ptr[0].p, ptr[0].sz); r.printAll(ndbout); #endif - const int noErrCodes = 2; int errCodes[noErrCodes] = {CreateTableRef::Busy, @@ -1625,7 +1638,10 @@ void NdbDictInterface::execCREATE_TABLE_CONF(NdbApiSignal * signal, LinearSectionPtr ptr[3]) { - //CreateTableConf* const conf = CAST_PTR(CreateTableConf, signal->getDataPtr()); + const CreateTableConf* const conf= + CAST_CONSTPTR(CreateTableConf, signal->getDataPtr()); + Uint32 tableId= conf->tableId; + Uint32 tableVersion= conf->tableVersion; m_waiter.signal(NO_WAIT); } @@ -1634,7 +1650,8 @@ void NdbDictInterface::execCREATE_TABLE_REF(NdbApiSignal * signal, LinearSectionPtr ptr[3]) { - const CreateTableRef* const ref = CAST_CONSTPTR(CreateTableRef, signal->getDataPtr()); + const CreateTableRef* const ref= + CAST_CONSTPTR(CreateTableRef, signal->getDataPtr()); m_error.code = ref->errorCode; m_masterNodeId = ref->masterNodeId; m_waiter.signal(NO_WAIT); @@ -1648,7 +1665,6 @@ NdbDictInterface::alterTable(NdbApiSignal* signal, LinearSectionPtr ptr[3]) SimplePropertiesLinearReader r(ptr[0].p, ptr[0].sz); r.printAll(ndbout); #endif - const int noErrCodes = 2; int errCodes[noErrCodes] = {AlterTableRef::NotMaster, @@ -1871,7 +1887,8 @@ NdbIndexImpl* NdbDictionaryImpl::getIndexImpl(const char * externalName, const char * internalName) { - Ndb_local_table_info * info = get_local_table_info(internalName); + Ndb_local_table_info * info = get_local_table_info(internalName, + false); if(info == 0){ m_error.code = 4243; return 0; diff --git a/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/ndb/src/ndbapi/NdbDictionaryImpl.hpp index 1fe92db94ed..12f0946ab67 100644 --- a/ndb/src/ndbapi/NdbDictionaryImpl.hpp +++ b/ndb/src/ndbapi/NdbDictionaryImpl.hpp @@ -393,7 +393,8 @@ public: int listIndexes(List& list, Uint32 indexId); NdbTableImpl * getTable(const char * tableName, void **data= 0); - Ndb_local_table_info * get_local_table_info(const char * internalName); + Ndb_local_table_info * get_local_table_info(const char * internalName, + bool do_add_blob_tables); NdbIndexImpl * getIndex(const char * indexName, const char * tableName); NdbIndexImpl * getIndexImpl(const char * name, const char * internalName); @@ -613,8 +614,8 @@ inline NdbTableImpl * NdbDictionaryImpl::getTable(const char * tableName, void **data) { - const char * internalTableName = m_ndb.internalizeTableName(tableName); - Ndb_local_table_info *info= get_local_table_info(internalTableName); + Ndb_local_table_info *info= + get_local_table_info(m_ndb.internalizeTableName(tableName), true); if (info == 0) { return 0; } @@ -626,13 +627,22 @@ NdbDictionaryImpl::getTable(const char * tableName, void **data) inline Ndb_local_table_info * -NdbDictionaryImpl::get_local_table_info(const char * internalTableName) +NdbDictionaryImpl::get_local_table_info(const char * internalTableName, + bool do_add_blob_tables) { Ndb_local_table_info *info= m_localHash.get(internalTableName); - if (info != 0) { - return info; // autoincrement already initialized + if (info == 0) { + info= fetchGlobalTableImpl(internalTableName); + if (info == 0) { + return 0; + } } - return fetchGlobalTableImpl(internalTableName); + if (do_add_blob_tables && + info->m_table_impl->m_noOfBlobs && + addBlobTables(*(info->m_table_impl))) { + return 0; + } + return info; // autoincrement already initialized } inline @@ -647,10 +657,12 @@ NdbDictionaryImpl::getIndex(const char * indexName, if (t != 0) internalIndexName = m_ndb.internalizeIndexName(t, indexName); } else { - internalIndexName = m_ndb.internalizeTableName(indexName); // Index is also a table + internalIndexName = + m_ndb.internalizeTableName(indexName); // Index is also a table } if (internalIndexName) { - Ndb_local_table_info * info = get_local_table_info(internalIndexName); + Ndb_local_table_info * info = get_local_table_info(internalIndexName, + false); if (info) { NdbTableImpl * tab = info->m_table_impl; if (tab->m_index == 0)