mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-ndb
into whalegate.ndb.mysql.com:/home/tomas/mysql-5.0-ndb-merge sql/ha_ndbcluster.cc: Auto merged sql/mysqld.cc: Auto merged
This commit is contained in:
445
mysql-test/r/ndb_auto_increment.result
Normal file
445
mysql-test/r/ndb_auto_increment.result
Normal file
@ -0,0 +1,445 @@
|
|||||||
|
DROP TABLE IF EXISTS t1,t2;
|
||||||
|
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;
|
||||||
|
flush status;
|
||||||
|
create table t1 (a int not null auto_increment primary key) engine ndb;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
update t1 set a = 5 where a = 1;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
6
|
||||||
|
insert into t1 values (7);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
insert into t1 values (2);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
update t1 set a = 4 where a = 2;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
10
|
||||||
|
delete from t1 where a = 10;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
replace t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
replace t1 values (15);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
15
|
||||||
|
replace into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
15
|
||||||
|
16
|
||||||
|
replace t1 values (15);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
15
|
||||||
|
16
|
||||||
|
insert ignore into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
15
|
||||||
|
16
|
||||||
|
17
|
||||||
|
insert ignore into t1 values (15), (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
15
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
insert into t1 values (15)
|
||||||
|
on duplicate key update a = 20;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
20
|
||||||
|
21
|
||||||
|
insert into t1 values (NULL) on duplicate key update a = 30;
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
insert into t1 values (30) on duplicate key update a = 40;
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
30
|
||||||
|
insert ignore into t1 values(600),(NULL),(NULL),(610),(NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
11
|
||||||
|
12
|
||||||
|
16
|
||||||
|
17
|
||||||
|
18
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
30
|
||||||
|
600
|
||||||
|
601
|
||||||
|
602
|
||||||
|
610
|
||||||
|
611
|
||||||
|
drop table t1;
|
||||||
|
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;
|
||||||
|
a b
|
||||||
|
1 1
|
||||||
|
3 3
|
||||||
|
4 4
|
||||||
|
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;
|
||||||
|
SET @@session.auto_increment_offset=1;
|
||||||
|
SET @@session.auto_increment_increment=1;
|
||||||
|
set ndb_autoincrement_prefetch_sz = 32;
|
||||||
|
drop table if exists t1;
|
||||||
|
SET @@session.auto_increment_offset=1;
|
||||||
|
SET @@session.auto_increment_increment=1;
|
||||||
|
set ndb_autoincrement_prefetch_sz = 32;
|
||||||
|
create table t1 (a int not null auto_increment primary key) engine ndb;
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
33
|
||||||
|
insert into t1 values (20);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
20
|
||||||
|
33
|
||||||
|
34
|
||||||
|
insert into t1 values (35);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
ERROR 23000: Duplicate entry '35' for key 1
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
20
|
||||||
|
21
|
||||||
|
33
|
||||||
|
34
|
||||||
|
35
|
||||||
|
insert into t1 values (100);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
insert into t1 values (NULL);
|
||||||
|
select * from t1 order by a;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
20
|
||||||
|
21
|
||||||
|
22
|
||||||
|
33
|
||||||
|
34
|
||||||
|
35
|
||||||
|
100
|
||||||
|
101
|
||||||
|
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;
|
@ -112,9 +112,9 @@ unique key(a)
|
|||||||
) engine=ndb;
|
) engine=ndb;
|
||||||
insert into t1 values(1, 'aAa');
|
insert into t1 values(1, 'aAa');
|
||||||
insert into t1 values(2, 'aaa');
|
insert into t1 values(2, 'aaa');
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry 'aaa' for key 2
|
||||||
insert into t1 values(3, 'AAA');
|
insert into t1 values(3, 'AAA');
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry 'AAA' for key 2
|
||||||
select * from t1 order by p;
|
select * from t1 order by p;
|
||||||
p a
|
p a
|
||||||
1 aAa
|
1 aAa
|
||||||
@ -138,9 +138,9 @@ unique key(a)
|
|||||||
) engine=ndb;
|
) engine=ndb;
|
||||||
insert into t1 values (1,'A'),(2,'b '),(3,'C '),(4,'d '),(5,'E'),(6,'f');
|
insert into t1 values (1,'A'),(2,'b '),(3,'C '),(4,'d '),(5,'E'),(6,'f');
|
||||||
insert into t1 values(99,'b');
|
insert into t1 values(99,'b');
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry 'b' for key 2
|
||||||
insert into t1 values(99,'a ');
|
insert into t1 values(99,'a ');
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry 'a ' for key 2
|
||||||
select a,length(a) from t1 order by a;
|
select a,length(a) from t1 order by a;
|
||||||
a length(a)
|
a length(a)
|
||||||
A 1
|
A 1
|
||||||
|
@ -22,7 +22,7 @@ select * from t1 where b = 4 order by a;
|
|||||||
a b c
|
a b c
|
||||||
3 4 6
|
3 4 6
|
||||||
insert into t1 values(8, 2, 3);
|
insert into t1 values(8, 2, 3);
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '2' for key 2
|
||||||
select * from t1 order by a;
|
select * from t1 order by a;
|
||||||
a b c
|
a b c
|
||||||
1 2 3
|
1 2 3
|
||||||
@ -89,7 +89,7 @@ a b c
|
|||||||
1 1 1
|
1 1 1
|
||||||
4 4 NULL
|
4 4 NULL
|
||||||
insert into t1 values(5,1,1);
|
insert into t1 values(5,1,1);
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '1-1' for key 2
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t2 (
|
CREATE TABLE t2 (
|
||||||
a int unsigned NOT NULL PRIMARY KEY,
|
a int unsigned NOT NULL PRIMARY KEY,
|
||||||
@ -112,7 +112,7 @@ select * from t2 where b = 4 order by a;
|
|||||||
a b c
|
a b c
|
||||||
3 4 6
|
3 4 6
|
||||||
insert into t2 values(8, 2, 3);
|
insert into t2 values(8, 2, 3);
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '2-3' for key 2
|
||||||
select * from t2 order by a;
|
select * from t2 order by a;
|
||||||
a b c
|
a b c
|
||||||
1 2 3
|
1 2 3
|
||||||
@ -135,7 +135,7 @@ a b c
|
|||||||
8 2 3
|
8 2 3
|
||||||
create unique index bi using hash on t2(b);
|
create unique index bi using hash on t2(b);
|
||||||
insert into t2 values(9, 3, 1);
|
insert into t2 values(9, 3, 1);
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '3' for key 3
|
||||||
alter table t2 drop index bi;
|
alter table t2 drop index bi;
|
||||||
insert into t2 values(9, 3, 1);
|
insert into t2 values(9, 3, 1);
|
||||||
select * from t2 order by a;
|
select * from t2 order by a;
|
||||||
@ -225,7 +225,7 @@ pk a
|
|||||||
3 NULL
|
3 NULL
|
||||||
4 4
|
4 4
|
||||||
insert into t1 values (5,0);
|
insert into t1 values (5,0);
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '0' for key 2
|
||||||
select * from t1 order by pk;
|
select * from t1 order by pk;
|
||||||
pk a
|
pk a
|
||||||
-1 NULL
|
-1 NULL
|
||||||
@ -258,7 +258,7 @@ pk a b c
|
|||||||
0 NULL 18 NULL
|
0 NULL 18 NULL
|
||||||
1 3 19 abc
|
1 3 19 abc
|
||||||
insert into t2 values(2,3,19,'abc');
|
insert into t2 values(2,3,19,'abc');
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '3-abc' for key 2
|
||||||
select * from t2 order by pk;
|
select * from t2 order by pk;
|
||||||
pk a b c
|
pk a b c
|
||||||
-1 1 17 NULL
|
-1 1 17 NULL
|
||||||
@ -678,7 +678,7 @@ create table t1 (a int primary key, b varchar(1000) not null, unique key (b))
|
|||||||
engine=ndb charset=utf8;
|
engine=ndb charset=utf8;
|
||||||
insert into t1 values (1, repeat(_utf8 0xe288ab6474, 200));
|
insert into t1 values (1, repeat(_utf8 0xe288ab6474, 200));
|
||||||
insert into t1 values (2, repeat(_utf8 0xe288ab6474, 200));
|
insert into t1 values (2, repeat(_utf8 0xe288ab6474, 200));
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫dt∫d' for key 2
|
||||||
select a, sha1(b) from t1;
|
select a, sha1(b) from t1;
|
||||||
a sha1(b)
|
a sha1(b)
|
||||||
1 08f5d02c8b8bc244f275bdfc22c42c5cab0d9d7d
|
1 08f5d02c8b8bc244f275bdfc22c42c5cab0d9d7d
|
||||||
|
@ -657,172 +657,3 @@ a b
|
|||||||
2 NULL
|
2 NULL
|
||||||
3 NULL
|
3 NULL
|
||||||
drop table t1;
|
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;
|
|
||||||
|
@ -26,7 +26,7 @@ pk1 b c
|
|||||||
2 2 2
|
2 2 2
|
||||||
4 1 1
|
4 1 1
|
||||||
UPDATE t1 set pk1 = 1, c = 2 where pk1 = 4;
|
UPDATE t1 set pk1 = 1, c = 2 where pk1 = 4;
|
||||||
ERROR 23000: Duplicate entry '' for key 0
|
ERROR 23000: Duplicate entry '2' for key 2
|
||||||
UPDATE IGNORE t1 set pk1 = 1, c = 2 where pk1 = 4;
|
UPDATE IGNORE t1 set pk1 = 1, c = 2 where pk1 = 4;
|
||||||
select * from t1 order by pk1;
|
select * from t1 order by pk1;
|
||||||
pk1 b c
|
pk1 b c
|
||||||
|
294
mysql-test/t/ndb_auto_increment.test
Normal file
294
mysql-test/t/ndb_auto_increment.test
Normal file
@ -0,0 +1,294 @@
|
|||||||
|
-- source include/have_ndb.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;
|
||||||
|
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;
|
@ -638,142 +638,4 @@ create table t1(a int primary key, b int, unique key(b)) engine=ndb;
|
|||||||
insert ignore into t1 values (1,0), (2,0), (2,null), (3,null);
|
insert ignore into t1 values (1,0), (2,0), (2,null), (3,null);
|
||||||
select * from t1 order by a;
|
select * from t1 order by a;
|
||||||
drop table t1;
|
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
|
# End of 4.1 tests
|
||||||
|
@ -40,12 +40,13 @@ class TcKeyRef {
|
|||||||
friend bool printTCKEYREF(FILE *, const Uint32 *, Uint32, Uint16);
|
friend bool printTCKEYREF(FILE *, const Uint32 *, Uint32, Uint16);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
STATIC_CONST( SignalLength = 4 );
|
STATIC_CONST( SignalLength = 5 );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint32 connectPtr;
|
Uint32 connectPtr;
|
||||||
Uint32 transId[2];
|
Uint32 transId[2];
|
||||||
Uint32 errorCode;
|
Uint32 errorCode;
|
||||||
|
Uint32 errorData;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -38,12 +38,13 @@ class TcRollbackRep {
|
|||||||
friend bool printTCROLBACKREP(FILE *, const Uint32 *, Uint32, Uint16);
|
friend bool printTCROLBACKREP(FILE *, const Uint32 *, Uint32, Uint16);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
STATIC_CONST( SignalLength = 4 );
|
STATIC_CONST( SignalLength = 5 );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Uint32 connectPtr;
|
Uint32 connectPtr;
|
||||||
Uint32 transId[2];
|
Uint32 transId[2];
|
||||||
Uint32 returnCode;
|
Uint32 returnCode;
|
||||||
|
Uint32 errorData;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -792,7 +792,12 @@ public:
|
|||||||
* Get the name of the table being indexed
|
* Get the name of the table being indexed
|
||||||
*/
|
*/
|
||||||
const char * getTable() const;
|
const char * getTable() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the table representing the index
|
||||||
|
*/
|
||||||
|
const Table * getIndexTable() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of columns in the index
|
* Get the number of columns in the index
|
||||||
*/
|
*/
|
||||||
|
@ -727,6 +727,7 @@ public:
|
|||||||
// Index op return context
|
// Index op return context
|
||||||
UintR indexOp;
|
UintR indexOp;
|
||||||
UintR clientData;
|
UintR clientData;
|
||||||
|
Uint32 errorData;
|
||||||
UintR attrInfoLen;
|
UintR attrInfoLen;
|
||||||
|
|
||||||
UintR accumulatingIndexOp;
|
UintR accumulatingIndexOp;
|
||||||
|
@ -5107,6 +5107,7 @@ void Dbtc::releaseDirtyWrite(Signal* signal)
|
|||||||
void Dbtc::execLQHKEYREF(Signal* signal)
|
void Dbtc::execLQHKEYREF(Signal* signal)
|
||||||
{
|
{
|
||||||
const LqhKeyRef * const lqhKeyRef = (LqhKeyRef *)signal->getDataPtr();
|
const LqhKeyRef * const lqhKeyRef = (LqhKeyRef *)signal->getDataPtr();
|
||||||
|
Uint32 indexId = 0;
|
||||||
jamEntry();
|
jamEntry();
|
||||||
|
|
||||||
UintR compare_transid1, compare_transid2;
|
UintR compare_transid1, compare_transid2;
|
||||||
@ -5158,6 +5159,9 @@ void Dbtc::execLQHKEYREF(Signal* signal)
|
|||||||
ptrCheckGuard(opPtr, ctcConnectFilesize, localTcConnectRecord);
|
ptrCheckGuard(opPtr, ctcConnectFilesize, localTcConnectRecord);
|
||||||
|
|
||||||
// The operation executed an index trigger
|
// The operation executed an index trigger
|
||||||
|
TcIndexData* indexData = c_theIndexes.getPtr(currentIndexId);
|
||||||
|
indexId = indexData->indexId;
|
||||||
|
regApiPtr->errorData = indexId;
|
||||||
const Uint32 opType = regTcPtr->operation;
|
const Uint32 opType = regTcPtr->operation;
|
||||||
if (errCode == ZALREADYEXIST)
|
if (errCode == ZALREADYEXIST)
|
||||||
errCode = terrorCode = ZNOTUNIQUE;
|
errCode = terrorCode = ZNOTUNIQUE;
|
||||||
@ -5170,7 +5174,6 @@ void Dbtc::execLQHKEYREF(Signal* signal)
|
|||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
/** ZDELETE && NOT_FOUND */
|
/** ZDELETE && NOT_FOUND */
|
||||||
TcIndexData* indexData = c_theIndexes.getPtr(currentIndexId);
|
|
||||||
if(indexData->indexState == IS_BUILDING && state != CS_ABORTING){
|
if(indexData->indexState == IS_BUILDING && state != CS_ABORTING){
|
||||||
jam();
|
jam();
|
||||||
/**
|
/**
|
||||||
@ -5242,12 +5245,14 @@ void Dbtc::execLQHKEYREF(Signal* signal)
|
|||||||
jam();
|
jam();
|
||||||
regApiPtr->lqhkeyreqrec--; // Compensate for extra during read
|
regApiPtr->lqhkeyreqrec--; // Compensate for extra during read
|
||||||
tcKeyRef->connectPtr = indexOp;
|
tcKeyRef->connectPtr = indexOp;
|
||||||
|
tcKeyRef->errorData = indexId;
|
||||||
EXECUTE_DIRECT(DBTC, GSN_TCKEYREF, signal, TcKeyRef::SignalLength);
|
EXECUTE_DIRECT(DBTC, GSN_TCKEYREF, signal, TcKeyRef::SignalLength);
|
||||||
apiConnectptr.i = save;
|
apiConnectptr.i = save;
|
||||||
apiConnectptr.p = regApiPtr;
|
apiConnectptr.p = regApiPtr;
|
||||||
} else {
|
} else {
|
||||||
jam();
|
jam();
|
||||||
tcKeyRef->connectPtr = clientData;
|
tcKeyRef->connectPtr = clientData;
|
||||||
|
tcKeyRef->errorData = indexId;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref,
|
sendSignal(regApiPtr->ndbapiBlockref,
|
||||||
GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
|
GSN_TCKEYREF, signal, TcKeyRef::SignalLength, JBB);
|
||||||
}//if
|
}//if
|
||||||
@ -10548,6 +10553,7 @@ void Dbtc::releaseAbortResources(Signal* signal)
|
|||||||
tcRollbackRep->transId[0] = apiConnectptr.p->transid[0];
|
tcRollbackRep->transId[0] = apiConnectptr.p->transid[0];
|
||||||
tcRollbackRep->transId[1] = apiConnectptr.p->transid[1];
|
tcRollbackRep->transId[1] = apiConnectptr.p->transid[1];
|
||||||
tcRollbackRep->returnCode = apiConnectptr.p->returncode;
|
tcRollbackRep->returnCode = apiConnectptr.p->returncode;
|
||||||
|
tcRollbackRep->errorData = apiConnectptr.p->errorData;
|
||||||
sendSignal(blockRef, GSN_TCROLLBACKREP, signal,
|
sendSignal(blockRef, GSN_TCROLLBACKREP, signal,
|
||||||
TcRollbackRep::SignalLength, JBB);
|
TcRollbackRep::SignalLength, JBB);
|
||||||
}
|
}
|
||||||
@ -11972,6 +11978,7 @@ void Dbtc::execTCKEYCONF(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -11991,6 +11998,7 @@ void Dbtc::execTCKEYCONF(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -12074,6 +12082,7 @@ void Dbtc::execTCKEYREF(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = tcKeyRef->transId[0];
|
tcIndxRef->transId[0] = tcKeyRef->transId[0];
|
||||||
tcIndxRef->transId[1] = tcKeyRef->transId[1];
|
tcIndxRef->transId[1] = tcKeyRef->transId[1];
|
||||||
tcIndxRef->errorCode = tcKeyRef->errorCode;
|
tcIndxRef->errorCode = tcKeyRef->errorCode;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
|
|
||||||
releaseIndexOperation(regApiPtr, indexOp);
|
releaseIndexOperation(regApiPtr, indexOp);
|
||||||
|
|
||||||
@ -12151,6 +12160,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4000;
|
tcIndxRef->errorCode = 4000;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -12166,6 +12176,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -12194,6 +12205,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
*/
|
*/
|
||||||
@ -12219,6 +12231,7 @@ void Dbtc::execTRANSID_AI(Signal* signal)
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = regApiPtr->errorData;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -12272,6 +12285,7 @@ void Dbtc::readIndexTable(Signal* signal,
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4000;
|
tcIndxRef->errorCode = 4000;
|
||||||
|
// tcIndxRef->errorData = ??; Where to find indexId
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
@ -12414,6 +12428,7 @@ void Dbtc::executeIndexOperation(Signal* signal,
|
|||||||
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
tcIndxRef->transId[0] = regApiPtr->transid[0];
|
||||||
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
tcIndxRef->transId[1] = regApiPtr->transid[1];
|
||||||
tcIndxRef->errorCode = 4349;
|
tcIndxRef->errorCode = 4349;
|
||||||
|
tcIndxRef->errorData = 0;
|
||||||
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
sendSignal(regApiPtr->ndbapiBlockref, GSN_TCINDXREF, signal,
|
||||||
TcKeyRef::SignalLength, JBB);
|
TcKeyRef::SignalLength, JBB);
|
||||||
return;
|
return;
|
||||||
|
@ -542,6 +542,15 @@ NdbDictionary::Index::getTable() const {
|
|||||||
return m_impl.getTable();
|
return m_impl.getTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NdbDictionary::Table *
|
||||||
|
NdbDictionary::Index::getIndexTable() const {
|
||||||
|
NdbTableImpl * t = m_impl.m_table;
|
||||||
|
if (t) {
|
||||||
|
return t->m_facade;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
NdbDictionary::Index::getNoOfColumns() const {
|
NdbDictionary::Index::getNoOfColumns() const {
|
||||||
return m_impl.m_columns.size();
|
return m_impl.m_columns.size();
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "Interpreter.hpp"
|
#include "Interpreter.hpp"
|
||||||
#include <AttributeHeader.hpp>
|
#include <AttributeHeader.hpp>
|
||||||
#include <signaldata/TcKeyReq.hpp>
|
#include <signaldata/TcKeyReq.hpp>
|
||||||
|
#include <signaldata/TcKeyRef.hpp>
|
||||||
#include <signaldata/KeyInfo.hpp>
|
#include <signaldata/KeyInfo.hpp>
|
||||||
#include <signaldata/AttrInfo.hpp>
|
#include <signaldata/AttrInfo.hpp>
|
||||||
#include <signaldata/ScanTab.hpp>
|
#include <signaldata/ScanTab.hpp>
|
||||||
@ -550,6 +551,12 @@ NdbOperation::receiveTCKEYREF( NdbApiSignal* aSignal)
|
|||||||
theNdbCon->theReturnStatus = NdbTransaction::ReturnFailure;
|
theNdbCon->theReturnStatus = NdbTransaction::ReturnFailure;
|
||||||
}
|
}
|
||||||
theError.code = aSignal->readData(4);
|
theError.code = aSignal->readData(4);
|
||||||
|
if (aSignal->getLength() == TcKeyRef::SignalLength)
|
||||||
|
{
|
||||||
|
// Signal may contain additional error data
|
||||||
|
theError.details = (char *) aSignal->readData(5);
|
||||||
|
}
|
||||||
|
|
||||||
theNdbCon->setOperationErrorCodeAbort(aSignal->readData(4), ao);
|
theNdbCon->setOperationErrorCodeAbort(aSignal->readData(4), ao);
|
||||||
|
|
||||||
if(theOperationType != ReadRequest || !theSimpleIndicator) // not simple read
|
if(theOperationType != ReadRequest || !theSimpleIndicator) // not simple read
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include <signaldata/TcCommit.hpp>
|
#include <signaldata/TcCommit.hpp>
|
||||||
#include <signaldata/TcKeyFailConf.hpp>
|
#include <signaldata/TcKeyFailConf.hpp>
|
||||||
#include <signaldata/TcHbRep.hpp>
|
#include <signaldata/TcHbRep.hpp>
|
||||||
|
#include <signaldata/TcRollbackRep.hpp>
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
NdbTransaction( Ndb* aNdb );
|
NdbTransaction( Ndb* aNdb );
|
||||||
@ -1757,6 +1758,8 @@ Remark: Handles the reception of the ROLLBACKREP signal.
|
|||||||
int
|
int
|
||||||
NdbTransaction::receiveTCROLLBACKREP( NdbApiSignal* aSignal)
|
NdbTransaction::receiveTCROLLBACKREP( NdbApiSignal* aSignal)
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("NdbTransaction::receiveTCROLLBACKREP");
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Check that we are expecting signals from this transaction and that it doesn't
|
Check that we are expecting signals from this transaction and that it doesn't
|
||||||
belong to a transaction already completed. Simply ignore messages from other
|
belong to a transaction already completed. Simply ignore messages from other
|
||||||
@ -1764,6 +1767,11 @@ transactions.
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
if(checkState_TransId(aSignal->getDataPtr() + 1)){
|
if(checkState_TransId(aSignal->getDataPtr() + 1)){
|
||||||
theError.code = aSignal->readData(4);// Override any previous errors
|
theError.code = aSignal->readData(4);// Override any previous errors
|
||||||
|
if (aSignal->getLength() == TcRollbackRep::SignalLength)
|
||||||
|
{
|
||||||
|
// Signal may contain additional error data
|
||||||
|
theError.details = (char *) aSignal->readData(5);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
/* A serious error has occured. This could be due to deadlock or */
|
/* A serious error has occured. This could be due to deadlock or */
|
||||||
@ -1775,14 +1783,14 @@ transactions.
|
|||||||
theCompletionStatus = CompletedFailure;
|
theCompletionStatus = CompletedFailure;
|
||||||
theCommitStatus = Aborted;
|
theCommitStatus = Aborted;
|
||||||
theReturnStatus = ReturnFailure;
|
theReturnStatus = ReturnFailure;
|
||||||
return 0;
|
DBUG_RETURN(0);
|
||||||
} else {
|
} else {
|
||||||
#ifdef NDB_NO_DROPPED_SIGNAL
|
#ifdef NDB_NO_DROPPED_SIGNAL
|
||||||
abort();
|
abort();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
DBUG_RETURN(-1);
|
||||||
}//NdbTransaction::receiveTCROLLBACKREP()
|
}//NdbTransaction::receiveTCROLLBACKREP()
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
@ -640,8 +640,6 @@ ndberror_update(ndberror_struct * error){
|
|||||||
if(!found){
|
if(!found){
|
||||||
error->status = ST_U;
|
error->status = ST_U;
|
||||||
}
|
}
|
||||||
|
|
||||||
error->details = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -540,6 +540,25 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans)
|
|||||||
err.code, res));
|
err.code, res));
|
||||||
if (res == HA_ERR_FOUND_DUPP_KEY)
|
if (res == HA_ERR_FOUND_DUPP_KEY)
|
||||||
{
|
{
|
||||||
|
char *error_data= err.details;
|
||||||
|
uint dupkey= MAX_KEY;
|
||||||
|
|
||||||
|
for (uint i= 0; i < MAX_KEY; i++)
|
||||||
|
{
|
||||||
|
if (m_index[i].type == UNIQUE_INDEX ||
|
||||||
|
m_index[i].type == UNIQUE_ORDERED_INDEX)
|
||||||
|
{
|
||||||
|
const NDBINDEX *unique_index=
|
||||||
|
(const NDBINDEX *) m_index[i].unique_index;
|
||||||
|
if (unique_index &&
|
||||||
|
unique_index->getIndexTable() &&
|
||||||
|
(char *) unique_index->getIndexTable()->getTableId() == error_data)
|
||||||
|
{
|
||||||
|
dupkey= i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (m_rows_to_insert == 1)
|
if (m_rows_to_insert == 1)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -547,7 +566,7 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans)
|
|||||||
violations here, so we need to return MAX_KEY for non-primary
|
violations here, so we need to return MAX_KEY for non-primary
|
||||||
to signal that key is unknown
|
to signal that key is unknown
|
||||||
*/
|
*/
|
||||||
m_dupkey= err.code == 630 ? table->s->primary_key : MAX_KEY;
|
m_dupkey= err.code == 630 ? table->s->primary_key : dupkey;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -2259,6 +2278,25 @@ int ha_ndbcluster::full_table_scan(byte *buf)
|
|||||||
DBUG_RETURN(next_result(buf));
|
DBUG_RETURN(next_result(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ha_ndbcluster::set_auto_inc(Field *field)
|
||||||
|
{
|
||||||
|
Ndb *ndb= get_ndb();
|
||||||
|
Uint64 next_val= (Uint64) field->val_int() + 1;
|
||||||
|
DBUG_ENTER("ha_ndbcluster::set_auto_inc");
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
char buff[22];
|
||||||
|
DBUG_PRINT("info",
|
||||||
|
("Trying to set next auto increment value to %s",
|
||||||
|
llstr(next_val, buff)));
|
||||||
|
#endif
|
||||||
|
if (ndb->setAutoIncrementValue((const NDBTAB *) m_table, next_val, TRUE)
|
||||||
|
== -1)
|
||||||
|
ERR_RETURN(ndb->getNdbError());
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Insert one record into NDB
|
Insert one record into NDB
|
||||||
*/
|
*/
|
||||||
@ -2413,17 +2451,11 @@ int ha_ndbcluster::write_row(byte *record)
|
|||||||
}
|
}
|
||||||
if ((has_auto_increment) && (m_skip_auto_increment))
|
if ((has_auto_increment) && (m_skip_auto_increment))
|
||||||
{
|
{
|
||||||
Ndb *ndb= get_ndb();
|
int ret_val;
|
||||||
Uint64 next_val= (Uint64) table->next_number_field->val_int() + 1;
|
if ((ret_val= set_auto_inc(table->next_number_field)))
|
||||||
#ifndef DBUG_OFF
|
{
|
||||||
char buff[22];
|
DBUG_RETURN(ret_val);
|
||||||
DBUG_PRINT("info",
|
}
|
||||||
("Trying to set next auto increment value to %s",
|
|
||||||
llstr(next_val, buff)));
|
|
||||||
#endif
|
|
||||||
if (ndb->setAutoIncrementValue((const NDBTAB *) m_table, next_val, TRUE)
|
|
||||||
== -1)
|
|
||||||
ERR_RETURN(ndb->getNdbError());
|
|
||||||
}
|
}
|
||||||
m_skip_auto_increment= TRUE;
|
m_skip_auto_increment= TRUE;
|
||||||
|
|
||||||
@ -2476,6 +2508,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
|
|||||||
NdbScanOperation* cursor= m_active_cursor;
|
NdbScanOperation* cursor= m_active_cursor;
|
||||||
NdbOperation *op;
|
NdbOperation *op;
|
||||||
uint i;
|
uint i;
|
||||||
|
int auto_res;
|
||||||
bool pk_update= (table->s->primary_key != MAX_KEY &&
|
bool pk_update= (table->s->primary_key != MAX_KEY &&
|
||||||
key_cmp(table->s->primary_key, old_data, new_data));
|
key_cmp(table->s->primary_key, old_data, new_data));
|
||||||
DBUG_ENTER("update_row");
|
DBUG_ENTER("update_row");
|
||||||
@ -2531,6 +2564,16 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
|
|||||||
// Insert new row
|
// Insert new row
|
||||||
DBUG_PRINT("info", ("delete succeded"));
|
DBUG_PRINT("info", ("delete succeded"));
|
||||||
m_primary_key_update= TRUE;
|
m_primary_key_update= TRUE;
|
||||||
|
/*
|
||||||
|
If we are updating a primary key with auto_increment
|
||||||
|
then we need to update the auto_increment counter
|
||||||
|
*/
|
||||||
|
if (table->found_next_number_field &&
|
||||||
|
table->found_next_number_field->query_id == thd->query_id &&
|
||||||
|
(auto_res= set_auto_inc(table->found_next_number_field)))
|
||||||
|
{
|
||||||
|
DBUG_RETURN(auto_res);
|
||||||
|
}
|
||||||
insert_res= write_row(new_data);
|
insert_res= write_row(new_data);
|
||||||
m_primary_key_update= FALSE;
|
m_primary_key_update= FALSE;
|
||||||
if (insert_res)
|
if (insert_res)
|
||||||
@ -2553,7 +2596,16 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
|
|||||||
DBUG_PRINT("info", ("delete+insert succeeded"));
|
DBUG_PRINT("info", ("delete+insert succeeded"));
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
If we are updating a unique key with auto_increment
|
||||||
|
then we need to update the auto_increment counter
|
||||||
|
*/
|
||||||
|
if (table->found_next_number_field &&
|
||||||
|
table->found_next_number_field->query_id == thd->query_id &&
|
||||||
|
(auto_res= set_auto_inc(table->found_next_number_field)))
|
||||||
|
{
|
||||||
|
DBUG_RETURN(auto_res);
|
||||||
|
}
|
||||||
if (cursor)
|
if (cursor)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -3841,9 +3893,11 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
|||||||
// store thread specific data first to set the right context
|
// store thread specific data first to set the right context
|
||||||
m_force_send= thd->variables.ndb_force_send;
|
m_force_send= thd->variables.ndb_force_send;
|
||||||
m_ha_not_exact_count= !thd->variables.ndb_use_exact_count;
|
m_ha_not_exact_count= !thd->variables.ndb_use_exact_count;
|
||||||
m_autoincrement_prefetch=
|
m_autoincrement_prefetch=
|
||||||
(ha_rows) thd->variables.ndb_autoincrement_prefetch_sz;
|
(thd->variables.ndb_autoincrement_prefetch_sz >
|
||||||
|
NDB_DEFAULT_AUTO_PREFETCH) ?
|
||||||
|
(ha_rows) thd->variables.ndb_autoincrement_prefetch_sz
|
||||||
|
: (ha_rows) NDB_DEFAULT_AUTO_PREFETCH;
|
||||||
m_active_trans= thd_ndb->all ? thd_ndb->all : thd_ndb->stmt;
|
m_active_trans= thd_ndb->all ? thd_ndb->all : thd_ndb->stmt;
|
||||||
DBUG_ASSERT(m_active_trans);
|
DBUG_ASSERT(m_active_trans);
|
||||||
// Start of transaction
|
// Start of transaction
|
||||||
@ -4866,10 +4920,11 @@ int ha_ndbcluster::drop_table()
|
|||||||
|
|
||||||
ulonglong ha_ndbcluster::get_auto_increment()
|
ulonglong ha_ndbcluster::get_auto_increment()
|
||||||
{
|
{
|
||||||
int cache_size;
|
uint cache_size;
|
||||||
Uint64 auto_value;
|
Uint64 auto_value;
|
||||||
Uint64 step= current_thd->variables.auto_increment_increment;
|
THD *thd= current_thd;
|
||||||
Uint64 start= current_thd->variables.auto_increment_offset;
|
Uint64 step= thd->variables.auto_increment_increment;
|
||||||
|
Uint64 start= thd->variables.auto_increment_offset;
|
||||||
DBUG_ENTER("get_auto_increment");
|
DBUG_ENTER("get_auto_increment");
|
||||||
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
|
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
|
||||||
Ndb *ndb= get_ndb();
|
Ndb *ndb= get_ndb();
|
||||||
@ -4879,11 +4934,14 @@ ulonglong ha_ndbcluster::get_auto_increment()
|
|||||||
/* We guessed too low */
|
/* We guessed too low */
|
||||||
m_rows_to_insert+= m_autoincrement_prefetch;
|
m_rows_to_insert+= m_autoincrement_prefetch;
|
||||||
}
|
}
|
||||||
cache_size=
|
uint remaining= m_rows_to_insert - m_rows_inserted;
|
||||||
(int) ((m_rows_to_insert - m_rows_inserted < m_autoincrement_prefetch) ?
|
uint min_prefetch=
|
||||||
m_rows_to_insert - m_rows_inserted :
|
(remaining < thd->variables.ndb_autoincrement_prefetch_sz) ?
|
||||||
((m_rows_to_insert > m_autoincrement_prefetch) ?
|
thd->variables.ndb_autoincrement_prefetch_sz
|
||||||
m_rows_to_insert : m_autoincrement_prefetch));
|
: remaining;
|
||||||
|
cache_size= ((remaining < m_autoincrement_prefetch) ?
|
||||||
|
min_prefetch
|
||||||
|
: remaining);
|
||||||
uint retries= NDB_AUTO_INCREMENT_RETRIES;
|
uint retries= NDB_AUTO_INCREMENT_RETRIES;
|
||||||
int retry_sleep= 30; /* 30 milliseconds, transaction */
|
int retry_sleep= 30; /* 30 milliseconds, transaction */
|
||||||
for (;;)
|
for (;;)
|
||||||
@ -4953,7 +5011,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
|
|||||||
m_dupkey((uint) -1),
|
m_dupkey((uint) -1),
|
||||||
m_ha_not_exact_count(FALSE),
|
m_ha_not_exact_count(FALSE),
|
||||||
m_force_send(TRUE),
|
m_force_send(TRUE),
|
||||||
m_autoincrement_prefetch((ha_rows) 32),
|
m_autoincrement_prefetch((ha_rows) NDB_DEFAULT_AUTO_PREFETCH),
|
||||||
m_transaction_on(TRUE),
|
m_transaction_on(TRUE),
|
||||||
m_cond(NULL),
|
m_cond(NULL),
|
||||||
m_multi_cursor(NULL)
|
m_multi_cursor(NULL)
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include <ndbapi_limits.h>
|
#include <ndbapi_limits.h>
|
||||||
|
|
||||||
#define NDB_HIDDEN_PRIMARY_KEY_LENGTH 8
|
#define NDB_HIDDEN_PRIMARY_KEY_LENGTH 8
|
||||||
|
#define NDB_DEFAULT_AUTO_PREFETCH 32
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
class Ndb;
|
class Ndb;
|
||||||
class NdbOperation;
|
class NdbOperation;
|
||||||
@ -271,6 +273,7 @@ private:
|
|||||||
int full_table_scan(byte * buf);
|
int full_table_scan(byte * buf);
|
||||||
int fetch_next(NdbScanOperation* op);
|
int fetch_next(NdbScanOperation* op);
|
||||||
int next_result(byte *buf);
|
int next_result(byte *buf);
|
||||||
|
int set_auto_inc(Field *field);
|
||||||
int define_read_attrs(byte* buf, NdbOperation* op);
|
int define_read_attrs(byte* buf, NdbOperation* op);
|
||||||
int filtered_scan(const byte *key, uint key_len,
|
int filtered_scan(const byte *key, uint key_len,
|
||||||
byte *buf,
|
byte *buf,
|
||||||
|
@ -5354,8 +5354,8 @@ Disable with --skip-ndbcluster (will save memory).",
|
|||||||
{"ndb-autoincrement-prefetch-sz", OPT_NDB_AUTOINCREMENT_PREFETCH_SZ,
|
{"ndb-autoincrement-prefetch-sz", OPT_NDB_AUTOINCREMENT_PREFETCH_SZ,
|
||||||
"Specify number of autoincrement values that are prefetched.",
|
"Specify number of autoincrement values that are prefetched.",
|
||||||
(gptr*) &global_system_variables.ndb_autoincrement_prefetch_sz,
|
(gptr*) &global_system_variables.ndb_autoincrement_prefetch_sz,
|
||||||
(gptr*) &global_system_variables.ndb_autoincrement_prefetch_sz,
|
(gptr*) &max_system_variables.ndb_autoincrement_prefetch_sz,
|
||||||
0, GET_ULONG, REQUIRED_ARG, 32, 1, 256, 0, 0, 0},
|
0, GET_ULONG, REQUIRED_ARG, 1, 1, 256, 0, 0, 0},
|
||||||
{"ndb-force-send", OPT_NDB_FORCE_SEND,
|
{"ndb-force-send", OPT_NDB_FORCE_SEND,
|
||||||
"Force send of buffers to ndb immediately without waiting for "
|
"Force send of buffers to ndb immediately without waiting for "
|
||||||
"other threads.",
|
"other threads.",
|
||||||
|
Reference in New Issue
Block a user