summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <magnus@neptunus.(none)>2004-05-10 15:09:19 +0200
committerunknown <magnus@neptunus.(none)>2004-05-10 15:09:19 +0200
commit5b92b23bbf77f8984c9e1309f516bb6820b9cbce (patch)
tree837393b3e3a58f46b2377b5ec5ccad11d77e80db
parente13340b0a2aa93bfa2c3d3c2e0fde041419a737c (diff)
parentd6676b0f575b8ec1605fa3cf125b09b073b0a10c (diff)
downloadmariadb-git-5b92b23bbf77f8984c9e1309f516bb6820b9cbce.tar.gz
Merge msvensson@bk-internal.mysql.com:/home/bk/mysql-4.1
into neptunus.(none):/home/magnus/mysql-4.1 sql/sql_table.cc: Auto merged
-rw-r--r--mysql-test/mysql-test-run.sh11
-rw-r--r--mysql-test/ndb/ndb_config_2_node.ini1
-rwxr-xr-xmysql-test/ndb/stop_ndbcluster13
-rw-r--r--mysql-test/r/ndb_alter_table.result29
-rw-r--r--mysql-test/r/ndb_basic.result54
-rw-r--r--mysql-test/r/ndb_index.result160
-rw-r--r--mysql-test/r/ndb_index_ordered.result190
-rw-r--r--mysql-test/r/ndb_index_unique.result371
-rw-r--r--mysql-test/r/ndb_insert.result419
-rw-r--r--mysql-test/t/ndb_alter_table.test41
-rw-r--r--mysql-test/t/ndb_basic.test21
-rw-r--r--mysql-test/t/ndb_index.test126
-rw-r--r--mysql-test/t/ndb_index_ordered.test112
-rw-r--r--mysql-test/t/ndb_index_unique.test134
-rw-r--r--mysql-test/t/ndb_insert.test433
-rw-r--r--ndb/bin/regression.sh644
-rw-r--r--ndb/include/ndbapi/ndbapi_limits.h1
-rw-r--r--sql-bench/server-cfg.sh7
-rw-r--r--sql/ha_ndbcluster.cc828
-rw-r--r--sql/ha_ndbcluster.h31
-rw-r--r--sql/sql_table.cc6
21 files changed, 2709 insertions, 923 deletions
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index 2d189d1b10b..8d675ec7f68 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -1470,16 +1470,23 @@ $ECHO "Starting Tests"
#
if [ "$DO_BENCH" = 1 ]
then
+ start_master
+
+ if [ ! -z "$USE_NDBCLUSTER" ]
+ then
+ EXTRA_BENCH_ARGS="--create-options=TYPE=ndb"
+ fi
+
BENCHDIR=$BASEDIR/sql-bench/
savedir=`pwd`
cd $BENCHDIR
if [ -z "$1" ]
then
- ./run-all-tests --socket=$MASTER_MYSOCK --user=root
+ ./run-all-tests --socket=$MASTER_MYSOCK --user=root $EXTRA_BENCH_ARGS
else
if [ -x "./$1" ]
then
- ./$1 --socket=$MASTER_MYSOCK --user=root
+ ./$1 --socket=$MASTER_MYSOCK --user=root $EXTRA_BENCH_ARGS
else
echo "benchmark $1 not found"
fi
diff --git a/mysql-test/ndb/ndb_config_2_node.ini b/mysql-test/ndb/ndb_config_2_node.ini
index 9e0f8254c78..57aa2f527e0 100644
--- a/mysql-test/ndb/ndb_config_2_node.ini
+++ b/mysql-test/ndb/ndb_config_2_node.ini
@@ -2,6 +2,7 @@
#NoOfFragmentLogfiles: 1
#TimeBetweenLocalCheckpoints: 31
NoOfReplicas: 2
+MaxNoOfConcurrentOperations: 100000
[COMPUTER]
Id: 1
diff --git a/mysql-test/ndb/stop_ndbcluster b/mysql-test/ndb/stop_ndbcluster
index 09e22cf69c4..e1a98f1de07 100755
--- a/mysql-test/ndb/stop_ndbcluster
+++ b/mysql-test/ndb/stop_ndbcluster
@@ -22,9 +22,9 @@ done
stop_default_ndbcluster() {
-if [ ! -f $pidfile ] ; then
- exit 0
-fi
+#if [ ! -f $pidfile ] ; then
+# exit 0
+#fi
if [ ! -f $cfgfile ] ; then
echo "$cfgfile missing"
@@ -43,8 +43,11 @@ echo "all stop" | $exec_mgmtclient
sleep 5
-kill `cat $pidfile`
-rm $pidfile
+if [ -f $pidfile ] ; then
+ kill `cat $pidfile`
+ rm $pidfile
+fi
+
}
stop_default_ndbcluster
diff --git a/mysql-test/r/ndb_alter_table.result b/mysql-test/r/ndb_alter_table.result
new file mode 100644
index 00000000000..6cc6a89d5ad
--- /dev/null
+++ b/mysql-test/r/ndb_alter_table.result
@@ -0,0 +1,29 @@
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (
+a INT NOT NULL,
+b INT NOT NULL
+) ENGINE=ndbcluster;
+INSERT INTO t1 VALUES (9410,9412);
+ALTER TABLE t1 ADD COLUMN c int not null;
+SELECT * FROM t1;
+a b c
+9410 9412 0
+DROP TABLE t1;
+create table t1 (
+col1 int not null auto_increment primary key,
+col2 varchar(30) not null,
+col3 varchar (20) not null,
+col4 varchar(4) not null,
+col5 enum('PENDING', 'ACTIVE', 'DISABLED') not null,
+col6 int not null, to_be_deleted int);
+insert into t1 values (2,4,3,5,"PENDING",1,7);
+alter table t1
+add column col4_5 varchar(20) not null after col4,
+add column col7 varchar(30) not null after col5,
+add column col8 datetime not null, drop column to_be_deleted,
+change column col2 fourth varchar(30) not null after col3,
+modify column col6 int not null first;
+select * from t1;
+col6 col1 col3 fourth col4 col4_5 col5 col7 col8
+1 2 3 4 5 PENDING 0000-00-00 00:00:00
+drop table t1;
diff --git a/mysql-test/r/ndb_basic.result b/mysql-test/r/ndb_basic.result
index ac550937146..4e26ac8e0b5 100644
--- a/mysql-test/r/ndb_basic.result
+++ b/mysql-test/r/ndb_basic.result
@@ -25,11 +25,59 @@ pk1 attr1
DELETE FROM t1;
SELECT * FROM t1;
pk1 attr1
-INSERT INTO t1 VALUES (9410,9412);
+INSERT INTO t1 VALUES (9410,9412), (9411, 9413), (9408, 8765),
+(7,8), (8,9), (9,10), (10,11), (11,12), (12,13), (13,14);
+UPDATE t1 SET attr1 = 9999;
+SELECT * FROM t1 ORDER BY pk1;
+pk1 attr1
+7 9999
+8 9999
+9 9999
+10 9999
+11 9999
+12 9999
+13 9999
+9408 9999
+9410 9999
+9411 9999
+UPDATE t1 SET attr1 = 9998 WHERE pk1 < 1000;
+SELECT * FROM t1 ORDER BY pk1;
+pk1 attr1
+7 9998
+8 9998
+9 9998
+10 9998
+11 9998
+12 9998
+13 9998
+9408 9999
+9410 9999
+9411 9999
+UPDATE t1 SET attr1 = 9997 WHERE attr1 = 9999;
+SELECT * FROM t1 ORDER BY pk1;
+pk1 attr1
+7 9998
+8 9998
+9 9998
+10 9998
+11 9998
+12 9998
+13 9998
+9408 9997
+9410 9997
+9411 9997
DELETE FROM t1 WHERE pk1 = 9410;
-SELECT * FROM t1;
+SELECT * FROM t1 ORDER BY pk1;
pk1 attr1
-INSERT INTO t1 VALUES (9410,9412), (9411, 9413), (9408, 8765);
+7 9998
+8 9998
+9 9998
+10 9998
+11 9998
+12 9998
+13 9998
+9408 9997
+9411 9997
DELETE FROM t1;
SELECT * FROM t1;
pk1 attr1
diff --git a/mysql-test/r/ndb_index.result b/mysql-test/r/ndb_index.result
new file mode 100644
index 00000000000..47fcf03b6c9
--- /dev/null
+++ b/mysql-test/r/ndb_index.result
@@ -0,0 +1,160 @@
+drop table if exists t1;
+CREATE TABLE t1 (
+PORT varchar(16) NOT NULL,
+ACCESSNODE varchar(16) NOT NULL,
+POP varchar(48) NOT NULL,
+ACCESSTYPE int unsigned NOT NULL,
+CUSTOMER_ID varchar(20) NOT NULL,
+PROVIDER varchar(16),
+TEXPIRE int unsigned,
+NUM_IP int unsigned,
+LEASED_NUM_IP int unsigned,
+LOCKED_IP int unsigned,
+STATIC_DNS int unsigned,
+SUSPENDED_SERVICE int unsigned,
+SUSPENDED_REASON int unsigned,
+BGP_COMMUNITY int unsigned,
+INDEX CUSTOMER_ID_INDEX(CUSTOMER_ID),
+INDEX FQPN_INDEX(POP,ACCESSNODE,PORT),
+PRIMARY KEY(POP,ACCESSNODE,PORT,ACCESSTYPE)
+) engine=ndbcluster;
+INSERT INTO t1 VALUES ('port67', 'node78', 'pop98', 1, 'kllopmn', 'pr_43', 121212, 1, 2, 3, 8, NULL, NULL, NULL);
+INSERT INTO t1 VALUES ('port67', 'node78', 'pop99', 2, 'klkighh', 'pr_44', 121213, 3, 3, 6, 7, NULL, NULL, NULL);
+INSERT INTO t1 VALUES ('port79', 'node79', 'pop79', 2, 'kpongfaa', 'pr_44', 981213, 2, 4, 10, 11, 2, 99, 1278);
+select port, accessnode, pop, accesstype from t1 where port='port67' order by accesstype;
+port accessnode pop accesstype
+port67 node78 pop98 1
+port67 node78 pop99 2
+select port, accessnode, pop, accesstype from t1 where port='foo';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where accessnode='node78' order by accesstype;
+port accessnode pop accesstype
+port67 node78 pop98 1
+port67 node78 pop99 2
+select port, accessnode, pop, accesstype from t1 where accessnode='foo';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98' order by accesstype;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='POP98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='POP98' order by accesstype;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='foo';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where accesstype=1;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where accesstype=2 order by port;
+port accessnode pop accesstype
+port67 node78 pop99 2
+port79 node79 pop79 2
+select port, accessnode, pop, accesstype from t1 where accesstype=98 order by port;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where customer_id='KLLOPMN';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where customer_id='kLLoPMn';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where customer_id='foo';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where provider='pr_43';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where provider='foo';
+port accessnode pop accesstype
+select port, accessnode from t1 where texpire=121212;
+port accessnode
+port67 node78
+select port, accessnode from t1 where texpire=2323;
+port accessnode
+select port, accessnode, pop, accesstype from t1 where num_ip=1;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where num_ip=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where leased_num_ip=2;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where leased_num_ip=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where locked_ip=3;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where locked_ip=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where static_dns=8;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where static_dns=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where suspended_service=8;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where suspended_service=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where suspended_reason=NULL;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where suspended_reason=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where suspended_reason=0;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where bgp_community=NULL;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where bgp_community=89;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where bgp_community=0;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where port='port67' and accessnode='node78' and pop='pop98' and accesstype=1;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where port='port67' and accesstype=1 and accessnode='node78' and pop='pop98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and port='port67' and accesstype=1 and accessnode='node78';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode from t1 where port='foo' and accessnode='foo' and pop='foo' and accesstype=99;
+port accessnode
+select port, accessnode, pop, accesstype from t1 where port='port67' and pop='pop98' and accesstype=1;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where accesstype=1 and accessnode='node78' and pop='pop98';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where port='port67' and accesstype=1 and accessnode='node78';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode from t1 where port='foo' and accessnode='foo' and pop='foo';
+port accessnode
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn' and accesstype=1;
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn' and accesstype=2;
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where accesstype=2 and customer_id='kllopmn';
+port accessnode pop accesstype
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67' and customer_id='kllopmn';
+port accessnode pop accesstype
+port67 node78 pop98 1
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67' and customer_id='foo';
+port accessnode pop accesstype
+drop table t1;
diff --git a/mysql-test/r/ndb_index_ordered.result b/mysql-test/r/ndb_index_ordered.result
new file mode 100644
index 00000000000..9f24e18c88e
--- /dev/null
+++ b/mysql-test/r/ndb_index_ordered.result
@@ -0,0 +1,190 @@
+drop table if exists t1;
+CREATE TABLE t1 (
+a int unsigned NOT NULL PRIMARY KEY,
+b int unsigned not null,
+c int unsigned,
+KEY(b)
+) engine=ndbcluster;
+insert t1 values(1, 2, 3), (2,3, 5), (3, 4, 6), (4, 5, 8), (5,6, 2), (6,7, 2);
+select * from t1 order by b;
+a b c
+1 2 3
+2 3 5
+3 4 6
+4 5 8
+5 6 2
+6 7 2
+select * from t1 where b >= 4 order by b;
+a b c
+3 4 6
+4 5 8
+5 6 2
+6 7 2
+select * from t1 where b = 4 order by b;
+a b c
+3 4 6
+select * from t1 where b > 4 order by b;
+a b c
+4 5 8
+5 6 2
+6 7 2
+select * from t1 where b < 4 order by b;
+a b c
+1 2 3
+2 3 5
+select * from t1 where b <= 4 order by b;
+a b c
+1 2 3
+2 3 5
+3 4 6
+update t1 set c = 3 where b = 3;
+select * from t1 order by a;
+a b c
+1 2 3
+2 3 3
+3 4 6
+4 5 8
+5 6 2
+6 7 2
+update t1 set c = 10 where b >= 6;
+select * from t1 order by a;
+a b c
+1 2 3
+2 3 3
+3 4 6
+4 5 8
+5 6 10
+6 7 10
+update t1 set c = 11 where b < 5;
+select * from t1 order by a;
+a b c
+1 2 11
+2 3 11
+3 4 11
+4 5 8
+5 6 10
+6 7 10
+update t1 set c = 12 where b > 0;
+select * from t1 order by a;
+a b c
+1 2 12
+2 3 12
+3 4 12
+4 5 12
+5 6 12
+6 7 12
+update t1 set c = 13 where b <= 3;
+select * from t1 order by a;
+a b c
+1 2 13
+2 3 13
+3 4 12
+4 5 12
+5 6 12
+6 7 12
+drop table t1;
+CREATE TABLE t1 (
+a int unsigned NOT NULL PRIMARY KEY,
+b int unsigned not null,
+c int unsigned,
+KEY(b)
+) engine=ndbcluster;
+insert t1 values(1, 2, 13), (2,3, 13), (3, 4, 12), (4, 5, 12), (5,6, 12), (6,7, 12);
+delete from t1 where b = 3;
+select * from t1 order by a;
+a b c
+1 2 13
+3 4 12
+4 5 12
+5 6 12
+6 7 12
+delete from t1 where b >= 6;
+select * from t1 order by a;
+a b c
+1 2 13
+3 4 12
+4 5 12
+delete from t1 where b < 4;
+select * from t1 order by a;
+a b c
+3 4 12
+4 5 12
+delete from t1 where b > 5;
+select * from t1 order by a;
+a b c
+3 4 12
+4 5 12
+delete from t1 where b <= 4;
+select * from t1 order by a;
+a b c
+4 5 12
+drop table t1;
+CREATE TABLE t1 (
+a int unsigned NOT NULL PRIMARY KEY,
+b int unsigned not null,
+c int unsigned not null,
+) engine = ndb;
+create index a1 on t1 (b, c);
+insert into t1 values (1, 2, 13);
+insert into t1 values (2,3, 13);
+insert into t1 values (3, 4, 12);
+insert into t1 values (4, 5, 12);
+insert into t1 values (5,6, 12);
+insert into t1 values (6,7, 12);
+insert into t1 values (7, 2, 1);
+insert into t1 values (8,3, 6);
+insert into t1 values (9, 4, 12);
+insert into t1 values (14, 5, 4);
+insert into t1 values (15,5,5);
+insert into t1 values (16,5, 6);
+insert into t1 values (17,4,4);
+insert into t1 values (18,1, 7);
+select * from t1 order by a;
+a b c
+1 2 13
+2 3 13
+3 4 12
+4 5 12
+5 6 12
+6 7 12
+7 2 1
+8 3 6
+9 4 12
+14 5 4
+15 5 5
+16 5 6
+17 4 4
+18 1 7
+select * from t1 where b<=5 order by a;
+a b c
+1 2 13
+2 3 13
+3 4 12
+4 5 12
+7 2 1
+8 3 6
+9 4 12
+14 5 4
+15 5 5
+16 5 6
+17 4 4
+18 1 7
+select * from t1 where b<=5 and c=0;
+a b c
+insert into t1 values (19,4, 0);
+select * from t1 where b<=5 and c=0;
+a b c
+19 4 0
+select * from t1 where b=4 and c<=5;
+a b c
+19 4 0
+17 4 4
+select * from t1 where b<=4 and c<=5 order by a;
+a b c
+7 2 1
+17 4 4
+19 4 0
+select * from t1 where b<=5 and c=0 or b<=5 and c=2;
+a b c
+19 4 0
+drop table t1;
diff --git a/mysql-test/r/ndb_index_unique.result b/mysql-test/r/ndb_index_unique.result
new file mode 100644
index 00000000000..59ff07fffda
--- /dev/null
+++ b/mysql-test/r/ndb_index_unique.result
@@ -0,0 +1,371 @@
+drop table if exists t1, t2, t3, t4, t5, t6, t7;
+CREATE TABLE t1 (
+a int unsigned NOT NULL PRIMARY KEY,
+b int unsigned not null,
+c int unsigned,
+UNIQUE(b)
+) engine=ndbcluster;
+insert t1 values(1, 2, 3), (2, 3, 5), (3, 4, 6), (4, 5, 8), (5,6, 2), (6,7, 2);
+select * from t1 order by b;
+a b c
+1 2 3
+2 3 5
+3 4 6
+4 5 8
+5 6 2
+6 7 2
+select * from t1 where b = 4 order by b;
+a b c
+3 4 6
+insert into t1 values(7,8,3);
+select * from t1 where b = 4 order by a;
+a b c
+3 4 6
+drop table t1;
+CREATE TABLE t1 (
+cid smallint(5) unsigned NOT NULL default '0',
+cv varchar(250) NOT NULL default '',
+PRIMARY KEY (cid),
+UNIQUE KEY cv (cv)
+) engine=ndbcluster;
+INSERT INTO t1 VALUES (8,'dummy');
+CREATE TABLE t2 (
+cid bigint(20) unsigned NOT NULL auto_increment,
+cap varchar(255) NOT NULL default '',
+PRIMARY KEY (cid),
+) engine=ndbcluster;
+CREATE TABLE t3 (
+gid bigint(20) unsigned NOT NULL auto_increment,
+gn varchar(255) NOT NULL default '',
+must tinyint(4) default NULL,
+PRIMARY KEY (gid),
+) engine=ndbcluster;
+INSERT INTO t3 VALUES (1,'V1',NULL);
+CREATE TABLE t4 (
+uid bigint(20) unsigned NOT NULL default '0',
+gid bigint(20) unsigned NOT NULL,
+rid bigint(20) unsigned NOT NULL default '-1',
+cid bigint(20) unsigned NOT NULL default '-1',
+UNIQUE KEY m (uid,gid,rid,cid),
+) engine=ndbcluster;
+INSERT INTO t4 VALUES (1,1,2,4);
+INSERT INTO t4 VALUES (1,1,2,3);
+INSERT INTO t4 VALUES (1,1,5,7);
+INSERT INTO t4 VALUES (1,1,10,8);
+CREATE TABLE t5 (
+rid bigint(20) unsigned NOT NULL auto_increment,
+rl varchar(255) NOT NULL default '',
+PRIMARY KEY (rid),
+) engine=ndbcluster;
+CREATE TABLE t6 (
+uid bigint(20) unsigned NOT NULL auto_increment,
+un varchar(250) NOT NULL default '',
+uc smallint(5) unsigned NOT NULL default '0',
+PRIMARY KEY (uid),
+UNIQUE KEY nc (un,uc),
+) engine=ndbcluster;
+INSERT INTO t6 VALUES (1,'test',8);
+INSERT INTO t6 VALUES (2,'test2',9);
+INSERT INTO t6 VALUES (3,'tre',3);
+CREATE TABLE t7 (
+mid bigint(20) unsigned NOT NULL PRIMARY KEY,
+uid bigint(20) unsigned NOT NULL default '0',
+gid bigint(20) unsigned NOT NULL,
+rid bigint(20) unsigned NOT NULL default '-1',
+cid bigint(20) unsigned NOT NULL default '-1',
+UNIQUE KEY m (uid,gid,rid,cid),
+) engine=ndbcluster;
+INSERT INTO t7 VALUES(1, 1, 1, 1, 1);
+INSERT INTO t7 VALUES(2, 2, 1, 1, 1);
+INSERT INTO t7 VALUES(3, 3, 1, 1, 1);
+INSERT INTO t7 VALUES(4, 4, 1, 1, 1);
+INSERT INTO t7 VALUES(5, 5, 1, 1, 1);
+INSERT INTO t7 VALUES(6, 1, 1, 1, 6);
+INSERT INTO t7 VALUES(7, 2, 1, 1, 7);
+INSERT INTO t7 VALUES(8, 3, 1, 1, 8);
+INSERT INTO t7 VALUES(9, 4, 1, 1, 9);
+INSERT INTO t7 VALUES(10, 5, 1, 1, 10);
+select * from t1 where cv = 'dummy';
+cid cv
+8 dummy
+select * from t1 where cv = 'test';
+cid cv
+select * from t4 where uid = 1 and gid=1 and rid=2 and cid=4;
+uid gid rid cid
+1 1 2 4
+select * from t4 where uid = 1 and gid=1 and rid=1 and cid=4;
+uid gid rid cid
+select * from t4 where uid = 1 order by cid;
+uid gid rid cid
+1 1 2 3
+1 1 2 4
+1 1 5 7
+1 1 10 8
+select * from t4 where rid = 2 order by cid;
+uid gid rid cid
+1 1 2 3
+1 1 2 4
+select * from t6 where un='test' and uc=8;
+uid un uc
+1 test 8
+select * from t6 where un='test' and uc=7;
+uid un uc
+select * from t6 where un='test';
+uid un uc
+1 test 8
+select * from t7 where mid = 8;
+mid uid gid rid cid
+8 3 1 1 8
+select * from t7 where uid = 8;
+mid uid gid rid cid
+select * from t7 where uid = 1 order by mid;
+mid uid gid rid cid
+1 1 1 1 1
+6 1 1 1 6
+select * from t7 where uid = 4 order by mid;
+mid uid gid rid cid
+4 4 1 1 1
+9 4 1 1 9
+select * from t7 where gid = 4;
+mid uid gid rid cid
+select * from t7 where gid = 1 order by mid;
+mid uid gid rid cid
+1 1 1 1 1
+2 2 1 1 1
+3 3 1 1 1
+4 4 1 1 1
+5 5 1 1 1
+6 1 1 1 6
+7 2 1 1 7
+8 3 1 1 8
+9 4 1 1 9
+10 5 1 1 10
+select * from t7 where cid = 4;
+mid uid gid rid cid
+select * from t7 where cid = 8;
+mid uid gid rid cid
+8 3 1 1 8
+select * from t4 where uid = 1 and gid=1 and rid=2 and cid=4;
+uid gid rid cid
+1 1 2 4
+select * from t4 where uid = 1 and gid=1 and rid=1 and cid=4;
+uid gid rid cid
+select * from t4 where uid = 1 order by gid,cid;
+uid gid rid cid
+1 1 2 3
+1 1 2 4
+1 1 5 7
+1 1 10 8
+1 1 5 12
+1 2 5 12
+1 3 9 11
+1 3 5 12
+1 4 5 12
+1 5 5 12
+1 6 5 12
+1 7 5 12
+1 8 5 12
+1 9 5 12
+1 10 5 12
+1 11 5 12
+1 12 5 12
+1 13 5 12
+1 14 5 12
+1 15 5 12
+1 16 5 12
+1 17 5 12
+1 18 5 12
+1 19 5 12
+1 20 5 12
+1 21 5 12
+1 22 5 12
+1 23 5 12
+1 24 5 12
+1 25 5 12
+1 26 5 12
+1 27 5 12
+1 28 5 12
+1 29 5 12
+1 30 5 12
+1 31 5 12
+1 32 5 12
+1 33 5 12
+1 34 5 12
+1 35 5 12
+1 36 5 12
+1 37 5 12
+1 38 5 12
+1 39 5 12
+1 40 5 12
+1 41 5 12
+1 42 5 12
+1 43 5 12
+1 44 5 12
+1 45 5 12
+1 46 5 12
+1 47 5 12
+1 48 5 12
+1 49 5 12
+1 50 5 12
+1 51 5 12
+1 52 5 12
+1 53 5 12
+1 54 5 12
+1 55 5 12
+1 56 5 12
+1 57 5 12
+1 58 5 12
+1 59 5 12
+1 60 5 12
+1 61 5 12
+1 62 5 12
+1 63 5 12
+1 64 5 12
+1 65 5 12
+1 66 5 12
+1 67 5 12
+1 68 5 12
+1 69 5 12
+1 70 5 12
+1 71 5 12
+1 72 5 12
+1 73 5 12
+1 74 5 12
+1 75 5 12
+1 76 5 12
+1 77 5 12
+1 78 5 12
+1 79 5 12
+1 80 5 12
+1 81 5 12
+1 82 5 12
+1 83 5 12
+1 84 5 12
+1 85 5 12
+1 86 5 12
+1 87 5 12
+1 88 5 12
+1 89 5 12
+1 90 5 12
+1 91 5 12
+1 92 5 12
+1 93 5 12
+1 94 5 12
+1 95 5 12
+1 96 5 12
+1 97 5 12
+1 98 5 12
+1 99 5 12
+1 100 5 12
+select * from t4 where uid = 1 order by gid,cid;
+uid gid rid cid
+1 1 2 3
+1 1 2 4
+1 1 5 7
+1 1 10 8
+1 1 5 12
+1 2 5 12
+1 3 9 11
+1 3 5 12
+1 4 5 12
+1 5 5 12
+1 6 5 12
+1 7 5 12
+1 8 5 12
+1 9 5 12
+1 10 5 12
+1 11 5 12
+1 12 5 12
+1 13 5 12
+1 14 5 12
+1 15 5 12
+1 16 5 12
+1 17 5 12
+1 18 5 12
+1 19 5 12
+1 20 5 12
+1 21 5 12
+1 22 5 12
+1 23 5 12
+1 24 5 12
+1 25 5 12
+1 26 5 12
+1 27 5 12
+1 28 5 12
+1 29 5 12
+1 30 5 12
+1 31 5 12
+1 32 5 12
+1 33 5 12
+1 34 5 12
+1 35 5 12
+1 36 5 12
+1 37 5 12
+1 38 5 12
+1 39 5 12
+1 40 5 12
+1 41 5 12
+1 42 5 12
+1 43 5 12
+1 44 5 12
+1 45 5 12
+1 46 5 12
+1 47 5 12
+1 48 5 12
+1 49 5 12
+1 50 5 12
+1 51 5 12
+1 52 5 12
+1 53 5 12
+1 54 5 12
+1 55 5 12
+1 56 5 12
+1 57 5 12
+1 58 5 12
+1 59 5 12
+1 60 5 12
+1 61 5 12
+1 62 5 12
+1 63 5 12
+1 64 5 12
+1 65 5 12
+1 66 5 12
+1 67 5 12
+1 68 5 12
+1 69 5 12
+1 70 5 12
+1 71 5 12
+1 72 5 12
+1 73 5 12
+1 74 5 12
+1 75 5 12
+1 76 5 12
+1 77 5 12
+1 78 5 12
+1 79 5 12
+1 80 5 12
+1 81 5 12
+1 82 5 12
+1 83 5 12
+1 84 5 12
+1 85 5 12
+1 86 5 12
+1 87 5 12
+1 88 5 12
+1 89 5 12
+1 90 5 12
+1 91 5 12
+1 92 5 12
+1 93 5 12
+1 94 5 12
+1 95 5 12
+1 96 5 12
+1 97 5 12
+1 98 5 12
+1 99 5 12
+1 100 5 12
+select * from t4 where rid = 2 order by cid;
+uid gid rid cid
+1 1 2 3
+1 1 2 4
+drop table t1,t2,t3,t4,t5,t6,t7;
diff --git a/mysql-test/r/ndb_insert.result b/mysql-test/r/ndb_insert.result
new file mode 100644
index 00000000000..93f46c85499
--- /dev/null
+++ b/mysql-test/r/ndb_insert.result
@@ -0,0 +1,419 @@
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (
+pk1 INT NOT NULL PRIMARY KEY,
+b INT NOT NULL,
+c INT NOT NULL
+) ENGINE=ndbcluster;
+INSERT INTO t1 VALUES (0, 0, 0);
+SELECT * FROM t1;
+pk1 b c
+0 0 0
+INSERT INTO t1 VALUES
+(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),
+(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),
+(11,11,11),(12,12,12),(13,13,13),(14,14,14),(15,15,15),
+(16,16,16),(17,17,17),(18,18,18),(19,19,19),(20,20,20),
+(21,21,21),(22,22,22),(23,23,23),(24,24,24),(25,25,25),
+(26,26,26),(27,27,27),(28,28,28),(29,29,29),(30,30,30),
+(31,31,31),(32,32,32),(33,33,33),(34,34,34),(35,35,35),
+(36,36,36),(37,37,37),(38,38,38),(39,39,39),(40,40,40),
+(41,41,41),(42,42,42),(43,43,43),(44,44,44),(45,45,45),
+(46,46,46),(47,47,47),(48,48,48),(49,49,49),(50,50,50),
+(51,51,51),(52,52,52),(53,53,53),(54,54,54),(55,55,55),
+(56,56,56),(57,57,57),(58,58,58),(59,59,59),(60,60,60),
+(61,61,61),(62,62,62),(63,63,63),(64,64,64),(65,65,65),
+(66,66,66),(67,67,67),(68,68,68),(69,69,69),(70,70,70),
+(71,71,71),(72,72,72),(73,73,73),(74,74,74),(75,75,75),
+(76,76,76),(77,77,77),(78,78,78),(79,79,79),(80,80,80),
+(81,81,81),(82,82,82),(83,83,83),(84,84,84),(85,85,85),
+(86,86,86),(87,87,87),(88,88,88),(89,89,89),(90,90,90),
+(91,91,91),(92,92,92),(93,93,93),(94,94,94),(95,95,95),
+(96,96,96),(97,97,97),(98,98,98),(99,99,99),(100,100,100),
+(101,101,101),(102,102,102),(103,103,103),(104,104,104),(105,105,105),
+(106,106,106),(107,107,107),(108,108,108),(109,109,109),(110,110,110),
+(111,111,111),(112,112,112),(113,113,113),(114,114,114),(115,115,115),
+(116,116,116),(117,117,117),(118,118,118),(119,119,119),(120,120,120),
+(121,121,121),(122,122,122),(123,123,123),(124,124,124),(125,125,125),
+(126,126,126),(127,127,127),(128,128,128),(129,129,129),(130,130,130),
+(131,131,131),(132,132,132),(133,133,133),(134,134,134),(135,135,135),
+(136,136,136),(137,137,137),(138,138,138),(139,139,139),(140,140,140),
+(141,141,141),(142,142,142),(143,143,143),(144,144,144),(145,145,145),
+(146,146,146),(147,147,147),(148,148,148),(149,149,149),(150,150,150),
+(151,151,151),(152,152,152),(153,153,153),(154,154,154),(155,155,155),
+(156,156,156),(157,157,157),(158,158,158),(159,159,159),(160,160,160),
+(161,161,161),(162,162,162),(163,163,163),(164,164,164),(165,165,165),
+(166,166,166),(167,167,167),(168,168,168),(169,169,169),(170,170,170),
+(171,171,171),(172,172,172),(173,173,173),(174,174,174),(175,175,175),
+(176,176,176),(177,177,177),(178,178,178),(179,179,179),(180,180,180),
+(181,181,181),(182,182,182),(183,183,183),(184,184,184),(185,185,185),
+(186,186,186),(187,187,187),(188,188,188),(189,189,189),(190,190,190),
+(191,191,191),(192,192,192),(193,193,193),(194,194,194),(195,195,195),
+(196,196,196),(197,197,197),(198,198,198),(199,199,199),(200,200,200),
+(201,201,201),(202,202,202),(203,203,203),(204,204,204),(205,205,205),
+(206,206,206),(207,207,207),(208,208,208),(209,209,209),(210,210,210),
+(211,211,211),(212,212,212),(213,213,213),(214,214,214),(215,215,215),
+(216,216,216),(217,217,217),(218,218,218),(219,219,219),(220,220,220),
+(221,221,221),(222,222,222),(223,223,223),(224,224,224),(225,225,225),
+(226,226,226),(227,227,227),(228,228,228),(229,229,229),(230,230,230),
+(231,231,231),(232,232,232),(233,233,233),(234,234,234),(235,235,235),
+(236,236,236),(237,237,237),(238,238,238),(239,239,239),(240,240,240),
+(241,241,241),(242,242,242),(243,243,243),(244,244,244),(245,245,245),
+(246,246,246),(247,247,247),(248,248,248),(249,249,249),(250,250,250),
+(251,251,251),(252,252,252),(253,253,253),(254,254,254),(255,255,255),
+(256,256,256),(257,257,257),(258,258,258),(259,259,259),(260,260,260),
+(261,261,261),(262,262,262),(263,263,263),(264,264,264),(265,265,265),
+(266,266,266),(267,267,267),(268,268,268),(269,269,269),(270,270,270),
+(271,271,271),(272,272,272),(273,273,273),(274,274,274),(275,275,275),
+(276,276,276),(277,277,277),(278,278,278),(279,279,279),(280,280,280),
+(281,281,281),(282,282,282),(283,283,283),(284,284,284),(285,285,285),
+(286,286,286),(287,287,287),(288,288,288),(289,289,289),(290,290,290),
+(291,291,291),(292,292,292),(293,293,293),(294,294,294),(295,295,295),
+(296,296,296),(297,297,297),(298,298,298),(299,299,299),(300,300,300),
+(301,301,301),(302,302,302),(303,303,303),(304,304,304),(305,305,305),
+(306,306,306),(307,307,307),(308,308,308),(309,309,309),(310,310,310),
+(311,311,311),(312,312,312),(313,313,313),(314,314,314),(315,315,315),
+(316,316,316),(317,317,317),(318,318,318),(319,319,319),(320,320,320),
+(321,321,321),(322,322,322),(323,323,323),(324,324,324),(325,325,325),
+(326,326,326),(327,327,327),(328,328,328),(329,329,329),(330,330,330),
+(331,331,331),(332,332,332),(333,333,333),(334,334,334),(335,335,335),
+(336,336,336),(337,337,337),(338,338,338),(339,339,339),(340,340,340),
+(341,341,341),(342,342,342),(343,343,343),(344,344,344),(345,345,345),
+(346,346,346),(347,347,347),(348,348,348),(349,349,349),(350,350,350),
+(351,351,351),(352,352,352),(353,353,353),(354,354,354),(355,355,355),
+(356,356,356),(357,357,357),(358,358,358),(359,359,359),(360,360,360),
+(361,361,361),(362,362,362),(363,363,363),(364,364,364),(365,365,365),
+(366,366,366),(367,367,367),(368,368,368),(369,369,369),(370,370,370),
+(371,371,371),(372,372,372),(373,373,373),(374,374,374),(375,375,375),
+(376,376,376),(377,377,377),(378,378,378),(379,379,379),(380,380,380),
+(381,381,381),(382,382,382),(383,383,383),(384,384,384),(385,385,385),
+(386,386,386),(387,387,387),(388,388,388),(389,389,389),(390,390,390),
+(391,391,391),(392,392,392),(393,393,393),(394,394,394),(395,395,395),
+(396,396,396),(397,397,397),(398,398,398),(399,399,399),(400,400,400),
+(401,401,401),(402,402,402),(403,403,403),(404,404,404),(405,405,405),
+(406,406,406),(407,407,407),(408,408,408),(409,409,409),(410,410,410),
+(411,411,411),(412,412,412),(413,413,413),(414,414,414),(415,415,415),
+(416,416,416),(417,417,417),(418,418,418),(419,419,419),(420,420,420),
+(421,421,421),(422,422,422),(423,423,423),(424,424,424),(425,425,425),
+(426,426,426),(427,427,427),(428,428,428),(429,429,429),(430,430,430),
+(431,431,431),(432,432,432),(433,433,433),(434,434,434),(435,435,435),
+(436,436,436),(437,437,437),(438,438,438),(439,439,439),(440,440,440),
+(441,441,441),(442,442,442),(443,443,443),(444,444,444),(445,445,445),
+(446,446,446),(447,447,447),(448,448,448),(449,449,449),(450,450,450),
+(451,451,451),(452,452,452),(453,453,453),(454,454,454),(455,455,455),
+(456,456,456),(457,457,457),(458,458,458),(459,459,459),(460,460,460),
+(461,461,461),(462,462,462),(463,463,463),(464,464,464),(465,465,465),
+(466,466,466),(467,467,467),(468,468,468),(469,469,469),(470,470,470),
+(471,471,471),(472,472,472),(473,473,473),(474,474,474),(475,475,475),
+(476,476,476),(477,477,477),(478,478,478),(479,479,479),(480,480,480),
+(481,481,481),(482,482,482),(483,483,483),(484,484,484),(485,485,485),
+(486,486,486),(487,487,487),(488,488,488),(489,489,489),(490,490,490),
+(491,491,491),(492,492,492),(493,493,493),(494,494,494),(495,495,495),
+(496,496,496),(497,497,497),(498,498,498),(499,499,499),(500, 500, 500);
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+501
+INSERT INTO t1 VALUES
+(501,501,501),(502,502,502),(503,503,503),(504,504,504),(505,505,505),
+(506,506,506),(507,507,507),(508,508,508),(509,509,509),(510,510,510),
+(511,511,511),(512,512,512),(513,513,513),(514,514,514),(515,515,515),
+(516,516,516),(517,517,517),(518,518,518),(519,519,519),(520,520,520),
+(521,521,521),(522,522,522),(523,523,523),(524,524,524),(525,525,525),
+(526,526,526),(527,527,527),(528,528,528),(529,529,529),(530,530,530),
+(531,531,531),(532,532,532),(533,533,533),(534,534,534),(535,535,535),
+(536,536,536),(537,537,537),(538,538,538),(539,539,539),(540,540,540),
+(541,541,541),(542,542,542),(543,543,543),(544,544,544),(545,545,545),
+(546,546,546),(547,547,547),(548,548,548),(549,549,549),(550,550,550),
+(551,551,551),(552,552,552),(553,553,553),(554,554,554),(555,555,555),
+(556,556,556),(557,557,557),(558,558,558),(559,559,559),(560,560,560),
+(561,561,561),(562,562,562),(563,563,563),(564,564,564),(565,565,565),
+(566,566,566),(567,567,567),(568,568,568),(569,569,569),(570,570,570),
+(571,571,571),(572,572,572),(573,573,573),(574,574,574),(575,575,575),
+(576,576,576),(577,577,577),(578,578,578),(579,579,579),(580,580,580),
+(581,581,581),(582,582,582),(583,583,583),(584,584,584),(585,585,585),
+(586,586,586),(587,587,587),(588,588,588),(589,589,589),(590,590,590),
+(591,591,591),(592,592,592),(593,593,593),(594,594,594),(595,595,595),
+(596,596,596),(597,597,597),(598,598,598),(599,599,599),(600,600,600),
+(601,601,601),(602,602,602),(603,603,603),(604,604,604),(605,605,605),
+(606,606,606),(607,607,607),(608,608,608),(609,609,609),(610,610,610),
+(611,611,611),(612,612,612),(613,613,613),(614,614,614),(615,615,615),
+(616,616,616),(617,617,617),(618,618,618),(619,619,619),(620,620,620),
+(621,621,621),(622,622,622),(623,623,623),(624,624,624),(625,625,625),
+(626,626,626),(627,627,627),(628,628,628),(629,629,629),(630,630,630),
+(631,631,631),(632,632,632),(633,633,633),(634,634,634),(635,635,635),
+(636,636,636),(637,637,637),(638,638,638),(639,639,639),(640,640,640),
+(641,641,641),(642,642,642),(643,643,643),(644,644,644),(645,645,645),
+(646,646,646),(647,647,647),(648,648,648),(649,649,649),(650,650,650),
+(651,651,651),(652,652,652),(653,653,653),(654,654,654),(655,655,655),
+(656,656,656),(657,657,657),(658,658,658),(659,659,659),(660,660,660),
+(661,661,661),(662,662,662),(663,663,663),(664,664,664),(665,665,665),
+(666,666,666),(667,667,667),(668,668,668),(669,669,669),(670,670,670),
+(671,671,671),(672,672,672),(673,673,673),(674,674,674),(675,675,675),
+(676,676,676),(677,677,677),(678,678,678),(679,679,679),(680,680,680),
+(681,681,681),(682,682,682),(683,683,683),(684,684,684),(685,685,685),
+(686,686,686),(687,687,687),(688,688,688),(689,689,689),(690,690,690),
+(691,691,691),(692,692,692),(693,693,693),(694,694,694),(695,695,695),
+(696,696,696),(697,697,697),(698,698,698),(699,699,699),(700,700,700),
+(701,701,701),(702,702,702),(703,703,703),(704,704,704),(705,705,705),
+(706,706,706),(707,707,707),(708,708,708),(709,709,709),(710,710,710),
+(711,711,711),(712,712,712),(713,713,713),(714,714,714),(715,715,715),
+(716,716,716),(717,717,717),(718,718,718),(719,719,719),(720,720,720),
+(721,721,721),(722,722,722),(723,723,723),(724,724,724),(725,725,725),
+(726,726,726),(727,727,727),(728,728,728),(729,729,729),(730,730,730),
+(731,731,731),(732,732,732),(733,733,733),(734,734,734),(735,735,735),
+(736,736,736),(737,737,737),(738,738,738),(739,739,739),(740,740,740),
+(741,741,741),(742,742,742),(743,743,743),(744,744,744),(745,745,745),
+(746,746,746),(747,747,747),(748,748,748),(749,749,749),(750,750,750),
+(751,751,751),(752,752,752),(753,753,753),(754,754,754),(755,755,755),
+(756,756,756),(757,757,757),(758,758,758),(759,759,759),(760,760,760),
+(761,761,761),(762,762,762),(763,763,763),(764,764,764),(765,765,765),
+(766,766,766),(767,767,767),(768,768,768),(769,769,769),(770,770,770),
+(771,771,771),(772,772,772),(773,773,773),(774,774,774),(775,775,775),
+(776,776,776),(777,777,777),(778,778,778),(779,779,779),(780,780,780),
+(781,781,781),(782,782,782),(783,783,783),(784,784,784),(785,785,785),
+(786,786,786),(787,787,787),(788,788,788),(789,789,789),(790,790,790),
+(791,791,791),(792,792,792),(793,793,793),(794,794,794),(795,795,795),
+(796,796,796),(797,797,797),(798,798,798),(799,799,799),(800,800,800),
+(801,801,801),(802,802,802),(803,803,803),(804,804,804),(805,805,805),
+(806,806,806),(807,807,807),(808,808,808),(809,809,809),(810,810,810),
+(811,811,811),(812,812,812),(813,813,813),(814,814,814),(815,815,815),
+(816,816,816),(817,817,817),(818,818,818),(819,819,819),(820,820,820),
+(821,821,821),(822,822,822),(823,823,823),(824,824,824),(825,825,825),
+(826,826,826),(827,827,827),(828,828,828),(829,829,829),(830,830,830),
+(831,831,831),(832,832,832),(833,833,833),(834,834,834),(835,835,835),
+(836,836,836),(837,837,837),(838,838,838),(839,839,839),(840,840,840),
+(841,841,841),(842,842,842),(843,843,843),(844,844,844),(845,845,845),
+(846,846,846),(847,847,847),(848,848,848),(849,849,849),(850,850,850),
+(851,851,851),(852,852,852),(853,853,853),(854,854,854),(855,855,855),
+(856,856,856),(857,857,857),(858,858,858),(859,859,859),(860,860,860),
+(861,861,861),(862,862,862),(863,863,863),(864,864,864),(865,865,865),
+(866,866,866),(867,867,867),(868,868,868),(869,869,869),(870,870,870),
+(871,871,871),(872,872,872),(873,873,873),(874,874,874),(875,875,875),
+(876,876,876),(877,877,877),(878,878,878),(879,879,879),(880,880,880),
+(881,881,881),(882,882,882),(883,883,883),(884,884,884),(885,885,885),
+(886,886,886),(887,887,887),(888,888,888),(889,889,889),(890,890,890),
+(891,891,891),(892,892,892),(893,893,893),(894,894,894),(895,895,895),
+(896,896,896),(897,897,897),(898,898,898),(899,899,899),(900,900,900),
+(901,901,901),(902,902,902),(903,903,903),(904,904,904),(905,905,905),
+(906,906,906),(907,907,907),(908,908,908),(909,909,909),(910,910,910),
+(911,911,911),(912,912,912),(913,913,913),(914,914,914),(915,915,915),
+(916,916,916),(917,917,917),(918,918,918),(919,919,919),(920,920,920),
+(921,921,921),(922,922,922),(923,923,923),(924,924,924),(925,925,925),
+(926,926,926),(927,927,927),(928,928,928),(929,929,929),(930,930,930),
+(931,931,931),(932,932,932),(933,933,933),(934,934,934),(935,935,935),
+(936,936,936),(937,937,937),(938,938,938),(939,939,939),(940,940,940),
+(941,941,941),(942,942,942),(943,943,943),(944,944,944),(945,945,945),
+(946,946,946),(947,947,947),(948,948,948),(949,949,949),(950,950,950),
+(951,951,951),(952,952,952),(953,953,953),(954,954,954),(955,955,955),
+(956,956,956),(957,957,957),(958,958,958),(959,959,959),(960,960,960),
+(961,961,961),(962,962,962),(963,963,963),(964,964,964),(965,965,965),
+(966,966,966),(967,967,967),(968,968,968),(969,969,969),(970,970,970),
+(971,971,971),(972,972,972),(973,973,973),(974,974,974),(975,975,975),
+(976,976,976),(977,977,977),(978,978,978),(979,979,979),(980,980,980),
+(981,981,981),(982,982,982),(983,983,983),(984,984,984),(985,985,985),
+(986,986,986),(987,987,987),(988,988,988),(989,989,989),(990,990,990),
+(991,991,991),(992,992,992),(993,993,993),(994,994,994),(995,995,995),
+(996,996,996),(997,997,997),(998,998,998),(999,999,999),(1000,1000,1000),
+(1001,1001,1001),(1002,1002,1002),(1003,1003,1003),(1004,1004,1004),(1005,1005,1005),
+(1006,1006,1006),(1007,1007,1007),(1008,1008,1008),(1009,1009,1009),(1010,1010,1010),
+(1011,1011,1011),(1012,1012,1012),(1013,1013,1013),(1014,1014,1014),(1015,1015,1015),
+(1016,1016,1016),(1017,1017,1017),(1018,1018,1018),(1019,1019,1019),(1020,1020,1020),
+(1021,1021,1021),(1022,1022,1022),(1023,1023,1023),(1024,1024,1024),(1025,1025,1025),
+(1026,1026,1026),(1027,1027,1027),(1028,1028,1028),(1029,1029,1029),(1030,1030,1030),
+(1031,1031,1031),(1032,1032,1032),(1033,1033,1033),(1034,1034,1034),(1035,1035,1035),
+(1036,1036,1036),(1037,1037,1037),(1038,1038,1038),(1039,1039,1039),(1040,1040,1040),
+(1041,1041,1041),(1042,1042,1042),(1043,1043,1043),(1044,1044,1044),(1045,1045,1045),
+(1046,1046,1046),(1047,1047,1047),(1048,1048,1048),(1049,1049,1049),(1050,1050,1050),
+(1051,1051,1051),(1052,1052,1052),(1053,1053,1053),(1054,1054,1054),(1055,1055,1055),
+(1056,1056,1056),(1057,1057,1057),(1058,1058,1058),(1059,1059,1059),(1060,1060,1060),
+(1061,1061,1061),(1062,1062,1062),(1063,1063,1063),(1064,1064,1064),(1065,1065,1065),
+(1066,1066,1066),(1067,1067,1067),(1068,1068,1068),(1069,1069,1069),(1070,1070,1070),
+(1071,1071,1071),(1072,1072,1072),(1073,1073,1073),(1074,1074,1074),(1075,1075,1075),
+(1076,1076,1076),(1077,1077,1077),(1078,1078,1078),(1079,1079,1079),(1080,1080,1080),
+(1081,1081,1081),(1082,1082,1082),(1083,1083,1083),(1084,1084,1084),(1085,1085,1085),
+(1086,1086,1086),(1087,1087,1087),(1088,1088,1088),(1089,1089,1089),(1090,1090,1090),
+(1091,1091,1091),(1092,1092,1092),(1093,1093,1093),(1094,1094,1094),(1095,1095,1095),
+(1096,1096,1096),(1097,1097,1097),(1098,1098,1098),(1099,1099,1099),(1100,1100,1100),
+(1101,1101,1101),(1102,1102,1102),(1103,1103,1103),(1104,1104,1104),(1105,1105,1105),
+(1106,1106,1106),(1107,1107,1107),(1108,1108,1108),(1109,1109,1109),(1110,1110,1110),
+(1111,1111,1111),(1112,1112,1112),(1113,1113,1113),(1114,1114,1114),(1115,1115,1115),
+(1116,1116,1116),(1117,1117,1117),(1118,1118,1118),(1119,1119,1119),(1120,1120,1120),
+(1121,1121,1121),(1122,1122,1122),(1123,1123,1123),(1124,1124,1124),(1125,1125,1125),
+(1126,1126,1126),(1127,1127,1127),(1128,1128,1128),(1129,1129,1129),(1130,1130,1130),
+(1131,1131,1131),(1132,1132,1132),(1133,1133,1133),(1134,1134,1134),(1135,1135,1135),
+(1136,1136,1136),(1137,1137,1137),(1138,1138,1138),(1139,1139,1139),(1140,1140,1140),
+(1141,1141,1141),(1142,1142,1142),(1143,1143,1143),(1144,1144,1144),(1145,1145,1145),
+(1146,1146,1146),(1147,1147,1147),(1148,1148,1148),(1149,1149,1149),(1150,1150,1150),
+(1151,1151,1151),(1152,1152,1152),(1153,1153,1153),(1154,1154,1154),(1155,1155,1155),
+(1156,1156,1156),(1157,1157,1157),(1158,1158,1158),(1159,1159,1159),(1160,1160,1160),
+(1161,1161,1161),(1162,1162,1162),(1163,1163,1163),(1164,1164,1164),(1165,1165,1165),
+(1166,1166,1166),(1167,1167,1167),(1168,1168,1168),(1169,1169,1169),(1170,1170,1170),
+(1171,1171,1171),(1172,1172,1172),(1173,1173,1173),(1174,1174,1174),(1175,1175,1175),
+(1176,1176,1176),(1177,1177,1177),(1178,1178,1178),(1179,1179,1179),(1180,1180,1180),
+(1181,1181,1181),(1182,1182,1182),(1183,1183,1183),(1184,1184,1184),(1185,1185,1185),
+(1186,1186,1186),(1187,1187,1187),(1188,1188,1188),(1189,1189,1189),(1190,1190,1190),
+(1191,1191,1191),(1192,1192,1192),(1193,1193,1193),(1194,1194,1194),(1195,1195,1195),
+(1196,1196,1196),(1197,1197,1197),(1198,1198,1198),(1199,1199,1199),(1200,1200,1200),
+(1201,1201,1201),(1202,1202,1202),(1203,1203,1203),(1204,1204,1204),(1205,1205,1205),
+(1206,1206,1206),(1207,1207,1207),(1208,1208,1208),(1209,1209,1209),(1210,1210,1210),
+(1211,1211,1211),(1212,1212,1212),(1213,1213,1213),(1214,1214,1214),(1215,1215,1215),
+(1216,1216,1216),(1217,1217,1217),(1218,1218,1218),(1219,1219,1219),(1220,1220,1220),
+(1221,1221,1221),(1222,1222,1222),(1223,1223,1223),(1224,1224,1224),(1225,1225,1225),
+(1226,1226,1226),(1227,1227,1227),(1228,1228,1228),(1229,1229,1229),(1230,1230,1230),
+(1231,1231,1231),(1232,1232,1232),(1233,1233,1233),(1234,1234,1234),(1235,1235,1235),
+(1236,1236,1236),(1237,1237,1237),(1238,1238,1238),(1239,1239,1239),(1240,1240,1240),
+(1241,1241,1241),(1242,1242,1242),(1243,1243,1243),(1244,1244,1244),(1245,1245,1245),
+(1246,1246,1246),(1247,1247,1247),(1248,1248,1248),(1249,1249,1249),(1250,1250,1250),
+(1251,1251,1251),(1252,1252,1252),(1253,1253,1253),(1254,1254,1254),(1255,1255,1255),
+(1256,1256,1256),(1257,1257,1257),(1258,1258,1258),(1259,1259,1259),(1260,1260,1260),
+(1261,1261,1261),(1262,1262,1262),(1263,1263,1263),(1264,1264,1264),(1265,1265,1265),
+(1266,1266,1266),(1267,1267,1267),(1268,1268,1268),(1269,1269,1269),(1270,1270,1270),
+(1271,1271,1271),(1272,1272,1272),(1273,1273,1273),(1274,1274,1274),(1275,1275,1275),
+(1276,1276,1276),(1277,1277,1277),(1278,1278,1278),(1279,1279,1279),(1280,1280,1280),
+(1281,1281,1281),(1282,1282,1282),(1283,1283,1283),(1284,1284,1284),(1285,1285,1285),
+(1286,1286,1286),(1287,1287,1287),(1288,1288,1288),(1289,1289,1289),(1290,1290,1290),
+(1291,1291,1291),(1292,1292,1292),(1293,1293,1293),(1294,1294,1294),(1295,1295,1295),
+(1296,1296,1296),(1297,1297,1297),(1298,1298,1298),(1299,1299,1299),(1300,1300,1300),
+(1301,1301,1301),(1302,1302,1302),(1303,1303,1303),(1304,1304,1304),(1305,1305,1305),
+(1306,1306,1306),(1307,1307,1307),(1308,1308,1308),(1309,1309,1309),(1310,1310,1310),
+(1311,1311,1311),(1312,1312,1312),(1313,1313,1313),(1314,1314,1314),(1315,1315,1315),
+(1316,1316,1316),(1317,1317,1317),(1318,1318,1318),(1319,1319,1319),(1320,1320,1320),
+(1321,1321,1321),(1322,1322,1322),(1323,1323,1323),(1324,1324,1324),(1325,1325,1325),
+(1326,1326,1326),(1327,1327,1327),(1328,1328,1328),(1329,1329,1329),(1330,1330,1330),
+(1331,1331,1331),(1332,1332,1332),(1333,1333,1333),(1334,1334,1334),(1335,1335,1335),
+(1336,1336,1336),(1337,1337,1337),(1338,1338,1338),(1339,1339,1339),(1340,1340,1340),
+(1341,1341,1341),(1342,1342,1342),(1343,1343,1343),(1344,1344,1344),(1345,1345,1345),
+(1346,1346,1346),(1347,1347,1347),(1348,1348,1348),(1349,1349,1349),(1350,1350,1350),
+(1351,1351,1351),(1352,1352,1352),(1353,1353,1353),(1354,1354,1354),(1355,1355,1355),
+(1356,1356,1356),(1357,1357,1357),(1358,1358,1358),(1359,1359,1359),(1360,1360,1360),
+(1361,1361,1361),(1362,1362,1362),(1363,1363,1363),(1364,1364,1364),(1365,1365,1365),
+(1366,1366,1366),(1367,1367,1367),(1368,1368,1368),(1369,1369,1369),(1370,1370,1370),
+(1371,1371,1371),(1372,1372,1372),(1373,1373,1373),(1374,1374,1374),(1375,1375,1375),
+(1376,1376,1376),(1377,1377,1377),(1378,1378,1378),(1379,1379,1379),(1380,1380,1380),
+(1381,1381,1381),(1382,1382,1382),(1383,1383,1383),(1384,1384,1384),(1385,1385,1385),
+(1386,1386,1386),(1387,1387,1387),(1388,1388,1388),(1389,1389,1389),(1390,1390,1390),
+(1391,1391,1391),(1392,1392,1392),(1393,1393,1393),(1394,1394,1394),(1395,1395,1395),
+(1396,1396,1396),(1397,1397,1397),(1398,1398,1398),(1399,1399,1399),(1400,1400,1400),
+(1401,1401,1401),(1402,1402,1402),(1403,1403,1403),(1404,1404,1404),(1405,1405,1405),
+(1406,1406,1406),(1407,1407,1407),(1408,1408,1408),(1409,1409,1409),(1410,1410,1410),
+(1411,1411,1411),(1412,1412,1412),(1413,1413,1413),(1414,1414,1414),(1415,1415,1415),
+(1416,1416,1416),(1417,1417,1417),(1418,1418,1418),(1419,1419,1419),(1420,1420,1420),
+(1421,1421,1421),(1422,1422,1422),(1423,1423,1423),(1424,1424,1424),(1425,1425,1425),
+(1426,1426,1426),(1427,1427,1427),(1428,1428,1428),(1429,1429,1429),(1430,1430,1430),
+(1431,1431,1431),(1432,1432,1432),(1433,1433,1433),(1434,1434,1434),(1435,1435,1435),
+(1436,1436,1436),(1437,1437,1437),(1438,1438,1438),(1439,1439,1439),(1440,1440,1440),
+(1441,1441,1441),(1442,1442,1442),(1443,1443,1443),(1444,1444,1444),(1445,1445,1445),
+(1446,1446,1446),(1447,1447,1447),(1448,1448,1448),(1449,1449,1449),(1450,1450,1450),
+(1451,1451,1451),(1452,1452,1452),(1453,1453,1453),(1454,1454,1454),(1455,1455,1455),
+(1456,1456,1456),(1457,1457,1457),(1458,1458,1458),(1459,1459,1459),(1460,1460,1460),
+(1461,1461,1461),(1462,1462,1462),(1463,1463,1463),(1464,1464,1464),(1465,1465,1465),
+(1466,1466,1466),(1467,1467,1467),(1468,1468,1468),(1469,1469,1469),(1470,1470,1470),
+(1471,1471,1471),(1472,1472,1472),(1473,1473,1473),(1474,1474,1474),(1475,1475,1475),
+(1476,1476,1476),(1477,1477,1477),(1478,1478,1478),(1479,1479,1479),(1480,1480,1480),
+(1481,1481,1481),(1482,1482,1482),(1483,1483,1483),(1484,1484,1484),(1485,1485,1485),
+(1486,1486,1486),(1487,1487,1487),(1488,1488,1488),(1489,1489,1489),(1490,1490,1490),
+(1491,1491,1491),(1492,1492,1492),(1493,1493,1493),(1494,1494,1494),(1495,1495,1495),
+(1496,1496,1496),(1497,1497,1497),(1498,1498,1498),(1499,1499,1499),(1500,1500,1500),
+(1501,1501,1501),(1502,1502,1502),(1503,1503,1503),(1504,1504,1504),(1505,1505,1505),
+(1506,1506,1506),(1507,1507,1507),(1508,1508,1508),(1509,1509,1509),(1510,1510,1510),
+(1511,1511,1511),(1512,1512,1512),(1513,1513,1513),(1514,1514,1514),(1515,1515,1515),
+(1516,1516,1516),(1517,1517,1517),(1518,1518,1518),(1519,1519,1519),(1520,1520,1520),
+(1521,1521,1521),(1522,1522,1522),(1523,1523,1523),(1524,1524,1524),(1525,1525,1525),
+(1526,1526,1526),(1527,1527,1527),(1528,1528,1528),(1529,1529,1529),(1530,1530,1530),
+(1531,1531,1531),(1532,1532,1532),(1533,1533,1533),(1534,1534,1534),(1535,1535,1535),
+(1536,1536,1536),(1537,1537,1537),(1538,1538,1538),(1539,1539,1539),(1540,1540,1540),
+(1541,1541,1541),(1542,1542,1542),(1543,1543,1543),(1544,1544,1544),(1545,1545,1545),
+(1546,1546,1546),(1547,1547,1547),(1548,1548,1548),(1549,1549,1549),(1550,1550,1550),
+(1551,1551,1551),(1552,1552,1552),(1553,1553,1553),(1554,1554,1554),(1555,1555,1555),
+(1556,1556,1556),(1557,1557,1557),(1558,1558,1558),(1559,1559,1559),(1560,1560,1560),
+(1561,1561,1561),(1562,1562,1562),(1563,1563,1563),(1564,1564,1564),(1565,1565,1565),
+(1566,1566,1566),(1567,1567,1567),(1568,1568,1568),(1569,1569,1569),(1570,1570,1570),
+(1571,1571,1571),(1572,1572,1572),(1573,1573,1573),(1574,1574,1574),(1575,1575,1575),
+(1576,1576,1576),(1577,1577,1577),(1578,1578,1578),(1579,1579,1579),(1580,1580,1580),
+(1581,1581,1581),(1582,1582,1582),(1583,1583,1583),(1584,1584,1584),(1585,1585,1585),
+(1586,1586,1586),(1587,1587,1587),(1588,1588,1588),(1589,1589,1589),(1590,1590,1590),
+(1591,1591,1591),(1592,1592,1592),(1593,1593,1593),(1594,1594,1594),(1595,1595,1595),
+(1596,1596,1596),(1597,1597,1597),(1598,1598,1598),(1599,1599,1599),(1600,1600,1600),
+(1601,1601,1601),(1602,1602,1602),(1603,1603,1603),(1604,1604,1604),(1605,1605,1605),
+(1606,1606,1606),(1607,1607,1607),(1608,1608,1608),(1609,1609,1609),(1610,1610,1610),
+(1611,1611,1611),(1612,1612,1612),(1613,1613,1613),(1614,1614,1614),(1615,1615,1615),
+(1616,1616,1616),(1617,1617,1617),(1618,1618,1618),(1619,1619,1619),(1620,1620,1620),
+(1621,1621,1621),(1622,1622,1622),(1623,1623,1623),(1624,1624,1624),(1625,1625,1625),
+(1626,1626,1626),(1627,1627,1627),(1628,1628,1628),(1629,1629,1629),(1630,1630,1630),
+(1631,1631,1631),(1632,1632,1632),(1633,1633,1633),(1634,1634,1634),(1635,1635,1635),
+(1636,1636,1636),(1637,1637,1637),(1638,1638,1638),(1639,1639,1639),(1640,1640,1640),
+(1641,1641,1641),(1642,1642,1642),(1643,1643,1643),(1644,1644,1644),(1645,1645,1645),
+(1646,1646,1646),(1647,1647,1647),(1648,1648,1648),(1649,1649,1649),(1650,1650,1650),
+(1651,1651,1651),(1652,1652,1652),(1653,1653,1653),(1654,1654,1654),(1655,1655,1655),
+(1656,1656,1656),(1657,1657,1657),(1658,1658,1658),(1659,1659,1659),(1660,1660,1660),
+(1661,1661,1661),(1662,1662,1662),(1663,1663,1663),(1664,1664,1664),(1665,1665,1665),
+(1666,1666,1666),(1667,1667,1667),(1668,1668,1668),(1669,1669,1669),(1670,1670,1670),
+(1671,1671,1671),(1672,1672,1672),(1673,1673,1673),(1674,1674,1674),(1675,1675,1675),
+(1676,1676,1676),(1677,1677,1677),(1678,1678,1678),(1679,1679,1679),(1680,1680,1680),
+(1681,1681,1681),(1682,1682,1682),(1683,1683,1683),(1684,1684,1684),(1685,1685,1685),
+(1686,1686,1686),(1687,1687,1687),(1688,1688,1688),(1689,1689,1689),(1690,1690,1690),
+(1691,1691,1691),(1692,1692,1692),(1693,1693,1693),(1694,1694,1694),(1695,1695,1695),
+(1696,1696,1696),(1697,1697,1697),(1698,1698,1698),(1699,1699,1699),(1700,1700,1700),
+(1701,1701,1701),(1702,1702,1702),(1703,1703,1703),(1704,1704,1704),(1705,1705,1705),
+(1706,1706,1706),(1707,1707,1707),(1708,1708,1708),(1709,1709,1709),(1710,1710,1710),
+(1711,1711,1711),(1712,1712,1712),(1713,1713,1713),(1714,1714,1714),(1715,1715,1715),
+(1716,1716,1716),(1717,1717,1717),(1718,1718,1718),(1719,1719,1719),(1720,1720,1720),
+(1721,1721,1721),(1722,1722,1722),(1723,1723,1723),(1724,1724,1724),(1725,1725,1725),
+(1726,1726,1726),(1727,1727,1727),(1728,1728,1728),(1729,1729,1729),(1730,1730,1730),
+(1731,1731,1731),(1732,1732,1732),(1733,1733,1733),(1734,1734,1734),(1735,1735,1735),
+(1736,1736,1736),(1737,1737,1737),(1738,1738,1738),(1739,1739,1739),(1740,1740,1740),
+(1741,1741,1741),(1742,1742,1742),(1743,1743,1743),(1744,1744,1744),(1745,1745,1745),
+(1746,1746,1746),(1747,1747,1747),(1748,1748,1748),(1749,1749,1749),(1750,1750,1750),
+(1751,1751,1751),(1752,1752,1752),(1753,1753,1753),(1754,1754,1754),(1755,1755,1755),
+(1756,1756,1756),(1757,1757,1757),(1758,1758,1758),(1759,1759,1759),(1760,1760,1760),
+(1761,1761,1761),(1762,1762,1762),(1763,1763,1763),(1764,1764,1764),(1765,1765,1765),
+(1766,1766,1766),(1767,1767,1767),(1768,1768,1768),(1769,1769,1769),(1770,1770,1770),
+(1771,1771,1771),(1772,1772,1772),(1773,1773,1773),(1774,1774,1774),(1775,1775,1775),
+(1776,1776,1776),(1777,1777,1777),(1778,1778,1778),(1779,1779,1779),(1780,1780,1780),
+(1781,1781,1781),(1782,1782,1782),(1783,1783,1783),(1784,1784,1784),(1785,1785,1785),
+(1786,1786,1786),(1787,1787,1787),(1788,1788,1788),(1789,1789,1789),(1790,1790,1790),
+(1791,1791,1791),(1792,1792,1792),(1793,1793,1793),(1794,1794,1794),(1795,1795,1795),
+(1796,1796,1796),(1797,1797,1797),(1798,1798,1798),(1799,1799,1799),(1800,1800,1800),
+(1801,1801,1801),(1802,1802,1802),(1803,1803,1803),(1804,1804,1804),(1805,1805,1805),
+(1806,1806,1806),(1807,1807,1807),(1808,1808,1808),(1809,1809,1809),(1810,1810,1810),
+(1811,1811,1811),(1812,1812,1812),(1813,1813,1813),(1814,1814,1814),(1815,1815,1815),
+(1816,1816,1816),(1817,1817,1817),(1818,1818,1818),(1819,1819,1819),(1820,1820,1820),
+(1821,1821,1821),(1822,1822,1822),(1823,1823,1823),(1824,1824,1824),(1825,1825,1825),
+(1826,1826,1826),(1827,1827,1827),(1828,1828,1828),(1829,1829,1829),(1830,1830,1830),
+(1831,1831,1831),(1832,1832,1832),(1833,1833,1833),(1834,1834,1834),(1835,1835,1835),
+(1836,1836,1836),(1837,1837,1837),(1838,1838,1838),(1839,1839,1839),(1840,1840,1840),
+(1841,1841,1841),(1842,1842,1842),(1843,1843,1843),(1844,1844,1844),(1845,1845,1845),
+(1846,1846,1846),(1847,1847,1847),(1848,1848,1848),(1849,1849,1849),(1850,1850,1850),
+(1851,1851,1851),(1852,1852,1852),(1853,1853,1853),(1854,1854,1854),(1855,1855,1855),
+(1856,1856,1856),(1857,1857,1857),(1858,1858,1858),(1859,1859,1859),(1860,1860,1860),
+(1861,1861,1861),(1862,1862,1862),(1863,1863,1863),(1864,1864,1864),(1865,1865,1865),
+(1866,1866,1866),(1867,1867,1867),(1868,1868,1868),(1869,1869,1869),(1870,1870,1870),
+(1871,1871,1871),(1872,1872,1872),(1873,1873,1873),(1874,1874,1874),(1875,1875,1875),
+(1876,1876,1876),(1877,1877,1877),(1878,1878,1878),(1879,1879,1879),(1880,1880,1880),
+(1881,1881,1881),(1882,1882,1882),(1883,1883,1883),(1884,1884,1884),(1885,1885,1885),
+(1886,1886,1886),(1887,1887,1887),(1888,1888,1888),(1889,1889,1889),(1890,1890,1890),
+(1891,1891,1891),(1892,1892,1892),(1893,1893,1893),(1894,1894,1894),(1895,1895,1895),
+(1896,1896,1896),(1897,1897,1897),(1898,1898,1898),(1899,1899,1899),(1900,1900,1900),
+(1901,1901,1901),(1902,1902,1902),(1903,1903,1903),(1904,1904,1904),(1905,1905,1905),
+(1906,1906,1906),(1907,1907,1907),(1908,1908,1908),(1909,1909,1909),(1910,1910,1910),
+(1911,1911,1911),(1912,1912,1912),(1913,1913,1913),(1914,1914,1914),(1915,1915,1915),
+(1916,1916,1916),(1917,1917,1917),(1918,1918,1918),(1919,1919,1919),(1920,1920,1920),
+(1921,1921,1921),(1922,1922,1922),(1923,1923,1923),(1924,1924,1924),(1925,1925,1925),
+(1926,1926,1926),(1927,1927,1927),(1928,1928,1928),(1929,1929,1929),(1930,1930,1930),
+(1931,1931,1931),(1932,1932,1932),(1933,1933,1933),(1934,1934,1934),(1935,1935,1935),
+(1936,1936,1936),(1937,1937,1937),(1938,1938,1938),(1939,1939,1939),(1940,1940,1940),
+(1941,1941,1941),(1942,1942,1942),(1943,1943,1943),(1944,1944,1944),(1945,1945,1945),
+(1946,1946,1946),(1947,1947,1947),(1948,1948,1948),(1949,1949,1949),(1950,1950,1950),
+(1951,1951,1951),(1952,1952,1952),(1953,1953,1953),(1954,1954,1954),(1955,1955,1955),
+(1956,1956,1956),(1957,1957,1957),(1958,1958,1958),(1959,1959,1959),(1960,1960,1960),
+(1961,1961,1961),(1962,1962,1962),(1963,1963,1963),(1964,1964,1964),(1965,1965,1965),
+(1966,1966,1966),(1967,1967,1967),(1968,1968,1968),(1969,1969,1969),(1970,1970,1970),
+(1971,1971,1971),(1972,1972,1972),(1973,1973,1973),(1974,1974,1974),(1975,1975,1975),
+(1976,1976,1976),(1977,1977,1977),(1978,1978,1978),(1979,1979,1979),(1980,1980,1980),
+(1981,1981,1981),(1982,1982,1982),(1983,1983,1983),(1984,1984,1984),(1985,1985,1985),
+(1986,1986,1986),(1987,1987,1987),(1988,1988,1988),(1989,1989,1989),(1990,1990,1990),
+(1991,1991,1991),(1992,1992,1992),(1993,1993,1993),(1994,1994,1994),(1995,1995,1995),
+(1996,1996,1996),(1997,1997,1997),(1998,1998,1998),(1999,1999,1999);
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+2000
+DROP TABLE t1;
diff --git a/mysql-test/t/ndb_alter_table.test b/mysql-test/t/ndb_alter_table.test
new file mode 100644
index 00000000000..f95aa82b7cc
--- /dev/null
+++ b/mysql-test/t/ndb_alter_table.test
@@ -0,0 +1,41 @@
+-- source include/have_ndb.inc
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+#
+# Basic test to show that the ALTER TABLE
+# is working
+#
+CREATE TABLE t1 (
+ a INT NOT NULL,
+ b INT NOT NULL
+) ENGINE=ndbcluster;
+
+INSERT INTO t1 VALUES (9410,9412);
+
+ALTER TABLE t1 ADD COLUMN c int not null;
+SELECT * FROM t1;
+
+DROP TABLE t1;
+
+#
+# More advanced test
+#
+create table t1 (
+col1 int not null auto_increment primary key,
+col2 varchar(30) not null,
+col3 varchar (20) not null,
+col4 varchar(4) not null,
+col5 enum('PENDING', 'ACTIVE', 'DISABLED') not null,
+col6 int not null, to_be_deleted int);
+insert into t1 values (2,4,3,5,"PENDING",1,7);
+alter table t1
+add column col4_5 varchar(20) not null after col4,
+add column col7 varchar(30) not null after col5,
+add column col8 datetime not null, drop column to_be_deleted,
+change column col2 fourth varchar(30) not null after col3,
+modify column col6 int not null first;
+select * from t1;
+drop table t1;
diff --git a/mysql-test/t/ndb_basic.test b/mysql-test/t/ndb_basic.test
index d03abc34633..42dd9f0b8ed 100644
--- a/mysql-test/t/ndb_basic.test
+++ b/mysql-test/t/ndb_basic.test
@@ -23,6 +23,7 @@ SELECT pk1 FROM t1;
SELECT * FROM t1;
SELECT t1.* FROM t1;
+# Update on record by primary key
UPDATE t1 SET attr1=1 WHERE pk1=9410;
SELECT * FROM t1;
@@ -35,13 +36,23 @@ SELECT * FROM t1;
DELETE FROM t1;
SELECT * FROM t1;
-# Delete the record by specifying pk
-INSERT INTO t1 VALUES (9410,9412);
+# Insert more records and update them all at once
+INSERT INTO t1 VALUES (9410,9412), (9411, 9413), (9408, 8765),
+(7,8), (8,9), (9,10), (10,11), (11,12), (12,13), (13,14);
+UPDATE t1 SET attr1 = 9999;
+SELECT * FROM t1 ORDER BY pk1;
+
+UPDATE t1 SET attr1 = 9998 WHERE pk1 < 1000;
+SELECT * FROM t1 ORDER BY pk1;
+
+UPDATE t1 SET attr1 = 9997 WHERE attr1 = 9999;
+SELECT * FROM t1 ORDER BY pk1;
+
+# Delete one record by specifying pk
DELETE FROM t1 WHERE pk1 = 9410;
-SELECT * FROM t1;
+SELECT * FROM t1 ORDER BY pk1;
-# Insert three records and delete the
-INSERT INTO t1 VALUES (9410,9412), (9411, 9413), (9408, 8765);
+# Delete all from table
DELETE FROM t1;
SELECT * FROM t1;
diff --git a/mysql-test/t/ndb_index.test b/mysql-test/t/ndb_index.test
new file mode 100644
index 00000000000..a4a4b92a66b
--- /dev/null
+++ b/mysql-test/t/ndb_index.test
@@ -0,0 +1,126 @@
+-- source include/have_ndb.inc
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+CREATE TABLE t1 (
+ PORT varchar(16) NOT NULL,
+ ACCESSNODE varchar(16) NOT NULL,
+ POP varchar(48) NOT NULL,
+ ACCESSTYPE int unsigned NOT NULL,
+ CUSTOMER_ID varchar(20) NOT NULL,
+ PROVIDER varchar(16),
+ TEXPIRE int unsigned,
+ NUM_IP int unsigned,
+ LEASED_NUM_IP int unsigned,
+ LOCKED_IP int unsigned,
+ STATIC_DNS int unsigned,
+ SUSPENDED_SERVICE int unsigned,
+ SUSPENDED_REASON int unsigned,
+ BGP_COMMUNITY int unsigned,
+ INDEX CUSTOMER_ID_INDEX(CUSTOMER_ID),
+ INDEX FQPN_INDEX(POP,ACCESSNODE,PORT),
+ PRIMARY KEY(POP,ACCESSNODE,PORT,ACCESSTYPE)
+) engine=ndbcluster;
+
+INSERT INTO t1 VALUES ('port67', 'node78', 'pop98', 1, 'kllopmn', 'pr_43', 121212, 1, 2, 3, 8, NULL, NULL, NULL);
+INSERT INTO t1 VALUES ('port67', 'node78', 'pop99', 2, 'klkighh', 'pr_44', 121213, 3, 3, 6, 7, NULL, NULL, NULL);
+INSERT INTO t1 VALUES ('port79', 'node79', 'pop79', 2, 'kpongfaa', 'pr_44', 981213, 2, 4, 10, 11, 2, 99, 1278);
+
+
+# Test select using port
+select port, accessnode, pop, accesstype from t1 where port='port67' order by accesstype;
+select port, accessnode, pop, accesstype from t1 where port='foo';
+
+# Test select using accessnode
+select port, accessnode, pop, accesstype from t1 where accessnode='node78' order by accesstype;
+select port, accessnode, pop, accesstype from t1 where accessnode='foo';
+
+# Test select using pop
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+select port, accessnode, pop, accesstype from t1 where pop='pop98';
+select port, accessnode, pop, accesstype from t1 where pop='pop98' order by accesstype;
+select port, accessnode, pop, accesstype from t1 where pop='POP98';
+select port, accessnode, pop, accesstype from t1 where pop='POP98' order by accesstype;
+select port, accessnode, pop, accesstype from t1 where pop='foo';
+
+# Test select using accesstype
+select port, accessnode, pop, accesstype from t1 where accesstype=1;
+select port, accessnode, pop, accesstype from t1 where accesstype=2 order by port;
+select port, accessnode, pop, accesstype from t1 where accesstype=98 order by port;
+
+# Test select using customer_id
+# NOTE! customer_id has a INDEX (ordered index in NDB), it's case sensitive!
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn';
+select port, accessnode, pop, accesstype from t1 where customer_id='KLLOPMN';
+select port, accessnode, pop, accesstype from t1 where customer_id='kLLoPMn';
+select port, accessnode, pop, accesstype from t1 where customer_id='foo';
+
+# Test select using provider
+select port, accessnode, pop, accesstype from t1 where provider='pr_43';
+select port, accessnode, pop, accesstype from t1 where provider='foo';
+
+# Test select using texpire
+select port, accessnode from t1 where texpire=121212;
+select port, accessnode from t1 where texpire=2323;
+
+# Test select using num_ip
+select port, accessnode, pop, accesstype from t1 where num_ip=1;
+select port, accessnode, pop, accesstype from t1 where num_ip=89;
+
+# Test select using leased_num_ip
+select port, accessnode, pop, accesstype from t1 where leased_num_ip=2;
+select port, accessnode, pop, accesstype from t1 where leased_num_ip=89;
+
+# Test select using locked_ip
+select port, accessnode, pop, accesstype from t1 where locked_ip=3;
+select port, accessnode, pop, accesstype from t1 where locked_ip=89;
+
+# Test select using static_dns
+select port, accessnode, pop, accesstype from t1 where static_dns=8;
+select port, accessnode, pop, accesstype from t1 where static_dns=89;
+
+# Test select using suspended_service
+select port, accessnode, pop, accesstype from t1 where suspended_service=8;
+select port, accessnode, pop, accesstype from t1 where suspended_service=89;
+
+# Test select using suspended_reason
+select port, accessnode, pop, accesstype from t1 where suspended_reason=NULL;
+select port, accessnode, pop, accesstype from t1 where suspended_reason=89;
+select port, accessnode, pop, accesstype from t1 where suspended_reason=0;
+
+# Test select using bgp_community
+select port, accessnode, pop, accesstype from t1 where bgp_community=NULL;
+select port, accessnode, pop, accesstype from t1 where bgp_community=89;
+select port, accessnode, pop, accesstype from t1 where bgp_community=0;
+
+# Test select using full primary key
+select port, accessnode, pop, accesstype from t1 where port='port67' and accessnode='node78' and pop='pop98' and accesstype=1;
+select port, accessnode, pop, accesstype from t1 where port='port67' and accesstype=1 and accessnode='node78' and pop='pop98';
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and port='port67' and accesstype=1 and accessnode='node78';
+select port, accessnode from t1 where port='foo' and accessnode='foo' and pop='foo' and accesstype=99;
+
+# Test select using partial primary key
+select port, accessnode, pop, accesstype from t1 where port='port67' and pop='pop98' and accesstype=1;
+select port, accessnode, pop, accesstype from t1 where accesstype=1 and accessnode='node78' and pop='pop98';
+select port, accessnode, pop, accesstype from t1 where port='port67' and accesstype=1 and accessnode='node78';
+select port, accessnode from t1 where port='foo' and accessnode='foo' and pop='foo';
+
+# Test select using CUSTOMER_ID_INDEX
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn';
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn' and accesstype=1;
+select port, accessnode, pop, accesstype from t1 where customer_id='kllopmn' and accesstype=2;
+select port, accessnode, pop, accesstype from t1 where accesstype=2 and customer_id='kllopmn';
+
+# Test select using FQPN_INDEX
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67';
+#select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67' order by accesstype;
+#select port, accessnode, pop, accesstype from t1 where accessnode='node78' and port='port67' and pop='pop98' order by accesstype;
+#select port, accessnode, pop, accesstype from t1 where port='port67' and pop='pop98' and accessnode='node78' order by accesstype;
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67' and customer_id='kllopmn';
+select port, accessnode, pop, accesstype from t1 where pop='pop98' and accessnode='node78' and port='port67' and customer_id='foo';
+
+
+drop table t1;
diff --git a/mysql-test/t/ndb_index_ordered.test b/mysql-test/t/ndb_index_ordered.test
new file mode 100644
index 00000000000..c05db318825
--- /dev/null
+++ b/mysql-test/t/ndb_index_ordered.test
@@ -0,0 +1,112 @@
+-- source include/have_ndb.inc
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+#
+# Simple test to show use of ordered indexes
+#
+
+CREATE TABLE t1 (
+ a int unsigned NOT NULL PRIMARY KEY,
+ b int unsigned not null,
+ c int unsigned,
+ KEY(b)
+) engine=ndbcluster;
+
+insert t1 values(1, 2, 3), (2,3, 5), (3, 4, 6), (4, 5, 8), (5,6, 2), (6,7, 2);
+select * from t1 order by b;
+select * from t1 where b >= 4 order by b;
+select * from t1 where b = 4 order by b;
+select * from t1 where b > 4 order by b;
+select * from t1 where b < 4 order by b;
+select * from t1 where b <= 4 order by b;
+
+#
+# Here we should add some "explain select" to verify that the ordered index is
+# used for these queries.
+#
+
+#
+# Update using ordered index scan
+#
+
+update t1 set c = 3 where b = 3;
+select * from t1 order by a;
+update t1 set c = 10 where b >= 6;
+select * from t1 order by a;
+update t1 set c = 11 where b < 5;
+select * from t1 order by a;
+update t1 set c = 12 where b > 0;
+select * from t1 order by a;
+update t1 set c = 13 where b <= 3;
+select * from t1 order by a;
+
+
+#
+# Delete using ordered index scan
+#
+
+drop table t1;
+
+CREATE TABLE t1 (
+ a int unsigned NOT NULL PRIMARY KEY,
+ b int unsigned not null,
+ c int unsigned,
+ KEY(b)
+) engine=ndbcluster;
+
+insert t1 values(1, 2, 13), (2,3, 13), (3, 4, 12), (4, 5, 12), (5,6, 12), (6,7, 12);
+
+delete from t1 where b = 3;
+select * from t1 order by a;
+delete from t1 where b >= 6;
+select * from t1 order by a;
+delete from t1 where b < 4;
+select * from t1 order by a;
+delete from t1 where b > 5;
+select * from t1 order by a;
+delete from t1 where b <= 4;
+select * from t1 order by a;
+
+drop table t1;
+
+
+#
+#multi part key
+#
+CREATE TABLE t1 (
+ a int unsigned NOT NULL PRIMARY KEY,
+ b int unsigned not null,
+ c int unsigned not null,
+) engine = ndb;
+
+create index a1 on t1 (b, c);
+
+insert into t1 values (1, 2, 13);
+insert into t1 values (2,3, 13);
+insert into t1 values (3, 4, 12);
+insert into t1 values (4, 5, 12);
+insert into t1 values (5,6, 12);
+insert into t1 values (6,7, 12);
+insert into t1 values (7, 2, 1);
+insert into t1 values (8,3, 6);
+insert into t1 values (9, 4, 12);
+insert into t1 values (14, 5, 4);
+insert into t1 values (15,5,5);
+insert into t1 values (16,5, 6);
+insert into t1 values (17,4,4);
+insert into t1 values (18,1, 7);
+
+
+
+select * from t1 order by a;
+select * from t1 where b<=5 order by a;
+select * from t1 where b<=5 and c=0;
+insert into t1 values (19,4, 0);
+select * from t1 where b<=5 and c=0;
+select * from t1 where b=4 and c<=5;
+select * from t1 where b<=4 and c<=5 order by a;
+select * from t1 where b<=5 and c=0 or b<=5 and c=2;
+drop table t1;
diff --git a/mysql-test/t/ndb_index_unique.test b/mysql-test/t/ndb_index_unique.test
new file mode 100644
index 00000000000..bfab6225efd
--- /dev/null
+++ b/mysql-test/t/ndb_index_unique.test
@@ -0,0 +1,134 @@
+-- source include/have_ndb.inc
+
+--disable_warnings
+drop table if exists t1, t2, t3, t4, t5, t6, t7;
+--enable_warnings
+
+#
+# Simple test to show use of UNIQUE indexes
+#
+
+CREATE TABLE t1 (
+ a int unsigned NOT NULL PRIMARY KEY,
+ b int unsigned not null,
+ c int unsigned,
+ UNIQUE(b)
+) engine=ndbcluster;
+
+insert t1 values(1, 2, 3), (2, 3, 5), (3, 4, 6), (4, 5, 8), (5,6, 2), (6,7, 2);
+select * from t1 order by b;
+select * from t1 where b = 4 order by b;
+insert into t1 values(7,8,3);
+select * from t1 where b = 4 order by a;
+
+drop table t1;
+
+#
+# More complex tables
+#
+
+CREATE TABLE t1 (
+ cid smallint(5) unsigned NOT NULL default '0',
+ cv varchar(250) NOT NULL default '',
+ PRIMARY KEY (cid),
+ UNIQUE KEY cv (cv)
+) engine=ndbcluster;
+INSERT INTO t1 VALUES (8,'dummy');
+CREATE TABLE t2 (
+ cid bigint(20) unsigned NOT NULL auto_increment,
+ cap varchar(255) NOT NULL default '',
+ PRIMARY KEY (cid),
+) engine=ndbcluster;
+CREATE TABLE t3 (
+ gid bigint(20) unsigned NOT NULL auto_increment,
+ gn varchar(255) NOT NULL default '',
+ must tinyint(4) default NULL,
+ PRIMARY KEY (gid),
+) engine=ndbcluster;
+INSERT INTO t3 VALUES (1,'V1',NULL);
+CREATE TABLE t4 (
+ uid bigint(20) unsigned NOT NULL default '0',
+ gid bigint(20) unsigned NOT NULL,
+ rid bigint(20) unsigned NOT NULL default '-1',
+ cid bigint(20) unsigned NOT NULL default '-1',
+ UNIQUE KEY m (uid,gid,rid,cid),
+) engine=ndbcluster;
+INSERT INTO t4 VALUES (1,1,2,4);
+INSERT INTO t4 VALUES (1,1,2,3);
+INSERT INTO t4 VALUES (1,1,5,7);
+INSERT INTO t4 VALUES (1,1,10,8);
+CREATE TABLE t5 (
+ rid bigint(20) unsigned NOT NULL auto_increment,
+ rl varchar(255) NOT NULL default '',
+ PRIMARY KEY (rid),
+) engine=ndbcluster;
+CREATE TABLE t6 (
+ uid bigint(20) unsigned NOT NULL auto_increment,
+ un varchar(250) NOT NULL default '',
+ uc smallint(5) unsigned NOT NULL default '0',
+ PRIMARY KEY (uid),
+ UNIQUE KEY nc (un,uc),
+) engine=ndbcluster;
+INSERT INTO t6 VALUES (1,'test',8);
+INSERT INTO t6 VALUES (2,'test2',9);
+INSERT INTO t6 VALUES (3,'tre',3);
+CREATE TABLE t7 (
+ mid bigint(20) unsigned NOT NULL PRIMARY KEY,
+ uid bigint(20) unsigned NOT NULL default '0',
+ gid bigint(20) unsigned NOT NULL,
+ rid bigint(20) unsigned NOT NULL default '-1',
+ cid bigint(20) unsigned NOT NULL default '-1',
+ UNIQUE KEY m (uid,gid,rid,cid),
+) engine=ndbcluster;
+INSERT INTO t7 VALUES(1, 1, 1, 1, 1);
+INSERT INTO t7 VALUES(2, 2, 1, 1, 1);
+INSERT INTO t7 VALUES(3, 3, 1, 1, 1);
+INSERT INTO t7 VALUES(4, 4, 1, 1, 1);
+INSERT INTO t7 VALUES(5, 5, 1, 1, 1);
+INSERT INTO t7 VALUES(6, 1, 1, 1, 6);
+INSERT INTO t7 VALUES(7, 2, 1, 1, 7);
+INSERT INTO t7 VALUES(8, 3, 1, 1, 8);
+INSERT INTO t7 VALUES(9, 4, 1, 1, 9);
+INSERT INTO t7 VALUES(10, 5, 1, 1, 10);
+
+select * from t1 where cv = 'dummy';
+select * from t1 where cv = 'test';
+select * from t4 where uid = 1 and gid=1 and rid=2 and cid=4;
+select * from t4 where uid = 1 and gid=1 and rid=1 and cid=4;
+select * from t4 where uid = 1 order by cid;
+select * from t4 where rid = 2 order by cid;
+select * from t6 where un='test' and uc=8;
+select * from t6 where un='test' and uc=7;
+select * from t6 where un='test';
+select * from t7 where mid = 8;
+select * from t7 where uid = 8;
+select * from t7 where uid = 1 order by mid;
+select * from t7 where uid = 4 order by mid;
+select * from t7 where gid = 4;
+select * from t7 where gid = 1 order by mid;
+select * from t7 where cid = 4;
+select * from t7 where cid = 8;
+
+#
+# insert more records into t4
+#
+let $1=100;
+disable_query_log;
+while ($1)
+{
+ eval insert into t4 values(1, $1, 5, 12);
+ eval insert into t4 values($1, 3, 9, 11);
+ dec $1;
+}
+enable_query_log;
+
+select * from t4 where uid = 1 and gid=1 and rid=2 and cid=4;
+select * from t4 where uid = 1 and gid=1 and rid=1 and cid=4;
+select * from t4 where uid = 1 order by gid,cid;
+select * from t4 where uid = 1 order by gid,cid;
+select * from t4 where rid = 2 order by cid;
+
+
+drop table t1,t2,t3,t4,t5,t6,t7;
+
+
diff --git a/mysql-test/t/ndb_insert.test b/mysql-test/t/ndb_insert.test
new file mode 100644
index 00000000000..c55a925dca2
--- /dev/null
+++ b/mysql-test/t/ndb_insert.test
@@ -0,0 +1,433 @@
+-- source include/have_ndb.inc
+
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+#
+# Basic test of INSERT in NDB
+#
+
+#
+# Create a normal table with primary key
+#
+CREATE TABLE t1 (
+ pk1 INT NOT NULL PRIMARY KEY,
+ b INT NOT NULL,
+ c INT NOT NULL
+) ENGINE=ndbcluster;
+
+INSERT INTO t1 VALUES (0, 0, 0);
+SELECT * FROM t1;
+
+INSERT INTO t1 VALUES
+(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),
+(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),
+(11,11,11),(12,12,12),(13,13,13),(14,14,14),(15,15,15),
+(16,16,16),(17,17,17),(18,18,18),(19,19,19),(20,20,20),
+(21,21,21),(22,22,22),(23,23,23),(24,24,24),(25,25,25),
+(26,26,26),(27,27,27),(28,28,28),(29,29,29),(30,30,30),
+(31,31,31),(32,32,32),(33,33,33),(34,34,34),(35,35,35),
+(36,36,36),(37,37,37),(38,38,38),(39,39,39),(40,40,40),
+(41,41,41),(42,42,42),(43,43,43),(44,44,44),(45,45,45),
+(46,46,46),(47,47,47),(48,48,48),(49,49,49),(50,50,50),
+(51,51,51),(52,52,52),(53,53,53),(54,54,54),(55,55,55),
+(56,56,56),(57,57,57),(58,58,58),(59,59,59),(60,60,60),
+(61,61,61),(62,62,62),(63,63,63),(64,64,64),(65,65,65),
+(66,66,66),(67,67,67),(68,68,68),(69,69,69),(70,70,70),
+(71,71,71),(72,72,72),(73,73,73),(74,74,74),(75,75,75),
+(76,76,76),(77,77,77),(78,78,78),(79,79,79),(80,80,80),
+(81,81,81),(82,82,82),(83,83,83),(84,84,84),(85,85,85),
+(86,86,86),(87,87,87),(88,88,88),(89,89,89),(90,90,90),
+(91,91,91),(92,92,92),(93,93,93),(94,94,94),(95,95,95),
+(96,96,96),(97,97,97),(98,98,98),(99,99,99),(100,100,100),
+(101,101,101),(102,102,102),(103,103,103),(104,104,104),(105,105,105),
+(106,106,106),(107,107,107),(108,108,108),(109,109,109),(110,110,110),
+(111,111,111),(112,112,112),(113,113,113),(114,114,114),(115,115,115),
+(116,116,116),(117,117,117),(118,118,118),(119,119,119),(120,120,120),
+(121,121,121),(122,122,122),(123,123,123),(124,124,124),(125,125,125),
+(126,126,126),(127,127,127),(128,128,128),(129,129,129),(130,130,130),
+(131,131,131),(132,132,132),(133,133,133),(134,134,134),(135,135,135),
+(136,136,136),(137,137,137),(138,138,138),(139,139,139),(140,140,140),
+(141,141,141),(142,142,142),(143,143,143),(144,144,144),(145,145,145),
+(146,146,146),(147,147,147),(148,148,148),(149,149,149),(150,150,150),
+(151,151,151),(152,152,152),(153,153,153),(154,154,154),(155,155,155),
+(156,156,156),(157,157,157),(158,158,158),(159,159,159),(160,160,160),
+(161,161,161),(162,162,162),(163,163,163),(164,164,164),(165,165,165),
+(166,166,166),(167,167,167),(168,168,168),(169,169,169),(170,170,170),
+(171,171,171),(172,172,172),(173,173,173),(174,174,174),(175,175,175),
+(176,176,176),(177,177,177),(178,178,178),(179,179,179),(180,180,180),
+(181,181,181),(182,182,182),(183,183,183),(184,184,184),(185,185,185),
+(186,186,186),(187,187,187),(188,188,188),(189,189,189),(190,190,190),
+(191,191,191),(192,192,192),(193,193,193),(194,194,194),(195,195,195),
+(196,196,196),(197,197,197),(198,198,198),(199,199,199),(200,200,200),
+(201,201,201),(202,202,202),(203,203,203),(204,204,204),(205,205,205),
+(206,206,206),(207,207,207),(208,208,208),(209,209,209),(210,210,210),
+(211,211,211),(212,212,212),(213,213,213),(214,214,214),(215,215,215),
+(216,216,216),(217,217,217),(218,218,218),(219,219,219),(220,220,220),
+(221,221,221),(222,222,222),(223,223,223),(224,224,224),(225,225,225),
+(226,226,226),(227,227,227),(228,228,228),(229,229,229),(230,230,230),
+(231,231,231),(232,232,232),(233,233,233),(234,234,234),(235,235,235),
+(236,236,236),(237,237,237),(238,238,238),(239,239,239),(240,240,240),
+(241,241,241),(242,242,242),(243,243,243),(244,244,244),(245,245,245),
+(246,246,246),(247,247,247),(248,248,248),(249,249,249),(250,250,250),
+(251,251,251),(252,252,252),(253,253,253),(254,254,254),(255,255,255),
+(256,256,256),(257,257,257),(258,258,258),(259,259,259),(260,260,260),
+(261,261,261),(262,262,262),(263,263,263),(264,264,264),(265,265,265),
+(266,266,266),(267,267,267),(268,268,268),(269,269,269),(270,270,270),
+(271,271,271),(272,272,272),(273,273,273),(274,274,274),(275,275,275),
+(276,276,276),(277,277,277),(278,278,278),(279,279,279),(280,280,280),
+(281,281,281),(282,282,282),(283,283,283),(284,284,284),(285,285,285),
+(286,286,286),(287,287,287),(288,288,288),(289,289,289),(290,290,290),
+(291,291,291),(292,292,292),(293,293,293),(294,294,294),(295,295,295),
+(296,296,296),(297,297,297),(298,298,298),(299,299,299),(300,300,300),
+(301,301,301),(302,302,302),(303,303,303),(304,304,304),(305,305,305),
+(306,306,306),(307,307,307),(308,308,308),(309,309,309),(310,310,310),
+(311,311,311),(312,312,312),(313,313,313),(314,314,314),(315,315,315),
+(316,316,316),(317,317,317),(318,318,318),(319,319,319),(320,320,320),
+(321,321,321),(322,322,322),(323,323,323),(324,324,324),(325,325,325),
+(326,326,326),(327,327,327),(328,328,328),(329,329,329),(330,330,330),
+(331,331,331),(332,332,332),(333,333,333),(334,334,334),(335,335,335),
+(336,336,336),(337,337,337),(338,338,338),(339,339,339),(340,340,340),
+(341,341,341),(342,342,342),(343,343,343),(344,344,344),(345,345,345),
+(346,346,346),(347,347,347),(348,348,348),(349,349,349),(350,350,350),
+(351,351,351),(352,352,352),(353,353,353),(354,354,354),(355,355,355),
+(356,356,356),(357,357,357),(358,358,358),(359,359,359),(360,360,360),
+(361,361,361),(362,362,362),(363,363,363),(364,364,364),(365,365,365),
+(366,366,366),(367,367,367),(368,368,368),(369,369,369),(370,370,370),
+(371,371,371),(372,372,372),(373,373,373),(374,374,374),(375,375,375),
+(376,376,376),(377,377,377),(378,378,378),(379,379,379),(380,380,380),
+(381,381,381),(382,382,382),(383,383,383),(384,384,384),(385,385,385),
+(386,386,386),(387,387,387),(388,388,388),(389,389,389),(390,390,390),
+(391,391,391),(392,392,392),(393,393,393),(394,394,394),(395,395,395),
+(396,396,396),(397,397,397),(398,398,398),(399,399,399),(400,400,400),
+(401,401,401),(402,402,402),(403,403,403),(404,404,404),(405,405,405),
+(406,406,406),(407,407,407),(408,408,408),(409,409,409),(410,410,410),
+(411,411,411),(412,412,412),(413,413,413),(414,414,414),(415,415,415),
+(416,416,416),(417,417,417),(418,418,418),(419,419,419),(420,420,420),
+(421,421,421),(422,422,422),(423,423,423),(424,424,424),(425,425,425),
+(426,426,426),(427,427,427),(428,428,428),(429,429,429),(430,430,430),
+(431,431,431),(432,432,432),(433,433,433),(434,434,434),(435,435,435),
+(436,436,436),(437,437,437),(438,438,438),(439,439,439),(440,440,440),
+(441,441,441),(442,442,442),(443,443,443),(444,444,444),(445,445,445),
+(446,446,446),(447,447,447),(448,448,448),(449,449,449),(450,450,450),
+(451,451,451),(452,452,452),(453,453,453),(454,454,454),(455,455,455),
+(456,456,456),(457,457,457),(458,458,458),(459,459,459),(460,460,460),
+(461,461,461),(462,462,462),(463,463,463),(464,464,464),(465,465,465),
+(466,466,466),(467,467,467),(468,468,468),(469,469,469),(470,470,470),
+(471,471,471),(472,472,472),(473,473,473),(474,474,474),(475,475,475),
+(476,476,476),(477,477,477),(478,478,478),(479,479,479),(480,480,480),
+(481,481,481),(482,482,482),(483,483,483),(484,484,484),(485,485,485),
+(486,486,486),(487,487,487),(488,488,488),(489,489,489),(490,490,490),
+(491,491,491),(492,492,492),(493,493,493),(494,494,494),(495,495,495),
+(496,496,496),(497,497,497),(498,498,498),(499,499,499),(500, 500, 500);
+
+SELECT COUNT(*) FROM t1;
+
+INSERT INTO t1 VALUES
+(501,501,501),(502,502,502),(503,503,503),(504,504,504),(505,505,505),
+(506,506,506),(507,507,507),(508,508,508),(509,509,509),(510,510,510),
+(511,511,511),(512,512,512),(513,513,513),(514,514,514),(515,515,515),
+(516,516,516),(517,517,517),(518,518,518),(519,519,519),(520,520,520),
+(521,521,521),(522,522,522),(523,523,523),(524,524,524),(525,525,525),
+(526,526,526),(527,527,527),(528,528,528),(529,529,529),(530,530,530),
+(531,531,531),(532,532,532),(533,533,533),(534,534,534),(535,535,535),
+(536,536,536),(537,537,537),(538,538,538),(539,539,539),(540,540,540),
+(541,541,541),(542,542,542),(543,543,543),(544,544,544),(545,545,545),
+(546,546,546),(547,547,547),(548,548,548),(549,549,549),(550,550,550),
+(551,551,551),(552,552,552),(553,553,553),(554,554,554),(555,555,555),
+(556,556,556),(557,557,557),(558,558,558),(559,559,559),(560,560,560),
+(561,561,561),(562,562,562),(563,563,563),(564,564,564),(565,565,565),
+(566,566,566),(567,567,567),(568,568,568),(569,569,569),(570,570,570),
+(571,571,571),(572,572,572),(573,573,573),(574,574,574),(575,575,575),
+(576,576,576),(577,577,577),(578,578,578),(579,579,579),(580,580,580),
+(581,581,581),(582,582,582),(583,583,583),(584,584,584),(585,585,585),
+(586,586,586),(587,587,587),(588,588,588),(589,589,589),(590,590,590),
+(591,591,591),(592,592,592),(593,593,593),(594,594,594),(595,595,595),
+(596,596,596),(597,597,597),(598,598,598),(599,599,599),(600,600,600),
+(601,601,601),(602,602,602),(603,603,603),(604,604,604),(605,605,605),
+(606,606,606),(607,607,607),(608,608,608),(609,609,609),(610,610,610),
+(611,611,611),(612,612,612),(613,613,613),(614,614,614),(615,615,615),
+(616,616,616),(617,617,617),(618,618,618),(619,619,619),(620,620,620),
+(621,621,621),(622,622,622),(623,623,623),(624,624,624),(625,625,625),
+(626,626,626),(627,627,627),(628,628,628),(629,629,629),(630,630,630),
+(631,631,631),(632,632,632),(633,633,633),(634,634,634),(635,635,635),
+(636,636,636),(637,637,637),(638,638,638),(639,639,639),(640,640,640),
+(641,641,641),(642,642,642),(643,643,643),(644,644,644),(645,645,645),
+(646,646,646),(647,647,647),(648,648,648),(649,649,649),(650,650,650),
+(651,651,651),(652,652,652),(653,653,653),(654,654,654),(655,655,655),
+(656,656,656),(657,657,657),(658,658,658),(659,659,659),(660,660,660),
+(661,661,661),(662,662,662),(663,663,663),(664,664,664),(665,665,665),
+(666,666,666),(667,667,667),(668,668,668),(669,669,669),(670,670,670),
+(671,671,671),(672,672,672),(673,673,673),(674,674,674),(675,675,675),
+(676,676,676),(677,677,677),(678,678,678),(679,679,679),(680,680,680),
+(681,681,681),(682,682,682),(683,683,683),(684,684,684),(685,685,685),
+(686,686,686),(687,687,687),(688,688,688),(689,689,689),(690,690,690),
+(691,691,691),(692,692,692),(693,693,693),(694,694,694),(695,695,695),
+(696,696,696),(697,697,697),(698,698,698),(699,699,699),(700,700,700),
+(701,701,701),(702,702,702),(703,703,703),(704,704,704),(705,705,705),
+(706,706,706),(707,707,707),(708,708,708),(709,709,709),(710,710,710),
+(711,711,711),(712,712,712),(713,713,713),(714,714,714),(715,715,715),
+(716,716,716),(717,717,717),(718,718,718),(719,719,719),(720,720,720),
+(721,721,721),(722,722,722),(723,723,723),(724,724,724),(725,725,725),
+(726,726,726),(727,727,727),(728,728,728),(729,729,729),(730,730,730),
+(731,731,731),(732,732,732),(733,733,733),(734,734,734),(735,735,735),
+(736,736,736),(737,737,737),(738,738,738),(739,739,739),(740,740,740),
+(741,741,741),(742,742,742),(743,743,743),(744,744,744),(745,745,745),
+(746,746,746),(747,747,747),(748,748,748),(749,749,749),(750,750,750),
+(751,751,751),(752,752,752),(753,753,753),(754,754,754),(755,755,755),
+(756,756,756),(757,757,757),(758,758,758),(759,759,759),(760,760,760),
+(761,761,761),(762,762,762),(763,763,763),(764,764,764),(765,765,765),
+(766,766,766),(767,767,767),(768,768,768),(769,769,769),(770,770,770),
+(771,771,771),(772,772,772),(773,773,773),(774,774,774),(775,775,775),
+(776,776,776),(777,777,777),(778,778,778),(779,779,779),(780,780,780),
+(781,781,781),(782,782,782),(783,783,783),(784,784,784),(785,785,785),
+(786,786,786),(787,787,787),(788,788,788),(789,789,789),(790,790,790),
+(791,791,791),(792,792,792),(793,793,793),(794,794,794),(795,795,795),
+(796,796,796),(797,797,797),(798,798,798),(799,799,799),(800,800,800),
+(801,801,801),(802,802,802),(803,803,803),(804,804,804),(805,805,805),
+(806,806,806),(807,807,807),(808,808,808),(809,809,809),(810,810,810),
+(811,811,811),(812,812,812),(813,813,813),(814,814,814),(815,815,815),
+(816,816,816),(817,817,817),(818,818,818),(819,819,819),(820,820,820),
+(821,821,821),(822,822,822),(823,823,823),(824,824,824),(825,825,825),
+(826,826,826),(827,827,827),(828,828,828),(829,829,829),(830,830,830),
+(831,831,831),(832,832,832),(833,833,833),(834,834,834),(835,835,835),
+(836,836,836),(837,837,837),(838,838,838),(839,839,839),(840,840,840),
+(841,841,841),(842,842,842),(843,843,843),(844,844,844),(845,845,845),
+(846,846,846),(847,847,847),(848,848,848),(849,849,849),(850,850,850),
+(851,851,851),(852,852,852),(853,853,853),(854,854,854),(855,855,855),
+(856,856,856),(857,857,857),(858,858,858),(859,859,859),(860,860,860),
+(861,861,861),(862,862,862),(863,863,863),(864,864,864),(865,865,865),
+(866,866,866),(867,867,867),(868,868,868),(869,869,869),(870,870,870),
+(871,871,871),(872,872,872),(873,873,873),(874,874,874),(875,875,875),
+(876,876,876),(877,877,877),(878,878,878),(879,879,879),(880,880,880),
+(881,881,881),(882,882,882),(883,883,883),(884,884,884),(885,885,885),
+(886,886,886),(887,887,887),(888,888,888),(889,889,889),(890,890,890),
+(891,891,891),(892,892,892),(893,893,893),(894,894,894),(895,895,895),
+(896,896,896),(897,897,897),(898,898,898),(899,899,899),(900,900,900),
+(901,901,901),(902,902,902),(903,903,903),(904,904,904),(905,905,905),
+(906,906,906),(907,907,907),(908,908,908),(909,909,909),(910,910,910),
+(911,911,911),(912,912,912),(913,913,913),(914,914,914),(915,915,915),
+(916,916,916),(917,917,917),(918,918,918),(919,919,919),(920,920,920),
+(921,921,921),(922,922,922),(923,923,923),(924,924,924),(925,925,925),
+(926,926,926),(927,927,927),(928,928,928),(929,929,929),(930,930,930),
+(931,931,931),(932,932,932),(933,933,933),(934,934,934),(935,935,935),
+(936,936,936),(937,937,937),(938,938,938),(939,939,939),(940,940,940),
+(941,941,941),(942,942,942),(943,943,943),(944,944,944),(945,945,945),
+(946,946,946),(947,947,947),(948,948,948),(949,949,949),(950,950,950),
+(951,951,951),(952,952,952),(953,953,953),(954,954,954),(955,955,955),
+(956,956,956),(957,957,957),(958,958,958),(959,959,959),(960,960,960),
+(961,961,961),(962,962,962),(963,963,963),(964,964,964),(965,965,965),
+(966,966,966),(967,967,967),(968,968,968),(969,969,969),(970,970,970),
+(971,971,971),(972,972,972),(973,973,973),(974,974,974),(975,975,975),
+(976,976,976),(977,977,977),(978,978,978),(979,979,979),(980,980,980),
+(981,981,981),(982,982,982),(983,983,983),(984,984,984),(985,985,985),
+(986,986,986),(987,987,987),(988,988,988),(989,989,989),(990,990,990),
+(991,991,991),(992,992,992),(993,993,993),(994,994,994),(995,995,995),
+(996,996,996),(997,997,997),(998,998,998),(999,999,999),(1000,1000,1000),
+(1001,1001,1001),(1002,1002,1002),(1003,1003,1003),(1004,1004,1004),(1005,1005,1005),
+(1006,1006,1006),(1007,1007,1007),(1008,1008,1008),(1009,1009,1009),(1010,1010,1010),
+(1011,1011,1011),(1012,1012,1012),(1013,1013,1013),(1014,1014,1014),(1015,1015,1015),
+(1016,1016,1016),(1017,1017,1017),(1018,1018,1018),(1019,1019,1019),(1020,1020,1020),
+(1021,1021,1021),(1022,1022,1022),(1023,1023,1023),(1024,1024,1024),(1025,1025,1025),
+(1026,1026,1026),(1027,1027,1027),(1028,1028,1028),(1029,1029,1029),(1030,1030,1030),
+(1031,1031,1031),(1032,1032,1032),(1033,1033,1033),(1034,1034,1034),(1035,1035,1035),
+(1036,1036,1036),(1037,1037,1037),(1038,1038,1038),(1039,1039,1039),(1040,1040,1040),
+(1041,1041,1041),(1042,1042,1042),(1043,1043,1043),(1044,1044,1044),(1045,1045,1045),
+(1046,1046,1046),(1047,1047,1047),(1048,1048,1048),(1049,1049,1049),(1050,1050,1050),
+(1051,1051,1051),(1052,1052,1052),(1053,1053,1053),(1054,1054,1054),(1055,1055,1055),
+(1056,1056,1056),(1057,1057,1057),(1058,1058,1058),(1059,1059,1059),(1060,1060,1060),
+(1061,1061,1061),(1062,1062,1062),(1063,1063,1063),(1064,1064,1064),(1065,1065,1065),
+(1066,1066,1066),(1067,1067,1067),(1068,1068,1068),(1069,1069,1069),(1070,1070,1070),
+(1071,1071,1071),(1072,1072,1072),(1073,1073,1073),(1074,1074,1074),(1075,1075,1075),
+(1076,1076,1076),(1077,1077,1077),(1078,1078,1078),(1079,1079,1079),(1080,1080,1080),
+(1081,1081,1081),(1082,1082,1082),(1083,1083,1083),(1084,1084,1084),(1085,1085,1085),
+(1086,1086,1086),(1087,1087,1087),(1088,1088,1088),(1089,1089,1089),(1090,1090,1090),
+(1091,1091,1091),(1092,1092,1092),(1093,1093,1093),(1094,1094,1094),(1095,1095,1095),
+(1096,1096,1096),(1097,1097,1097),(1098,1098,1098),(1099,1099,1099),(1100,1100,1100),
+(1101,1101,1101),(1102,1102,1102),(1103,1103,1103),(1104,1104,1104),(1105,1105,1105),
+(1106,1106,1106),(1107,1107,1107),(1108,1108,1108),(1109,1109,1109),(1110,1110,1110),
+(1111,1111,1111),(1112,1112,1112),(1113,1113,1113),(1114,1114,1114),(1115,1115,1115),
+(1116,1116,1116),(1117,1117,1117),(1118,1118,1118),(1119,1119,1119),(1120,1120,1120),
+(1121,1121,1121),(1122,1122,1122),(1123,1123,1123),(1124,1124,1124),(1125,1125,1125),
+(1126,1126,1126),(1127,1127,1127),(1128,1128,1128),(1129,1129,1129),(1130,1130,1130),
+(1131,1131,1131),(1132,1132,1132),(1133,1133,1133),(1134,1134,1134),(1135,1135,1135),
+(1136,1136,1136),(1137,1137,1137),(1138,1138,1138),(1139,1139,1139),(1140,1140,1140),
+(1141,1141,1141),(1142,1142,1142),(1143,1143,1143),(1144,1144,1144),(1145,1145,1145),
+(1146,1146,1146),(1147,1147,1147),(1148,1148,1148),(1149,1149,1149),(1150,1150,1150),
+(1151,1151,1151),(1152,1152,1152),(1153,1153,1153),(1154,1154,1154),(1155,1155,1155),
+(1156,1156,1156),(1157,1157,1157),(1158,1158,1158),(1159,1159,1159),(1160,1160,1160),
+(1161,1161,1161),(1162,1162,1162),(1163,1163,1163),(1164,1164,1164),(1165,1165,1165),
+(1166,1166,1166),(1167,1167,1167),(1168,1168,1168),(1169,1169,1169),(1170,1170,1170),
+(1171,1171,1171),(1172,1172,1172),(1173,1173,1173),(1174,1174,1174),(1175,1175,1175),
+(1176,1176,1176),(1177,1177,1177),(1178,1178,1178),(1179,1179,1179),(1180,1180,1180),
+(1181,1181,1181),(1182,1182,1182),(1183,1183,1183),(1184,1184,1184),(1185,1185,1185),
+(1186,1186,1186),(1187,1187,1187),(1188,1188,1188),(1189,1189,1189),(1190,1190,1190),
+(1191,1191,1191),(1192,1192,1192),(1193,1193,1193),(1194,1194,1194),(1195,1195,1195),
+(1196,1196,1196),(1197,1197,1197),(1198,1198,1198),(1199,1199,1199),(1200,1200,1200),
+(1201,1201,1201),(1202,1202,1202),(1203,1203,1203),(1204,1204,1204),(1205,1205,1205),
+(1206,1206,1206),(1207,1207,1207),(1208,1208,1208),(1209,1209,1209),(1210,1210,1210),
+(1211,1211,1211),(1212,1212,1212),(1213,1213,1213),(1214,1214,1214),(1215,1215,1215),
+(1216,1216,1216),(1217,1217,1217),(1218,1218,1218),(1219,1219,1219),(1220,1220,1220),
+(1221,1221,1221),(1222,1222,1222),(1223,1223,1223),(1224,1224,1224),(1225,1225,1225),
+(1226,1226,1226),(1227,1227,1227),(1228,1228,1228),(1229,1229,1229),(1230,1230,1230),
+(1231,1231,1231),(1232,1232,1232),(1233,1233,1233),(1234,1234,1234),(1235,1235,1235),
+(1236,1236,1236),(1237,1237,1237),(1238,1238,1238),(1239,1239,1239),(1240,1240,1240),
+(1241,1241,1241),(1242,1242,1242),(1243,1243,1243),(1244,1244,1244),(1245,1245,1245),
+(1246,1246,1246),(1247,1247,1247),(1248,1248,1248),(1249,1249,1249),(1250,1250,1250),
+(1251,1251,1251),(1252,1252,1252),(1253,1253,1253),(1254,1254,1254),(1255,1255,1255),
+(1256,1256,1256),(1257,1257,1257),(1258,1258,1258),(1259,1259,1259),(1260,1260,1260),
+(1261,1261,1261),(1262,1262,1262),(1263,1263,1263),(1264,1264,1264),(1265,1265,1265),
+(1266,1266,1266),(1267,1267,1267),(1268,1268,1268),(1269,1269,1269),(1270,1270,1270),
+(1271,1271,1271),(1272,1272,1272),(1273,1273,1273),(1274,1274,1274),(1275,1275,1275),
+(1276,1276,1276),(1277,1277,1277),(1278,1278,1278),(1279,1279,1279),(1280,1280,1280),
+(1281,1281,1281),(1282,1282,1282),(1283,1283,1283),(1284,1284,1284),(1285,1285,1285),
+(1286,1286,1286),(1287,1287,1287),(1288,1288,1288),(1289,1289,1289),(1290,1290,1290),
+(1291,1291,1291),(1292,1292,1292),(1293,1293,1293),(1294,1294,1294),(1295,1295,1295),
+(1296,1296,1296),(1297,1297,1297),(1298,1298,1298),(1299,1299,1299),(1300,1300,1300),
+(1301,1301,1301),(1302,1302,1302),(1303,1303,1303),(1304,1304,1304),(1305,1305,1305),
+(1306,1306,1306),(1307,1307,1307),(1308,1308,1308),(1309,1309,1309),(1310,1310,1310),
+(1311,1311,1311),(1312,1312,1312),(1313,1313,1313),(1314,1314,1314),(1315,1315,1315),
+(1316,1316,1316),(1317,1317,1317),(1318,1318,1318),(1319,1319,1319),(1320,1320,1320),
+(1321,1321,1321),(1322,1322,1322),(1323,1323,1323),(1324,1324,1324),(1325,1325,1325),
+(1326,1326,1326),(1327,1327,1327),(1328,1328,1328),(1329,1329,1329),(1330,1330,1330),
+(1331,1331,1331),(1332,1332,1332),(1333,1333,1333),(1334,1334,1334),(1335,1335,1335),
+(1336,1336,1336),(1337,1337,1337),(1338,1338,1338),(1339,1339,1339),(1340,1340,1340),
+(1341,1341,1341),(1342,1342,1342),(1343,1343,1343),(1344,1344,1344),(1345,1345,1345),
+(1346,1346,1346),(1347,1347,1347),(1348,1348,1348),(1349,1349,1349),(1350,1350,1350),
+(1351,1351,1351),(1352,1352,1352),(1353,1353,1353),(1354,1354,1354),(1355,1355,1355),
+(1356,1356,1356),(1357,1357,1357),(1358,1358,1358),(1359,1359,1359),(1360,1360,1360),
+(1361,1361,1361),(1362,1362,1362),(1363,1363,1363),(1364,1364,1364),(1365,1365,1365),
+(1366,1366,1366),(1367,1367,1367),(1368,1368,1368),(1369,1369,1369),(1370,1370,1370),
+(1371,1371,1371),(1372,1372,1372),(1373,1373,1373),(1374,1374,1374),(1375,1375,1375),
+(1376,1376,1376),(1377,1377,1377),(1378,1378,1378),(1379,1379,1379),(1380,1380,1380),
+(1381,1381,1381),(1382,1382,1382),(1383,1383,1383),(1384,1384,1384),(1385,1385,1385),
+(1386,1386,1386),(1387,1387,1387),(1388,1388,1388),(1389,1389,1389),(1390,1390,1390),
+(1391,1391,1391),(1392,1392,1392),(1393,1393,1393),(1394,1394,1394),(1395,1395,1395),
+(1396,1396,1396),(1397,1397,1397),(1398,1398,1398),(1399,1399,1399),(1400,1400,1400),
+(1401,1401,1401),(1402,1402,1402),(1403,1403,1403),(1404,1404,1404),(1405,1405,1405),
+(1406,1406,1406),(1407,1407,1407),(1408,1408,1408),(1409,1409,1409),(1410,1410,1410),
+(1411,1411,1411),(1412,1412,1412),(1413,1413,1413),(1414,1414,1414),(1415,1415,1415),
+(1416,1416,1416),(1417,1417,1417),(1418,1418,1418),(1419,1419,1419),(1420,1420,1420),
+(1421,1421,1421),(1422,1422,1422),(1423,1423,1423),(1424,1424,1424),(1425,1425,1425),
+(1426,1426,1426),(1427,1427,1427),(1428,1428,1428),(1429,1429,1429),(1430,1430,1430),
+(1431,1431,1431),(1432,1432,1432),(1433,1433,1433),(1434,1434,1434),(1435,1435,1435),
+(1436,1436,1436),(1437,1437,1437),(1438,1438,1438),(1439,1439,1439),(1440,1440,1440),
+(1441,1441,1441),(1442,1442,1442),(1443,1443,1443),(1444,1444,1444),(1445,1445,1445),
+(1446,1446,1446),(1447,1447,1447),(1448,1448,1448),(1449,1449,1449),(1450,1450,1450),
+(1451,1451,1451),(1452,1452,1452),(1453,1453,1453),(1454,1454,1454),(1455,1455,1455),
+(1456,1456,1456),(1457,1457,1457),(1458,1458,1458),(1459,1459,1459),(1460,1460,1460),
+(1461,1461,1461),(1462,1462,1462),(1463,1463,1463),(1464,1464,1464),(1465,1465,1465),
+(1466,1466,1466),(1467,1467,1467),(1468,1468,1468),(1469,1469,1469),(1470,1470,1470),
+(1471,1471,1471),(1472,1472,1472),(1473,1473,1473),(1474,1474,1474),(1475,1475,1475),
+(1476,1476,1476),(1477,1477,1477),(1478,1478,1478),(1479,1479,1479),(1480,1480,1480),
+(1481,1481,1481),(1482,1482,1482),(1483,1483,1483),(1484,1484,1484),(1485,1485,1485),
+(1486,1486,1486),(1487,1487,1487),(1488,1488,1488),(1489,1489,1489),(1490,1490,1490),
+(1491,1491,1491),(1492,1492,1492),(1493,1493,1493),(1494,1494,1494),(1495,1495,1495),
+(1496,1496,1496),(1497,1497,1497),(1498,1498,1498),(1499,1499,1499),(1500,1500,1500),
+(1501,1501,1501),(1502,1502,1502),(1503,1503,1503),(1504,1504,1504),(1505,1505,1505),
+(1506,1506,1506),(1507,1507,1507),(1508,1508,1508),(1509,1509,1509),(1510,1510,1510),
+(1511,1511,1511),(1512,1512,1512),(1513,1513,1513),(1514,1514,1514),(1515,1515,1515),
+(1516,1516,1516),(1517,1517,1517),(1518,1518,1518),(1519,1519,1519),(1520,1520,1520),
+(1521,1521,1521),(1522,1522,1522),(1523,1523,1523),(1524,1524,1524),(1525,1525,1525),
+(1526,1526,1526),(1527,1527,1527),(1528,1528,1528),(1529,1529,1529),(1530,1530,1530),
+(1531,1531,1531),(1532,1532,1532),(1533,1533,1533),(1534,1534,1534),(1535,1535,1535),
+(1536,1536,1536),(1537,1537,1537),(1538,1538,1538),(1539,1539,1539),(1540,1540,1540),
+(1541,1541,1541),(1542,1542,1542),(1543,1543,1543),(1544,1544,1544),(1545,1545,1545),
+(1546,1546,1546),(1547,1547,1547),(1548,1548,1548),(1549,1549,1549),(1550,1550,1550),
+(1551,1551,1551),(1552,1552,1552),(1553,1553,1553),(1554,1554,1554),(1555,1555,1555),
+(1556,1556,1556),(1557,1557,1557),(1558,1558,1558),(1559,1559,1559),(1560,1560,1560),
+(1561,1561,1561),(1562,1562,1562),(1563,1563,1563),(1564,1564,1564),(1565,1565,1565),
+(1566,1566,1566),(1567,1567,1567),(1568,1568,1568),(1569,1569,1569),(1570,1570,1570),
+(1571,1571,1571),(1572,1572,1572),(1573,1573,1573),(1574,1574,1574),(1575,1575,1575),
+(1576,1576,1576),(1577,1577,1577),(1578,1578,1578),(1579,1579,1579),(1580,1580,1580),
+(1581,1581,1581),(1582,1582,1582),(1583,1583,1583),(1584,1584,1584),(1585,1585,1585),
+(1586,1586,1586),(1587,1587,1587),(1588,1588,1588),(1589,1589,1589),(1590,1590,1590),
+(1591,1591,1591),(1592,1592,1592),(1593,1593,1593),(1594,1594,1594),(1595,1595,1595),
+(1596,1596,1596),(1597,1597,1597),(1598,1598,1598),(1599,1599,1599),(1600,1600,1600),
+(1601,1601,1601),(1602,1602,1602),(1603,1603,1603),(1604,1604,1604),(1605,1605,1605),
+(1606,1606,1606),(1607,1607,1607),(1608,1608,1608),(1609,1609,1609),(1610,1610,1610),
+(1611,1611,1611),(1612,1612,1612),(1613,1613,1613),(1614,1614,1614),(1615,1615,1615),
+(1616,1616,1616),(1617,1617,1617),(1618,1618,1618),(1619,1619,1619),(1620,1620,1620),
+(1621,1621,1621),(1622,1622,1622),(1623,1623,1623),(1624,1624,1624),(1625,1625,1625),
+(1626,1626,1626),(1627,1627,1627),(1628,1628,1628),(1629,1629,1629),(1630,1630,1630),
+(1631,1631,1631),(1632,1632,1632),(1633,1633,1633),(1634,1634,1634),(1635,1635,1635),
+(1636,1636,1636),(1637,1637,1637),(1638,1638,1638),(1639,1639,1639),(1640,1640,1640),
+(1641,1641,1641),(1642,1642,1642),(1643,1643,1643),(1644,1644,1644),(1645,1645,1645),
+(1646,1646,1646),(1647,1647,1647),(1648,1648,1648),(1649,1649,1649),(1650,1650,1650),
+(1651,1651,1651),(1652,1652,1652),(1653,1653,1653),(1654,1654,1654),(1655,1655,1655),
+(1656,1656,1656),(1657,1657,1657),(1658,1658,1658),(1659,1659,1659),(1660,1660,1660),
+(1661,1661,1661),(1662,1662,1662),(1663,1663,1663),(1664,1664,1664),(1665,1665,1665),
+(1666,1666,1666),(1667,1667,1667),(1668,1668,1668),(1669,1669,1669),(1670,1670,1670),
+(1671,1671,1671),(1672,1672,1672),(1673,1673,1673),(1674,1674,1674),(1675,1675,1675),
+(1676,1676,1676),(1677,1677,1677),(1678,1678,1678),(1679,1679,1679),(1680,1680,1680),
+(1681,1681,1681),(1682,1682,1682),(1683,1683,1683),(1684,1684,1684),(1685,1685,1685),
+(1686,1686,1686),(1687,1687,1687),(1688,1688,1688),(1689,1689,1689),(1690,1690,1690),
+(1691,1691,1691),(1692,1692,1692),(1693,1693,1693),(1694,1694,1694),(1695,1695,1695),
+(1696,1696,1696),(1697,1697,1697),(1698,1698,1698),(1699,1699,1699),(1700,1700,1700),
+(1701,1701,1701),(1702,1702,1702),(1703,1703,1703),(1704,1704,1704),(1705,1705,1705),
+(1706,1706,1706),(1707,1707,1707),(1708,1708,1708),(1709,1709,1709),(1710,1710,1710),
+(1711,1711,1711),(1712,1712,1712),(1713,1713,1713),(1714,1714,1714),(1715,1715,1715),
+(1716,1716,1716),(1717,1717,1717),(1718,1718,1718),(1719,1719,1719),(1720,1720,1720),
+(1721,1721,1721),(1722,1722,1722),(1723,1723,1723),(1724,1724,1724),(1725,1725,1725),
+(1726,1726,1726),(1727,1727,1727),(1728,1728,1728),(1729,1729,1729),(1730,1730,1730),
+(1731,1731,1731),(1732,1732,1732),(1733,1733,1733),(1734,1734,1734),(1735,1735,1735),
+(1736,1736,1736),(1737,1737,1737),(1738,1738,1738),(1739,1739,1739),(1740,1740,1740),
+(1741,1741,1741),(1742,1742,1742),(1743,1743,1743),(1744,1744,1744),(1745,1745,1745),
+(1746,1746,1746),(1747,1747,1747),(1748,1748,1748),(1749,1749,1749),(1750,1750,1750),
+(1751,1751,1751),(1752,1752,1752),(1753,1753,1753),(1754,1754,1754),(1755,1755,1755),
+(1756,1756,1756),(1757,1757,1757),(1758,1758,1758),(1759,1759,1759),(1760,1760,1760),
+(1761,1761,1761),(1762,1762,1762),(1763,1763,1763),(1764,1764,1764),(1765,1765,1765),
+(1766,1766,1766),(1767,1767,1767),(1768,1768,1768),(1769,1769,1769),(1770,1770,1770),
+(1771,1771,1771),(1772,1772,1772),(1773,1773,1773),(1774,1774,1774),(1775,1775,1775),
+(1776,1776,1776),(1777,1777,1777),(1778,1778,1778),(1779,1779,1779),(1780,1780,1780),
+(1781,1781,1781),(1782,1782,1782),(1783,1783,1783),(1784,1784,1784),(1785,1785,1785),
+(1786,1786,1786),(1787,1787,1787),(1788,1788,1788),(1789,1789,1789),(1790,1790,1790),
+(1791,1791,1791),(1792,1792,1792),(1793,1793,1793),(1794,1794,1794),(1795,1795,1795),
+(1796,1796,1796),(1797,1797,1797),(1798,1798,1798),(1799,1799,1799),(1800,1800,1800),
+(1801,1801,1801),(1802,1802,1802),(1803,1803,1803),(1804,1804,1804),(1805,1805,1805),
+(1806,1806,1806),(1807,1807,1807),(1808,1808,1808),(1809,1809,1809),(1810,1810,1810),
+(1811,1811,1811),(1812,1812,1812),(1813,1813,1813),(1814,1814,1814),(1815,1815,1815),
+(1816,1816,1816),(1817,1817,1817),(1818,1818,1818),(1819,1819,1819),(1820,1820,1820),
+(1821,1821,1821),(1822,1822,1822),(1823,1823,1823),(1824,1824,1824),(1825,1825,1825),
+(1826,1826,1826),(1827,1827,1827),(1828,1828,1828),(1829,1829,1829),(1830,1830,1830),
+(1831,1831,1831),(1832,1832,1832),(1833,1833,1833),(1834,1834,1834),(1835,1835,1835),
+(1836,1836,1836),(1837,1837,1837),(1838,1838,1838),(1839,1839,1839),(1840,1840,1840),
+(1841,1841,1841),(1842,1842,1842),(1843,1843,1843),(1844,1844,1844),(1845,1845,1845),
+(1846,1846,1846),(1847,1847,1847),(1848,1848,1848),(1849,1849,1849),(1850,1850,1850),
+(1851,1851,1851),(1852,1852,1852),(1853,1853,1853),(1854,1854,1854),(1855,1855,1855),
+(1856,1856,1856),(1857,1857,1857),(1858,1858,1858),(1859,1859,1859),(1860,1860,1860),
+(1861,1861,1861),(1862,1862,1862),(1863,1863,1863),(1864,1864,1864),(1865,1865,1865),
+(1866,1866,1866),(1867,1867,1867),(1868,1868,1868),(1869,1869,1869),(1870,1870,1870),
+(1871,1871,1871),(1872,1872,1872),(1873,1873,1873),(1874,1874,1874),(1875,1875,1875),
+(1876,1876,1876),(1877,1877,1877),(1878,1878,1878),(1879,1879,1879),(1880,1880,1880),
+(1881,1881,1881),(1882,1882,1882),(1883,1883,1883),(1884,1884,1884),(1885,1885,1885),
+(1886,1886,1886),(1887,1887,1887),(1888,1888,1888),(1889,1889,1889),(1890,1890,1890),
+(1891,1891,1891),(1892,1892,1892),(1893,1893,1893),(1894,1894,1894),(1895,1895,1895),
+(1896,1896,1896),(1897,1897,1897),(1898,1898,1898),(1899,1899,1899),(1900,1900,1900),
+(1901,1901,1901),(1902,1902,1902),(1903,1903,1903),(1904,1904,1904),(1905,1905,1905),
+(1906,1906,1906),(1907,1907,1907),(1908,1908,1908),(1909,1909,1909),(1910,1910,1910),
+(1911,1911,1911),(1912,1912,1912),(1913,1913,1913),(1914,1914,1914),(1915,1915,1915),
+(1916,1916,1916),(1917,1917,1917),(1918,1918,1918),(1919,1919,1919),(1920,1920,1920),
+(1921,1921,1921),(1922,1922,1922),(1923,1923,1923),(1924,1924,1924),(1925,1925,1925),
+(1926,1926,1926),(1927,1927,1927),(1928,1928,1928),(1929,1929,1929),(1930,1930,1930),
+(1931,1931,1931),(1932,1932,1932),(1933,1933,1933),(1934,1934,1934),(1935,1935,1935),
+(1936,1936,1936),(1937,1937,1937),(1938,1938,1938),(1939,1939,1939),(1940,1940,1940),
+(1941,1941,1941),(1942,1942,1942),(1943,1943,1943),(1944,1944,1944),(1945,1945,1945),
+(1946,1946,1946),(1947,1947,1947),(1948,1948,1948),(1949,1949,1949),(1950,1950,1950),
+(1951,1951,1951),(1952,1952,1952),(1953,1953,1953),(1954,1954,1954),(1955,1955,1955),
+(1956,1956,1956),(1957,1957,1957),(1958,1958,1958),(1959,1959,1959),(1960,1960,1960),
+(1961,1961,1961),(1962,1962,1962),(1963,1963,1963),(1964,1964,1964),(1965,1965,1965),
+(1966,1966,1966),(1967,1967,1967),(1968,1968,1968),(1969,1969,1969),(1970,1970,1970),
+(1971,1971,1971),(1972,1972,1972),(1973,1973,1973),(1974,1974,1974),(1975,1975,1975),
+(1976,1976,1976),(1977,1977,1977),(1978,1978,1978),(1979,1979,1979),(1980,1980,1980),
+(1981,1981,1981),(1982,1982,1982),(1983,1983,1983),(1984,1984,1984),(1985,1985,1985),
+(1986,1986,1986),(1987,1987,1987),(1988,1988,1988),(1989,1989,1989),(1990,1990,1990),
+(1991,1991,1991),(1992,1992,1992),(1993,1993,1993),(1994,1994,1994),(1995,1995,1995),
+(1996,1996,1996),(1997,1997,1997),(1998,1998,1998),(1999,1999,1999);
+
+SELECT COUNT(*) FROM t1;
+
+
+
+DROP TABLE t1;
diff --git a/ndb/bin/regression.sh b/ndb/bin/regression.sh
deleted file mode 100644
index 5e3491af208..00000000000
--- a/ndb/bin/regression.sh
+++ /dev/null
@@ -1,644 +0,0 @@
-#!/bin/sh
-# NAME
-# regression.sh
-#
-# SYNOPSIS
-# regression.sh
-#
-# DESCRIPTION
-#
-# This script runs a number of regression tests to verify that nothing
-# is broken. Currently it executes the same tests as in the autotest
-# regression suite.
-#
-# OPTIONS
-#
-# EXAMPLES
-#
-#
-# ENVIRONMENT
-# verbose verbose printouts
-#
-# FILES
-#
-#
-# SEE ALSO
-#
-# DIAGNOSTICTS
-#
-#
-# VERSION
-# 1.0
-#
-# AUTHOR
-#
-#
-
-
-# die prints the supplied message to stderr,
-# prefixed with the program name, and exits
-# with the exit code given by "-e num" or
-# 1, if no -e option is present.
-#
-die ()
-{
- die_code__=1
- [ "X$1" = X-e ] && { die_code__=$2; shift 2; }
- [ "X$1" = X-- ] && shift
- errmsg "$@"
- exit $die_code__
-}
-
-
-# msg prints the supplied message to stderr,
-# prefixed with the program name.
-#
-errmsg ()
-{
- echo "${progname:-<no program name set>}:" "$@" >&2
-}
-
-# rawdie prints the supplied message to stderr.
-# It then exits with the exit code given with "-e num"
-# or 1, if no -e option is present.
-#
-rawdie ()
-{
- rawdie_code__=1
- [ "X$1" = X-e ] && { rawdie_code__=$2; shift 2; }
- [ "X$1" = X-- ] && shift
- rawerrmsg "$@"
- exit $rawdie_code__
-}
-
-# Syndie prints the supplied message (if present) to stderr,
-# prefixed with the program name, on the first line.
-# On the second line, it prints $synopsis.
-# It then exits with the exit code given with "-e num"
-# or 1, if no -e option is present.
-#
-syndie ()
-{
- syndie_code__=1
- [ "X$1" = X-e ] && { syndie_code__=$2; shift 2; }
- [ "X$1" = X-- ] && shift
- [ -n "$*" ] && msg "$*"
- rawdie -e $syndie_code__ "Synopsis: $synopsis"
-}
-
-
-
-
-# msg prints the supplied message to stdout,
-# prefixed with the program name.
-#
-msg ()
-{
- echo "${progname:-<no program name set>}:" "$@"
-}
-
-rawmsg () { echo "$*"; } # print the supplied message to stdout
-rawerrmsg () { echo "$*" >&2; } # print the supplied message to stderr
-
-# trace prints the supplied message to stdout if verbose is non-null
-#
-trace ()
-{
- [ -n "$verbose" ] && msg "$@"
-}
-
-
-# errtrace prints the supplied message to stderr if verbose is non-null
-#
-errtrace ()
-{
- [ -n "$verbose" ] && msg "$@" >&2
-}
-
-
-synopsis="regression.sh"
-progname=`basename $0`
-
-numOfTestsOK=0
-numOfTestsFailed=0
-
-LOG=regression-$1.`date '+%Y-%m-%d'`
-
-executeTest()
-{
- eval "$@" | tee -a $LOG
-
- if [ $? -eq 0 ]
- then
- echo "SUCCESS: $@"
- numOfTestsOK=`expr $numOfTestsOK + 1`
- else
- echo "FAILED: $@"
- numOfTestsFailed=`expr $numOfTestsFailed + 1`
- fi
-}
-
-#
-# INFO
-#
-trace "Starting: `date`"
-trace "NDB_TOP = $NDB_TOP"
-
-#
-# THE TESTS TO EXECUTE
-#
-
-# BASIC FUNCTIONALITY
-if [ $1 = "basic" ]
-then
-executeTest 'testBasic -n PkRead'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n PkUpdate'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n PkDelete'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n PkInsert'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n UpdateAndRead'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n PkReadAndLocker' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n PkReadAndLocker2' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n PkReadUpdateAndLocker' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n ReadWithLocksAndInserts' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n PkInsertTwice' T1 T6 T10
-executeTest 'drop_tab' T1 T6 T10
-
-executeTest 'testBasic -n PkDirtyRead'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasic -n Fill' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n Fill' T1
-executeTest 'drop_tab' T1
-
-executeTest 'testBasic -n NoCommitSleep' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n NoCommit626' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n NoCommitAndClose' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n Commit626' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n CommitTry626' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n CommitAsMuch626' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n NoCommit626' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n NoCommitRollback626' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n Commit630' T1 T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n CommitTry630' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n CommitAsMuch630' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n NoCommit630' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n NoCommitRollback630' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n NoCommitAndClose' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n RollbackUpdate' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n RollbackDeleteMultiple' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n ImplicitRollbackDelete' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n CommitDelete' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n RollbackNothing' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testBasic -n ReadConsistency' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testBasic -n PkRead' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-
-executeTest 'testBasic -n PkUpdate' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-
-executeTest 'testBasic -n PkDelete' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-
-executeTest 'testBasic -n PkInsert' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_409
-executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-
-executeTest 'testBasic -n UpdateAndRead' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-#executeTest 'drop_tab' TPK_33 TPK_34 TPK_1003 TPK_2003 TPK_4092
-
-executeTest 'testBasicAsynch -n PkInsertAsynch'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasicAsynch -n PkReadAsynch'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasicAsynch -n PkUpdateAsynch'
-executeTest 'drop_all_tabs'
-
-executeTest 'testBasicAsynch -n PkDeleteAsynch'
-executeTest 'drop_all_tabs'
-fi
-
-# SCAN TESTS
-if [ $1 = "scan" ]
-then
-executeTest 'testScan -n ScanRead16'
-executeTest 'drop_all_tabs'
-
-executeTest 'testScan -n ScanRead240'
-executeTest 'drop_all_tabs'
-
-executeTest 'testScan -n ScanUpdate'
-executeTest 'drop_all_tabs'
-
-executeTest 'testScan -n ScanUpdate2' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanDelete'
-executeTest 'drop_all_tab'
-
-executeTest 'testScan -n ScanDelete2' T10
-executeTest 'drop_tab' T10
-
-executeTest 'testScan -n ScanUpdateAndScanRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadAndLocker' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadAndPkRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanRead488' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanWithLocksAndInserts' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadAbort' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadAbort15' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadAbort240' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanUpdateAbort16' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanReadRestart' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ScanUpdateRestart' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n CheckGetValue' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n CloseWithoutStop' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n NextScanWhenNoMore' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n ExecuteScanWithoutOpenScan' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n OnlyOpenScanOnce' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n OnlyOneOpInScanTrans' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n OnlyOneOpBeforeOpenScan' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n OnlyOneScanPerTrans' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n NoCloseTransaction' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n CheckInactivityTimeOut' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n CheckInactivityBeforeClose' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testScan -n CheckAfterTerror' T6
-executeTest 'drop_tab' T6
-fi
-
-
-# DICT TESTS
-if [ $1 = "dict" ]
-then
-executeTest 'testDict -n CreateAndDrop'
-executeTest 'drop_all_tabs'
-
-executeTest 'testDict -n CreateAndDropWithData'
-executeTest 'drop_all_tabs'
-
-executeTest 'testDict -n CreateAndDropDuring' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testDict -n CreateInvalidTables'
-executeTest 'drop_all_tabs'
-
-executeTest 'testDict -n CreateTableWhenDbIsFull' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testDict -n CreateMaxTables' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testDict -n FragmentTypeAll' T1 T6 T7 T8
-executeTest 'drop_tab' T1 T6 T7 T8
-
-executeTest 'testDict -n FragmentTypeAllLarge' T1 T6 T7 T8
-executeTest 'drop_tab' T1 T6 T7 T8
-
-executeTest 'testDict -n TemporaryTables' T1 T6 T7 T8
-executeTest 'drop_tab' T1 T6 T7 T8
-fi
-
-# TEST NDBAPI
-if [ $1 = "api" ]
-then
-executeTest 'testNdbApi -n MaxNdb' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n MaxTransactions' T1 T6 T7 T8 T13
-executeTest 'drop_tab' T1 T6 T7 T8 T13
-
-executeTest 'testNdbApi -n MaxOperations' T1 T6 T7 T8 T1
-executeTest 'drop_tab' T1 T6 T7 T8 T13
-
-executeTest 'testNdbApi -n MaxGetValue' T1 T6 T7 T8 T13
-executeTest 'drop_tab' T1 T6 T7 T8 T13
-
-executeTest 'testNdbApi -n MaxEqual'
-executeTest 'drop_all_tabs'
-
-executeTest 'testNdbApi -n DeleteNdb' T1 T6
-executeTest 'drop_tab' T1 T6
-
-executeTest 'testNdbApi -n WaitUntilReady' T1 T6 T7 T8 T13
-executeTest 'drop_tab' T1 T6 T7 T8 T13
-
-executeTest 'testNdbApi -n GetOperationNoTab' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n NdbErrorOperation' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n MissingOperation' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n GetValueInUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n UpdateWithoutKeys' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testNdbApi -n UpdateWithoutValues' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadReadEx' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadInsert' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadDelete' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadExRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadExReadEx' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadExInsert' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadExUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n ReadExDelete' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n InsertRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n InsertReadEx' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n InsertInsert' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n InsertUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n InsertDelete' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n UpdateRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n UpdateReadEx' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n UpdateInsert' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n UpdateUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n UpdateDelete' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n DeleteRead' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n DeleteReadEx' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n DeleteInsert' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n DeleteUpdate' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testOperations -n DeleteDelete' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testRestartGci' T6
-executeTest 'drop_tab' T6
-
-executeTest 'testIndex -n CreateAll'
-executeTest 'drop_all_tabs'
-
-executeTest 'testIndex -n InsertDeleteGentle' T1 T6 T8 T10
-executeTest 'drop_tab' T1 T6 T8 T10
-
-executeTest 'testIndex -n InsertDelete' T1 T6 T8 T10
-executeTest 'drop_tab' T1 T6 T8 T10
-
-executeTest 'testIndex -n CreateLoadDropGentle' T1 T6 T8 T10
-executeTest 'drop_tab' T1 T6 T8 T10
-
-executeTest 'testIndex -n CreateLoadDrop' T1 T6 T8 T10
-executeTest 'drop_tab' T1 T6 T8 T10
-
-executeTest 'testBackup' -n BackupOne
-
-executeTest 'testBackup' -n BackupBank T6
-executeTest 'drop_tab' T6
-fi
-
-# TEST SYSTEM RESTARTS
-if [ $1 = "sr" ]
-then
-executeTest 'testSystemRestart -n SR1' T1
-executeTest 'testSystemRestart -n SR1' T6
-executeTest 'testSystemRestart -n SR1' T7
-executeTest 'testSystemRestart -n SR1' T8
-executeTest 'testSystemRestart -n SR1' T10
-executeTest 'testSystemRestart -n SR2' T1
-executeTest 'testSystemRestart -n SR2' T6
-executeTest 'testSystemRestart -n SR2' T7
-executeTest 'testSystemRestart -n SR2' T10
-executeTest 'testSystemRestart -n SR2' T13
-executeTest 'testSystemRestart -n SR3' T6
-executeTest 'testSystemRestart -n SR3' T10
-executeTest 'testSystemRestart -n SR4' T6
-executeTest 'testSystemRestart -n SR_UNDO' T1
-executeTest 'testSystemRestart -n SR_UNDO' T6
-executeTest 'testSystemRestart -n SR_UNDO' T7
-executeTest 'testSystemRestart -n SR_UNDO' T8
-executeTest 'testSystemRestart -n SR_UNDO' T10
-executeTest 'drop_tab' T1 T6 T7 T8 T10
-fi
-
-# TEST NODE RESTARTS
-if [ $1 = "nr" ]
-then
-executeTest 'testNodeRestart -n NoLoad' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n PkRead' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n PkReadPkUpdate' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n ReadUpdateScan' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n Terror' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n FullDb' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartRandomNode' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartRandomNodeError' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartRandomNodeInitial' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartNFDuringNR' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartNodeDuringLCP' T6 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartMasterNodeError' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n TwoNodeFailure' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n TwoMasterNodeFailure' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n FiftyPercentFail' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartAllNodes' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartAllNodesAbort' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n RestartAllNodesError9999' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-executeTest 'testNodeRestart -n FiftyPercentStopAndWait' T6 T8 T13
-executeTest 'drop_tab' T6 T8 T13
-
-fi
-
-# TESTS FINISHED
-trace "Finished: `date`"
-
-#
-# TEST SUMMARY
-#
-if [ $numOfTestsFailed -eq 0 ]
-then
- echo "-- REGRESSION TEST SUCCESSFUL --"
-else
- echo "-- REGRESSION TEST FAILED!! --"
-fi
-echo "Number of successful tests: $numOfTestsOK"
-echo "Number of failed tests : $numOfTestsFailed"
diff --git a/ndb/include/ndbapi/ndbapi_limits.h b/ndb/include/ndbapi/ndbapi_limits.h
index bcfba7d3f9d..428c5407cbd 100644
--- a/ndb/include/ndbapi/ndbapi_limits.h
+++ b/ndb/include/ndbapi/ndbapi_limits.h
@@ -31,7 +31,6 @@
#define NDB_MAX_KEYSIZE_IN_WORDS 1023
#define NDB_MAX_KEY_SIZE NDB_MAX_KEYSIZE_IN_WORDS*sizeof(Uint32)
#define NDB_MAX_TUPLE_SIZE 8191
-#define NDB_MAX_CONNECTIONS 127
#define NDB_MAX_TRANSACTIONS 1024
#define NDB_MAX_PARALLEL_SCANS 12
#define NDB_MAX_ACTIVE_EVENTS 100
diff --git a/sql-bench/server-cfg.sh b/sql-bench/server-cfg.sh
index 905e7ee65be..9d5df27379c 100644
--- a/sql-bench/server-cfg.sh
+++ b/sql-bench/server-cfg.sh
@@ -184,6 +184,13 @@ sub new
$self->{'transactions'} = 1; # Transactions enabled
}
if (defined($main::opt_create_options) &&
+ $main::opt_create_options =~ /type=ndb/i)
+ {
+ $self->{'transactions'} = 1; # Transactions enabled
+ $limits{'max_columns'} = 90; # Max number of columns in table
+ $limits{'working_blobs'} = 0; # NDB tables can't handle BLOB's
+ }
+ if (defined($main::opt_create_options) &&
$main::opt_create_options =~ /type=bdb/i)
{
$self->{'transactions'} = 1; # Transactions enabled
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 3bc322878d1..2c474c161d5 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -20,12 +20,6 @@
NDB Cluster
*/
-/*
- TODO
- After CREATE DATABASE gör discover på alla tabeller i den databasen
-
-*/
-
#ifdef __GNUC__
#pragma implementation // gcc: Class implementation
@@ -41,6 +35,7 @@
#define USE_DISCOVER_ON_STARTUP
//#define USE_NDB_POOL
+#define USE_EXTRA_ORDERED_INDEX
// Default value for parallelism
static const int parallelism= 240;
@@ -64,6 +59,10 @@ typedef NdbDictionary::Dictionary NDBDICT;
bool ndbcluster_inited= false;
+#ifdef USE_EXTRA_ORDERED_INDEX
+static const char* unique_suffix= "$unique";
+#endif
+
// Handler synchronization
pthread_mutex_t ndbcluster_mutex;
@@ -95,6 +94,7 @@ static const err_code_mapping err_map[]=
{ 630, HA_ERR_FOUND_DUPP_KEY },
{ 893, HA_ERR_FOUND_DUPP_UNIQUE },
{ 721, HA_ERR_TABLE_EXIST },
+ { 4244, HA_ERR_TABLE_EXIST },
{ 241, HA_ERR_OLD_METADATA },
{ -1, -1 }
};
@@ -354,15 +354,37 @@ int ha_ndbcluster::get_metadata(const char *path)
m_table= (void*)tab;
for (i= 0; i < MAX_KEY; i++)
+ {
m_indextype[i]= UNDEFINED_INDEX;
+ m_unique_index_name[i]= NULL;
+ }
// Save information about all known indexes
for (i= 0; i < table->keys; i++)
- m_indextype[i] = get_index_type_from_table(i);
+ {
+ m_indextype[i]= get_index_type_from_table(i);
+
+#ifdef USE_EXTRA_ORDERED_INDEX
+ if (m_indextype[i] == UNIQUE_INDEX)
+ {
+ char *name;
+ const char *index_name= get_index_name(i);
+ int name_len= strlen(index_name)+strlen(unique_suffix)+1;
+
+ if (!(name= my_malloc(name_len, MYF(MY_WME))))
+ DBUG_RETURN(2);
+ strxnmov(name, name_len, index_name, unique_suffix, NullS);
+ m_unique_index_name[i]= name;
+ DBUG_PRINT("info", ("Created unique index name: %s for index %d",
+ name, i));
+ }
+#endif
+ }
DBUG_RETURN(0);
}
+
/*
Decode the type of an index from information
provided in table object
@@ -380,27 +402,43 @@ NDB_INDEX_TYPE ha_ndbcluster::get_index_type_from_table(uint index_no) const
void ha_ndbcluster::release_metadata()
{
+ int i;
+
DBUG_ENTER("release_metadata");
DBUG_PRINT("enter", ("m_tabname: %s", m_tabname));
m_table= NULL;
+ for (i= 0; i < MAX_KEY; i++)
+ {
+ my_free((char*)m_unique_index_name[i], MYF(MY_ALLOW_ZERO_PTR));
+ m_unique_index_name[i]= NULL;
+ }
+
DBUG_VOID_RETURN;
}
+
+inline int ha_ndbcluster::get_ndb_lock_type()
+{
+ return (int)((m_lock.type == TL_WRITE_ALLOW_WRITE) ?
+ NdbCursorOperation::LM_Exclusive : NdbCursorOperation::LM_Read);
+}
+
static const ulong index_type_flags[]=
{
/* UNDEFINED_INDEX */
0,
/* PRIMARY_KEY_INDEX */
- HA_ONLY_WHOLE_INDEX |
- HA_WRONG_ASCII_ORDER |
+ /*
+ Enable HA_KEY_READ_ONLY when "sorted" indexes are supported,
+ thus ORDERD BY clauses can be optimized by reading directly
+ through the index.
+ */
HA_NOT_READ_PREFIX_LAST,
/* UNIQUE_INDEX */
- HA_ONLY_WHOLE_INDEX |
- HA_WRONG_ASCII_ORDER |
HA_NOT_READ_PREFIX_LAST,
/* ORDERED_INDEX */
@@ -416,6 +454,18 @@ inline const char* ha_ndbcluster::get_index_name(uint idx_no) const
return table->keynames.type_names[idx_no];
}
+inline const char* ha_ndbcluster::get_unique_index_name(uint idx_no) const
+{
+#ifdef USE_EXTRA_ORDERED_INDEX
+ DBUG_ASSERT(idx_no < MAX_KEY);
+ DBUG_ASSERT(m_unique_index_name[idx_no]);
+ return m_unique_index_name[idx_no];
+#else
+ return get_index_name(idx_no);
+#endif
+
+ }
+
inline NDB_INDEX_TYPE ha_ndbcluster::get_index_type(uint idx_no) const
{
DBUG_ASSERT(idx_no < MAX_KEY);
@@ -433,6 +483,7 @@ inline NDB_INDEX_TYPE ha_ndbcluster::get_index_type(uint idx_no) const
inline ulong ha_ndbcluster::index_flags(uint idx_no) const
{
DBUG_ENTER("index_flags");
+ DBUG_PRINT("info", ("idx_no: %d", idx_no));
DBUG_ASSERT(get_index_type_from_table(idx_no) < index_flags_size);
DBUG_RETURN(index_type_flags[get_index_type_from_table(idx_no)]);
}
@@ -550,7 +601,6 @@ int ha_ndbcluster::unique_index_read(const byte *key,
uint key_len, byte *buf)
{
NdbConnection *trans= m_active_trans;
- const char *index_name;
NdbIndexOperation *op;
THD *thd= current_thd;
byte *key_ptr;
@@ -560,9 +610,10 @@ int ha_ndbcluster::unique_index_read(const byte *key,
DBUG_ENTER("unique_index_read");
DBUG_PRINT("enter", ("key_len: %u, index: %u", key_len, active_index));
DBUG_DUMP("key", (char*)key, key_len);
+ DBUG_PRINT("enter", ("name: %s", get_unique_index_name(active_index)));
- index_name= get_index_name(active_index);
- if (!(op= trans->getNdbIndexOperation(index_name, m_tabname)) ||
+ if (!(op= trans->getNdbIndexOperation(get_unique_index_name(active_index),
+ m_tabname)) ||
op->readTuple() != 0)
ERR_RETURN(trans->getNdbError());
@@ -608,22 +659,61 @@ int ha_ndbcluster::unique_index_read(const byte *key,
}
/*
- Get the next record of a started scan
+ Get the next record of a started scan. Try to fetch
+ it locally from NdbApi cached records if possible,
+ otherwise ask NDB for more.
+
+ NOTE
+ If this is a update/delete make sure to not contact
+ NDB before any pending ops have been sent to NDB.
+
*/
inline int ha_ndbcluster::next_result(byte *buf)
{
+ int check;
NdbConnection *trans= m_active_trans;
NdbResultSet *cursor= m_active_cursor;
DBUG_ENTER("next_result");
-
- if (cursor->nextResult() == 0)
- {
- // One more record found
- unpack_record(buf);
- table->status= 0;
- DBUG_RETURN(0);
- }
+
+ if (!cursor)
+ DBUG_RETURN(HA_ERR_END_OF_FILE);
+
+ /*
+ If this an update or delete, call nextResult with false
+ to process any records already cached in NdbApi
+ */
+ bool contact_ndb = m_lock.type != TL_WRITE_ALLOW_WRITE;
+ do {
+ DBUG_PRINT("info", ("Call nextResult, contact_ndb: %d", contact_ndb));
+ check= cursor->nextResult(contact_ndb);
+ if (check == 0)
+ {
+ // One more record found
+ DBUG_PRINT("info", ("One more record found"));
+ unpack_record(buf);
+ table->status= 0;
+ DBUG_RETURN(0);
+ }
+ else if (check == 1 || check == 2)
+ {
+ // 1: No more records
+ // 2: No more cached records
+
+ /*
+ Before fetching more rows and releasing lock(s),
+ all pending update or delete operations should
+ be sent to NDB
+ */
+ DBUG_PRINT("info", ("ops_pending: %d", ops_pending));
+ if (ops_pending && trans->execute(NoCommit) != 0)
+ DBUG_RETURN(ndb_err(trans));
+ ops_pending= 0;
+
+ contact_ndb= (check == 2);
+ }
+ } while (check == 2);
+
table->status= STATUS_NOT_FOUND;
if (ndb_err(trans))
ERR_RETURN(trans->getNdbError());
@@ -635,112 +725,117 @@ inline int ha_ndbcluster::next_result(byte *buf)
/*
- Read record(s) from NDB using ordered index scan
+ Set bounds for a ordered index scan, use key_range
*/
-int ha_ndbcluster::ordered_index_scan(const byte *key, uint key_len,
- byte *buf,
- enum ha_rkey_function find_flag)
-{
- uint no_fields= table->fields;
- uint tot_len, i;
- NdbConnection *trans= m_active_trans;
- NdbResultSet *cursor= m_active_cursor;
- NdbScanOperation *op;
- const char *bound_str= NULL;
- const char *index_name;
- NdbOperation::BoundType bound_type = NdbOperation::BoundEQ;
- bool can_be_handled_by_ndb= FALSE;
+int ha_ndbcluster::set_bounds(NdbOperation *op,
+ const key_range *key,
+ int bound)
+{
+ uint i, tot_len;
byte *key_ptr;
- KEY *key_info;
- THD* thd = current_thd;
- DBUG_ENTER("ordered_index_scan");
- DBUG_PRINT("enter", ("index: %u", active_index));
- DBUG_PRINT("enter", ("Starting new ordered scan on %s", m_tabname));
-
- index_name= get_index_name(active_index);
- if (!(op= trans->getNdbScanOperation(index_name, m_tabname)))
- ERR_RETURN(trans->getNdbError());
- if (!(cursor= op->readTuples(parallelism)))
- ERR_RETURN(trans->getNdbError());
- m_active_cursor= cursor;
-
- switch (find_flag) {
- case HA_READ_KEY_EXACT: /* Find first record else error */
- bound_str= "HA_READ_KEY_EXACT";
- bound_type= NdbOperation::BoundEQ;
- can_be_handled_by_ndb= TRUE;
- break;
- case HA_READ_KEY_OR_NEXT: /* Record or next record */
- bound_str= "HA_READ_KEY_OR_NEXT";
- bound_type= NdbOperation::BoundLE;
- can_be_handled_by_ndb= TRUE;
- break;
- case HA_READ_KEY_OR_PREV: /* Record or previous */
- bound_str= "HA_READ_KEY_OR_PREV";
- bound_type= NdbOperation::BoundGE;
- can_be_handled_by_ndb= TRUE;
- break;
- case HA_READ_AFTER_KEY: /* Find next rec. after key-record */
- bound_str= "HA_READ_AFTER_KEY";
- bound_type= NdbOperation::BoundLT;
- can_be_handled_by_ndb= TRUE;
- break;
- case HA_READ_BEFORE_KEY: /* Find next rec. before key-record */
- bound_str= "HA_READ_BEFORE_KEY";
- bound_type= NdbOperation::BoundGT;
- can_be_handled_by_ndb= TRUE;
- break;
- case HA_READ_PREFIX: /* Key which as same prefix */
- bound_str= "HA_READ_PREFIX";
- break;
- case HA_READ_PREFIX_LAST: /* Last key with the same prefix */
- bound_str= "HA_READ_PREFIX_LAST";
- break;
- case HA_READ_PREFIX_LAST_OR_PREV:
- /* Last or prev key with the same prefix */
- bound_str= "HA_READ_PREFIX_LAST_OR_PREV";
- break;
- default:
- bound_str= "UNKNOWN";
- break;
- }
- DBUG_PRINT("info", ("find_flag: %s, bound_type: %d,"
- "can_be_handled_by_ndb: %d",
- bound_str, bound_type, can_be_handled_by_ndb));
- if (!can_be_handled_by_ndb)
- DBUG_RETURN(1);
-
+ KEY* key_info= table->key_info + active_index;
+ KEY_PART_INFO* key_part= key_info->key_part;
+ KEY_PART_INFO* end= key_part+key_info->key_parts;
+
+ DBUG_ENTER("set_bounds");
+ DBUG_PRINT("enter", ("bound: %d", bound));
+ DBUG_PRINT("enter", ("key_parts: %d", key_info->key_parts));
+ DBUG_PRINT("enter", ("key->length: %d", key->length));
+ DBUG_PRINT("enter", ("key->flag: %d", key->flag));
+
// Set bounds using key data
tot_len= 0;
- key_ptr= (byte *) key;
- key_info= table->key_info + active_index;
- for (i= 0; i < key_info->key_parts; i++)
+ key_ptr= (byte *) key->key;
+ for (; key_part != end; key_part++)
{
- Field* field= key_info->key_part[i].field;
+ Field* field= key_part->field;
uint32 field_len= field->pack_length();
- DBUG_PRINT("info", ("Set index bound on %s",
+ tot_len+= field_len;
+
+ const char* bounds[]= {"LE", "LT", "GE", "GT", "EQ"};
+ DBUG_ASSERT(bound >= 0 && bound <= 4);
+ DBUG_PRINT("info", ("Set Bound%s on %s",
+ bounds[bound],
field->field_name));
DBUG_DUMP("key", (char*)key_ptr, field_len);
-
+
if (op->setBound(field->field_name,
- bound_type,
+ bound,
key_ptr,
field_len) != 0)
ERR_RETURN(op->getNdbError());
key_ptr+= field_len;
- tot_len+= field_len;
- if (tot_len >= key_len)
+
+ if (tot_len >= key->length)
+ break;
+
+ /*
+ Only one bound which is not EQ can be set
+ so if this bound was not EQ, bail out and make
+ a best effort attempt
+ */
+ if (bound != NdbOperation::BoundEQ)
break;
}
-
+
+ DBUG_RETURN(0);
+}
+
+
+/*
+ Start ordered index scan in NDB
+*/
+
+int ha_ndbcluster::ordered_index_scan(const key_range *start_key,
+ const key_range *end_key,
+ bool sorted, byte* buf)
+{
+ NdbConnection *trans= m_active_trans;
+ NdbResultSet *cursor;
+ NdbScanOperation *op;
+ const char *index_name;
+
+ DBUG_ENTER("ordered_index_scan");
+ DBUG_PRINT("enter", ("index: %u, sorted: %d", active_index, sorted));
+ DBUG_PRINT("enter", ("Starting new ordered scan on %s", m_tabname));
+
+ index_name= get_index_name(active_index);
+ if (!(op= trans->getNdbScanOperation(index_name, m_tabname)))
+ ERR_RETURN(trans->getNdbError());
+ if (!(cursor=
+ op->readTuples(parallelism,
+ (NdbCursorOperation::LockMode)get_ndb_lock_type())))
+ ERR_RETURN(trans->getNdbError());
+ m_active_cursor= cursor;
+
+ if (start_key &&
+ set_bounds(op, start_key,
+ (start_key->flag == HA_READ_KEY_EXACT) ?
+ NdbOperation::BoundEQ :
+ (start_key->flag == HA_READ_AFTER_KEY) ?
+ NdbOperation::BoundLT :
+ NdbOperation::BoundLE))
+ DBUG_RETURN(1);
+
+ if (end_key)
+ {
+ if (start_key && start_key->flag == HA_READ_KEY_EXACT)
+ DBUG_PRINT("info", ("start_key is HA_READ_KEY_EXACT ignoring end_key"));
+ else if (set_bounds(op, end_key,
+ (end_key->flag == HA_READ_AFTER_KEY) ?
+ NdbOperation::BoundGE :
+ NdbOperation::BoundGT))
+ DBUG_RETURN(1);
+ }
// Define attributes to read
for (i= 0; i < no_fields; i++)
{
Field *field= table->field[i];
if ((thd->query_id == field->query_id) ||
- (field->flags & PRI_KEY_FLAG))
+ (field->flags & PRI_KEY_FLAG) ||
+ retrieve_all_fields)
{
if (get_ndb_value(op, i, field->ptr))
ERR_RETURN(op->getNdbError());
@@ -768,22 +863,31 @@ int ha_ndbcluster::ordered_index_scan(const byte *key, uint key_len,
if (trans->execute(NoCommit) != 0)
DBUG_RETURN(ndb_err(trans));
DBUG_PRINT("exit", ("Scan started successfully"));
- DBUG_RETURN(next_result(buf));
+ DBUG_RETURN(define_read_attrs(buf, op));
}
-#if 0
/*
- Read record(s) from NDB using full table scan with filter
+ Start a filtered scan in NDB.
+
+ NOTE
+ This function is here as an example of how to start a
+ filtered scan. It should be possible to replace full_table_scan
+ with this function and make a best effort attempt
+ at filtering out the irrelevant data by converting the "items"
+ into interpreted instructions.
+ This would speed up table scans where there is a limiting WHERE clause
+ that doesn't match any index in the table.
+
*/
int ha_ndbcluster::filtered_scan(const byte *key, uint key_len,
byte *buf,
enum ha_rkey_function find_flag)
{
- uint no_fields= table->fields;
NdbConnection *trans= m_active_trans;
- NdbResultSet *cursor= m_active_cursor;
+ NdbResultSet *cursor;
+ NdbScanOperation *op;
DBUG_ENTER("filtered_scan");
DBUG_PRINT("enter", ("key_len: %u, index: %u",
@@ -791,12 +895,12 @@ int ha_ndbcluster::filtered_scan(const byte *key, uint key_len,
DBUG_DUMP("key", (char*)key, key_len);
DBUG_PRINT("info", ("Starting a new filtered scan on %s",
m_tabname));
- NdbScanOperation *op= trans->getNdbScanOperation(m_tabname);
- if (!op)
+
+ if (!(op= trans->getNdbScanOperation(m_tabname)))
ERR_RETURN(trans->getNdbError());
-
- cursor= op->readTuples(parallelism);
- if (!cursor)
+ if (!(cursor=
+ op->readTuples(parallelism,
+ (NdbCursorOperation::LockMode)get_ndb_lock_type())))
ERR_RETURN(trans->getNdbError());
m_active_cursor= cursor;
@@ -845,66 +949,51 @@ int ha_ndbcluster::filtered_scan(const byte *key, uint key_len,
sf.end();
}
- // Define attributes to read
- for (uint field_no= 0; field_no < no_fields; field_no++)
- {
- Field *field= table->field[field_no];
-
- // Read attribute
- DBUG_PRINT("get", ("%d: %s", field_no, field->field_name));
- if (get_ndb_value(op, field_no, field->ptr))
- ERR_RETURN(op->getNdbError());
- }
-
- if (table->primary_key == MAX_KEY)
- {
- DBUG_PRINT("info", ("Getting hidden key"));
- // Scanning table with no primary key
- int hidden_no= no_fields;
-#ifndef DBUG_OFF
- const NDBTAB *tab= (NDBTAB *) m_table;
- if (!tab->getColumn(hidden_no))
- DBUG_RETURN(1);
-#endif
- if (get_ndb_value(op, hidden_no, NULL))
- ERR_RETURN(op->getNdbError());
- }
-
- if (trans->execute(NoCommit) != 0)
- DBUG_RETURN(ndb_err(trans));
- DBUG_PRINT("exit", ("Scan started successfully"));
- DBUG_RETURN(next_result(buf));
+ DBUG_RETURN(define_read_attrs(buf, op));
}
-#endif
/*
- Read records from NDB using full table scan
+ Start full table scan in NDB
*/
int ha_ndbcluster::full_table_scan(byte *buf)
{
uint i;
- THD *thd= current_thd;
- NdbConnection *trans= m_active_trans;
NdbResultSet *cursor;
NdbScanOperation *op;
+ NdbConnection *trans= m_active_trans;
DBUG_ENTER("full_table_scan");
DBUG_PRINT("enter", ("Starting new scan on %s", m_tabname));
if (!(op=trans->getNdbScanOperation(m_tabname)))
ERR_RETURN(trans->getNdbError());
- if (!(cursor= op->readTuples(parallelism)))
+ if (!(cursor=
+ op->readTuples(parallelism,
+ (NdbCursorOperation::LockMode)get_ndb_lock_type())))
ERR_RETURN(trans->getNdbError());
m_active_cursor= cursor;
-
+ DBUG_RETURN(define_read_attrs(buf, op));
+}
+
+
+inline
+int ha_ndbcluster::define_read_attrs(byte* buf, NdbOperation* op)
+{
+ uint i;
+ THD *thd= current_thd;
+ NdbConnection *trans= m_active_trans;
+
+ DBUG_ENTER("define_read_attrs");
+
// Define attributes to read
for (i= 0; i < table->fields; i++)
{
Field *field= table->field[i];
if ((thd->query_id == field->query_id) ||
- (field->flags & PRI_KEY_FLAG))
+ (field->flags & PRI_KEY_FLAG) ||
+ retrieve_all_fields)
{
if (get_ndb_value(op, i, field->ptr))
ERR_RETURN(op->getNdbError());
@@ -991,8 +1080,17 @@ int ha_ndbcluster::write_row(byte *record)
to NoCommit the transaction between each row.
Find out how this is detected!
*/
- if (trans->execute(NoCommit) != 0)
- DBUG_RETURN(ndb_err(trans));
+ rows_inserted++;
+ if ((rows_inserted == rows_to_insert) ||
+ ((rows_inserted % bulk_insert_rows) == 0))
+ {
+ // Send rows to NDB
+ DBUG_PRINT("info", ("Sending inserts to NDB, "\
+ "rows_inserted:%d, bulk_insert_rows: %d",
+ rows_inserted, bulk_insert_rows));
+ if (trans->execute(NoCommit) != 0)
+ DBUG_RETURN(ndb_err(trans));
+ }
DBUG_RETURN(0);
}
@@ -1039,6 +1137,7 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
{
THD *thd= current_thd;
NdbConnection *trans= m_active_trans;
+ NdbResultSet* cursor= m_active_cursor;
NdbOperation *op;
uint i;
DBUG_ENTER("update_row");
@@ -1047,49 +1146,66 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
if (table->timestamp_on_update_now)
update_timestamp(new_data+table->timestamp_on_update_now-1);
- if (!(op= trans->getNdbOperation(m_tabname)) ||
- op->updateTuple() != 0)
- ERR_RETURN(trans->getNdbError());
-
- if (table->primary_key == MAX_KEY)
- {
- // This table has no primary key, use "hidden" primary key
- DBUG_PRINT("info", ("Using hidden key"));
-
- // Require that the PK for this record has previously been
- // read into m_value
- uint no_fields= table->fields;
- NdbRecAttr* rec= m_value[no_fields];
- DBUG_ASSERT(rec);
- DBUG_DUMP("key", (char*)rec->aRef(), NDB_HIDDEN_PRIMARY_KEY_LENGTH);
-
- if (set_hidden_key(op, no_fields, rec->aRef()))
- ERR_RETURN(op->getNdbError());
- }
- else
+ /* Check for update of primary key and return error */
+ if ((table->primary_key != MAX_KEY) &&
+ (key_cmp(table->primary_key, old_data, new_data)))
+ DBUG_RETURN(HA_ERR_UNSUPPORTED);
+
+ if (cursor)
{
- /* Check for update of primary key and return error */
- if (key_cmp(table->primary_key, old_data, new_data))
- DBUG_RETURN(HA_ERR_UNSUPPORTED);
-
- int res;
- if ((res= set_primary_key(op, old_data + table->null_bytes)))
- DBUG_RETURN(res);
+ /*
+ We are scanning records and want to update the record
+ that was just found, call updateTuple on the cursor
+ to take over the lock to a new update operation
+ And thus setting the primary key of the record from
+ the active record in cursor
+ */
+ DBUG_PRINT("info", ("Calling updateTuple on cursor"));
+ if (!(op= cursor->updateTuple()))
+ ERR_RETURN(trans->getNdbError());
+ ops_pending++;
+ }
+ else
+ {
+ if (!(op= trans->getNdbOperation(m_tabname)) ||
+ op->updateTuple() != 0)
+ ERR_RETURN(trans->getNdbError());
+
+ if (table->primary_key == MAX_KEY)
+ {
+ // This table has no primary key, use "hidden" primary key
+ DBUG_PRINT("info", ("Using hidden key"));
+
+ // Require that the PK for this record has previously been
+ // read into m_value
+ uint no_fields= table->fields;
+ NdbRecAttr* rec= m_value[no_fields];
+ DBUG_ASSERT(rec);
+ DBUG_DUMP("key", (char*)rec->aRef(), NDB_HIDDEN_PRIMARY_KEY_LENGTH);
+
+ if (set_hidden_key(op, no_fields, rec->aRef()))
+ ERR_RETURN(op->getNdbError());
+ }
+ else
+ {
+ int res;
+ if ((res= set_primary_key(op, old_data + table->null_bytes)))
+ DBUG_RETURN(res);
+ }
}
// Set non-key attribute(s)
for (i= 0; i < table->fields; i++)
{
-
Field *field= table->field[i];
if ((thd->query_id == field->query_id) &&
(!(field->flags & PRI_KEY_FLAG)) &&
set_ndb_value(op, field, i))
ERR_RETURN(op->getNdbError());
}
-
+
// Execute update operation
- if (trans->execute(NoCommit) != 0)
+ if (!cursor && trans->execute(NoCommit) != 0)
DBUG_RETURN(ndb_err(trans));
DBUG_RETURN(0);
@@ -1103,39 +1219,61 @@ int ha_ndbcluster::update_row(const byte *old_data, byte *new_data)
int ha_ndbcluster::delete_row(const byte *record)
{
NdbConnection *trans= m_active_trans;
+ NdbResultSet* cursor= m_active_cursor;
NdbOperation *op;
DBUG_ENTER("delete_row");
statistic_increment(ha_delete_count,&LOCK_status);
- if (!(op=trans->getNdbOperation(m_tabname)) ||
- op->deleteTuple() != 0)
- ERR_RETURN(trans->getNdbError());
-
- if (table->primary_key == MAX_KEY)
+ if (cursor)
{
- // This table has no primary key, use "hidden" primary key
- DBUG_PRINT("info", ("Using hidden key"));
- uint no_fields= table->fields;
- NdbRecAttr* rec= m_value[no_fields];
- DBUG_ASSERT(rec != NULL);
+ /*
+ We are scanning records and want to update the record
+ that was just found, call deleteTuple on the cursor
+ to take over the lock to a new update operation
+ And thus setting the primary key of the record from
+ the active record in cursor
+ */
+ DBUG_PRINT("info", ("Calling deleteTuple on cursor"));
+ if (cursor->deleteTuple() != 0)
+ ERR_RETURN(trans->getNdbError());
+ ops_pending++;
- if (set_hidden_key(op, no_fields, rec->aRef()))
- ERR_RETURN(op->getNdbError());
- }
- else
+ // If deleting from cursor, NoCommit will be handled in next_result
+ DBUG_RETURN(0);
+ }
+ else
{
- int res;
- if ((res= set_primary_key(op)))
- return res;
+
+ if (!(op=trans->getNdbOperation(m_tabname)) ||
+ op->deleteTuple() != 0)
+ ERR_RETURN(trans->getNdbError());
+
+ if (table->primary_key == MAX_KEY)
+ {
+ // This table has no primary key, use "hidden" primary key
+ DBUG_PRINT("info", ("Using hidden key"));
+ uint no_fields= table->fields;
+ NdbRecAttr* rec= m_value[no_fields];
+ DBUG_ASSERT(rec != NULL);
+
+ if (set_hidden_key(op, no_fields, rec->aRef()))
+ ERR_RETURN(op->getNdbError());
+ }
+ else
+ {
+ int res;
+ if ((res= set_primary_key(op)))
+ return res;
+ }
}
-
+
// Execute delete operation
if (trans->execute(NoCommit) != 0)
DBUG_RETURN(ndb_err(trans));
DBUG_RETURN(0);
}
-
+
/*
Unpack a record read from NDB
@@ -1349,20 +1487,52 @@ int ha_ndbcluster::index_read(byte *buf,
DBUG_PRINT("enter", ("active_index: %u, key_len: %u, find_flag: %d",
active_index, key_len, find_flag));
+ KEY* key_info;
int error= 1;
statistic_increment(ha_read_key_count, &LOCK_status);
switch (get_index_type(active_index)){
case PRIMARY_KEY_INDEX:
+#ifdef USE_EXTRA_ORDERED_INDEX
+ key_info= table->key_info + active_index;
+ if (key_len < key_info->key_length ||
+ find_flag != HA_READ_KEY_EXACT)
+ {
+ key_range start_key;
+ start_key.key= key;
+ start_key.length= key_len;
+ start_key.flag= find_flag;
+ error= ordered_index_scan(&start_key, 0, false, buf);
+ break;
+
+ }
+#endif
error= pk_read(key, key_len, buf);
break;
case UNIQUE_INDEX:
+#ifdef USE_EXTRA_ORDERED_INDEX
+ key_info= table->key_info + active_index;
+ if (key_len < key_info->key_length ||
+ find_flag != HA_READ_KEY_EXACT)
+ {
+ key_range start_key;
+ start_key.key= key;
+ start_key.length= key_len;
+ start_key.flag= find_flag;
+ error= ordered_index_scan(&start_key, 0, false, buf);
+ break;
+ }
+#endif
error= unique_index_read(key, key_len, buf);
break;
-
+
case ORDERED_INDEX:
- error= ordered_index_scan(key, key_len, buf, find_flag);
+ key_range start_key;
+ start_key.key= key;
+ start_key.length= key_len;
+ start_key.flag= find_flag;
+ error= ordered_index_scan(&start_key, 0, false, buf);
break;
default:
@@ -1391,11 +1561,7 @@ int ha_ndbcluster::index_next(byte *buf)
int error = 1;
statistic_increment(ha_read_next_count,&LOCK_status);
- if (get_index_type(active_index) == PRIMARY_KEY_INDEX)
- error= HA_ERR_END_OF_FILE;
- else
- error = next_result(buf);
- DBUG_RETURN(error);
+ DBUG_RETURN(next_result(buf));
}
@@ -1423,6 +1589,49 @@ int ha_ndbcluster::index_last(byte *buf)
}
+int ha_ndbcluster::read_range_first(const key_range *start_key,
+ const key_range *end_key,
+ bool sorted)
+{
+ KEY* key_info;
+ int error= 1;
+ byte* buf= table->record[0];
+ DBUG_ENTER("ha_ndbcluster::read_range_first");
+ DBUG_PRINT("info", ("sorted: %d", sorted));
+
+ switch (get_index_type(active_index)){
+ case PRIMARY_KEY_INDEX:
+ key_info= table->key_info + active_index;
+ if (start_key &&
+ start_key->length == key_info->key_length &&
+ start_key->flag == HA_READ_KEY_EXACT)
+ DBUG_RETURN(pk_read(start_key->key, start_key->length, buf));
+ break;
+ case UNIQUE_INDEX:
+ key_info= table->key_info + active_index;
+ if (start_key &&
+ start_key->length == key_info->key_length &&
+ start_key->flag == HA_READ_KEY_EXACT)
+ DBUG_RETURN(unique_index_read(start_key->key, start_key->length, buf));
+ break;
+ default:
+ break;
+ }
+
+ // Start the ordered index scan and fetch the first row
+ error= ordered_index_scan(start_key, end_key, sorted,
+ buf);
+ DBUG_RETURN(error);
+}
+
+
+int ha_ndbcluster::read_range_next(bool eq_range)
+{
+ DBUG_ENTER("ha_ndbcluster::read_range_next");
+ DBUG_RETURN(next_result(table->record[0]));
+}
+
+
int ha_ndbcluster::rnd_init(bool scan)
{
NdbResultSet *cursor= m_active_cursor;
@@ -1455,12 +1664,10 @@ int ha_ndbcluster::rnd_next(byte *buf)
{
DBUG_ENTER("rnd_next");
statistic_increment(ha_read_rnd_next_count, &LOCK_status);
- int error = 1;
+
if (!m_active_cursor)
- error = full_table_scan(buf);
- else
- error = next_result(buf);
- DBUG_RETURN(error);
+ DBUG_RETURN(full_table_scan(buf));
+ DBUG_RETURN(next_result(buf));
}
@@ -1654,6 +1861,7 @@ int ha_ndbcluster::extra(enum ha_extra_function operation)
where field->query_id is the same as
the current query id */
DBUG_PRINT("info", ("HA_EXTRA_RETRIEVE_ALL_COLS"));
+ retrieve_all_fields= TRUE;
break;
case HA_EXTRA_PREPARE_FOR_DELETE:
DBUG_PRINT("info", ("HA_EXTRA_PREPARE_FOR_DELETE"));
@@ -1679,6 +1887,53 @@ int ha_ndbcluster::extra(enum ha_extra_function operation)
DBUG_RETURN(0);
}
+/*
+ Start of an insert, remember number of rows to be inserted, it will
+ be used in write_row and get_autoincrement to send an optimal number
+ of rows in each roundtrip to the server
+
+ SYNOPSIS
+ rows number of rows to insert, 0 if unknown
+
+*/
+
+void ha_ndbcluster::start_bulk_insert(ha_rows rows)
+{
+ int bytes, batch;
+ const NDBTAB *tab= (NDBTAB *) m_table;
+
+ DBUG_ENTER("start_bulk_insert");
+ DBUG_PRINT("enter", ("rows: %d", rows));
+
+ rows_inserted= 0;
+ rows_to_insert= rows;
+
+ /*
+ Calculate how many rows that should be inserted
+ per roundtrip to NDB. This is done in order to minimize the
+ number of roundtrips as much as possible. However performance will
+ degrade if too many bytes are inserted, thus it's limited by this
+ calculation.
+ */
+ const int bytesperbatch = 8192;
+ bytes= 12 + tab->getRowSizeInBytes() + 4 * tab->getNoOfColumns();
+ batch= bytesperbatch/bytes;
+ batch= batch == 0 ? 1 : batch;
+ DBUG_PRINT("info", ("batch: %d, bytes: %d", batch, bytes));
+ bulk_insert_rows= batch;
+
+ DBUG_VOID_RETURN;
+}
+
+/*
+ End of an insert
+ */
+int ha_ndbcluster::end_bulk_insert()
+{
+ DBUG_ENTER("end_bulk_insert");
+ DBUG_RETURN(0);
+}
+
int ha_ndbcluster::extra_opt(enum ha_extra_function operation, ulong cache_size)
{
@@ -1708,7 +1963,7 @@ const char **ha_ndbcluster::bas_ext() const
double ha_ndbcluster::scan_time()
{
- return rows2double(records/3);
+ return rows2double(records*1000);
}
@@ -1740,6 +1995,8 @@ THR_LOCK_DATA **ha_ndbcluster::store_lock(THD *thd,
m_lock.type=lock_type;
}
*to++= &m_lock;
+
+ DBUG_PRINT("exit", ("lock_type: %d", lock_type));
DBUG_RETURN(to);
}
@@ -1853,7 +2110,10 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
(NdbConnection*)thd->transaction.all.ndb_tid:
(NdbConnection*)thd->transaction.stmt.ndb_tid;
DBUG_ASSERT(m_active_trans);
-
+
+ // Start of transaction
+ retrieve_all_fields= FALSE;
+ ops_pending= 0;
}
else
{
@@ -1904,6 +2164,10 @@ int ha_ndbcluster::start_stmt(THD *thd)
thd->transaction.stmt.ndb_tid= trans;
}
m_active_trans= trans;
+
+ // Start of statement
+ retrieve_all_fields= FALSE;
+ ops_pending= 0;
DBUG_RETURN(error);
}
@@ -2041,9 +2305,8 @@ int ha_ndbcluster::create(const char *name,
NdbDictionary::Column::Type ndb_type;
NDBCOL col;
uint pack_length, length, i;
- int res;
const void *data, *pack_data;
- const char **key_name= form->keynames.type_names;
+ const char **key_names= form->keynames.type_names;
char name2[FN_HEADLEN];
DBUG_ENTER("create");
@@ -2086,13 +2349,11 @@ int ha_ndbcluster::create(const char *name,
col.setPrimaryKey(field->flags & PRI_KEY_FLAG);
if (field->flags & AUTO_INCREMENT_FLAG)
{
- DBUG_PRINT("info", ("Found auto_increment key"));
col.setAutoIncrement(TRUE);
- ulonglong value = info->auto_increment_value ?
- info->auto_increment_value -1 :
- (ulonglong) 0;
- DBUG_PRINT("info", ("initial value=%ld", value));
-// col.setInitialAutIncValue(value);
+ ulonglong value= info->auto_increment_value ?
+ info->auto_increment_value -1 : (ulonglong) 0;
+ DBUG_PRINT("info", ("Autoincrement key, initial: %d", value));
+ col.setAutoIncrementInitialValue(value);
}
else
col.setAutoIncrement(false);
@@ -2143,54 +2404,90 @@ int ha_ndbcluster::create(const char *name,
}
// Create secondary indexes
- for (i= 0; i < form->keys; i++)
+ KEY* key_info= form->key_info;
+ const char** key_name= key_names;
+ for (i= 0; i < form->keys; i++, key_info++, key_name++)
{
- DBUG_PRINT("info", ("Found index %u: %s", i, key_name[i]));
+ int error= 0;
+ DBUG_PRINT("info", ("Index %u: %s", i, *key_name));
if (i == form->primary_key)
- {
- DBUG_PRINT("info", ("Skipping it, PK already created"));
- continue;
+ {
+#ifdef USE_EXTRA_ORDERED_INDEX
+ error= create_ordered_index(*key_name, key_info);
+#endif
}
+ else if (key_info->flags & HA_NOSAME)
+ error= create_unique_index(*key_name, key_info);
+ else
+ error= create_ordered_index(*key_name, key_info);
+
- DBUG_PRINT("info", ("Creating index %u: %s", i, key_name[i]));
- res= create_index(key_name[i],
- form->key_info + i);
- switch(res){
- case 0:
- // OK
- break;
- default:
+ if (error)
+ {
DBUG_PRINT("error", ("Failed to create index %u", i));
drop_table();
- my_errno= res;
- goto err_end;
+ my_errno= error;
+ break;
}
}
-err_end:
DBUG_RETURN(my_errno);
}
+int ha_ndbcluster::create_ordered_index(const char *name,
+ KEY *key_info)
+{
+ DBUG_ENTER("create_ordered_index");
+ DBUG_RETURN(create_index(name, key_info, false));
+}
+
+int ha_ndbcluster::create_unique_index(const char *name,
+ KEY *key_info)
+{
+ int error;
+ const char* unique_name= name;
+ DBUG_ENTER("create_unique_index");
+
+#ifdef USE_EXTRA_ORDERED_INDEX
+ char buf[FN_HEADLEN];
+ strxnmov(buf, FN_HEADLEN, name, unique_suffix, NullS);
+ unique_name= buf;
+#endif
+
+ error= create_index(unique_name, key_info, true);
+ if (error)
+ DBUG_RETURN(error);
+
+#ifdef USE_EXTRA_ORDERED_INDEX
+ /*
+ If unique index contains more then one attribute
+ an ordered index should be created to support
+ partial key search
+ */
+ error= create_ordered_index(name, key_info);
+#endif
+ DBUG_RETURN(error);
+}
+
+
/*
Create an index in NDB Cluster
*/
int ha_ndbcluster::create_index(const char *name,
- KEY *key_info){
+ KEY *key_info,
+ bool unique)
+{
NdbDictionary::Dictionary *dict= m_ndb->getDictionary();
KEY_PART_INFO *key_part= key_info->key_part;
KEY_PART_INFO *end= key_part + key_info->key_parts;
DBUG_ENTER("create_index");
DBUG_PRINT("enter", ("name: %s ", name));
-
- // Check that an index with the same name do not already exist
- if (dict->getIndex(name, m_tabname))
- ERR_RETURN(dict->getNdbError());
-
+
NdbDictionary::Index ndb_index(name);
- if (key_info->flags & HA_NOSAME)
+ if (unique)
ndb_index.setType(NdbDictionary::Index::UniqueHashIndex);
else
{
@@ -2321,10 +2618,10 @@ int ndbcluster_drop_database(const char *path)
longlong ha_ndbcluster::get_auto_increment()
-{
- // NOTE If number of values to be inserted is known
- // the autoincrement cache could be used here
- Uint64 auto_value= m_ndb->getAutoIncrementValue(m_tabname);
+{
+ int cache_size = rows_to_insert ? rows_to_insert : 32;
+ Uint64 auto_value=
+ m_ndb->getAutoIncrementValue(m_tabname, cache_size);
return (longlong)auto_value;
}
@@ -2347,9 +2644,15 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
HA_NO_BLOBS |
HA_DROP_BEFORE_CREATE |
HA_NOT_READ_AFTER_KEY),
- m_use_write(false)
+ m_use_write(false),
+ retrieve_all_fields(FALSE),
+ rows_to_insert(0),
+ rows_inserted(0),
+ bulk_insert_rows(1024),
+ ops_pending(0)
{
-
+ int i;
+
DBUG_ENTER("ha_ndbcluster");
m_tabname[0]= '\0';
@@ -2360,6 +2663,12 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
records= 100;
block_size= 1024;
+ for (i= 0; i < MAX_KEY; i++)
+ {
+ m_indextype[i]= UNDEFINED_INDEX;
+ m_unique_index_name[i]= NULL;
+ }
+
DBUG_VOID_RETURN;
}
@@ -2765,6 +3074,7 @@ ha_ndbcluster::records_in_range(int inx,
DBUG_PRINT("enter", ("end_key: %x, end_key_len: %d", end_key, end_key_len));
DBUG_PRINT("enter", ("end_search_flag: %d", end_search_flag));
+#ifndef USE_EXTRA_ORDERED_INDEX
/*
Check that start_key_len is equal to
the length of the used index and
@@ -2779,6 +3089,14 @@ ha_ndbcluster::records_in_range(int inx,
key_length));
records= HA_POS_ERROR;
}
+#else
+ /*
+ Extra ordered indexes are created primarily
+ to support partial key scan/read and range scans of hash indexes.
+ I.e. the ordered index are used instead of the hash indexes for
+ these queries.
+ */
+#endif
DBUG_RETURN(records);
}
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index bd601f39fc4..35b62689924 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -76,6 +76,11 @@ class ha_ndbcluster: public handler
int rnd_next(byte *buf);
int rnd_pos(byte *buf, byte *pos);
void position(const byte *record);
+ int read_range_first(const key_range *start_key,
+ const key_range *end_key,
+ bool sorted);
+ int read_range_next(bool eq_range);
+
void info(uint);
int extra(enum ha_extra_function operation);
@@ -127,6 +132,8 @@ class ha_ndbcluster: public handler
const byte *end_key,uint end_key_len,
enum ha_rkey_function end_search_flag);
+ void start_bulk_insert(ha_rows rows);
+ int end_bulk_insert();
static Ndb* seize_ndb();
static void release_ndb(Ndb* ndb);
@@ -135,29 +142,31 @@ class ha_ndbcluster: public handler
private:
int alter_table_name(const char *from, const char *to);
int drop_table();
- int create_index(const char *name, KEY *key_info);
+ int create_index(const char *name, KEY *key_info, bool unique);
+ int create_ordered_index(const char *name, KEY *key_info);
+ int create_unique_index(const char *name, KEY *key_info);
int initialize_autoincrement(const void* table);
int get_metadata(const char* path);
void release_metadata();
const char* get_index_name(uint idx_no) const;
+ const char* get_unique_index_name(uint idx_no) const;
NDB_INDEX_TYPE get_index_type(uint idx_no) const;
NDB_INDEX_TYPE get_index_type_from_table(uint index_no) const;
+ int get_ndb_lock_type();
int pk_read(const byte *key, uint key_len,
byte *buf);
int unique_index_read(const byte *key, uint key_len,
byte *buf);
- int ordered_index_scan(const byte *key, uint key_len,
- byte *buf,
- enum ha_rkey_function find_flag);
+ int ordered_index_scan(const key_range *start_key,
+ const key_range *end_key,
+ bool sorted, byte* buf);
int full_table_scan(byte * buf);
int next_result(byte *buf);
-#if 0
+ int define_read_attrs(byte* buf, NdbOperation* op);
int filtered_scan(const byte *key, uint key_len,
byte *buf,
enum ha_rkey_function find_flag);
-#endif
-
void unpack_record(byte *buf);
void set_dbname(const char *pathname);
@@ -172,6 +181,8 @@ class ha_ndbcluster: public handler
int get_ndb_value(NdbOperation*, uint fieldnr, byte *field_ptr);
int set_primary_key(NdbOperation *op, const byte *key);
int set_primary_key(NdbOperation *op);
+ int set_bounds(NdbOperation *ndb_op, const key_range *key,
+ int bound);
int key_cmp(uint keynr, const byte * old_row, const byte * new_row);
void print_results();
@@ -193,8 +204,14 @@ class ha_ndbcluster: public handler
THR_LOCK_DATA m_lock;
NDB_SHARE *m_share;
NDB_INDEX_TYPE m_indextype[MAX_KEY];
+ const char* m_unique_index_name[MAX_KEY];
NdbRecAttr *m_value[NDB_MAX_ATTRIBUTES_IN_TABLE];
bool m_use_write;
+ bool retrieve_all_fields;
+ ha_rows rows_to_insert;
+ ha_rows rows_inserted;
+ ha_rows bulk_insert_rows;
+ ha_rows ops_pending;
};
bool ndbcluster_init(void);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 55b726293c2..9521e1d909b 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -3247,7 +3247,11 @@ copy_data_between_tables(TABLE *from,TABLE *to,
error= 1;
goto err;
}
-
+
+ /* Handler must be told explicitly to retrieve all columns, because
+ this function does not set field->query_id in the columns to the
+ current query id */
+ from->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
init_read_record(&info, thd, from, (SQL_SELECT *) 0, 1,1);
if (handle_duplicates == DUP_IGNORE ||
handle_duplicates == DUP_REPLACE)