Commit 4c6e70cc authored by unknown's avatar unknown

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
parents b8ecfef8 4931d5ca
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) ...@@ -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) ...@@ -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; ...@@ -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 ...@@ -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; ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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)) ...@@ -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 ...@@ -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 ...@@ -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
......
-- 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; ...@@ -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 { ...@@ -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 { ...@@ -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: ...@@ -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: ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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 { ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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. ...@@ -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. ...@@ -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. ...@@ -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){ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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() ...@@ -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() ...@@ -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): ...@@ -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 @@ ...@@ -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: ...@@ -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).", ...@@ -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.",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment