# The include statement below is a temp one for tests that are yet to
#be ported to run with InnoDB,
#but needs to be kept for tests that would need MyISAM in future.
--source include/force_myisam_default.inc

-- 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;

#
# Bug #46985 Got error 4350 'Transaction already aborted' from NDBCLUSTER
#
# This bug was a configuration issue, but the testcase revealed another
# bug whereauto_increment was not handled correctly for INSERT IGNORE

CREATE TABLE t1 (
  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  data binary(16) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_t1_data (data)
) ENGINE = NDB;

INSERT IGNORE INTO t1 (data) VALUES (6),(6),(6),(6),(6),(6),(6);

SELECT id FROM t1;

DELETE from t1;

INSERT IGNORE INTO t1 (data) VALUES (6),(6),(6),(6),(6),(6),(6);

SELECT id from t1;

DROP TABLE t1;

#
# Bug #13731134	AUTO-INC COUNTER IS NOT UPDATED WITH EXPLICIT @@INSERT_ID SET
#

create table t1 (a serial) engine ndb;

set @@insert_id=1;
insert into t1 values(null);

connection server2;

insert into t1 values(null);
insert into t1 values(null);
insert into t1 values(null);
set @@insert_id=17;
insert into t1 values(null);
insert into t1 values(null);
insert into t1 values(null);
select * from t1 order by a;

set @@insert_id=1;
--error ER_DUP_ENTRY
insert into t1 values(null);

connection server1;
drop table t1;
