-- source include/have_multi_ndb.inc -- source include/not_embedded.inc --disable_warnings connection server1; DROP TABLE IF EXISTS t1,t2; connection server2; DROP TABLE IF EXISTS t1; set @old_auto_increment_offset = @@session.auto_increment_offset; set @old_auto_increment_increment = @@session.auto_increment_increment; set @old_ndb_autoincrement_prefetch_sz = @@session.ndb_autoincrement_prefetch_sz; connection server1; --enable_warnings set @old_auto_increment_offset = @@session.auto_increment_offset; set @old_auto_increment_increment = @@session.auto_increment_increment; set @old_ndb_autoincrement_prefetch_sz = @@session.ndb_autoincrement_prefetch_sz; flush status; create table t1 (a int not null auto_increment primary key) engine ndb; # Step 1: Verify simple insert insert into t1 values (NULL); select * from t1 order by a; # Step 2: Verify simple update with higher than highest value causes # next insert to use updated_value + 1 update t1 set a = 5 where a = 1; insert into t1 values (NULL); select * from t1 order by a; # Step 3: Verify insert that inserts higher than highest value causes # next insert to use inserted_value + 1 insert into t1 values (7); insert into t1 values (NULL); select * from t1 order by a; # Step 4: Verify that insert into hole, lower than highest value doesn't # affect next insert insert into t1 values (2); insert into t1 values (NULL); select * from t1 order by a; # Step 5: Verify that update into hole, lower than highest value doesn't # affect next insert update t1 set a = 4 where a = 2; insert into t1 values (NULL); select * from t1 order by a; # Step 6: Verify that delete of highest value doesn't cause the next # insert to reuse this value delete from t1 where a = 10; insert into t1 values (NULL); select * from t1 order by a; # Step 7: Verify that REPLACE has the same effect as INSERT replace t1 values (NULL); select * from t1 order by a; replace t1 values (15); select * from t1 order by a; replace into t1 values (NULL); select * from t1 order by a; # Step 8: Verify that REPLACE has the same effect as UPDATE replace t1 values (15); select * from t1 order by a; # Step 9: Verify that IGNORE doesn't affect auto_increment insert ignore into t1 values (NULL); select * from t1 order by a; insert ignore into t1 values (15), (NULL); select * from t1 order by a; # Step 10: Verify that on duplicate key as UPDATE behaves as an # UPDATE insert into t1 values (15) on duplicate key update a = 20; insert into t1 values (NULL); select * from t1 order by a; # Step 11: Verify that on duplicate key as INSERT behaves as INSERT insert into t1 values (NULL) on duplicate key update a = 30; select * from t1 order by a; insert into t1 values (30) on duplicate key update a = 40; select * from t1 order by a; #Step 12: Vefify INSERT IGNORE (bug#32055) insert ignore into t1 values(600),(NULL),(NULL),(610),(NULL); select * from t1 order by a; drop table t1; #Step 13: Verify auto_increment of unique key create table t1 (a int not null primary key, b int not null unique auto_increment) engine ndb; insert into t1 values (1, NULL); insert into t1 values (3, NULL); update t1 set b = 3 where a = 3; insert into t1 values (4, NULL); select * from t1 order by a; drop table t1; #Step 14: Verify that auto_increment_increment and auto_increment_offset # work as expected 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; #Step 15: Now verify that behaviour on multiple MySQL Servers behave # properly. Start by dropping table and recreating it to start # counters and id caches from zero again. --disable_warnings connection server2; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; set ndb_autoincrement_prefetch_sz = 32; drop table if exists t1; connection server1; SET @@session.auto_increment_offset=1; SET @@session.auto_increment_increment=1; set ndb_autoincrement_prefetch_sz = 32; --enable_warnings create table t1 (a int not null auto_increment primary key) engine ndb; # Basic test, ensure that the second server gets a new range. #Generate record with key = 1 insert into t1 values (NULL); connection server2; #Generate record with key = 33 insert into t1 values (NULL); connection server1; select * from t1 order by a; #This insert should not affect the range of the second server insert into t1 values (20); connection server2; insert into t1 values (NULL); select * from t1 order by a; connection server1; #This insert should remove cached values but also skip values already #taken by server2, given that there is no method of communicating with #the other server it should also cause a conflict connection server1; insert into t1 values (35); insert into t1 values (NULL); connection server2; --error ER_DUP_ENTRY insert into t1 values (NULL); select * from t1 order by a; insert into t1 values (100); insert into t1 values (NULL); connection server1; insert into t1 values (NULL); select * from t1 order by a; set auto_increment_offset = @old_auto_increment_offset; set auto_increment_increment = @old_auto_increment_increment; set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz; drop table t1; connection server2; set auto_increment_offset = @old_auto_increment_offset; set auto_increment_increment = @old_auto_increment_increment; set ndb_autoincrement_prefetch_sz = @old_ndb_autoincrement_prefetch_sz; # bug#46712 Auto_increment work incorrectly when using triggers and NDB Cluster # # Testing that auto_increment values are set correctly when inserting from # multiple SQL-nodes connection server1; CREATE TABLE `t1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=ndbcluster; CREATE TABLE `t2` ( `evend_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `timestamp` int(11) NOT NULL, `server_id` int(11) NOT NULL, PRIMARY KEY (`evend_id`) ) ENGINE=ndbcluster; insert into t1 values (null,1,'',''),(null,2,'',''); DELIMITER |; CREATE TRIGGER tr1 AFTER UPDATE ON t1 FOR EACH ROW BEGIN insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id); end; | DELIMITER ;| connection server2; DELIMITER |; CREATE TRIGGER tr1 AFTER UPDATE ON t1 FOR EACH ROW BEGIN insert into t2(timestamp, server_id) values(UNIX_TIMESTAMP(),@@global.server_id); end; | DELIMITER ;| connection server1; update t1 set c='foobar' where id=1; connection server2; update t1 set c='foobar' where id=1; connection server1; update t1 set c='foobar' where id=1; connection server2; update t1 set c='foobar' where id=1; connection server1; update t1 set c='foobar' where id=1; connection server2; update t1 set c='foobar' where id=1; connection server1; update t1 set c='foobar' where id=1; connection server2; update t1 set c='foobar' where id=1; connection server1; select evend_id,server_id from t2 order by evend_id; drop trigger tr1; drop table t1, t2; connection server2; --disable_warnings drop trigger if exists tr1; --enable_warnings connection server1; # # Bug #47865 SHOW CREATE TABLE does not show the current auto_increment number for ndb tables # create table t1 (a int primary key auto_increment, b int) engine=ndb; insert into t1 values (null,1),(null,2),(null,3); show create table t1; drop table t1; # # Bug #50247 ALTER TABLE cannot change auto_increment # create table t1 (a int primary key auto_increment, b int) auto_increment=5 engine=ndb; alter table t1 auto_increment=32000000; show create table t1; drop table t1;