Loading mysql-test/r/ndb_insert.result +169 −0 Original line number Diff line number Diff line Loading @@ -657,3 +657,172 @@ a b 2 NULL 3 NULL drop table t1; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 1 1 0 11 2 1 21 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_offset=5; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t1 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 27 4 3 35 5 4 99 6 5 105 7 6 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 7 TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_increment=2; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 1 1 0 3 2 1 5 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 7 1 0 8 2 1 9 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 3; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 3; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 15 1 0 25 2 1 35 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 5; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 5; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 100; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 100; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 105 1 0 115 2 1 125 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; mysql-test/t/ndb_insert.test +137 −0 Original line number Diff line number Diff line Loading @@ -639,4 +639,141 @@ insert ignore into t1 values (1,0), (2,0), (2,null), (3,null); select * from t1 order by a; drop table t1; # Bug#26342 auto_increment_increment AND auto_increment_offset REALLY REALLY anger NDB cluster CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_offset=5; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t1 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_increment=2; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 3; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 3; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 5; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 5; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 100; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 100; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; # End of 4.1 tests ndb/include/ndbapi/Ndb.hpp +6 −3 Original line number Diff line number Diff line Loading @@ -1388,9 +1388,11 @@ public: * @return 0 or -1 on error, and tupleId in out parameter */ int getAutoIncrementValue(const char* aTableName, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1); int getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1); int readAutoIncrementValue(const char* aTableName, Uint64 & tupleId); int readAutoIncrementValue(const NdbDictionary::Table * aTable, Loading @@ -1401,7 +1403,8 @@ public: Uint64 tupleId, bool increase); private: int getTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1 ); int readTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId); int setTupleIdInNdb(Ndb_local_table_info* info, Loading ndb/src/ndbapi/Ndb.cpp +73 −24 Original line number Diff line number Diff line Loading @@ -767,17 +767,27 @@ Ndb::getNodeId() } /**************************************************************************** Uint64 getTupleIdFromNdb( Uint32 aTableId, Uint32 cacheSize ); Parameters: aTableId : The TableId. cacheSize: Prefetch this many values Remark: Returns a new TupleId to the application. The TupleId comes from SYSTAB_0 where SYSKEY_0 = TableId. It is initialized to (TableId << 48) + 1 in NdbcntrMain.cpp. Uint64 getAutoIncrementValue( const char* aTableName, Uint64 & tupleId, Uint32 cacheSize, Uint64 step, Uint64 start); Parameters: aTableName (IN) : The table name. autoValue (OUT) : Returns new autoincrement value cacheSize (IN) : Prefetch this many values step (IN) : Specifies the step between the autoincrement values. start (IN) : Start value for first value Remark: Returns a new autoincrement value to the application. The autoincrement values can be increased by steps (default 1) and a number of values can be prefetched by specifying cacheSize (default 10). ****************************************************************************/ int Ndb::getAutoIncrementValue(const char* aTableName, Uint64 & tupleId, Uint32 cacheSize) Uint64 & autoValue, Uint32 cacheSize, Uint64 step, Uint64 start) { DBUG_ENTER("Ndb::getAutoIncrementValue"); BaseString internal_tabname(internalize_table_name(aTableName)); Loading @@ -788,15 +798,17 @@ Ndb::getAutoIncrementValue(const char* aTableName, theError.code = theDictionary->getNdbError().code; DBUG_RETURN(-1); } if (getTupleIdFromNdb(info, tupleId, cacheSize) == -1) DBUG_PRINT("info", ("step %lu", (ulong) step)); if (getTupleIdFromNdb(info, autoValue, cacheSize, step, start) == -1) DBUG_RETURN(-1); DBUG_PRINT("info", ("value %lu", (ulong) tupleId)); DBUG_PRINT("info", ("value %lu", (ulong) autoValue)); DBUG_RETURN(0); } int Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint64 & tupleId, Uint32 cacheSize) Uint64 & autoValue, Uint32 cacheSize, Uint64 step, Uint64 start) { DBUG_ENTER("Ndb::getAutoIncrementValue"); assert(aTable != 0); Loading @@ -809,36 +821,73 @@ Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, theError.code = theDictionary->getNdbError().code; DBUG_RETURN(-1); } if (getTupleIdFromNdb(info, tupleId, cacheSize) == -1) DBUG_PRINT("info", ("step %lu", (ulong) step)); if (getTupleIdFromNdb(info, autoValue, cacheSize, step, start) == -1) DBUG_RETURN(-1); DBUG_PRINT("info", ("value %lu", (ulong)tupleId)); DBUG_PRINT("info", ("value %lu", (ulong) autoValue)); DBUG_RETURN(0); } int Ndb::getTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId, Uint32 cacheSize) Uint64 & tupleId, Uint32 cacheSize, Uint64 step, Uint64 start) { /* Returns a new TupleId to the application. The TupleId comes from SYSTAB_0 where SYSKEY_0 = TableId. It is initialized to (TableId << 48) + 1 in NdbcntrMain.cpp. In most cases step= start= 1, in which case we get: 1,2,3,4,5,... If step=10 and start=5 and first number is 1, we get: 5,15,25,35,... */ DBUG_ENTER("Ndb::getTupleIdFromNdb"); if (info->m_first_tuple_id != info->m_last_tuple_id) DBUG_PRINT("info", ("Step %lu (%lu,%lu)", (ulong) step, (ulong) info->m_first_tuple_id, (ulong) info->m_last_tuple_id)); /* Check if the next value can be taken from the pre-fetched sequence. */ if (info->m_first_tuple_id != info->m_last_tuple_id && info->m_first_tuple_id + step <= info->m_last_tuple_id) { assert(info->m_first_tuple_id < info->m_last_tuple_id); tupleId = ++info->m_first_tuple_id; DBUG_PRINT("info", ("next cached value %lu", (ulong)tupleId)); info->m_first_tuple_id += step; tupleId = info->m_first_tuple_id; DBUG_PRINT("info", ("Next cached value %lu", (ulong) tupleId)); } else { /* If start value is greater than step it is ignored */ Uint64 offset = (start > step) ? 1 : start; /* Pre-fetch a number of values depending on cacheSize */ if (cacheSize == 0) cacheSize = 1; DBUG_PRINT("info", ("reading %u values from database", (uint)cacheSize)); DBUG_PRINT("info", ("Reading %u values from database", (uint)cacheSize)); /* * reserve next cacheSize entries in db. adds cacheSize to NEXTID * and returns first tupleId in the new range. * and returns first tupleId in the new range. If tupleId's are * incremented in steps then multiply the cacheSize with step size. */ Uint64 opValue = cacheSize; Uint64 opValue = cacheSize * step; if (opTupleIdOnNdb(info, opValue, 0) == -1) DBUG_RETURN(-1); tupleId = opValue; DBUG_PRINT("info", ("Next value fetched from database %lu", (ulong) opValue)); DBUG_PRINT("info", ("Increasing %lu by offset %lu, increment is %lu", (ulong) (ulong) opValue, (ulong) offset, (ulong) step)); Uint64 current, next; next = ((Uint64) (opValue + step - offset)) / step; next = next * step + offset; current = (next < step) ? next : next - step; tupleId = (opValue <= current) ? current : next; DBUG_PRINT("info", ("Returning %lu", (ulong) tupleId)); info->m_first_tuple_id = tupleId; } DBUG_RETURN(0); } Loading sql/ha_ndbcluster.cc +7 −6 Original line number Diff line number Diff line Loading @@ -2248,8 +2248,6 @@ int ha_ndbcluster::write_row(byte *record) m_skip_auto_increment= FALSE; if ((error= update_auto_increment())) DBUG_RETURN(error); /* Ensure that handler is always called for auto_increment values */ thd->next_insert_id= 0; m_skip_auto_increment= !auto_increment_column_changed; } } Loading Loading @@ -4830,6 +4828,8 @@ ulonglong ha_ndbcluster::get_auto_increment() { int cache_size; Uint64 auto_value; Uint64 step= current_thd->variables.auto_increment_increment; Uint64 start= current_thd->variables.auto_increment_offset; DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); Loading @@ -4851,7 +4851,7 @@ ulonglong ha_ndbcluster::get_auto_increment() if (m_skip_auto_increment && ndb->readAutoIncrementValue((const NDBTAB *) m_table, auto_value) || ndb->getAutoIncrementValue((const NDBTAB *) m_table, auto_value, cache_size)) auto_value, cache_size, step, start)) { if (--retries && ndb->getNdbError().status == NdbError::TemporaryError); Loading Loading @@ -4888,7 +4888,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): HA_NEED_READ_RANGE_BUFFER | HA_CAN_GEOMETRY | HA_CAN_BIT_FIELD | HA_PARTIAL_COLUMN_READ), HA_PARTIAL_COLUMN_READ | HA_EXTERNAL_AUTO_INCREMENT), m_share(0), m_use_write(FALSE), m_ignore_dup_key(FALSE), Loading Loading
mysql-test/r/ndb_insert.result +169 −0 Original line number Diff line number Diff line Loading @@ -657,3 +657,172 @@ a b 2 NULL 3 NULL drop table t1; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 1 1 0 11 2 1 21 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_offset=5; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t1 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 27 4 3 35 5 4 99 6 5 105 7 6 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 7 TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_increment=2; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 1 1 0 3 2 1 5 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 7 1 0 8 2 1 9 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 3; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 3; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 15 1 0 25 2 1 35 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 5; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 5; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 5 1 0 15 2 1 25 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 100; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 100; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; pk b c 105 1 0 115 2 1 125 3 2 SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; COUNT(t1.pk) 3 DROP TABLE t1, t2;
mysql-test/t/ndb_insert.test +137 −0 Original line number Diff line number Diff line Loading @@ -639,4 +639,141 @@ insert ignore into t1 values (1,0), (2,0), (2,null), (3,null); select * from t1 order by a; drop table t1; # Bug#26342 auto_increment_increment AND auto_increment_offset REALLY REALLY anger NDB cluster CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_offset=5; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t1 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (pk,b,c) VALUES (27,4,3),(NULL,5,4),(99,6,5),(NULL,7,6); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; TRUNCATE t1; TRUNCATE t2; SET @@session.auto_increment_increment=2; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 3; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 3; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 7; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 7; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 5; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 5; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; CREATE TABLE t1 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=NDBCLUSTER AUTO_INCREMENT = 100; CREATE TABLE t2 ( pk INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT NOT NULL, c INT NOT NULL UNIQUE ) ENGINE=MYISAM AUTO_INCREMENT = 100; SET @@session.auto_increment_offset=5; SET @@session.auto_increment_increment=10; INSERT INTO t1 (b,c) VALUES (1,0),(2,1),(3,2); INSERT INTO t2 (b,c) VALUES (1,0),(2,1),(3,2); SELECT * FROM t1 ORDER BY pk; SELECT COUNT(t1.pk) FROM t1, t2 WHERE t1.pk = t2.pk AND t1.b = t2.b AND t1.c = t1.c; DROP TABLE t1, t2; # End of 4.1 tests
ndb/include/ndbapi/Ndb.hpp +6 −3 Original line number Diff line number Diff line Loading @@ -1388,9 +1388,11 @@ public: * @return 0 or -1 on error, and tupleId in out parameter */ int getAutoIncrementValue(const char* aTableName, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1); int getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1); int readAutoIncrementValue(const char* aTableName, Uint64 & tupleId); int readAutoIncrementValue(const NdbDictionary::Table * aTable, Loading @@ -1401,7 +1403,8 @@ public: Uint64 tupleId, bool increase); private: int getTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId, Uint32 cacheSize); Uint64 & tupleId, Uint32 cacheSize, Uint64 step = 1, Uint64 start = 1 ); int readTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId); int setTupleIdInNdb(Ndb_local_table_info* info, Loading
ndb/src/ndbapi/Ndb.cpp +73 −24 Original line number Diff line number Diff line Loading @@ -767,17 +767,27 @@ Ndb::getNodeId() } /**************************************************************************** Uint64 getTupleIdFromNdb( Uint32 aTableId, Uint32 cacheSize ); Parameters: aTableId : The TableId. cacheSize: Prefetch this many values Remark: Returns a new TupleId to the application. The TupleId comes from SYSTAB_0 where SYSKEY_0 = TableId. It is initialized to (TableId << 48) + 1 in NdbcntrMain.cpp. Uint64 getAutoIncrementValue( const char* aTableName, Uint64 & tupleId, Uint32 cacheSize, Uint64 step, Uint64 start); Parameters: aTableName (IN) : The table name. autoValue (OUT) : Returns new autoincrement value cacheSize (IN) : Prefetch this many values step (IN) : Specifies the step between the autoincrement values. start (IN) : Start value for first value Remark: Returns a new autoincrement value to the application. The autoincrement values can be increased by steps (default 1) and a number of values can be prefetched by specifying cacheSize (default 10). ****************************************************************************/ int Ndb::getAutoIncrementValue(const char* aTableName, Uint64 & tupleId, Uint32 cacheSize) Uint64 & autoValue, Uint32 cacheSize, Uint64 step, Uint64 start) { DBUG_ENTER("Ndb::getAutoIncrementValue"); BaseString internal_tabname(internalize_table_name(aTableName)); Loading @@ -788,15 +798,17 @@ Ndb::getAutoIncrementValue(const char* aTableName, theError.code = theDictionary->getNdbError().code; DBUG_RETURN(-1); } if (getTupleIdFromNdb(info, tupleId, cacheSize) == -1) DBUG_PRINT("info", ("step %lu", (ulong) step)); if (getTupleIdFromNdb(info, autoValue, cacheSize, step, start) == -1) DBUG_RETURN(-1); DBUG_PRINT("info", ("value %lu", (ulong) tupleId)); DBUG_PRINT("info", ("value %lu", (ulong) autoValue)); DBUG_RETURN(0); } int Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, Uint64 & tupleId, Uint32 cacheSize) Uint64 & autoValue, Uint32 cacheSize, Uint64 step, Uint64 start) { DBUG_ENTER("Ndb::getAutoIncrementValue"); assert(aTable != 0); Loading @@ -809,36 +821,73 @@ Ndb::getAutoIncrementValue(const NdbDictionary::Table * aTable, theError.code = theDictionary->getNdbError().code; DBUG_RETURN(-1); } if (getTupleIdFromNdb(info, tupleId, cacheSize) == -1) DBUG_PRINT("info", ("step %lu", (ulong) step)); if (getTupleIdFromNdb(info, autoValue, cacheSize, step, start) == -1) DBUG_RETURN(-1); DBUG_PRINT("info", ("value %lu", (ulong)tupleId)); DBUG_PRINT("info", ("value %lu", (ulong) autoValue)); DBUG_RETURN(0); } int Ndb::getTupleIdFromNdb(Ndb_local_table_info* info, Uint64 & tupleId, Uint32 cacheSize) Uint64 & tupleId, Uint32 cacheSize, Uint64 step, Uint64 start) { /* Returns a new TupleId to the application. The TupleId comes from SYSTAB_0 where SYSKEY_0 = TableId. It is initialized to (TableId << 48) + 1 in NdbcntrMain.cpp. In most cases step= start= 1, in which case we get: 1,2,3,4,5,... If step=10 and start=5 and first number is 1, we get: 5,15,25,35,... */ DBUG_ENTER("Ndb::getTupleIdFromNdb"); if (info->m_first_tuple_id != info->m_last_tuple_id) DBUG_PRINT("info", ("Step %lu (%lu,%lu)", (ulong) step, (ulong) info->m_first_tuple_id, (ulong) info->m_last_tuple_id)); /* Check if the next value can be taken from the pre-fetched sequence. */ if (info->m_first_tuple_id != info->m_last_tuple_id && info->m_first_tuple_id + step <= info->m_last_tuple_id) { assert(info->m_first_tuple_id < info->m_last_tuple_id); tupleId = ++info->m_first_tuple_id; DBUG_PRINT("info", ("next cached value %lu", (ulong)tupleId)); info->m_first_tuple_id += step; tupleId = info->m_first_tuple_id; DBUG_PRINT("info", ("Next cached value %lu", (ulong) tupleId)); } else { /* If start value is greater than step it is ignored */ Uint64 offset = (start > step) ? 1 : start; /* Pre-fetch a number of values depending on cacheSize */ if (cacheSize == 0) cacheSize = 1; DBUG_PRINT("info", ("reading %u values from database", (uint)cacheSize)); DBUG_PRINT("info", ("Reading %u values from database", (uint)cacheSize)); /* * reserve next cacheSize entries in db. adds cacheSize to NEXTID * and returns first tupleId in the new range. * and returns first tupleId in the new range. If tupleId's are * incremented in steps then multiply the cacheSize with step size. */ Uint64 opValue = cacheSize; Uint64 opValue = cacheSize * step; if (opTupleIdOnNdb(info, opValue, 0) == -1) DBUG_RETURN(-1); tupleId = opValue; DBUG_PRINT("info", ("Next value fetched from database %lu", (ulong) opValue)); DBUG_PRINT("info", ("Increasing %lu by offset %lu, increment is %lu", (ulong) (ulong) opValue, (ulong) offset, (ulong) step)); Uint64 current, next; next = ((Uint64) (opValue + step - offset)) / step; next = next * step + offset; current = (next < step) ? next : next - step; tupleId = (opValue <= current) ? current : next; DBUG_PRINT("info", ("Returning %lu", (ulong) tupleId)); info->m_first_tuple_id = tupleId; } DBUG_RETURN(0); } Loading
sql/ha_ndbcluster.cc +7 −6 Original line number Diff line number Diff line Loading @@ -2248,8 +2248,6 @@ int ha_ndbcluster::write_row(byte *record) m_skip_auto_increment= FALSE; if ((error= update_auto_increment())) DBUG_RETURN(error); /* Ensure that handler is always called for auto_increment values */ thd->next_insert_id= 0; m_skip_auto_increment= !auto_increment_column_changed; } } Loading Loading @@ -4830,6 +4828,8 @@ ulonglong ha_ndbcluster::get_auto_increment() { int cache_size; Uint64 auto_value; Uint64 step= current_thd->variables.auto_increment_increment; Uint64 start= current_thd->variables.auto_increment_offset; DBUG_ENTER("get_auto_increment"); DBUG_PRINT("enter", ("m_tabname: %s", m_tabname)); Ndb *ndb= get_ndb(); Loading @@ -4851,7 +4851,7 @@ ulonglong ha_ndbcluster::get_auto_increment() if (m_skip_auto_increment && ndb->readAutoIncrementValue((const NDBTAB *) m_table, auto_value) || ndb->getAutoIncrementValue((const NDBTAB *) m_table, auto_value, cache_size)) auto_value, cache_size, step, start)) { if (--retries && ndb->getNdbError().status == NdbError::TemporaryError); Loading Loading @@ -4888,7 +4888,8 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): HA_NEED_READ_RANGE_BUFFER | HA_CAN_GEOMETRY | HA_CAN_BIT_FIELD | HA_PARTIAL_COLUMN_READ), HA_PARTIAL_COLUMN_READ | HA_EXTERNAL_AUTO_INCREMENT), m_share(0), m_use_write(FALSE), m_ignore_dup_key(FALSE), Loading