summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <tomas@poseidon.ndb.mysql.com>2004-10-10 08:31:45 +0000
committerunknown <tomas@poseidon.ndb.mysql.com>2004-10-10 08:31:45 +0000
commited5b9e9a3fcd6a2c2913e8d3c9d3d36d22d29d12 (patch)
tree4ae986847a4c08891f7a85e6ad5ca1c29fdf9dee
parentc428135ec8550b62a58ac061733c6c31c277a651 (diff)
downloadmariadb-git-ed5b9e9a3fcd6a2c2913e8d3c9d3d36d22d29d12.tar.gz
Fixes bug with tableImpl with blobs not being initialized properly w.r.t pointer to blob tableImpl in column
added blob to test to see that blob tables don't show up in show tables auto increment setting need not fetch blob tables (will otherwise generate error during table creation) moved addBlobTables out of fetchGlobalTableImpl to get_local_table_info changed addBlobTables to start from last column and break if all blobs added also addBlobTables will return -1 if failed (typically getTable) changed to using get_local_table_info with internal table name where applicable for efficiency added option to get_local_table_info wether to fetch blob tables or not getTable always fetches the blobtables moved addBlobTables to get_local_table_info to always be called, even if main table goes to cache only mysql-test/r/ndb_autodiscover.result: added blob to test to see that blob tables don't show up in show tables mysql-test/t/ndb_autodiscover.test: added blob to test to see that blob tables don't show up in show tables ndb/src/ndbapi/Ndb.cpp: auto increment setting need not fetch blob tables (will otherwise generate error during table creation) ndb/src/ndbapi/NdbDictionaryImpl.cpp: moved addBlobTables out of fetchGlobalTableImpl to get_local_table_info changed addBlobTables to start from last column and break if all blobs added also addBlobTables will return -1 if failed (typically getTable) changed to using get_local_table_info with internal table name where applicable for efficiency ndb/src/ndbapi/NdbDictionaryImpl.hpp: added option to get_local_table_info wether to fetch blob tables or not getTable always fetches the blobtables moved addBlobTables to get_local_table_info to always be called, even if main table goes to cache only
-rw-r--r--mysql-test/r/ndb_autodiscover.result6
-rw-r--r--mysql-test/t/ndb_autodiscover.test4
-rw-r--r--ndb/src/ndbapi/Ndb.cpp6
-rw-r--r--ndb/src/ndbapi/NdbDictionaryImpl.cpp51
-rw-r--r--ndb/src/ndbapi/NdbDictionaryImpl.hpp30
5 files changed, 64 insertions, 33 deletions
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;
+ }
+ }
+ if (do_add_blob_tables &&
+ info->m_table_impl->m_noOfBlobs &&
+ addBlobTables(*(info->m_table_impl))) {
+ return 0;
}
- return fetchGlobalTableImpl(internalTableName);
+ 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)