summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormskold@mysql.com <>2005-04-07 17:44:09 +0200
committermskold@mysql.com <>2005-04-07 17:44:09 +0200
commit89b140340cf4768d2f693d0d6f264fce429a83c7 (patch)
treea991ed26c00129bfd3b8a5ba99d810e4f1ba2423
parent934f458140dc970ccc4cdb4ebb094f38c8b651c9 (diff)
downloadmariadb-git-89b140340cf4768d2f693d0d6f264fce429a83c7.tar.gz
Fix for Bug #9675 Auto-increment not working with INSERT..SELECT and NDB storage
-rw-r--r--mysql-test/r/ndb_basic.result30
-rw-r--r--mysql-test/t/ndb_basic.test25
-rw-r--r--ndb/src/ndbapi/Ndb.cpp36
-rw-r--r--sql/ha_ndbcluster.cc7
4 files changed, 83 insertions, 15 deletions
diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result
index a6396080ef0..12f9c3742e5 100644
--- a/mysql-test/r/ndb_basic.result
+++ b/mysql-test/r/ndb_basic.result
@@ -607,3 +607,33 @@ primary key (a))
engine=ndb
max_rows=1;
drop table t1;
+create table t1
+(counter int(64) NOT NULL auto_increment,
+datavalue char(40) default 'XXXX',
+primary key (counter)
+) ENGINE=ndbcluster;
+insert into t1 (datavalue) values ('newval');
+insert into t1 (datavalue) values ('newval');
+select * from t1 order by counter;
+counter datavalue
+1 newval
+2 newval
+insert into t1 (datavalue) select datavalue from t1 where counter < 100;
+select * from t1 order by counter;
+counter datavalue
+1 newval
+2 newval
+3 newval
+4 newval
+insert into t1 (datavalue) select datavalue from t1 where counter < 100;
+select * from t1 order by counter;
+counter datavalue
+1 newval
+2 newval
+3 newval
+4 newval
+35 newval
+36 newval
+37 newval
+38 newval
+drop table t1;
diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test
index f460c573a9d..35e1ddc5ebf 100644
--- a/mysql-test/t/ndb_basic.test
+++ b/mysql-test/t/ndb_basic.test
@@ -577,3 +577,28 @@ create table t1
engine=ndb
max_rows=1;
drop table t1;
+
+#
+# Test auto_increment
+#
+
+connect (con1,localhost,,,test);
+connect (con2,localhost,,,test);
+
+create table t1
+ (counter int(64) NOT NULL auto_increment,
+ datavalue char(40) default 'XXXX',
+ primary key (counter)
+ ) ENGINE=ndbcluster;
+
+connection con1;
+insert into t1 (datavalue) values ('newval');
+insert into t1 (datavalue) values ('newval');
+select * from t1 order by counter;
+insert into t1 (datavalue) select datavalue from t1 where counter < 100;
+select * from t1 order by counter;
+connection con2;
+insert into t1 (datavalue) select datavalue from t1 where counter < 100;
+select * from t1 order by counter;
+
+drop table t1;
diff --git a/ndb/src/ndbapi/Ndb.cpp b/ndb/src/ndbapi/Ndb.cpp
index b5493622b70..6390a1b50b5 100644
--- a/ndb/src/ndbapi/Ndb.cpp
+++ b/ndb/src/ndbapi/Ndb.cpp
@@ -722,26 +722,28 @@ Remark: Returns a new TupleId to the application.
Uint64
Ndb::getAutoIncrementValue(const char* aTableName, Uint32 cacheSize)
{
- DEBUG_TRACE("getAutoIncrementValue");
+ DBUG_ENTER("getAutoIncrementValue");
const char * internalTableName = internalizeTableName(aTableName);
Ndb_local_table_info *info=
theDictionary->get_local_table_info(internalTableName, false);
if (info == 0)
- return ~0;
+ DBUG_RETURN(~0);
const NdbTableImpl *table= info->m_table_impl;
Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize);
- return tupleId;
+ DBUG_PRINT("info", ("value %u", tupleId));
+ DBUG_RETURN(tupleId);
}
Uint64
Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint32 cacheSize)
{
- DEBUG_TRACE("getAutoIncrementValue");
+ DBUG_ENTER("getAutoIncrementValue");
if (aTable == 0)
- return ~0;
+ DBUG_RETURN(~0);
const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable);
Uint64 tupleId = getTupleIdFromNdb(table->m_tableId, cacheSize);
- return tupleId;
+ DBUG_PRINT("info", ("value %u", tupleId));
+ DBUG_RETURN(tupleId);
}
Uint64
@@ -756,39 +758,45 @@ Ndb::getTupleIdFromNdb(const char* aTableName, Uint32 cacheSize)
Uint64
Ndb::getTupleIdFromNdb(Uint32 aTableId, Uint32 cacheSize)
{
+ DBUG_ENTER("getTupleIdFromNdb");
if ( theFirstTupleId[aTableId] != theLastTupleId[aTableId] )
{
theFirstTupleId[aTableId]++;
- return theFirstTupleId[aTableId];
+ DBUG_PRINT("info", ("next cached value %u", theFirstTupleId[aTableId]));
+ DBUG_RETURN(theFirstTupleId[aTableId]);
}
else // theFirstTupleId == theLastTupleId
{
- return opTupleIdOnNdb(aTableId, cacheSize, 0);
+ DBUG_PRINT("info",("reading %u values from database",
+ (cacheSize == 0) ? 1 : cacheSize));
+ DBUG_RETURN(opTupleIdOnNdb(aTableId, (cacheSize == 0) ? 1 : cacheSize, 0));
}
}
Uint64
Ndb::readAutoIncrementValue(const char* aTableName)
{
- DEBUG_TRACE("readtAutoIncrementValue");
+ DBUG_ENTER("readtAutoIncrementValue");
const NdbTableImpl* table = theDictionary->getTable(aTableName);
if (table == 0) {
theError= theDictionary->getNdbError();
- return ~0;
+ DBUG_RETURN(~0);
}
Uint64 tupleId = readTupleIdFromNdb(table->m_tableId);
- return tupleId;
+ DBUG_PRINT("info", ("value %u", tupleId));
+ DBUG_RETURN(tupleId);
}
Uint64
Ndb::readAutoIncrementValue(const NdbDictionary::Table * aTable)
{
- DEBUG_TRACE("readtAutoIncrementValue");
+ DBUG_ENTER("readtAutoIncrementValue");
if (aTable == 0)
- return ~0;
+ DBUG_RETURN(~0);
const NdbTableImpl* table = & NdbTableImpl::getImpl(*aTable);
Uint64 tupleId = readTupleIdFromNdb(table->m_tableId);
- return tupleId;
+ DBUG_PRINT("info", ("value %u", tupleId));
+ DBUG_RETURN(tupleId);
}
Uint64
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 7025ac2cd1a..31b16d58b62 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -2920,7 +2920,11 @@ void ha_ndbcluster::start_bulk_insert(ha_rows rows)
DBUG_PRINT("enter", ("rows: %d", (int)rows));
m_rows_inserted= 0;
- m_rows_to_insert= rows;
+ if (rows == 0)
+ /* We don't know how many will be inserted, guess */
+ m_rows_to_insert= m_autoincrement_prefetch;
+ else
+ m_rows_to_insert= rows;
/*
Calculate how many rows that should be inserted
@@ -3929,6 +3933,7 @@ longlong ha_ndbcluster::get_auto_increment()
DBUG_ENTER("get_auto_increment");
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
Ndb *ndb= get_ndb();
+
int cache_size=
(m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ?
m_rows_to_insert - m_rows_inserted