List:Commits« Previous MessageNext Message »
From:Tomas Ulin Date:March 12 2009 10:53am
Subject:bzr commit into mysql-6.0-telco-6.3 branch (tomas.ulin:2854)
View as plain text  
#At file:///home/tomas/mysql_src/mysql-6.0-telco-6.3-2/

 2854 Tomas Ulin	2009-03-12 [merge]
      merge from cluster 6.3
      removed:
        mysql-test/extra/rpl_tests/rpl_ndb_conflict_1.test
      added:
        mysql-test/include/ndb_backup_id.inc
        mysql-test/suite/ndb/r/ndb_partition_hash.result
        mysql-test/suite/ndb/t/ndb_partition_hash.test
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_d.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_u.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_i_i.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_init.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_d.inc
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_u.inc
        storage/ndb/test/run-test/check-tests.sh
      renamed:
        mysql-test/suite/rpl_ndb_big/r/rpl_ndb_mixed_engines_transactions.result => mysql-test/suite/rpl_ndb_big/r/rpl_ndb_mix_eng_trans.result
        mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions-master.opt => mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans-master.opt
        mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions-slave.opt => mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans-slave.opt
        mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions.test => mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans.test
      modified:
        configure.in
        mysql-test/include/default_ndbd.cnf
        mysql-test/include/ndb_backup.inc
        mysql-test/include/ndb_conflict_info.inc
        mysql-test/include/ndb_conflict_info_init.inc
        mysql-test/include/ndb_not_readonly.inc
        mysql-test/lib/My/ConfigFactory.pm
        mysql-test/lib/v1/ndb_config_2_node.ini
        mysql-test/mysql-test-run.pl
        mysql-test/suite/funcs_1/t/disabled.def
        mysql-test/suite/ndb/r/ndb_restore.result
        mysql-test/suite/ndb/r/ndb_restore_compressed.result
        mysql-test/suite/ndb/r/ndbapi.result
        mysql-test/suite/ndb/t/ndb_restore.test
        mysql-test/suite/ndb/t/ndbapi.test
        mysql-test/suite/ndb_team/my.cnf
        mysql-test/suite/ndb_team/r/ndb_autodiscover3.result
        mysql-test/suite/ndb_team/t/ndb_autodiscover3.test
        mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_max.result
        mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_old.result
        mysql-test/suite/rpl_ndb/r/rpl_ndb_logging.result
        mysql-test/suite/rpl_ndb/t/disabled.def
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_max.test
        mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_old.test
        mysql-test/suite/rpl_ndb/t/rpl_ndb_logging.test
        mysql-test/suite/rpl_ndb_big/t/rpl_ndbapi_multi.test
        mysql-test/t/warnings.test
        sql/ha_ndbcluster.cc
        sql/ha_ndbcluster.h
        sql/ha_ndbcluster_binlog.cc
        sql/ha_ndbcluster_binlog.h
        sql/log_event.cc
        sql/slave.cc
        storage/ndb/include/kernel/RefConvert.hpp
        storage/ndb/include/kernel/signaldata/AllocNodeId.hpp
        storage/ndb/include/kernel/signaldata/BuildIndx.hpp
        storage/ndb/include/kernel/signaldata/DihContinueB.hpp
        storage/ndb/include/kernel/signaldata/FsOpenReq.hpp
        storage/ndb/include/kernel/signaldata/LCP.hpp
        storage/ndb/include/mgmapi/mgmapi_config_parameters.h
        storage/ndb/include/mgmapi/ndb_logevent.h
        storage/ndb/include/ndbapi/Ndb.hpp
        storage/ndb/include/ndbapi/NdbBlob.hpp
        storage/ndb/include/ndbapi/NdbIndexScanOperation.hpp
        storage/ndb/include/ndbapi/NdbOperation.hpp
        storage/ndb/include/ndbapi/NdbScanOperation.hpp
        storage/ndb/src/common/debugger/EventLogger.cpp
        storage/ndb/src/common/debugger/signaldata/DihContinueB.cpp
        storage/ndb/src/kernel/blocks/backup/Backup.cpp
        storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
        storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
        storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp
        storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp
        storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
        storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
        storage/ndb/src/kernel/blocks/dbutil/DbUtil.cpp
        storage/ndb/src/kernel/blocks/dbutil/DbUtil.hpp
        storage/ndb/src/kernel/blocks/lgman.cpp
        storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp
        storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrInit.cpp
        storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
        storage/ndb/src/kernel/blocks/ndbfs/Filename.cpp
        storage/ndb/src/kernel/blocks/ndbfs/Filename.hpp
        storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
        storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.hpp
        storage/ndb/src/kernel/blocks/print_file.cpp
        storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp
        storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp
        storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp
        storage/ndb/src/kernel/blocks/trix/Trix.cpp
        storage/ndb/src/kernel/blocks/tsman.cpp
        storage/ndb/src/kernel/vm/DataBuffer.hpp
        storage/ndb/src/kernel/vm/Mutex.hpp
        storage/ndb/src/mgmclient/CommandInterpreter.cpp
        storage/ndb/src/mgmsrv/ConfigInfo.cpp
        storage/ndb/src/mgmsrv/MgmtSrvr.cpp
        storage/ndb/src/mgmsrv/MgmtSrvr.hpp
        storage/ndb/src/mgmsrv/Services.cpp
        storage/ndb/src/ndbapi/Ndb.cpp
        storage/ndb/src/ndbapi/NdbBlob.cpp
        storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
        storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp
        storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp
        storage/ndb/src/ndbapi/NdbOperationSearch.cpp
        storage/ndb/src/ndbapi/NdbScanOperation.cpp
        storage/ndb/src/ndbapi/ndberror.c
        storage/ndb/test/include/HugoOperations.hpp
        storage/ndb/test/include/NdbBackup.hpp
        storage/ndb/test/ndbapi/bank/Bank.cpp
        storage/ndb/test/ndbapi/testBackup.cpp
        storage/ndb/test/ndbapi/testBlobs.cpp
        storage/ndb/test/ndbapi/testIndex.cpp
        storage/ndb/test/ndbapi/testPartitioning.cpp
        storage/ndb/test/ndbapi/testSRBank.cpp
        storage/ndb/test/ndbapi/test_event_merge.cpp
        storage/ndb/test/run-test/conf-dl145a.cnf
        storage/ndb/test/run-test/conf-ndbmaster.cnf
        storage/ndb/test/run-test/daily-basic-tests.txt
        storage/ndb/test/run-test/daily-devel-tests.txt
        storage/ndb/test/src/HugoOperations.cpp
        storage/ndb/test/src/HugoTransactions.cpp
        storage/ndb/test/src/NdbBackup.cpp
        storage/ndb/test/src/NdbMixRestarter.cpp
        storage/ndb/test/tools/copy_tab.cpp
        storage/ndb/tools/restore/Restore.cpp
        storage/ndb/tools/restore/restore_main.cpp

=== modified file 'configure.in'
--- a/configure.in	2009-03-03 14:24:27 +0000
+++ b/configure.in	2009-03-12 10:51:59 +0000
@@ -18,7 +18,7 @@ AC_CONFIG_HEADERS([include/config.h:conf
 
 NDB_VERSION_MAJOR=6
 NDB_VERSION_MINOR=3
-NDB_VERSION_BUILD=23
+NDB_VERSION_BUILD=24
 NDB_VERSION_STATUS="-GA"
 
 PROTOCOL_VERSION=10

=== removed file 'mysql-test/extra/rpl_tests/rpl_ndb_conflict_1.test'
--- a/mysql-test/extra/rpl_tests/rpl_ndb_conflict_1.test	2007-10-14 17:27:00 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_ndb_conflict_1.test	1970-01-01 00:00:00 +0000
@@ -1,128 +0,0 @@
---connection master
-
---eval create table t1 (a int, b varchar(32), X $col_type, d varchar(9), primary key (a, d)) engine ndb
-create table t2 (a int key, b varchar(32), c int unsigned, d varchar(9)) engine ndb;
-
---echo ************************************************
---echo * some basic positive testing, i.e. no conflicts
---echo ************************************************
---connection master
---echo *** insert some data
-begin;
-insert into t1 values (1, "Master t1 a=1 at X=1", 1, '1');
-insert into t1 values (2, "Master t1 a=2 at X=1", 1, '12');
-insert into t1 values (3, "Master t1 a=3 at X=1", 1, '123');
-insert into t2 values (1, "Master t2 a=1 at c=1", 1, '1');
-insert into t2 values (2, "Master t2 a=2 at c=1", 1, '12');
-insert into t2 values (3, "Master t2 a=3 at c=1", 1, '123');
-commit;
-
---echo *** master - update all
---connection master
-begin;
-update t1 set b="Master t1 X=2", X=X+1;
-update t2 set b="Master t2 c=2", c=c+1;
-commit;
---echo *** slave - check update all
---sync_slave_with_master
---connection slave
-select * from t1 order by a, d;
-select * from t2 order by a, d;
-
---echo *** master - update 2 rows in different tables
---connection master
-update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
-update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
---echo *** slave - check update 2 rows in different tables
---sync_slave_with_master
---connection slave
-select * from t1 order by a, d;
-select * from t2 order by a, d;
-
---echo *** master - delete all
---connection master
-delete from t1;
-delete from t2;
---echo *** slave - check delete all
---sync_slave_with_master
---connection slave
-select * from t1 order by a, d;
-select * from t2 order by a, d;
-
---echo ************************
---echo * start conflict testing
---echo ************************
---echo *** master - insert some data
---connection master
-begin;
-insert into t1 values (1, "Master t1 a=1 at X=10", 10, '111');
-insert into t1 values (2, "Master t1 a=2 at X=10", 10, '111222');
-insert into t1 values (3, "Master t1 a=3 at X=10", 10, '111222333');
-insert into t2 values (1, "Master t2 a=1 at c=10", 10, '111');
-insert into t2 values (2, "Master t2 a=2 at c=10", 10, '111222');
-insert into t2 values (3, "Master t2 a=3 at c=10", 10, '111222333');
-commit;
-
---echo *** slave - check conflict info, no conflicts yet
---sync_slave_with_master
---connection slave
---source include/ndb_conflict_info.inc
-
---echo *** slave - check insert some data
-select * from t1 order by a, d;
-select * from t2 order by a, d;
-
---echo *** slave - update some data to cause conflicts
-begin;
-update t1 set b="Slave t1 a=1 at X=12", X=12 where a=1 and d='111';
-update t1 set b="Slave t1 a=2 at X=12", X=12 where a=2 and d='111222';
-update t1 set b="Slave t1 a=3 at X=12", X=12 where a=3 and d='111222333';
-update t2 set b="Slave t2 a=1 at c=12", c=12 where a=1;
-update t2 set b="Slave t2 a=2 at c=12", c=12 where a=2;
-update t2 set b="Slave t2 a=3 at c=12", c=12 where a=3;
-commit;
-
---echo *** master - update some data to cause conflicts
---connection master
-begin;
-update t1 set b="Master t1 a=1 at X=11", X=11 where a=1 and d='111';
-update t1 set b="Master t1 a=2 at X=11", X=11 where a=2 and d='111222';
-update t1 set b="Master t1 a=3 at X=11", X=11 where a=3 and d='111222333';
-update t2 set b="Master t2 a=1 at c=11", c=11 where a=1;
-update t2 set b="Master t2 a=2 at c=11", c=11 where a=2;
-update t2 set b="Master t2 a=3 at c=11", c=11 where a=3;
-commit;
-
---echo *** slave - check conflict info, there should be some
---sync_slave_with_master
---connection slave
---source include/ndb_conflict_info.inc
-
---echo *** slave - check update some data that causes conflicts
-select * from t1 order by a, d;
-select * from t2 order by a, d;
---echo *** slave - correct some data to correspond to the master
-update t1 set b="Slave t1 a=1 at X=11", X=11 where a=1 and d='111';
-
---echo *** master - update some data, use higher timestamp
---connection master
-begin;
-update t1 set b="Master t1 a=1 at X=13", X=13 where a=1 and d='111';
-update t1 set b="Master t1 a=2 at X=13", X=13 where a=2 and d='111222';
-update t1 set b="Master t1 a=3 at X=13", X=13 where a=3 and d='111222333';
-update t2 set b="Master t2 a=1 at c=13", c=13 where a=1;
-update t2 set b="Master t2 a=2 at c=13", c=13 where a=2;
-update t2 set b="Master t2 a=3 at c=13", c=13 where a=3;
-commit;
-
---echo *** slave - check conflict info, change depends on calling test
---sync_slave_with_master
---connection slave
---source include/ndb_conflict_info.inc
-
---echo *** slave - check higer timestamp
-select * from t1 order by a, d;
-select * from t2 order by a, d;
-
---connection master
-drop table t1, t2;

=== modified file 'mysql-test/include/default_ndbd.cnf'
--- a/mysql-test/include/default_ndbd.cnf	2009-02-05 12:22:39 +0000
+++ b/mysql-test/include/default_ndbd.cnf	2009-03-12 10:51:59 +0000
@@ -16,7 +16,7 @@ FragmentLogFileSize=           12M
 DiskPageBufferMemory=          4M
 
 # O_DIRECT has issues on 2.4 whach have not been handled, Bug #29612
-ODirect= 1
+#ODirect= 1
 CompressedLCP= 1
 CompressedBackup= 1
 # the following parametes just function as a small regression

=== modified file 'mysql-test/include/ndb_backup.inc'
--- a/mysql-test/include/ndb_backup.inc	2009-03-03 14:24:27 +0000
+++ b/mysql-test/include/ndb_backup.inc	2009-03-12 10:51:59 +0000
@@ -11,21 +11,4 @@
 
 --exec $NDB_MGM --no-defaults --ndb-connectstring="$NDB_CONNECTSTRING" -e "start backup" >> $NDB_TOOLS_OUTPUT
 
-# there is no neat way to find the backupid, this is a hack to find it...
-let $dump_file= $MYSQLTEST_VARDIR/tmp/tmp.dat;
---exec $NDB_TOOLS_DIR/ndb_select_all --ndb-connectstring="$NDB_CONNECTSTRING" -d sys --delimiter=',' SYSTAB_0 | grep 520093696 > $dump_file
-
-CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
-
-# needed for embedded
---exec chmod 0777 $dump_file
---replace_result $dump_file DUMP_FILE
-eval LOAD DATA INFILE '$dump_file' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
-
-# Load backup id into environment variable
-let the_backup_id=`SELECT  backup_id from test.backup_info`;
-DROP TABLE test.backup_info;
-
-remove_file $dump_file;
-
-
+--source include/ndb_backup_id.inc

=== added file 'mysql-test/include/ndb_backup_id.inc'
--- a/mysql-test/include/ndb_backup_id.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/include/ndb_backup_id.inc	2009-02-18 20:19:11 +0000
@@ -0,0 +1,16 @@
+# there is no neat way to find the backupid, this is a hack to find it...
+--let $dump_file= $MYSQLTEST_VARDIR/tmp/tmp.dat
+--exec $NDB_TOOLS_DIR/ndb_select_all --ndb-connectstring="$NDB_CONNECTSTRING" -d sys --delimiter=',' SYSTAB_0 | grep 520093696 > $dump_file
+
+CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
+
+# needed for embedded
+--exec chmod 0777 $dump_file
+--replace_result $dump_file DUMP_FILE
+eval LOAD DATA INFILE '$dump_file' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+
+# Load backup id into environment variable
+let the_backup_id=`SELECT  backup_id from test.backup_info`;
+DROP TABLE test.backup_info;
+
+--remove_file $dump_file

=== modified file 'mysql-test/include/ndb_conflict_info.inc'
--- a/mysql-test/include/ndb_conflict_info.inc	2007-10-14 10:32:32 +0000
+++ b/mysql-test/include/ndb_conflict_info.inc	2009-02-16 15:54:40 +0000
@@ -2,7 +2,7 @@ SELECT VARIABLE_VALUE-@init_ndb_conflict
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 --replace_column 3 # 5 # 6 #
 --error 0,1146
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 --replace_column 3 # 4 #
 --error 0,1146
 SELECT * FROM `t1$EX` ORDER BY a, d;

=== modified file 'mysql-test/include/ndb_conflict_info_init.inc'
--- a/mysql-test/include/ndb_conflict_info_init.inc	2007-10-08 20:14:41 +0000
+++ b/mysql-test/include/ndb_conflict_info_init.inc	2009-02-16 15:54:40 +0000
@@ -2,5 +2,7 @@
 --disable_result_log
 SELECT @init_ndb_conflict_fn_max:=(VARIABLE_VALUE+0) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 SELECT @init_ndb_conflict_fn_old:=(VARIABLE_VALUE+0) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+--error 0,1146
+DELETE FROM `t1$EX`;
 --enable_query_log
 --enable_result_log

=== modified file 'mysql-test/include/ndb_not_readonly.inc'
--- a/mysql-test/include/ndb_not_readonly.inc	2009-02-05 12:22:39 +0000
+++ b/mysql-test/include/ndb_not_readonly.inc	2009-03-12 10:51:59 +0000
@@ -11,7 +11,7 @@ let $counter= 600;
 while ($mysql_errno)
 {
   # Table is readonly until the mysqld has connected properly
-  --error 0,ER_NO_SUCH_TABLE,ER_OPEN_AS_READONLY,ER_GET_ERRMSG
+  --error 0,ER_NO_SUCH_TABLE,ER_OPEN_AS_READONLY,ER_GET_ERRMSG,ER_TABLE_DEF_CHANGED
   replace into mysql.ndb_schema values("","",0,"",0,0,0,0,0);
   if ($mysql_errno)
   {

=== modified file 'mysql-test/lib/My/ConfigFactory.pm'
--- a/mysql-test/lib/My/ConfigFactory.pm	2009-01-27 13:21:18 +0000
+++ b/mysql-test/lib/My/ConfigFactory.pm	2009-02-17 13:22:36 +0000
@@ -240,6 +240,20 @@ sub fix_cluster_backup_dir {
 }
 
 
+sub fix_cluster_undo_file_dir {
+  my ($self, $config, $group_name, $group)= @_;
+  my $dir= $group->value('DataDir');
+  return "$dir/uf";
+}
+
+
+sub fix_cluster_data_file_dir {
+  my ($self, $config, $group_name, $group)= @_;
+  my $dir= $group->value('DataDir');
+  return "$dir/df";
+}
+
+
 #
 # Rules to run for each ndb_mgmd in the config
 #  - will be run in order listed here
@@ -260,6 +274,8 @@ my @ndbd_rules=
  { 'HostName' => \&fix_host },
  { 'DataDir' => \&fix_cluster_dir },
  { 'BackupDataDir' => \&fix_cluster_backup_dir },
+ { 'FileSystemPathDD' => \&fix_cluster_undo_file_dir },
+ { 'FileSystemPathDataFiles' => \&fix_cluster_data_file_dir },
 );
 
 

=== modified file 'mysql-test/lib/v1/ndb_config_2_node.ini'
--- a/mysql-test/lib/v1/ndb_config_2_node.ini	2009-02-05 12:22:39 +0000
+++ b/mysql-test/lib/v1/ndb_config_2_node.ini	2009-03-12 10:51:59 +0000
@@ -22,6 +22,9 @@ CompressedBackup= 1
 # test that the parameter exists
 InitialNoOfOpenFiles= 27
 
+FileSystemPathDD= CHOOSE_FILESYSTEM/uf
+FileSystemPathDataFiles= CHOOSE_FILESYSTEM/df
+
 #
 # Increase timeouts to cater for slow test-machines
 #   (possibly running several tests in parallell)

=== modified file 'mysql-test/mysql-test-run.pl'
--- a/mysql-test/mysql-test-run.pl	2009-03-03 14:24:27 +0000
+++ b/mysql-test/mysql-test-run.pl	2009-03-12 10:51:59 +0000
@@ -963,12 +963,12 @@ sub command_line_setup {
   }
 
   # Look for language files and charsetsdir, use same share
-  my $path_share=      mtr_path_exists("$basedir/share/mysql",
-				       "$basedir/sql/share",
-				       "$basedir/share");
+  $path_language=   mtr_path_exists("$basedir/share/mysql/english",
+                                    "$basedir/sql/share/english",
+                                    "$basedir/share/english");
 
-  
-  $path_language=      mtr_path_exists("$path_share/english");
+
+  my $path_share= dirname($path_language);
   $path_charsetsdir=   mtr_path_exists("$path_share/charsets");
 
   if (using_extern())
@@ -4172,12 +4172,6 @@ sub server_need_restart {
     return 0;
   }
 
-  if ( $opt_embedded_server )
-  {
-    mtr_verbose_restart($server, "no start or restart for embedded server");
-    return 0;
-  }
-
   if ( $tinfo->{'force_restart'} ) {
     mtr_verbose_restart($server, "forced in .opt file");
     return 1;

=== modified file 'mysql-test/suite/funcs_1/t/disabled.def'
--- a/mysql-test/suite/funcs_1/t/disabled.def	2009-02-19 12:59:02 +0000
+++ b/mysql-test/suite/funcs_1/t/disabled.def	2009-03-12 10:51:59 +0000
@@ -11,3 +11,4 @@
 ##############################################################################
 
 ndb_views:		Bug #40860 funcs_1.ndb_views fail
+charset_collation_1:	wrong result

=== added file 'mysql-test/suite/ndb/r/ndb_partition_hash.result'
--- a/mysql-test/suite/ndb/r/ndb_partition_hash.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/r/ndb_partition_hash.result	2009-03-06 18:06:17 +0000
@@ -0,0 +1,23 @@
+drop table if exists t1;
+CREATE TABLE t1 (
+ol_o_id int NOT NULL,
+ol_d_id int NOT NULL,
+ol_w_id int NOT NULL,
+ol_number int NOT NULL,
+ol_tmp int,
+PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number)
+) ENGINE=NDB
+PARTITION BY HASH (ol_w_id);
+insert into t1 values (1,0,0,0,0),(1,0,0,1,0),(1,0,0,2,0),(1,1,0,0,0),(1,1,0,1,0);
+insert into t1 values (2,0,0,0,0),(4,0,0,0,0),(4,0,0,1,0);
+insert into t1 values (0,1,1,4,0),(0,1,1,5,0);
+UPDATE t1 force index (primary) SET ol_tmp = 1
+WHERE ol_o_id = 0 AND ol_d_id = 1 AND ol_w_id = 1;
+SELECT * FROM t1 WHERE ol_w_id = 1 AND ol_d_id = 1 AND ol_o_id = 0;
+ol_o_id	ol_d_id	ol_w_id	ol_number	ol_tmp
+0	1	1	4	1
+0	1	1	5	1
+SELECT SUM(ol_number) FROM t1 WHERE ol_o_id = 0 AND ol_w_id = 1 AND ol_d_id = 1;
+SUM(ol_number)
+9
+drop table t1;

=== modified file 'mysql-test/suite/ndb/r/ndb_restore.result'
--- a/mysql-test/suite/ndb/r/ndb_restore.result	2009-03-03 14:24:27 +0000
+++ b/mysql-test/suite/ndb/r/ndb_restore.result	2009-03-12 10:51:59 +0000
@@ -611,23 +611,53 @@ insert into tab2 values (1, "Donnington"
 (5, "Sciennes", 5, repeat("S", 1000)),
 (6, "Cairns", 6, repeat("T", 1000)),
 (7, "Highlea", 7, repeat("U", 1000));
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 create table tab1 (a int primary key) engine=ndb;
 create table tab2 (a int primary key, b varchar(20), c int, unique(c), d text) engine=ndb;
 insert into tab1 select * from db1.tab1;
 insert into tab2 select * from db1.tab2;
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
-checksum table tab2;
-Table	Checksum
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 ***********************
 Backing up created data
 ***********************
@@ -644,19 +674,53 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db1.tab2, db2.tab1, db2.tab2;
 ****************
 Include only db2
@@ -669,10 +733,27 @@ show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db2.tab1, db2.tab2;
 ****************
 Exclude only db2
@@ -682,10 +763,27 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
@@ -706,16 +804,31 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
 tab2
-checksum table tab2;
-Table	Checksum
-db2.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db2.tab2;
 *****************************
 Exclude db1.tab1 and db2.tab2
@@ -725,16 +838,31 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab1
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 drop table db1.tab2, db2.tab1;
 ********************************* 
 Include db1.tab1, but exclude db1
@@ -744,9 +872,18 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
@@ -759,9 +896,15 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
@@ -774,9 +917,18 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
@@ -793,10 +945,27 @@ show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db2.tab1, db2.tab2;
 *********************************
 Include db1, and include db2.tab1
@@ -809,9 +978,18 @@ use db2;
 show tables;
 Tables_in_db2
 tab1
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 drop table db2.tab1;
 ************************
 Include unknown database
@@ -848,19 +1026,53 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db1.tab2;
 drop table db2.tab1, db2.tab2;
 *********************************************
@@ -871,9 +1083,15 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2

=== modified file 'mysql-test/suite/ndb/r/ndb_restore_compressed.result'
--- a/mysql-test/suite/ndb/r/ndb_restore_compressed.result	2009-03-03 14:24:27 +0000
+++ b/mysql-test/suite/ndb/r/ndb_restore_compressed.result	2009-03-12 10:51:59 +0000
@@ -611,23 +611,53 @@ insert into tab2 values (1, "Donnington"
 (5, "Sciennes", 5, repeat("S", 1000)),
 (6, "Cairns", 6, repeat("T", 1000)),
 (7, "Highlea", 7, repeat("U", 1000));
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 create table tab1 (a int primary key) engine=ndb;
 create table tab2 (a int primary key, b varchar(20), c int, unique(c), d text) engine=ndb;
 insert into tab1 select * from db1.tab1;
 insert into tab2 select * from db1.tab2;
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
-checksum table tab2;
-Table	Checksum
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 ***********************
 Backing up created data
 ***********************
@@ -644,19 +674,53 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db1.tab2, db2.tab1, db2.tab2;
 ****************
 Include only db2
@@ -669,10 +733,27 @@ show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db2.tab1, db2.tab2;
 ****************
 Exclude only db2
@@ -682,10 +763,27 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
@@ -706,16 +804,31 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
 tab2
-checksum table tab2;
-Table	Checksum
-db2.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db2.tab2;
 *****************************
 Exclude db1.tab1 and db2.tab2
@@ -725,16 +838,31 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab1
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 drop table db1.tab2, db2.tab1;
 ********************************* 
 Include db1.tab1, but exclude db1
@@ -744,9 +872,18 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
@@ -759,9 +896,15 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
@@ -774,9 +917,18 @@ use db1;
 show tables;
 Tables_in_db1
 tab1
-checksum table tab1;
-Table	Checksum
-db1.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 use db2;
 show tables;
 Tables_in_db2
@@ -793,10 +945,27 @@ show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db2.tab1, db2.tab2;
 *********************************
 Include db1, and include db2.tab1
@@ -809,9 +978,18 @@ use db2;
 show tables;
 Tables_in_db2
 tab1
-checksum table tab1;
-Table	Checksum
-db2.tab1	994088853
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
 drop table db2.tab1;
 ************************
 Include unknown database
@@ -848,19 +1026,53 @@ show tables;
 Tables_in_db1
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db1.tab1	994088853
-db1.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2
 tab2
 tab1
-checksum table tab1, tab2;
-Table	Checksum
-db2.tab1	994088853
-db2.tab2	1516475923
+select * from tab1 order by a;
+a
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 drop table db1.tab1, db1.tab2;
 drop table db2.tab1, db2.tab2;
 *********************************************
@@ -871,9 +1083,15 @@ use db1;
 show tables;
 Tables_in_db1
 tab2
-checksum table tab2;
-Table	Checksum
-db1.tab2	1516475923
+select * from tab2 order by a;
+a	b	c	d
+1	Donnington	1	OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
 OOOOOOOOOOOOOOOOOOOOOOOOOO
+2	Basingstoke	2	PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 PPPPPPPPPPPPPPPPPPPPPPPPPPP
+3	George	3	QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
 QQQQQQQQQQQQQQQQQQQQQQ
+4	Spottiswoode	4	RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
 RRRRRRRRRRRRRRRRRRRRRRRRRRRR
+5	Sciennes	5	SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
 SSSSSSSSSSSSSSSSSSSSSSSS
+6	Cairns	6	TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
 TTTTTTTTTTTTTTTTTTTTTT
+7	Highlea	7	UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
 UUUUUUUUUUUUUUUUUUUUUUU
 use db2;
 show tables;
 Tables_in_db2

=== modified file 'mysql-test/suite/ndb/r/ndbapi.result'
--- a/mysql-test/suite/ndb/r/ndbapi.result	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/ndb/r/ndbapi.result	2009-02-25 12:47:05 +0000
@@ -19,4 +19,6 @@ update t0 set c2 = 'G' where c0 = 1;
 update t0 set c0 = 5, c2 = 'H' where c0 = 3;
 delete from t0;
 drop table t0;
+drop database TEST_DB;
+drop database TEST_DB_1;
 Running mgmapi_logevent

=== added file 'mysql-test/suite/ndb/t/ndb_partition_hash.test'
--- a/mysql-test/suite/ndb/t/ndb_partition_hash.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/ndb/t/ndb_partition_hash.test	2009-03-06 18:06:17 +0000
@@ -0,0 +1,49 @@
+--source include/have_ndb.inc
+#
+# Simple test for the partition storage engine
+# Focuses on range partitioning tests
+# 
+#-- source include/have_partition.inc
+
+--disable_query_log
+set new=on;
+--enable_query_log
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+#
+# Partition by hash, basic
+#
+
+
+#
+# BUG37934:
+# Partition pruning is broken for DBT2 table
+# Testcase from Mikael Ronstrom.
+# Note that the testcase did not fail previously, but accessed
+# partitions unnecessarily
+#
+CREATE TABLE t1 (
+  ol_o_id int NOT NULL,
+  ol_d_id int NOT NULL,
+  ol_w_id int NOT NULL,
+  ol_number int NOT NULL,
+  ol_tmp int,
+  PRIMARY KEY (ol_w_id, ol_d_id, ol_o_id, ol_number)
+) ENGINE=NDB
+PARTITION BY HASH (ol_w_id);
+
+insert into t1 values (1,0,0,0,0),(1,0,0,1,0),(1,0,0,2,0),(1,1,0,0,0),(1,1,0,1,0);
+insert into t1 values (2,0,0,0,0),(4,0,0,0,0),(4,0,0,1,0);
+insert into t1 values (0,1,1,4,0),(0,1,1,5,0); # Only rows affected.
+
+UPDATE t1 force index (primary) SET ol_tmp = 1
+WHERE ol_o_id = 0 AND ol_d_id = 1 AND ol_w_id = 1;
+
+SELECT * FROM t1 WHERE ol_w_id = 1 AND ol_d_id = 1 AND ol_o_id = 0;
+SELECT SUM(ol_number) FROM t1 WHERE ol_o_id = 0 AND ol_w_id = 1 AND ol_d_id = 1;
+
+drop table t1;
+

=== modified file 'mysql-test/suite/ndb/t/ndb_restore.test'
--- a/mysql-test/suite/ndb/t/ndb_restore.test	2009-02-05 12:22:39 +0000
+++ b/mysql-test/suite/ndb/t/ndb_restore.test	2009-03-12 10:51:59 +0000
@@ -510,8 +510,10 @@ insert into tab2 values (1, "Donnington"
 (6, "Cairns", 6, repeat("T", 1000)),
 (7, "Highlea", 7, repeat("U", 1000));
 
-checksum table tab1;
-checksum table tab2;
+# checksum table tab1;
+# checksum table tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 use db2;
 
@@ -521,8 +523,10 @@ create table tab2 (a int primary key, b 
 insert into tab1 select * from db1.tab1;
 insert into tab2 select * from db1.tab2;
 
-checksum table tab1;
-checksum table tab2;
+# checksum table tab1;
+# checksum table tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 --echo ***********************
 --echo Backing up created data
@@ -540,11 +544,15 @@ drop table db1.tab1, db1.tab2, db2.tab1,
 
 use db1;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 use db2;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 drop table db1.tab1, db1.tab2, db2.tab1, db2.tab2;
 
@@ -558,8 +566,9 @@ use db1;
 show tables;
 use db2;
 show tables;
-checksum table tab1, tab2;
-
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 drop table db2.tab1, db2.tab2;
 
@@ -572,7 +581,9 @@ drop table db2.tab1, db2.tab2;
 
 use db1;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 use db2;
 show tables;
@@ -601,11 +612,13 @@ show tables;
 
 use db1;
 show tables;
-checksum table tab1;
+# checksum table tab1;
+select * from tab1 order by a;
 
 use db2;
 show tables;
-checksum table tab2;
+# checksum table tab2;
+select * from tab2 order by a;
 
 
 drop table db1.tab1, db2.tab2;
@@ -620,11 +633,13 @@ drop table db1.tab1, db2.tab2;
 
 use db1;
 show tables;
-checksum table tab2;
+# checksum table tab2;
+select * from tab2 order by a;
 
 use db2;
 show tables;
-checksum table tab1;
+# checksum table tab1;
+select * from tab1 order by a;
 
 drop table db1.tab2, db2.tab1;
 
@@ -639,7 +654,8 @@ drop table db1.tab2, db2.tab1;
 
 use db1;
 show tables;
-checksum table tab1;
+# checksum table tab1;
+select * from tab1 order by a;
 
 use db2;
 show tables;
@@ -656,7 +672,8 @@ drop table db1.tab1;
 
 use db1;
 show tables;
-checksum table tab2;
+# checksum table tab2;
+select * from tab2 order by a;
 
 use db2;
 show tables;
@@ -673,7 +690,8 @@ drop table db1.tab2;
 
 use db1;
 show tables;
-checksum table tab1;
+# checksum table tab1;
+select * from tab1 order by a;
 
 use db2;
 show tables;
@@ -692,7 +710,9 @@ use db1;
 show tables;
 use db2;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 drop table db2.tab1, db2.tab2;
 
@@ -708,7 +728,8 @@ use db1;
 show tables;
 use db2;
 show tables;
-checksum table tab1;
+# checksum table tab1;
+select * from tab1 order by a;
 
 drop table db2.tab1;
 
@@ -737,10 +758,14 @@ show databases;
 
 use db1;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 use db2;
 show tables;
-checksum table tab1, tab2;
+# checksum table tab1, tab2;
+select * from tab1 order by a;
+select * from tab2 order by a;
 
 drop table db1.tab1, db1.tab2;
 drop table db2.tab1, db2.tab2;
@@ -754,7 +779,8 @@ drop table db2.tab1, db2.tab2;
 
 use db1;
 show tables;
-checksum table tab2;
+# checksum table tab2;
+select * from tab2 order by a;
 
 use db2;
 show tables;

=== modified file 'mysql-test/suite/ndb/t/ndbapi.test'
--- a/mysql-test/suite/ndb/t/ndbapi.test	2007-12-12 17:19:24 +0000
+++ b/mysql-test/suite/ndb/t/ndbapi.test	2009-02-25 12:47:05 +0000
@@ -5,6 +5,7 @@
 DROP TABLE IF EXISTS t0;
 drop database if exists mysqltest;
 --enable_warnings
+--let MASTER_MYSOCK=`select @@socket`;
 
 --exec echo Running ndbapi_simple
 --exec $NDB_EXAMPLES_DIR/ndbapi_simple/ndbapi_simple $MASTER_MYSOCK "$NDB_CONNECTSTRING" >> $NDB_EXAMPLES_OUTPUT
@@ -31,14 +32,16 @@ create table t0(c0 int, c1 int, c2 char(
 #--exec $NDB_EXAMPLES_DIR/ndbapi_event/ndbapi_event "$NDB_CONNECTSTRING" 1 >> $NDB_EXAMPLES_OUTPUT
 insert into t0 values (1, 2, 'a', 'b', null);
 insert into t0 values (3, 4, 'c', 'd', null);
-update t0 set c3 = 'e' where c0 = 1 and c2 = 'a'; -- use pk
-update t0 set c3 = 'f'; -- use scan
-update t0 set c3 = 'F'; -- use scan update to 'same'
-update t0 set c2 = 'g' where c0 = 1; -- update pk part
-update t0 set c2 = 'G' where c0 = 1; -- update pk part to 'same'
-update t0 set c0 = 5, c2 = 'H' where c0 = 3; -- update full PK
+update t0 set c3 = 'e' where c0 = 1 and c2 = 'a'; # use pk
+update t0 set c3 = 'f'; # use scan
+update t0 set c3 = 'F'; # use scan update to 'same'
+update t0 set c2 = 'g' where c0 = 1; # update pk part
+update t0 set c2 = 'G' where c0 = 1; # update pk part to 'same'
+update t0 set c0 = 5, c2 = 'H' where c0 = 3; # update full PK
 delete from t0;
 drop table t0;
+drop database TEST_DB;
+drop database TEST_DB_1;
 
 --exec echo Running mgmapi_logevent
 --exec $NDB_EXAMPLES_DIR/mgmapi_logevent/mgmapi_logevent "$NDB_CONNECTSTRING" 1 >> $NDB_EXAMPLES_OUTPUT

=== modified file 'mysql-test/suite/ndb_team/my.cnf'
--- a/mysql-test/suite/ndb_team/my.cnf	2009-02-02 15:58:48 +0000
+++ b/mysql-test/suite/ndb_team/my.cnf	2009-03-12 10:51:59 +0000
@@ -25,10 +25,10 @@ ndbapi=,,,,
 ndbcluster
 ndb-wait-connected=20
 ndb-cluster-connection-pool=3
-slave-allow-batching
-ndb-log-orig
+loose-slave-allow-batching
+loose-ndb-log-orig
 # Turn on bin logging
-log-bin=                       master-bin
+loose-log-bin=                       master-bin
 
 # Time to wait for NDB connection before
 # accepting connections client connections

=== modified file 'mysql-test/suite/ndb_team/r/ndb_autodiscover3.result'
--- a/mysql-test/suite/ndb_team/r/ndb_autodiscover3.result	2008-10-15 12:24:10 +0000
+++ b/mysql-test/suite/ndb_team/r/ndb_autodiscover3.result	2009-02-18 20:19:11 +0000
@@ -13,6 +13,9 @@ a	b
 1	1
 2	1
 3	1
+CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
+LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+DROP TABLE test.backup_info;
 select * from t2;
 ERROR 42S02: Table 'test.t2' doesn't exist
 show tables like 't2';
@@ -31,6 +34,9 @@ a
 2
 3
 reset master;
+CREATE TEMPORARY TABLE test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
+LOAD DATA INFILE 'DUMP_FILE' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
+DROP TABLE test.backup_info;
 select * from t2;
 ERROR 42S02: Table 'test.t2' doesn't exist
 show tables like 't2';

=== modified file 'mysql-test/suite/ndb_team/t/ndb_autodiscover3.test'
--- a/mysql-test/suite/ndb_team/t/ndb_autodiscover3.test	2009-01-27 13:03:36 +0000
+++ b/mysql-test/suite/ndb_team/t/ndb_autodiscover3.test	2009-03-12 10:51:59 +0000
@@ -54,8 +54,12 @@ create table t2 (a int, b int, primary k
 insert into t2 values (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1);
 select * from t2 order by a limit 3;
 
+--source include/ndb_backup_id.inc
 --exec $NDB_MGM --no-defaults -e "all restart -i" >> $NDB_TOOLS_OUTPUT
 --exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults -c $connect_str >> $NDB_TOOLS_OUTPUT
+# now make a backup with explicit id to restore the backup id after initial start
+--inc $the_backup_id
+--exec $NDB_MGM --no-defaults -e "start backup $the_backup_id" >> $NDB_TOOLS_OUTPUT
 # to ensure mysqld has connected again, and recreated system tables
 --disable_query_log
 --connection con1
@@ -78,8 +82,12 @@ select * from t2 order by a limit 3;
 select * from t2 order by a limit 3;
 reset master;
 
+--source include/ndb_backup_id.inc
 --exec $NDB_MGM --no-defaults -e "all restart -i" >> $NDB_TOOLS_OUTPUT
 --exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults -c $connect_str >> $NDB_TOOLS_OUTPUT
+# now make a backup with explicit id to restore the backup id after initial start
+--inc $the_backup_id
+--exec $NDB_MGM --no-defaults -e "start backup $the_backup_id" >> $NDB_TOOLS_OUTPUT
 # to ensure mysqld has connected again, and recreated system tables
 --disable_query_log
 --connection con1

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_max.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_max.result	2007-10-14 17:27:00 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_max.result	2009-02-16 15:54:40 +0000
@@ -5,7 +5,7 @@ reset slave;
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 start slave;
 *** Test 1 ********************************************************
-* test native NDB() conflict resolution
+* test native NDB$MAX() conflict resolution
 * test with both allowed "conflict column" types, uint32 and uint64
 *******************************************************************
 insert into mysql.ndb_replication values ("test", "t1", 0, NULL, "NDB$MAX(X)");
@@ -39,6 +39,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
@@ -53,6 +65,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -61,6 +85,18 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -80,8 +116,10 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check insert some data
@@ -120,8 +158,10 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check update some data that causes conflicts
@@ -153,8 +193,10 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check higer timestamp
@@ -170,7 +212,7 @@ a	b	c	d
 3	Master t2 a=3 at c=13	13	111222333
 drop table t1, t2;
 *** Test 2 ********************************************************
-* test native NDB() conflict resolution
+* test native NDB$MAX() conflict resolution
 * test with both allowed "conflict column" types, uint32 and uint64
 * test that setting binlog update option via table works equally well
 *******************************************************************
@@ -206,6 +248,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
@@ -220,6 +274,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -228,6 +294,18 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -243,12 +321,14 @@ commit;
 *** slave - check conflict info, no conflicts yet
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-3
+0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check insert some data
@@ -283,12 +363,14 @@ commit;
 *** slave - check conflict info, there should be some
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-6
+3
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check update some data that causes conflicts
@@ -316,12 +398,14 @@ commit;
 *** slave - check conflict info, change depends on calling test
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-6
+3
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check higer timestamp
@@ -365,28 +449,66 @@ commit;
 *** slave - check update all
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 X=2	2	1
-2	Master t1 X=2	2	12
-3	Master t1 X=2	2	123
+1	Master t1 a=1 at X=1	1	1
+2	Master t1 a=2 at X=1	1	12
+3	Master t1 a=3 at X=1	1	123
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+3
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	1	#	#
+2	1	#	2	#	#
+2	1	#	3	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
 *** slave - check update 2 rows in different tables
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 X=2	2	1
-2	Master t1 a=2 at X=3	3	12
-3	Master t1 X=2	2	123
+1	Master t1 a=1 at X=1	1	1
+2	Master t1 a=2 at X=1	1	12
+3	Master t1 a=3 at X=1	1	123
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+4
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	1	#	#
+2	1	#	2	#	#
+2	1	#	3	#	#
+2	1	#	4	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -395,6 +517,26 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+4
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	1	#	#
+2	1	#	2	#	#
+2	1	#	3	#	#
+2	1	#	4	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -410,12 +552,14 @@ commit;
 *** slave - check conflict info, no conflicts yet
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-6
+0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check insert some data
@@ -450,20 +594,28 @@ commit;
 *** slave - check conflict info, there should be some
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-6
+0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+3
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	1	#	#
+2	1	#	2	#	#
+2	1	#	3	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	111
+2	1	#	#	2	111222
+2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check update some data that causes conflicts
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 a=1 at X=11	11	111
-2	Master t1 a=2 at X=11	11	111222
-3	Master t1 a=3 at X=11	11	111222333
+1	Slave t1 a=1 at X=12	12	111
+2	Slave t1 a=2 at X=12	12	111222
+3	Slave t1 a=3 at X=12	12	111222333
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 a=1 at c=11	11	111
@@ -483,20 +635,34 @@ commit;
 *** slave - check conflict info, change depends on calling test
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
 VARIABLE_VALUE-@init_ndb_conflict_fn_max
-6
+0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+6
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	1	#	#
+2	1	#	2	#	#
+2	1	#	3	#	#
+2	1	#	4	#	#
+2	1	#	5	#	#
+2	1	#	6	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	111
+2	1	#	#	1	111
+2	1	#	#	2	111222
+2	1	#	#	2	111222
+2	1	#	#	3	111222333
+2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check higer timestamp
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 a=1 at X=13	13	111
-2	Master t1 a=2 at X=13	13	111222
-3	Master t1 a=3 at X=13	13	111222333
+1	Slave t1 a=1 at X=11	11	111
+2	Slave t1 a=2 at X=12	12	111222
+3	Slave t1 a=3 at X=12	12	111222333
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 a=1 at c=13	13	111

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_old.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_old.result	2007-10-14 17:27:00 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_conflict_old.result	2009-02-16 15:54:40 +0000
@@ -5,7 +5,7 @@ reset slave;
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
 start slave;
 *** Test 1 ********************************************************
-* test native NDB() conflict resolution
+* test native NDB$OLD() conflict resolution
 * test with both allowed "conflict column" types, uint32 and uint64
 *******************************************************************
 insert into mysql.ndb_replication values ("test", "t1", 0, NULL, "NDB$OLD(X)");
@@ -39,6 +39,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
@@ -53,6 +65,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -61,6 +85,18 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -80,8 +116,8 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 0
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
@@ -122,8 +158,8 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 3
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 2	1	#	1	#	#
 2	1	#	2	#	#
 2	1	#	3	#	#
@@ -163,8 +199,8 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
 5
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 2	1	#	1	#	#
 2	1	#	2	#	#
 2	1	#	3	#	#
@@ -192,7 +228,7 @@ a	b	c	d
 3	Master t2 a=3 at c=13	13	111222333
 drop table t1, t2;
 *** Test 2 ********************************************************
-* test native NDB() conflict resolution
+* test native NDB$OLD() conflict resolution
 * test with both allowed "conflict column" types, uint32 and uint64
 * test that setting binlog update option via table works equally well
 *******************************************************************
@@ -228,6 +264,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
@@ -242,6 +290,18 @@ a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -250,6 +310,18 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -268,21 +340,11 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-5
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
-2	1	#	#	1	111
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check insert some data
@@ -320,26 +382,16 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-8
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
+3
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-4	#	#
+2	1	#	-3	#	#
+2	1	#	-2	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
 2	1	#	#	1	111
-2	1	#	#	1	111
 2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
@@ -371,31 +423,21 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-10
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
+5
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-4	#	#
+2	1	#	-3	#	#
+2	1	#	-2	#	#
+2	1	#	-1	#	#
+2	1	#	0	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
 2	1	#	#	1	111
-2	1	#	#	1	111
-2	1	#	#	2	111222
-2	1	#	#	2	111222
 2	1	#	#	2	111222
 2	1	#	#	2	111222
 2	1	#	#	3	111222333
 2	1	#	#	3	111222333
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check higer timestamp
@@ -439,28 +481,66 @@ commit;
 *** slave - check update all
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 X=2	2	1
-2	Master t1 X=2	2	12
-3	Master t1 X=2	2	123
+1	Master t1 a=1 at X=1	1	1
+2	Master t1 a=2 at X=1	1	12
+3	Master t1 a=3 at X=1	1	123
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 c=2	2	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+3
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-9	#	#
+2	1	#	-8	#	#
+2	1	#	-7	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - update 2 rows in different tables
 update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
 update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
 *** slave - check update 2 rows in different tables
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 X=2	2	1
-2	Master t1 a=2 at X=3	3	12
-3	Master t1 X=2	2	123
+1	Master t1 a=1 at X=1	1	1
+2	Master t1 a=2 at X=1	1	12
+3	Master t1 a=3 at X=1	1	123
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 c=2	2	1
 2	Master t2 c=2	2	12
 3	Master t2 a=3 at c=3	3	123
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+4
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-9	#	#
+2	1	#	-8	#	#
+2	1	#	-7	#	#
+2	1	#	-6	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 *** master - delete all
 delete from t1;
 delete from t2;
@@ -469,6 +549,26 @@ select * from t1 order by a, d;
 a	b	X	d
 select * from t2 order by a, d;
 a	b	c	d
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_max FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_MAX";
+VARIABLE_VALUE-@init_ndb_conflict_fn_max
+0
+SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
+VARIABLE_VALUE-@init_ndb_conflict_fn_old
+4
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-9	#	#
+2	1	#	-8	#	#
+2	1	#	-7	#	#
+2	1	#	-6	#	#
+SELECT * FROM `t1$EX` ORDER BY a, d;
+server_id	master_server_id	master_epoch	count	a	d
+2	1	#	#	1	1
+2	1	#	#	2	12
+2	1	#	#	2	12
+2	1	#	#	3	123
+SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+SELECT * FROM `t2$EX` ORDER BY a, d;
 ************************
 * start conflict testing
 ************************
@@ -487,31 +587,11 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-10
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
+0
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
-2	1	#	#	1	111
-2	1	#	#	1	111
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check insert some data
@@ -549,39 +629,25 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-10
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
+3
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-9	#	#
+2	1	#	-8	#	#
+2	1	#	-7	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
 2	1	#	#	1	111
-2	1	#	#	1	111
-2	1	#	#	2	111222
-2	1	#	#	2	111222
 2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
 SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check update some data that causes conflicts
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 a=1 at X=11	11	111
-2	Master t1 a=2 at X=11	11	111222
-3	Master t1 a=3 at X=11	11	111222333
+1	Slave t1 a=1 at X=12	12	111
+2	Slave t1 a=2 at X=12	12	111222
+3	Slave t1 a=3 at X=12	12	111222333
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 a=1 at c=11	11	111
@@ -604,29 +670,21 @@ VARIABLE_VALUE-@init_ndb_conflict_fn_max
 0
 SELECT VARIABLE_VALUE-@init_ndb_conflict_fn_old FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE "NDB_CONFLICT_FN_OLD";
 VARIABLE_VALUE-@init_ndb_conflict_fn_old
-10
-SELECT * FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
-server_id	master_server_id	master_epoch	count	a	d
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
-2	1	#	1	#	#
-2	1	#	2	#	#
-2	1	#	3	#	#
-2	1	#	4	#	#
-2	1	#	5	#	#
+6
+SELECT server_id, master_server_id, master_epoch, count-@init_ndb_conflict_fn_old, a, d FROM `t1$EX` ORDER BY server_id, master_server_id, master_epoch, count;
+server_id	master_server_id	master_epoch	count-@init_ndb_conflict_fn_old	a	d
+2	1	#	-9	#	#
+2	1	#	-8	#	#
+2	1	#	-7	#	#
+2	1	#	-6	#	#
+2	1	#	-5	#	#
+2	1	#	-4	#	#
 SELECT * FROM `t1$EX` ORDER BY a, d;
 server_id	master_server_id	master_epoch	count	a	d
 2	1	#	#	1	111
 2	1	#	#	1	111
 2	1	#	#	2	111222
 2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	2	111222
-2	1	#	#	3	111222333
-2	1	#	#	3	111222333
 2	1	#	#	3	111222333
 2	1	#	#	3	111222333
 SELECT * FROM `t2$EX` ORDER BY server_id, master_server_id, master_epoch, count;
@@ -634,9 +692,9 @@ SELECT * FROM `t2$EX` ORDER BY a, d;
 *** slave - check higer timestamp
 select * from t1 order by a, d;
 a	b	X	d
-1	Master t1 a=1 at X=13	13	111
-2	Master t1 a=2 at X=13	13	111222
-3	Master t1 a=3 at X=13	13	111222333
+1	Slave t1 a=1 at X=11	11	111
+2	Slave t1 a=2 at X=12	12	111222
+3	Slave t1 a=3 at X=12	12	111222333
 select * from t2 order by a, d;
 a	b	c	d
 1	Master t2 a=1 at c=13	13	111

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_logging.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_logging.result	2007-09-05 16:06:44 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_logging.result	2009-02-16 22:16:44 +0000
@@ -70,3 +70,4 @@ a	b	c
 1	updated t2.b from master	t2.c from slave
 drop table t1;
 drop table t2;
+drop table mysql.ndb_replication;

=== modified file 'mysql-test/suite/rpl_ndb/t/disabled.def'
--- a/mysql-test/suite/rpl_ndb/t/disabled.def	2009-03-03 14:24:27 +0000
+++ b/mysql-test/suite/rpl_ndb/t/disabled.def	2009-03-12 10:51:59 +0000
@@ -10,5 +10,3 @@
 #
 ##############################################################################
 
-rpl_ndb_extraCol	 : Bug#41369 2008-12-10 alik
-rpl_ndb_circular_2ch     : Bug#42396 2009-01-28 andrei test fails auto-inc insert

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_1.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_1.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_1.inc	2009-02-16 22:16:44 +0000
@@ -0,0 +1,135 @@
+--connection slave
+--source include/ndb_conflict_info_init.inc
+
+--connection master
+
+--eval create table t1 (a int, b varchar(32), X $col_type, d varchar(9), primary key (a, d)) engine ndb
+create table t2 (a int key, b varchar(32), c int unsigned, d varchar(9)) engine ndb;
+
+--echo ************************************************
+--echo * some basic positive testing, i.e. no conflicts
+--echo ************************************************
+--connection master
+--echo *** insert some data
+begin;
+insert into t1 values (1, "Master t1 a=1 at X=1", 1, '1');
+insert into t1 values (2, "Master t1 a=2 at X=1", 1, '12');
+insert into t1 values (3, "Master t1 a=3 at X=1", 1, '123');
+insert into t2 values (1, "Master t2 a=1 at c=1", 1, '1');
+insert into t2 values (2, "Master t2 a=2 at c=1", 1, '12');
+insert into t2 values (3, "Master t2 a=3 at c=1", 1, '123');
+commit;
+
+--echo *** master - update all
+--connection master
+begin;
+update t1 set b="Master t1 X=2", X=X+1;
+update t2 set b="Master t2 c=2", c=c+1;
+commit;
+--echo *** slave - check update all
+--sync_slave_with_master
+--connection slave
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+--source include/ndb_conflict_info.inc
+
+--echo *** master - update 2 rows in different tables
+--connection master
+update t1 set b="Master t1 a=2 at X=3", X=X+1 where a=2;
+update t2 set b="Master t2 a=3 at c=3", c=c+1 where a=3;
+--echo *** slave - check update 2 rows in different tables
+--sync_slave_with_master
+--connection slave
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+--source include/ndb_conflict_info.inc
+
+--echo *** master - delete all
+--connection master
+delete from t1;
+delete from t2;
+--echo *** slave - check delete all
+--sync_slave_with_master
+--connection slave
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+--source include/ndb_conflict_info.inc
+--source include/ndb_conflict_info_init.inc
+
+--echo ************************
+--echo * start conflict testing
+--echo ************************
+--echo *** master - insert some data
+--connection master
+begin;
+insert into t1 values (1, "Master t1 a=1 at X=10", 10, '111');
+insert into t1 values (2, "Master t1 a=2 at X=10", 10, '111222');
+insert into t1 values (3, "Master t1 a=3 at X=10", 10, '111222333');
+insert into t2 values (1, "Master t2 a=1 at c=10", 10, '111');
+insert into t2 values (2, "Master t2 a=2 at c=10", 10, '111222');
+insert into t2 values (3, "Master t2 a=3 at c=10", 10, '111222333');
+commit;
+
+--echo *** slave - check conflict info, no conflicts yet
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+
+--echo *** slave - check insert some data
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+
+--echo *** slave - update some data to cause conflicts
+begin;
+update t1 set b="Slave t1 a=1 at X=12", X=12 where a=1 and d='111';
+update t1 set b="Slave t1 a=2 at X=12", X=12 where a=2 and d='111222';
+update t1 set b="Slave t1 a=3 at X=12", X=12 where a=3 and d='111222333';
+update t2 set b="Slave t2 a=1 at c=12", c=12 where a=1;
+update t2 set b="Slave t2 a=2 at c=12", c=12 where a=2;
+update t2 set b="Slave t2 a=3 at c=12", c=12 where a=3;
+commit;
+
+--echo *** master - update some data to cause conflicts
+--connection master
+begin;
+update t1 set b="Master t1 a=1 at X=11", X=11 where a=1 and d='111';
+update t1 set b="Master t1 a=2 at X=11", X=11 where a=2 and d='111222';
+update t1 set b="Master t1 a=3 at X=11", X=11 where a=3 and d='111222333';
+update t2 set b="Master t2 a=1 at c=11", c=11 where a=1;
+update t2 set b="Master t2 a=2 at c=11", c=11 where a=2;
+update t2 set b="Master t2 a=3 at c=11", c=11 where a=3;
+commit;
+
+--echo *** slave - check conflict info, there should be some
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+
+--echo *** slave - check update some data that causes conflicts
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+--echo *** slave - correct some data to correspond to the master
+update t1 set b="Slave t1 a=1 at X=11", X=11 where a=1 and d='111';
+
+--echo *** master - update some data, use higher timestamp
+--connection master
+begin;
+update t1 set b="Master t1 a=1 at X=13", X=13 where a=1 and d='111';
+update t1 set b="Master t1 a=2 at X=13", X=13 where a=2 and d='111222';
+update t1 set b="Master t1 a=3 at X=13", X=13 where a=3 and d='111222333';
+update t2 set b="Master t2 a=1 at c=13", c=13 where a=1;
+update t2 set b="Master t2 a=2 at c=13", c=13 where a=2;
+update t2 set b="Master t2 a=3 at c=13", c=13 where a=3;
+commit;
+
+--echo *** slave - check conflict info, change depends on calling test
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+
+--echo *** slave - check higer timestamp
+select * from t1 order by a, d;
+select * from t2 order by a, d;
+
+--connection master
+drop table t1, t2;

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_d.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_d.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_d.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,20 @@
+--echo ***
+--echo *** conflicting timestamps on delete-delete
+--echo ***
+
+--echo *** slave - cause conflict
+--connection slave
+--source include/ndb_conflict_info_init.inc
+update t1 set b="slave  X=3", X=3 where a=1;
+delete from t1 where a=1;
+
+--echo *** master - cause conflict
+--connection master
+delete from t1 where a=1;
+delete from t1 where a=2;
+
+--echo *** slave - check data
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+select * from t1 order by a;

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_u.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_u.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_d_u.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,19 @@
+--echo ***
+--echo *** conflicting timestamps on delete-update
+--echo ***
+
+--echo *** slave - cause conflict
+--connection slave
+--source include/ndb_conflict_info_init.inc
+update t1 set b="slave  X=3", X=3 where a=1;
+
+--echo *** master - cause conflict
+--connection master
+delete from t1 where a=1;
+delete from t1 where a=2;
+
+--echo *** slave - check data
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+select * from t1 order by a;

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_i_i.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_i_i.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_i_i.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,22 @@
+--echo ***
+--echo *** conflicting timestamps on insert
+--echo ***
+
+--connection master
+delete from t1 where a=1;
+--sync_slave_with_master
+
+--echo *** slave - cause conflict
+--connection slave
+--source include/ndb_conflict_info_init.inc
+insert into t1 values(1, "slave  X=3", 3, "1");
+
+--echo *** master - cause conflict
+--connection master
+insert into t1 values(1, "master X=2", 2, "1");
+
+--echo *** slave - check data
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+select * from t1 order by a;

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_init.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_init.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_init.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,28 @@
+--echo *** reset and init
+--disable_query_log
+--disable_result_log
+--connection slave
+stop slave;
+delete from t1;
+--error 0,1146
+delete from `test`.`t1$EX`;
+
+--connection master
+delete from t1;
+reset master;
+
+--connection slave
+reset slave;
+start slave;
+--source include/ndb_conflict_info_init.inc
+--disable_query_log
+--disable_result_log
+
+--connection master
+insert into t1 values (1, "master X=1", 1, "1");
+insert into t1 values (2, "master X=1", 1, "2");
+insert into t1 values (3, "master X=1", 1, "3");
+
+--sync_slave_with_master
+--enable_query_log
+--enable_result_log

=== modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_max.test'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_max.test	2007-10-14 17:27:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_max.test	2009-02-24 13:12:02 +0000
@@ -20,20 +20,28 @@ CREATE TABLE mysql.ndb_replication
   ENGINE=NDB PARTITION BY KEY(db,table_name);
 drop table if exists `test`.`t1$EX`;
 drop table if exists `test`.`t2$EX`;
+create table `test`.`t1$EX`
+  (server_id int unsigned,
+   master_server_id int unsigned,
+   master_epoch bigint unsigned,
+   count int unsigned,
+   a int not null,
+   d varchar(9) not null,
+   primary key(server_id, master_server_id, master_epoch, count)) engine ndb;
 --enable_warnings
 --enable_query_log
 
 --echo *** Test 1 ********************************************************
---echo * test native NDB$MAX() conflict resolution
+--echo * test native NDB\$MAX() conflict resolution
 --echo * test with both allowed "conflict column" types, uint32 and uint64
 --echo *******************************************************************
 --connection master
 insert into mysql.ndb_replication values ("test", "t1", 0, NULL, "NDB$MAX(X)");
 --let col_type = int unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** Test 2 ********************************************************
---echo * test native NDB$MAX() conflict resolution
+--echo * test native NDB\$MAX() conflict resolution
 --echo * test with both allowed "conflict column" types, uint32 and uint64
 --echo * test that setting binlog update option via table works equally well
 --echo *******************************************************************
@@ -41,7 +49,7 @@ insert into mysql.ndb_replication values
 set global ndb_log_update_as_write=1;
 update mysql.ndb_replication set binlog_type=4;
 --let col_type = bigint unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** Test 3 ***********************************************************
 --echo * test that setting binlog type really also sets the "USE_UPDATE" flag
@@ -52,13 +60,12 @@ update mysql.ndb_replication set binlog_
 set global ndb_log_update_as_write=0;
 update mysql.ndb_replication set binlog_type=2;
 --let col_type = int unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** test cleanup
 --disable_query_log
---connection slave
-stop slave;
-drop table mysql.ndb_replication;
 --connection master
 drop table mysql.ndb_replication;
+drop table `test`.`t1$EX`;
+--sync_slave_with_master
 --enable_query_log

=== modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_old.test'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_old.test	2007-10-14 17:27:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_old.test	2009-02-24 13:12:02 +0000
@@ -32,16 +32,16 @@ create table `test`.`t1$EX`
 --enable_query_log
 
 --echo *** Test 1 ********************************************************
---echo * test native NDB$OLD() conflict resolution
+--echo * test native NDB\$OLD() conflict resolution
 --echo * test with both allowed "conflict column" types, uint32 and uint64
 --echo *******************************************************************
 --connection master
 insert into mysql.ndb_replication values ("test", "t1", 0, NULL, "NDB$OLD(X)");
 --let col_type = int unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** Test 2 ********************************************************
---echo * test native NDB$OLD() conflict resolution
+--echo * test native NDB\$OLD() conflict resolution
 --echo * test with both allowed "conflict column" types, uint32 and uint64
 --echo * test that setting binlog update option via table works equally well
 --echo *******************************************************************
@@ -49,7 +49,7 @@ insert into mysql.ndb_replication values
 set global ndb_log_update_as_write=1;
 update mysql.ndb_replication set binlog_type=4;
 --let col_type = bigint unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** Test 3 ***********************************************************
 --echo * test that setting binlog type really also sets the "USE_UPDATE" flag
@@ -60,15 +60,12 @@ update mysql.ndb_replication set binlog_
 set global ndb_log_update_as_write=0;
 update mysql.ndb_replication set binlog_type=2;
 --let col_type = int unsigned
---source extra/rpl_tests/rpl_ndb_conflict_1.test
+--source suite/rpl_ndb/t/rpl_ndb_conflict_1.inc
 
 --echo *** test cleanup
 --disable_query_log
---connection slave
-stop slave;
-drop table mysql.ndb_replication;
-drop table `test`.`t1$EX`;
 --connection master
 drop table mysql.ndb_replication;
 drop table `test`.`t1$EX`;
+--sync_slave_with_master
 --enable_query_log

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_d.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_d.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_d.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,19 @@
+--echo ***
+--echo *** conflicting timestamps on update-delete
+--echo ***
+
+--echo *** slave - cause conflict
+--connection slave
+--source include/ndb_conflict_info_init.inc
+delete from t1 where a=1;
+
+--echo *** master - cause conflict
+--connection master
+update t1 set b="master X=2", X=2 where a=1;
+update t1 set b="master X=2", X=2 where a=2;
+
+--echo *** slave - check data
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+select * from t1 order by a;

=== added file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_u.inc'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_u.inc	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_conflict_u_u.inc	2009-02-16 15:54:40 +0000
@@ -0,0 +1,19 @@
+--echo ***
+--echo *** conflicting timestamps on update
+--echo ***
+
+--echo *** slave - cause conflict
+--connection slave
+--source include/ndb_conflict_info_init.inc
+update t1 set b="slave  X=3", X=3 where a=1;
+
+--echo *** master - cause conflict
+--connection master
+update t1 set b="master X=2", X=2 where a=1;
+update t1 set b="master X=2", X=2 where a=2;
+
+--echo *** slave - check data
+--sync_slave_with_master
+--connection slave
+--source include/ndb_conflict_info.inc
+select * from t1 order by a;

=== modified file 'mysql-test/suite/rpl_ndb/t/rpl_ndb_logging.test'
--- a/mysql-test/suite/rpl_ndb/t/rpl_ndb_logging.test	2008-08-12 15:04:32 +0000
+++ b/mysql-test/suite/rpl_ndb/t/rpl_ndb_logging.test	2009-02-16 22:16:44 +0000
@@ -2,7 +2,7 @@
 # Test engine logging options for ndb
 #
 --source include/have_ndb.inc
---source include/have_binlog_format_row.inc
+--source include/have_binlog_format_mixed_or_row.inc
 --source include/ndb_master-slave.inc
 
 --disable_warnings
@@ -134,3 +134,4 @@ select * from t2;
 --connection master
 drop table t1;
 drop table t2;
+drop table mysql.ndb_replication;

=== renamed file 'mysql-test/suite/rpl_ndb_big/r/rpl_ndb_mixed_engines_transactions.result' => 'mysql-test/suite/rpl_ndb_big/r/rpl_ndb_mix_eng_trans.result'
=== renamed file 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions-master.opt' => 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans-master.opt'
=== renamed file 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions-slave.opt' => 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans-slave.opt'
=== renamed file 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mixed_engines_transactions.test' => 'mysql-test/suite/rpl_ndb_big/t/rpl_ndb_mix_eng_trans.test'
=== modified file 'mysql-test/suite/rpl_ndb_big/t/rpl_ndbapi_multi.test'
--- a/mysql-test/suite/rpl_ndb_big/t/rpl_ndbapi_multi.test	2008-10-29 08:45:14 +0000
+++ b/mysql-test/suite/rpl_ndb_big/t/rpl_ndbapi_multi.test	2009-03-12 10:51:59 +0000
@@ -2,6 +2,7 @@
 -- source include/have_binlog_format_mixed_or_row.inc
 -- source include/have_ndbapi_examples.inc
 -- source include/ndb_master-slave.inc
+--let MASTER_MYSOCK=`select @@socket`;
 
 --exec echo Running ndbapi_simple_dual
 --exec $NDB_EXAMPLES_DIR/ndbapi_simple_dual/ndbapi_simple_dual $MASTER_MYSOCK "$NDB_CONNECTSTRING" $SLAVE_MYSOCK "$NDB_CONNECTSTRING_SLAVE" >> $NDB_EXAMPLES_OUTPUT

=== modified file 'mysql-test/t/warnings.test'
--- a/mysql-test/t/warnings.test	2009-02-05 10:05:23 +0000
+++ b/mysql-test/t/warnings.test	2009-03-12 10:51:59 +0000
@@ -50,7 +50,8 @@ drop table t1;
 #
 
 create table t1(a tinyint, b int not null, c date, d char(5));
-load data infile '../../std_data/warnings_loaddata.dat' into table t1 fields terminated by ',';
+--replace_result $MYSQLTEST_VARDIR ../..
+--eval load data infile '$MYSQLTEST_VARDIR/std_data/warnings_loaddata.dat' into table t1 fields terminated by ','
 # PS doesn't work good with @@warning_count
 --disable_ps_protocol
 select @@warning_count;

=== modified file 'sql/ha_ndbcluster.cc'
--- a/sql/ha_ndbcluster.cc	2009-03-03 14:24:27 +0000
+++ b/sql/ha_ndbcluster.cc	2009-03-12 10:51:59 +0000
@@ -381,18 +381,33 @@ check_completed_operations_pre_commit(Th
   while (first)
   {
     const NdbError &err= first->getNdbError();
-    if (err.classification != NdbError::NoError &&
-        err.classification != NdbError::ConstraintViolation &&
-        err.classification != NdbError::NoDataFound)
+    if (err.classification != NdbError::NoError
+#ifndef HAVE_NDB_BINLOG
+        && err.classification != NdbError::ConstraintViolation
+        && err.classification != NdbError::NoDataFound
+#endif
+        )
     {
 #ifdef HAVE_NDB_BINLOG
       DBUG_PRINT("info", ("ndb error: %d", err.code));
       if (err.code == (int) error_conflict_fn_max_violation)
       {
+        DBUG_PRINT("info", ("err.code == (int) error_conflict_fn_max_violation"));
         thd_ndb->m_max_violation_count++;
       }
-      else if (err.code == (int) error_conflict_fn_old_violation)
-      {
+      else if (err.code == (int) error_conflict_fn_old_violation ||
+               err.classification == NdbError::ConstraintViolation ||
+               err.classification == NdbError::NoDataFound)
+      {
+        DBUG_PRINT("info",
+                   ("err.code %s (int) error_conflict_fn_old_violation, "
+                    "err.classification %s",
+                    err.code == (int) error_conflict_fn_old_violation ? "==" : "!=",
+                    err.classification
+                    == NdbError::ConstraintViolation
+                    ? "== NdbError::ConstraintViolation"
+                    : (err.classification == NdbError::NoDataFound
+                       ? "== NdbError::NoDataFound" : "!=")));
         thd_ndb->m_old_violation_count++;
         const void* buffer= first->getCustomData();
         if (buffer != NULL)
@@ -452,7 +467,10 @@ check_completed_operations_pre_commit(Th
       }
       else
 #endif
+      {
+        DBUG_PRINT("info", ("err.code == %u", err.code));
         DBUG_RETURN(err.code);
+      }
     }
     if (err.classification != NdbError::NoError)
       ignores++;
@@ -2728,6 +2746,7 @@ ha_ndbcluster::pk_unique_index_read_key(
 
   if (ppartition_id != NULL)
   {
+    assert(m_user_defined_partitioning);
     options.optionsPresent|= NdbOperation::OperationOptions::OO_PARTITION_ID;
     options.partitionId= *ppartition_id;
     poptions= &options;
@@ -2892,6 +2911,11 @@ int ha_ndbcluster::ordered_index_scan(co
   if (m_use_partition_pruning && part_spec != NULL &&
       part_spec->start_part == part_spec->end_part)
   {
+    /* TODO - 6.4
+     * Really should only take this path when the table uses
+     * user-defined partitioning, otherwise we need a key value
+     * to correctly constrain the partition scanned.
+     */
     options.partitionId = part_spec->start_part;
     options.optionsPresent |= NdbScanOperation::ScanOptions::SO_PARTITION_ID;
   }
@@ -2906,6 +2930,8 @@ int ha_ndbcluster::ordered_index_scan(co
                              sizeof(NdbScanOperation::ScanOptions))))
     ERR_RETURN(trans->getNdbError());
 
+  DBUG_PRINT("info", ("Is scan pruned to 1 partition? : %u", op->getPruned()));
+
   if (uses_blob_value(table->read_set) &&
       get_blob_values(op, NULL, table->read_set) != 0)
     ERR_RETURN(op->getNdbError());
@@ -2984,6 +3010,14 @@ int ha_ndbcluster::full_table_scan(const
        * don't need it anymore since output from one ordered partitioned
        * index is always sorted.
        */
+      // TODO - 6.4
+      // This code still allows a table scan of a natively partitioned
+      // table to be pruned by MySQLD.  
+      // It is used as part of ALTER TABLE COALESCE PARTITION in the 
+      // ndb_partition_key test.
+      // If this is required then we need a single value of the
+      // distribution key to attempt pruning.
+      //
       use_set_part_id= TRUE;
       if (!(trans= get_transaction_part_id(part_spec.start_part, error)))
       {
@@ -3011,6 +3045,9 @@ int ha_ndbcluster::full_table_scan(const
   options.parallel = parallelism;
 
   if (use_set_part_id) {
+    // TODO - 6.4 
+    // Note that we still call this for natively partitioned tables
+    // See comment above about resolving this.
     options.optionsPresent|= NdbScanOperation::ScanOptions::SO_PARTITION_ID;
     options.partitionId = part_spec.start_part;
   };
@@ -3300,6 +3337,7 @@ int ha_ndbcluster::ndb_write_row(uchar *
   options.optionsPresent=0;
   
   eventSetAnyValue(thd, &options); 
+  bool need_flush= add_row_check_if_batch_full(thd_ndb);
 
   if (m_user_defined_partitioning)
   {
@@ -3344,8 +3382,17 @@ int ha_ndbcluster::ndb_write_row(uchar *
     This means that we now suffer from BUG#22045... :-/
   */
   const MY_BITMAP *user_cols_written_bitmap;
+#ifdef HAVE_NDB_BINLOG
+  uchar* ex_data_buffer= NULL;
+#endif
   
-  if (m_use_write)
+  if (m_use_write
+#ifdef HAVE_NDB_BINLOG
+      && !(thd->slave_thread &&
+           m_share->m_cfn_share &&
+           m_share->m_cfn_share->m_resolve_cft != CFT_NDB_UNDEF)
+#endif
+      )
   {
     uchar *mask;
 
@@ -3363,10 +3410,52 @@ int ha_ndbcluster::ndb_write_row(uchar *
         SQL thread -> use the write_set for writeTuple().
         otherwise (REPLACE INTO) -> do not use write_set.
     */
+
+#if 0 /* NOT YET, interpeted function not supported for write */
+    /*
+      Room for 10 instruction words, two labels (@ 2words/label)
+      + 2 extra words for the case of resolve_size == 8
+    */
+    Uint32 buffer[16];
+    NdbInterpretedCode code(m_table, buffer,
+                            sizeof(buffer)/sizeof(buffer[0]));
+#endif
     if (thd->slave_thread)
     {
       user_cols_written_bitmap= table->write_set;
       mask= (uchar *)(user_cols_written_bitmap->bitmap);
+#if 0 /* NOT YET, interpeted function not supported for write */
+      /* Conflict resolution in slave thread. */
+      enum_conflict_fn_type cft= m_share->m_cfn_share ? m_share->m_cfn_share->m_resolve_cft : CFT_NDB_UNDEF;
+      if (cft != CFT_NDB_UNDEF)
+      {
+        if (!write_row_conflict_fn(cft, record, &code))
+        {
+          options.optionsPresent|=NdbOperation::OperationOptions::OO_INTERPRETED;
+          options.interpretedCode= &code;
+          thd_ndb->m_conflict_fn_usage_count++;
+        }
+
+        Ndb_exceptions_data ex_data;
+        ex_data.share= m_share;
+        /*
+          We need to save the row data for possible conflict resolution after
+          execute().
+        */
+        ex_data.row= copy_row_to_buffer(thd_ndb, record);
+        ex_data_buffer= get_buffer(thd_ndb, sizeof(ex_data));
+        if (ex_data.row == NULL || ex_data_buffer == NULL)
+        {
+          DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+        }
+        memcpy(ex_data_buffer, &ex_data, sizeof(ex_data));
+
+        options.optionsPresent|= NdbOperation::OperationOptions::OO_CUSTOMDATA;
+        options.customData= (void*)ex_data_buffer;
+        if (options.optionsPresent != 0)
+          poptions=&options;
+      }
+#endif
     }
     else
 #endif
@@ -3374,13 +3463,36 @@ int ha_ndbcluster::ndb_write_row(uchar *
       user_cols_written_bitmap= NULL;
       mask= NULL;
     }
-
     op= trans->writeTuple(key_rec, (const char *)key_row, m_ndb_record,
                           (char *)record, mask,
                           poptions, sizeof(NdbOperation::OperationOptions));
   }
   else
   {
+#ifdef HAVE_NDB_BINLOG
+    if (m_use_write)
+    {
+      thd_ndb->m_conflict_fn_usage_count++;
+
+      Ndb_exceptions_data ex_data;
+      ex_data.share= m_share;
+      /*
+        We need to save the row data for possible conflict resolution after
+        execute().
+      */
+      ex_data.row= copy_row_to_buffer(thd_ndb, record);
+      ex_data_buffer= get_buffer(thd_ndb, sizeof(ex_data));
+      if (ex_data.row == NULL || ex_data_buffer == NULL)
+      {
+        DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+      }
+      memcpy(ex_data_buffer, &ex_data, sizeof(ex_data));
+
+      options.optionsPresent|= NdbOperation::OperationOptions::OO_CUSTOMDATA;
+      options.customData= (void*)ex_data_buffer;
+      poptions=&options;
+    }
+#endif
     /* Using insert, we write all user visible columns */
     user_cols_written_bitmap= NULL;
     op= trans->insertTuple(key_rec, (const char *)key_row, m_ndb_record,
@@ -3390,7 +3502,6 @@ int ha_ndbcluster::ndb_write_row(uchar *
   if (!(op))
     ERR_RETURN(trans->getNdbError());
 
-  bool need_flush= add_row_check_if_batch_full(thd_ndb);
   bool do_batch= !need_flush &&
     (batched_update || (thd->options & OPTION_ALLOW_BATCH));
   uint blob_count= 0;
@@ -3472,23 +3583,6 @@ int ha_ndbcluster::primary_key_cmp(const
         return 1;
     }
   }
-
-  /*
-    potentially not needed call to this function
-  */
-#if MYSQL_VERSION_ID > 60010
-  /*
-    int 
-    Update_rows_log_event::do_before_row_operations(const Slave_reporting_capability *const)
-
-    In 5.1 it used to clear the primary key bits for the slave applier. In 6.0 this changed
-    in order to fix something in Falcon, which results in this assert to trigger as
-    primary_key_cmp did not used to be called in the 5.1 code for the slave applier.
-    Disabling check for now until it has been decided how to proceed.  Assert will trigger
-    again in 6.0.11
-  */
-  DBUG_ASSERT(!table->in_use->slave_thread || (m_ignore_no_key == FALSE));
-#endif
   return 0;
 }
 
@@ -3506,9 +3600,8 @@ int ha_ndbcluster::primary_key_cmp(const
 */
 
 int
-ha_ndbcluster::update_row_conflict_fn_max(const uchar *old_data,
-                                          uchar *new_data,
-                                          NdbInterpretedCode *code)
+ha_ndbcluster::row_conflict_fn_max(const uchar *new_data,
+                                   NdbInterpretedCode *code)
 {
   uint32 resolve_column= m_share->m_cfn_share->m_resolve_column;
   uint32 resolve_size= m_share->m_cfn_share->m_resolve_size;
@@ -3521,7 +3614,7 @@ ha_ndbcluster::update_row_conflict_fn_ma
   if (!bitmap_is_set(table->write_set, resolve_column))
   {
     sql_print_information("NDB Slave: missing data for NDB_MAX");
-    return 0;
+    return 1;
   }
 
   const uint label_0= 0;
@@ -3592,9 +3685,8 @@ ha_ndbcluster::update_row_conflict_fn_ma
 */
 
 int
-ha_ndbcluster::update_row_conflict_fn_old(const uchar *old_data,
-                                          uchar *new_data,
-                                          NdbInterpretedCode *code)
+ha_ndbcluster::row_conflict_fn_old(const uchar *old_data,
+                                   NdbInterpretedCode *code)
 {
   uint32 resolve_column= m_share->m_cfn_share->m_resolve_column;
   uint32 resolve_size= m_share->m_cfn_share->m_resolve_size;
@@ -3607,7 +3699,7 @@ ha_ndbcluster::update_row_conflict_fn_ol
   if (!bitmap_is_set(table->write_set, resolve_column))
   {
     sql_print_information("NDB Slave: missing data for NDB_OLD");
-    return 0;
+    return -1;
   }
 
   const uint label_0= 0;
@@ -3672,13 +3764,58 @@ ha_ndbcluster::update_row_conflict_fn(en
   DBUG_ASSERT(cft == CFT_NDB_MAX || cft == CFT_NDB_OLD);
   switch (cft) {
   case CFT_NDB_MAX:
-    return update_row_conflict_fn_max(old_data, new_data, code);
+    return row_conflict_fn_max(new_data, code);
   case CFT_NDB_OLD:
-    return update_row_conflict_fn_old(old_data, new_data, code);
+    return row_conflict_fn_old(old_data, code);
   case CFT_NDB_UNDEF:
     abort();
   }
-  return 0;
+  return 1;
+}
+
+#if 0 /* NOT YET, interpeted function not supported for write */
+int
+ha_ndbcluster::write_row_conflict_fn(enum_conflict_fn_type cft,
+                                     uchar *data,
+                                     NdbInterpretedCode *code)
+{
+  DBUG_ASSERT(cft == CFT_NDB_MAX || cft == CFT_NDB_OLD);
+  switch (cft) {
+  case CFT_NDB_MAX:
+    return row_conflict_fn_max(data, code);
+  case CFT_NDB_OLD:
+    /*
+      No conflict function here, instead detect if tuple
+      already exists
+     */
+    return 1;
+  case CFT_NDB_UNDEF:
+    abort();
+  }
+  return 1;
+}
+#endif
+
+int
+ha_ndbcluster::delete_row_conflict_fn(enum_conflict_fn_type cft,
+                                      const uchar *old_data,
+                                      NdbInterpretedCode *code)
+{
+  DBUG_ASSERT(cft == CFT_NDB_MAX || cft == CFT_NDB_OLD);
+  switch (cft) {
+  case CFT_NDB_MAX:
+    /*
+      As we do not have a timestamp for the actual delete,
+      the best we can do is to detect a possible conflict
+      on the old data.
+    */
+    return row_conflict_fn_old(old_data, code);
+  case CFT_NDB_OLD:
+    return row_conflict_fn_old(old_data, code);
+  case CFT_NDB_UNDEF:
+    abort();
+  }
+  return 1;
 }
 #endif /* HAVE_NDB_BINLOG */
 
@@ -3942,28 +4079,24 @@ int ha_ndbcluster::ndb_update_row(const 
 
 #ifdef HAVE_NDB_BINLOG
     uchar* ex_data_buffer= NULL;
+    /*
+      Room for 10 instruction words, two labels (@ 2words/label)
+      + 2 extra words for the case of resolve_size == 8
+    */
+    Uint32 buffer[16];
+    NdbInterpretedCode code(m_table, buffer,
+                            sizeof(buffer)/sizeof(buffer[0]));
     if (thd->slave_thread && m_share->m_cfn_share &&
         (m_share->m_cfn_share->m_resolve_cft != CFT_NDB_UNDEF))
     {
       /* Conflict resolution in slave thread. */
-
-      /*
-        Room for 10 instruction words, two labels (@ 2words/label)
-        + 2 extra words for the case of resolve_size == 8
-      */
-      Uint32 buffer[16];
-      NdbInterpretedCode code(m_table, buffer,
-                              sizeof(buffer)/sizeof(buffer[0]));
       enum_conflict_fn_type cft= m_share->m_cfn_share->m_resolve_cft;
-      if (update_row_conflict_fn(cft, old_data, new_data, &code))
+      if (!update_row_conflict_fn(cft, old_data, new_data, &code))
       {
-        /* ToDo error handling */
-        abort();
+        options.optionsPresent|=NdbOperation::OperationOptions::OO_INTERPRETED;
+        options.interpretedCode= &code;
+        thd_ndb->m_conflict_fn_usage_count++;
       }
-      options.optionsPresent|=NdbOperation::OperationOptions::OO_INTERPRETED;
-      options.interpretedCode= &code;
-
-      thd_ndb->m_conflict_fn_usage_count++;
 
       Ndb_exceptions_data ex_data;
       ex_data.share= m_share;
@@ -4127,6 +4260,12 @@ int ha_ndbcluster::ndb_delete_row(const 
 
   eventSetAnyValue(thd, &options);
 
+  /*
+    Poor approx. let delete ~ tabsize / 4
+  */
+  uint delete_size= 12 + (m_bytes_per_write >> 2);
+  bool need_flush= add_row_check_if_batch_full_size(thd_ndb, delete_size);
+
   if (cursor)
   {
     if (options.optionsPresent != 0)
@@ -4169,11 +4308,51 @@ int ha_ndbcluster::ndb_delete_row(const 
       options.partitionId= part_id;
     }
 
+    setup_key_ref_for_ndb_record(&key_rec, &key_row, record,
+				 m_read_before_write_removal_used);
+
+#ifdef HAVE_NDB_BINLOG
+    uchar* ex_data_buffer= NULL;
+    /*
+      Room for 10 instruction words, two labels (@ 2words/label)
+      + 2 extra words for the case of resolve_size == 8
+    */
+    Uint32 buffer[16];
+    NdbInterpretedCode code(m_table, buffer,
+                            sizeof(buffer)/sizeof(buffer[0]));
+    if (thd->slave_thread && m_share->m_cfn_share &&
+        (m_share->m_cfn_share->m_resolve_cft != CFT_NDB_UNDEF))
+    {
+      /* Conflict resolution in slave thread. */
+      enum_conflict_fn_type cft= m_share->m_cfn_share->m_resolve_cft;
+      if (!delete_row_conflict_fn(cft, record, &code))
+      {
+        options.optionsPresent|=NdbOperation::OperationOptions::OO_INTERPRETED;
+        options.interpretedCode= &code;
+        thd_ndb->m_conflict_fn_usage_count++;
+      }
+
+      Ndb_exceptions_data ex_data;
+      ex_data.share= m_share;
+      /*
+        We need to save the row data for possible conflict resolution after
+        execute().
+      */
+      ex_data.row= copy_row_to_buffer(thd_ndb, record);
+      ex_data_buffer= get_buffer(thd_ndb, sizeof(ex_data));
+      if (ex_data.row == NULL || ex_data_buffer == NULL)
+      {
+        DBUG_RETURN(HA_ERR_OUT_OF_MEM);
+      }
+      memcpy(ex_data_buffer, &ex_data, sizeof(ex_data));
+
+      options.optionsPresent|= NdbOperation::OperationOptions::OO_CUSTOMDATA;
+      options.customData= (void*)ex_data_buffer;
+    }
+#endif /* HAVE_NDB_BINLOG */
     if (options.optionsPresent != 0)
       poptions= &options;
 
-    setup_key_ref_for_ndb_record(&key_rec, &key_row, record,
-				 m_read_before_write_removal_used);
     if (!(op=trans->deleteTuple(key_rec, (const char *)key_row,
                                 m_ndb_record,
                                 NULL, // row
@@ -4205,11 +4384,6 @@ int ha_ndbcluster::ndb_delete_row(const 
           been aborted.
     */
 
-    /*
-      Poor approx. let delete ~ tabsize / 4
-    */
-    uint delete_size= 12 + (m_bytes_per_write >> 2);
-    bool need_flush= add_row_check_if_batch_full_size(thd_ndb, delete_size);
     if ( allow_batch &&
 	 table_share->primary_key != MAX_KEY &&
 	 !primary_key_update &&
@@ -6474,7 +6648,6 @@ int ha_ndbcluster::create(const char *na
           strcmp(m_tabname, NDB_SCHEMA_TABLE) == 0))
     {
       DBUG_PRINT("info", ("Schema distribution table not setup"));
-      DBUG_ASSERT(ndb_schema_share);
       DBUG_RETURN(HA_ERR_NO_CONNECTION);
     }
     single_user_mode = NdbDictionary::Table::SingleUserModeReadWrite;
@@ -7315,7 +7488,6 @@ ha_ndbcluster::delete_table(THD *thd, ha
   if (!ndb_schema_share)
   {
     DBUG_PRINT("info", ("Schema distribution table not setup"));
-    DBUG_ASSERT(ndb_schema_share);
     DBUG_RETURN(HA_ERR_NO_CONNECTION);
   }
   /* ndb_share reference temporary */
@@ -10930,6 +11102,10 @@ int ha_ndbcluster::multi_range_start_ret
       {
         if (part_spec.start_part == part_spec.end_part)
         {
+          /* MySQLD thinks this key is definitely in one partition so 
+           * we'll hint the transaction to run there.
+           * No big loss if it's transiently incorrect
+           */
           if (unlikely((trans= start_transaction_part_id(part_spec.start_part, error)) == NULL))
           {
             DBUG_RETURN(error);
@@ -11008,6 +11184,25 @@ int ha_ndbcluster::multi_range_start_ret
         m_next_row= 0;
       }
 
+      Ndb::PartitionSpec ndbPartitionSpec;
+      const Ndb::PartitionSpec* ndbPartSpecPtr= NULL;
+
+      /* If this table uses user-defined partitioning, use MySQLD provided
+       * partition info as pruning info
+       * Otherwise, scan range pruning is performed automatically by
+       * NDBAPI based on distribution key values.
+       */
+      if (m_use_partition_pruning && 
+          m_user_defined_partitioning &&
+          (part_spec.start_part == part_spec.end_part))
+      {
+        DBUG_PRINT("info", ("Range on user-def-partitioned table can be pruned to part %u",
+                            part_spec.start_part));
+        ndbPartitionSpec.type= Ndb::PartitionSpec::PS_USER_DEFINED;
+        ndbPartitionSpec.UserDefined.partitionId= part_spec.start_part;
+        ndbPartSpecPtr= &ndbPartitionSpec;
+      }
+
       /* Include this range in the ordered index scan. */
       NdbIndexScanOperation::IndexBound bound;
       compute_index_bounds(bound, key_info,
@@ -11015,7 +11210,9 @@ int ha_ndbcluster::multi_range_start_ret
       bound.range_no= range_no;
 
       if (m_multi_cursor->setBound(m_index[active_index].ndb_record_key,
-                                   bound))
+                                   bound,
+                                   ndbPartSpecPtr, // Only for user-def tables
+                                   sizeof(Ndb::PartitionSpec)))
       {
         ERR_RETURN(trans->getNdbError());
       }

=== modified file 'sql/ha_ndbcluster.h'
--- a/sql/ha_ndbcluster.h	2009-01-27 13:03:36 +0000
+++ b/sql/ha_ndbcluster.h	2009-03-12 10:51:59 +0000
@@ -234,21 +234,39 @@ struct Ndb_tuple_id_range_guard {
 #define NSF_BINLOG_USE_UPDATE 16u  /* table update should be binlogged using
                                      update log event */
 inline void set_binlog_logging(NDB_SHARE *share)
-{ share->flags&= ~NSF_NO_BINLOG; }
+{
+  DBUG_PRINT("info", ("set_binlog_logging"));
+  share->flags&= ~NSF_NO_BINLOG;
+}
 inline void set_binlog_nologging(NDB_SHARE *share)
-{ share->flags|= NSF_NO_BINLOG; }
+{
+  DBUG_PRINT("info", ("set_binlog_nologging"));
+  share->flags|= NSF_NO_BINLOG;
+}
 inline my_bool get_binlog_nologging(NDB_SHARE *share)
 { return (share->flags & NSF_NO_BINLOG) != 0; }
 inline void set_binlog_updated_only(NDB_SHARE *share)
-{ share->flags&= ~NSF_BINLOG_FULL; }
+{
+  DBUG_PRINT("info", ("set_binlog_updated_only"));
+  share->flags&= ~NSF_BINLOG_FULL;
+}
 inline void set_binlog_full(NDB_SHARE *share)
-{ share->flags|= NSF_BINLOG_FULL; }
+{
+  DBUG_PRINT("info", ("set_binlog_full"));
+  share->flags|= NSF_BINLOG_FULL;
+}
 inline my_bool get_binlog_full(NDB_SHARE *share)
 { return (share->flags & NSF_BINLOG_FULL) != 0; }
 inline void set_binlog_use_write(NDB_SHARE *share)
-{ share->flags&= ~NSF_BINLOG_USE_UPDATE; }
+{
+  DBUG_PRINT("info", ("set_binlog_use_write"));
+  share->flags&= ~NSF_BINLOG_USE_UPDATE;
+}
 inline void set_binlog_use_update(NDB_SHARE *share)
-{ share->flags|= NSF_BINLOG_USE_UPDATE; }
+{
+  DBUG_PRINT("info", ("set_binlog_use_update"));
+  share->flags|= NSF_BINLOG_USE_UPDATE;
+}
 inline my_bool get_binlog_use_update(NDB_SHARE *share)
 { return (share->flags & NSF_BINLOG_USE_UPDATE) != 0; }
 
@@ -559,16 +577,20 @@ static void set_tabname(const char *path
 
 private:
 #ifdef HAVE_NDB_BINLOG
+  int delete_row_conflict_fn(enum_conflict_fn_type cft,
+                             const uchar *old_data,
+                             NdbInterpretedCode *);
+  int write_row_conflict_fn(enum_conflict_fn_type cft,
+                            uchar *data,
+                            NdbInterpretedCode *);
   int update_row_conflict_fn(enum_conflict_fn_type cft,
                              const uchar *old_data,
                              uchar *new_data,
                              NdbInterpretedCode *);
-  int update_row_conflict_fn_max(const uchar *old_data,
-                                 uchar *new_data,
-                                 NdbInterpretedCode *);
-  int update_row_conflict_fn_old(const uchar *old_data,
-                                 uchar *new_data,
-                                 NdbInterpretedCode *);
+  int row_conflict_fn_max(const uchar *new_data,
+                          NdbInterpretedCode *);
+  int row_conflict_fn_old(const uchar *old_data,
+                          NdbInterpretedCode *);
 #endif
   void setup_key_ref_for_ndb_record(const NdbRecord **key_rec,
                                     const uchar **key_row,

=== modified file 'sql/ha_ndbcluster_binlog.cc'
--- a/sql/ha_ndbcluster_binlog.cc	2009-03-03 14:24:27 +0000
+++ b/sql/ha_ndbcluster_binlog.cc	2009-03-12 10:51:59 +0000
@@ -72,7 +72,6 @@ int ndb_binlog_thread_running= 0;
 my_bool ndb_binlog_running= FALSE;
 my_bool ndb_binlog_tables_inited= FALSE;
 my_bool ndb_binlog_is_ready= FALSE;
-
 /*
   Global reference to the ndb injector thread THD oject
 
@@ -2125,7 +2124,7 @@ end:
 */
 
 int
-ndb_handle_schema_change(THD *thd, Ndb *ndb, NdbEventOperation *pOp,
+ndb_handle_schema_change(THD *thd, Ndb *is_ndb, NdbEventOperation *pOp,
                          Ndb_event_data *event_data)
 {
   DBUG_ENTER("ndb_handle_schema_change");
@@ -2143,8 +2142,11 @@ ndb_handle_schema_change(THD *thd, Ndb *
   DBUG_ASSERT(pOp->getEventType() == NDBEVENT::TE_DROP ||
               pOp->getEventType() == NDBEVENT::TE_CLUSTER_FAILURE);
   {
+    Thd_ndb *thd_ndb= get_thd_ndb(thd);
+    Ndb *ndb= thd_ndb->ndb;
+    NDBDICT *dict= ndb->getDictionary();
     ndb->setDatabaseName(dbname);
-    Ndb_table_guard ndbtab_g(ndb->getDictionary(), tabname);
+    Ndb_table_guard ndbtab_g(dict, tabname);
     const NDBTAB *ev_tab= pOp->getTable();
     const NDBTAB *cache_tab= ndbtab_g.get_table();
     if (cache_tab &&
@@ -2205,7 +2207,7 @@ ndb_handle_schema_change(THD *thd, Ndb *
   }
 
   pthread_mutex_lock(&injector_mutex);
-  ndb->dropEventOperation(pOp);
+  is_ndb->dropEventOperation(pOp);
   pOp= 0;
   pthread_mutex_unlock(&injector_mutex);
 
@@ -2250,7 +2252,7 @@ static void ndb_binlog_query(THD *thd, C
 }
 
 static int
-ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *ndb,
+ndb_binlog_thread_handle_schema_event(THD *thd, Ndb *s_ndb,
                                       NdbEventOperation *pOp,
                                       List<Cluster_schema> 
                                       *post_epoch_log_list,
@@ -2270,6 +2272,8 @@ ndb_binlog_thread_handle_schema_event(TH
         ev_type == NDBEVENT::TE_INSERT)
     {
       Thd_ndb *thd_ndb= get_thd_ndb(thd);
+      Ndb *ndb= thd_ndb->ndb;
+      NDBDICT *dict= ndb->getDictionary();
       Thd_ndb_options_guard thd_ndb_options(thd_ndb);
       Cluster_schema *schema= (Cluster_schema *)
         sql_alloc(sizeof(Cluster_schema));
@@ -2384,9 +2388,8 @@ ndb_binlog_thread_handle_schema_event(TH
           if (!share || !share->op)
           {
             {
-              injector_ndb->setDatabaseName(schema->db);
-              Ndb_table_guard ndbtab_g(injector_ndb->getDictionary(),
-                                       schema->name);
+              ndb->setDatabaseName(schema->db);
+              Ndb_table_guard ndbtab_g(dict, schema->name);
               ndbtab_g.invalidate();
             }
             TABLE_LIST table_list;
@@ -2538,7 +2541,7 @@ ndb_binlog_thread_handle_schema_event(TH
       close_cached_tables(NULL, NULL, FALSE, FALSE);
       // fall through
     case NDBEVENT::TE_ALTER:
-      ndb_handle_schema_change(thd, ndb, pOp, event_data);
+      ndb_handle_schema_change(thd, s_ndb, pOp, event_data);
       break;
     case NDBEVENT::TE_NODE_FAILURE:
     {
@@ -2625,6 +2628,8 @@ ndb_binlog_thread_handle_schema_event_po
   DBUG_ENTER("ndb_binlog_thread_handle_schema_event_post_epoch");
   Cluster_schema *schema;
   Thd_ndb *thd_ndb= get_thd_ndb(thd);
+  Ndb *ndb= thd_ndb->ndb;
+  NDBDICT *dict= ndb->getDictionary();
   while ((schema= post_epoch_log_list->pop()))
   {
     Thd_ndb_options_guard thd_ndb_options(thd_ndb);
@@ -2675,9 +2680,8 @@ ndb_binlog_thread_handle_schema_event_po
           sql_print_information("SOT_DROP_TABLE %s.%s", schema->db, schema->name);
         log_query= 1;
         {
-          injector_ndb->setDatabaseName(schema->db);
-          Ndb_table_guard ndbtab_g(injector_ndb->getDictionary(),
-                                   schema->name);
+          ndb->setDatabaseName(schema->db);
+          Ndb_table_guard ndbtab_g(dict, schema->name);
           ndbtab_g.invalidate();
         }
         {
@@ -2692,15 +2696,19 @@ ndb_binlog_thread_handle_schema_event_po
         if (ndb_extra_logging > 9)
           sql_print_information("SOT_RENAME_TABLE %s.%s", schema->db, schema->name);
         log_query= 1;
-        pthread_mutex_lock(&LOCK_open);
-        ndbcluster_rename_share(thd, share);
-        pthread_mutex_unlock(&LOCK_open);
+        if (share)
+        {
+          pthread_mutex_lock(&LOCK_open);
+          ndbcluster_rename_share(thd, share);
+          pthread_mutex_unlock(&LOCK_open);
+        }
         break;
       case SOT_RENAME_TABLE_PREPARE:
         if (ndb_extra_logging > 9)
           sql_print_information("SOT_RENAME_TABLE_PREPARE %s.%s -> %s",
                                 schema->db, schema->name, schema->query);
-        if (schema->node_id != g_ndb_cluster_connection->node_id())
+        if (share &&
+            schema->node_id != g_ndb_cluster_connection->node_id())
           ndbcluster_prepare_rename_share(share, schema->query);
         break;
       case SOT_ALTER_TABLE_COMMIT:
@@ -2710,9 +2718,8 @@ ndb_binlog_thread_handle_schema_event_po
           break;
         log_query= 1;
         {
-          injector_ndb->setDatabaseName(schema->db);
-          Ndb_table_guard ndbtab_g(injector_ndb->getDictionary(),
-                                   schema->name);
+          ndb->setDatabaseName(schema->db);
+          Ndb_table_guard ndbtab_g(dict, schema->name);
           ndbtab_g.invalidate();
         }
         {
@@ -2730,7 +2737,10 @@ ndb_binlog_thread_handle_schema_event_po
             if (event_data)
               delete event_data;
             share->op->setCustomData(NULL);
-            injector_ndb->dropEventOperation(share->op);
+            {
+              Mutex_guard injector_mutex_g(injector_mutex);
+              injector_ndb->dropEventOperation(share->op);
+            }
             share->op= 0;
             free_share(&share);
           }
@@ -2779,9 +2789,8 @@ ndb_binlog_thread_handle_schema_event_po
       {
         if (ndb_extra_logging > 9)
           sql_print_information("SOT_ONLINE_ALTER_TABLE_PREPARE %s.%s", schema->db, schema->name);
-        NDBDICT *dict= injector_ndb->getDictionary();
         int error= 0;
-        injector_ndb->setDatabaseName(schema->db);
+        ndb->setDatabaseName(schema->db);
         {
           Ndb_table_guard ndbtab_g(dict, schema->name);
           ndbtab_g.get_table();
@@ -2903,7 +2912,10 @@ ndb_binlog_thread_handle_schema_event_po
             if (event_data)
               delete event_data;
             share->op->setCustomData(NULL);
-            injector_ndb->dropEventOperation(share->op);
+            {
+              Mutex_guard injector_mutex_g(injector_mutex);
+              injector_ndb->dropEventOperation(share->op);
+            }
             share->op= share->new_op;
             share->new_op= 0;
             free_share(&share);
@@ -3211,40 +3223,57 @@ static void 
 set_binlog_flags(NDB_SHARE *share,
                  Ndb_binlog_type ndb_binlog_type)
 {
+  DBUG_ENTER("set_binlog_flags");
   switch (ndb_binlog_type)
   {
   case NBT_NO_LOGGING:
+    DBUG_PRINT("info", ("NBT_NO_LOGGING"));
     set_binlog_nologging(share);
-    return;
+    DBUG_VOID_RETURN;
   case NBT_DEFAULT:
+    DBUG_PRINT("info", ("NBT_DEFAULT"));
     if (opt_ndb_log_updated_only)
+    {
       set_binlog_updated_only(share);
+    }
     else
+    {
       set_binlog_full(share);
+    }
     if (opt_ndb_log_update_as_write)
+    {
       set_binlog_use_write(share);
+    }
     else
+    {
       set_binlog_use_update(share);
+    }
     break;
   case NBT_UPDATED_ONLY:
+    DBUG_PRINT("info", ("NBT_UPDATED_ONLY"));
     set_binlog_updated_only(share);
     set_binlog_use_write(share);
     break;
   case NBT_USE_UPDATE:
+    DBUG_PRINT("info", ("NBT_USE_UPDATE"));
   case NBT_UPDATED_ONLY_USE_UPDATE:
+    DBUG_PRINT("info", ("NBT_UPDATED_ONLY_USE_UPDATE"));
     set_binlog_updated_only(share);
     set_binlog_use_update(share);
     break;
   case NBT_FULL:
+    DBUG_PRINT("info", ("NBT_FULL"));
     set_binlog_full(share);
     set_binlog_use_write(share);
     break;
   case NBT_FULL_USE_UPDATE:
+    DBUG_PRINT("info", ("NBT_FULL_USE_UPDATE"));
     set_binlog_full(share);
     set_binlog_use_update(share);
     break;
   }
   set_binlog_logging(share);
+  DBUG_VOID_RETURN;
 }
 
 
@@ -3825,7 +3854,8 @@ err:
                         ER(ER_ILLEGAL_HA_CREATE_OPTION),
                         ndbcluster_hton_name, msg);  
   }
-  set_binlog_flags(share, NBT_DEFAULT);
+  if (do_set_binlog_flags)
+    set_binlog_flags(share, NBT_DEFAULT);
   if (ndberror.code && ndb_extra_logging)
   {
     List_iterator_fast<MYSQL_ERROR> it(thd->warning_info->warn_list());
@@ -4306,16 +4336,13 @@ ndbcluster_create_event_ops(THD *thd, ND
   int retry_sleep= 100;
   while (1)
   {
-    pthread_mutex_lock(&injector_mutex);
+    Mutex_guard injector_mutex_g(injector_mutex);
     Ndb *ndb= injector_ndb;
     if (do_ndb_schema_share)
       ndb= schema_ndb;
 
     if (ndb == 0)
-    {
-      pthread_mutex_unlock(&injector_mutex);
       DBUG_RETURN(-1);
-    }
 
     NdbEventOperation* op;
     if (do_ndb_schema_share)
@@ -4338,7 +4365,6 @@ ndbcluster_create_event_ops(THD *thd, ND
                           ndb->getNdbError().code,
                           ndb->getNdbError().message,
                           "NDB");
-      pthread_mutex_unlock(&injector_mutex);
       DBUG_RETURN(-1);
     }
 
@@ -4401,7 +4427,6 @@ ndbcluster_create_event_ops(THD *thd, ND
                                 op->getNdbError().message,
                                 "NDB");
             ndb->dropEventOperation(op);
-            pthread_mutex_unlock(&injector_mutex);
             DBUG_RETURN(-1);
           }
         }
@@ -4447,7 +4472,6 @@ ndbcluster_create_event_ops(THD *thd, ND
       share->event_data= event_data;
       op->setCustomData(NULL);
       ndb->dropEventOperation(op);
-      pthread_mutex_unlock(&injector_mutex);
       if (retries && !thd->killed)
       {
         do_retry_sleep(retry_sleep);
@@ -4455,7 +4479,6 @@ ndbcluster_create_event_ops(THD *thd, ND
       }
       DBUG_RETURN(-1);
     }
-    pthread_mutex_unlock(&injector_mutex);
     break;
   }
 
@@ -4844,7 +4867,7 @@ static int ndb_binlog_thread_handle_erro
 }
 
 static int
-ndb_binlog_thread_handle_non_data_event(THD *thd, Ndb *ndb,
+ndb_binlog_thread_handle_non_data_event(THD *thd,
                                         NdbEventOperation *pOp,
                                         ndb_binlog_index_row &row)
 {
@@ -4918,7 +4941,7 @@ ndb_binlog_thread_handle_non_data_event(
     return 0;
   }
 
-  ndb_handle_schema_change(thd, ndb, pOp, event_data);
+  ndb_handle_schema_change(thd, injector_ndb, pOp, event_data);
   return 0;
 }
 
@@ -5110,7 +5133,7 @@ ndb_binlog_thread_handle_data_event(Ndb 
         since we do not have an after image
       */
       int n;
-      if (table->s->primary_key != MAX_KEY)
+      if (!get_binlog_full(share) && table->s->primary_key != MAX_KEY)
         n= 0; /*
                 use the primary key only as it save time and space and
                 it is the only thing needed to log the delete
@@ -5434,8 +5457,19 @@ pthread_handler_t ndb_binlog_thread_func
 
 
 restart_cluster_failure:
+  int have_injector_mutex_lock= 0;
   do_ndbcluster_binlog_close_connection= BCCC_exit;
-  if (!(s_ndb= new Ndb(g_ndb_cluster_connection, "")) ||
+
+  if (!(thd_ndb= ha_ndbcluster::seize_thd_ndb()))
+  {
+    sql_print_error("Could not allocate Thd_ndb object");
+    ndb_binlog_thread_running= -1;
+    pthread_mutex_unlock(&injector_mutex);
+    pthread_cond_signal(&injector_cond);
+    goto err;
+  }
+
+  if (!(s_ndb= new Ndb(g_ndb_cluster_connection, NDB_REP_DB)) ||
       s_ndb->init())
   {
     sql_print_error("NDB Binlog: Getting Schema Ndb object failed");
@@ -5545,6 +5579,18 @@ restart_cluster_failure:
            (ndb_binlog_running && !ndb_apply_status_share) ||
            !ndb_binlog_tables_inited)
     {
+      if (!thd_ndb->valid_ndb())
+      {
+        /*
+          Cluster has gone away before setup was completed.
+          Keep lock on injector_mutex to prevent further
+          usage of the injector_ndb, and restart binlog
+          thread to get rid of any garbage on the ndb objects
+        */
+        have_injector_mutex_lock= 1;
+        do_ndbcluster_binlog_close_connection= BCCC_restart;
+        goto err;
+      }
       /* ndb not connected yet */
       struct timespec abstime;
       set_timespec(abstime, 1);
@@ -5557,18 +5603,10 @@ restart_cluster_failure:
     }
     pthread_mutex_unlock(&injector_mutex);
 
-    if (thd_ndb == NULL)
-    {
-      DBUG_ASSERT(ndbcluster_hton->slot != ~(uint)0);
-      if (!(thd_ndb= ha_ndbcluster::seize_thd_ndb()))
-      {
-        sql_print_error("Could not allocate Thd_ndb object");
-        goto err;
-      }
-      set_thd_ndb(thd, thd_ndb);
-      thd_ndb->options|= TNO_NO_LOG_SCHEMA_OP;
-      thd->query_id= 0; // to keep valgrind quiet
-    }
+    DBUG_ASSERT(ndbcluster_hton->slot != ~(uint)0);
+    set_thd_ndb(thd, thd_ndb);
+    thd_ndb->options|= TNO_NO_LOG_SCHEMA_OP;
+    thd->query_id= 0; // to keep valgrind quiet
   }
 
   {
@@ -5783,7 +5821,7 @@ restart_cluster_failure:
               (unsigned) NDBEVENT::TE_FIRST_NON_DATA_EVENT)
           {
             ndb_binlog_index_row row;
-            ndb_binlog_thread_handle_non_data_event(thd, i_ndb, pOp, row);
+            ndb_binlog_thread_handle_non_data_event(thd, pOp, row);
           }
         }
         if (i_ndb->getEventOperation() == NULL &&
@@ -6021,13 +6059,7 @@ restart_cluster_failure:
             ndb_binlog_thread_handle_data_event(i_ndb, pOp, &rows, trans, trans_row_count);
           else
           {
-            // set injector_ndb database/schema from table internal name
-            IF_DBUG(int ret=)
-              i_ndb->setDatabaseAndSchemaName(pOp->getEvent()->getTable());
-            DBUG_ASSERT(ret == 0);
-            ndb_binlog_thread_handle_non_data_event(thd, i_ndb, pOp, *rows);
-            // reset to catch errors
-            i_ndb->setDatabaseName("");
+            ndb_binlog_thread_handle_non_data_event(thd, pOp, *rows);
             DBUG_PRINT("info", ("s_ndb first: %s", s_ndb->getEventOperation() ?
                                 s_ndb->getEventOperation()->getEvent()->getTable()->getName() :
                                 "<empty>"));
@@ -6145,7 +6177,8 @@ restart_cluster_failure:
     DBUG_PRINT("info",("Restarting cluster binlog thread"));
     THD_SET_PROC_INFO(thd, "Restarting");
   }
-  pthread_mutex_lock(&injector_mutex);
+  if (!have_injector_mutex_lock)
+    pthread_mutex_lock(&injector_mutex);
   /* don't mess with the injector_ndb anymore from other threads */
   injector_thd= 0;
   injector_ndb= 0;

=== modified file 'sql/ha_ndbcluster_binlog.h'
--- a/sql/ha_ndbcluster_binlog.h	2009-01-27 13:03:36 +0000
+++ b/sql/ha_ndbcluster_binlog.h	2009-03-12 10:51:59 +0000
@@ -104,6 +104,21 @@ const uint error_conflict_fn_max_violati
 #endif /* HAVE_NDB_BINLOG */
 
 
+class Mutex_guard
+{
+public:
+  Mutex_guard(pthread_mutex_t &mutex) : m_mutex(mutex)
+  {
+    pthread_mutex_lock(&m_mutex);
+  };
+  ~Mutex_guard()
+  {
+    pthread_mutex_unlock(&m_mutex);
+  };
+private:
+  pthread_mutex_t &m_mutex;
+};
+
 class Ndb_table_guard
 {
 public:

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2009-03-03 14:24:27 +0000
+++ b/sql/log_event.cc	2009-03-12 10:51:59 +0000
@@ -9137,18 +9137,6 @@ Update_rows_log_event::do_before_row_ope
 {
   if (m_table->s->keys > 0)
   {
-    /*
-      primary key columns should not be set in write_set
-    */
-    if (m_table->s->primary_key != MAX_KEY)
-    {
-      KEY *key= m_table->key_info + m_table->s->primary_key;
-      KEY_PART_INFO *key_part= key->key_part;
-      KEY_PART_INFO *end= key_part + key->key_parts;
-      for (; key_part != end; key_part++)
-        bitmap_clear_bit(m_table->write_set, key_part->fieldnr - 1);
-    }
-
     // Allocate buffer for key searches
     m_key= (uchar*)my_malloc(m_table->key_info->key_length, MYF(MY_WME));
     if (!m_key)

=== modified file 'sql/slave.cc'
--- a/sql/slave.cc	2009-03-03 14:24:27 +0000
+++ b/sql/slave.cc	2009-03-12 10:51:59 +0000
@@ -2794,7 +2794,6 @@ Slave SQL thread aborted. Can't execute 
     DBUG_ASSERT(rli->sql_thd == thd);
     THD_CHECK_SENTRY(thd);
 
-    sql_print_information("new_mode %u", thd->variables.new_mode);
     if (exec_relay_log_event(thd,rli))
     {
       DBUG_PRINT("info", ("exec_relay_log_event() failed"));

=== modified file 'storage/ndb/include/kernel/RefConvert.hpp'
--- a/storage/ndb/include/kernel/RefConvert.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/include/kernel/RefConvert.hpp	2009-02-17 07:52:13 +0000
@@ -27,6 +27,14 @@ BlockNumber refToBlock(BlockReference re
 }
 
 /**
+ * For allowing to write merge safe code
+ */
+inline
+BlockNumber refToMain(BlockReference ref){
+  return (BlockNumber)(ref >> 16);
+}
+
+/**
  * Convert BlockReference to NodeId
  */
 inline

=== modified file 'storage/ndb/include/kernel/signaldata/AllocNodeId.hpp'
--- a/storage/ndb/include/kernel/signaldata/AllocNodeId.hpp	2006-12-27 01:23:51 +0000
+++ b/storage/ndb/include/kernel/signaldata/AllocNodeId.hpp	2009-02-18 14:29:58 +0000
@@ -24,21 +24,28 @@
  */
 class AllocNodeIdReq {
 public:
-  STATIC_CONST( SignalLength = 4 );
+  STATIC_CONST( SignalLength = 5 );
+  STATIC_CONST( SignalLengthQMGR = 7 );
 
   Uint32 senderRef;
   Uint32 senderData;
   Uint32 nodeId;
   Uint32 nodeType;
+  Uint32 timeout;
+
+  Uint32 secret_lo;
+  Uint32 secret_hi;
 };
 
 class AllocNodeIdConf {
 public:
-  STATIC_CONST( SignalLength = 3 );
+  STATIC_CONST( SignalLength = 5 );
 
   Uint32 senderRef;
   Uint32 senderData;
   Uint32 nodeId;
+  Uint32 secret_lo;
+  Uint32 secret_hi;
 };
 
 class AllocNodeIdRef {

=== modified file 'storage/ndb/include/kernel/signaldata/BuildIndx.hpp'
--- a/storage/ndb/include/kernel/signaldata/BuildIndx.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/include/kernel/signaldata/BuildIndx.hpp	2009-02-27 13:18:49 +0000
@@ -239,7 +239,8 @@ public:
     InvalidIndexType = 4250,
     IndexNotUnique = 4251,
     AllocationFailure = 4252,
-    InternalError = 4346
+    InternalError = 4346,
+    DeadlockError = 4351
   };
   STATIC_CONST( SignalLength = BuildIndxConf::SignalLength + 2 );
 

=== modified file 'storage/ndb/include/kernel/signaldata/DihContinueB.hpp'
--- a/storage/ndb/include/kernel/signaldata/DihContinueB.hpp	2007-11-23 07:15:16 +0000
+++ b/storage/ndb/include/kernel/signaldata/DihContinueB.hpp	2009-02-20 10:20:59 +0000
@@ -67,6 +67,8 @@ private:
     CHECK_WAIT_DROP_TAB_FAILED_LQH = 43,
     ZTO_START_FRAGMENTS = 44
     ,ZCOPY_NODE_WAIT_CREATE_FRAG = 45
+    ,ZLCP_TRY_LOCK = 46
+    ,ZDELAY_RELEASE_FRAGMENT_INFO_MUTEX = 47
   };
 };
 

=== modified file 'storage/ndb/include/kernel/signaldata/FsOpenReq.hpp'
--- a/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp	2007-11-15 00:30:00 +0000
+++ b/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp	2009-02-17 08:13:18 +0000
@@ -101,6 +101,15 @@ private:
     S_LOG = 7,
     S_CTL = 8
   };
+
+  enum BasePathSpec
+  {
+    BP_FS = 0,     // FileSystemPath
+    BP_BACKUP = 1, // BackupDataDir
+    BP_DD_DF = 2,  // FileSystemPathDataFiles
+    BP_DD_UF = 3,  // FileSystemPathUndoFiles
+    BP_MAX = 4
+  };
   
   static Uint32 getVersion(const Uint32 fileNumber[]);
   static Uint32 getSuffix(const Uint32 fileNumber[]);

=== modified file 'storage/ndb/include/kernel/signaldata/LCP.hpp'
--- a/storage/ndb/include/kernel/signaldata/LCP.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/include/kernel/signaldata/LCP.hpp	2009-03-11 17:36:28 +0000
@@ -19,7 +19,7 @@
 #include "SignalData.hpp"
 #include <NodeBitmask.hpp>
 
-class StartLcpReq {
+struct StartLcpReq {
   /**
    * Sender(s)
    */
@@ -38,7 +38,6 @@ class StartLcpReq {
 public:
 
   STATIC_CONST( SignalLength = 2 + 2 * NdbNodeBitmask::Size );
-private:
   Uint32 senderRef;
   Uint32 lcpId;
   
@@ -107,7 +106,7 @@ private:
 };
 
 
-class LcpFragRep {
+struct LcpFragRep {
   /**
    * Sender(s) and receiver(s)
    */
@@ -119,10 +118,9 @@ class LcpFragRep {
   friend class Dblqh;
 
   friend bool printLCP_FRAG_REP(FILE *, const Uint32 *, Uint32, Uint16);  
-public:
+
   STATIC_CONST( SignalLength = 7 );
 
-private:
   Uint32 nodeId;
   Uint32 lcpId;
   Uint32 lcpNo;

=== modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h'
--- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2008-12-18 09:34:44 +0000
+++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h	2009-02-20 10:20:59 +0000
@@ -141,9 +141,17 @@
 
 #define CFG_DB_INIT_REDO              189
 
+#define CFG_DB_DD_FILESYSTEM_PATH     193
+#define CFG_DB_DD_DATAFILE_PATH       194
+#define CFG_DB_DD_UNDOFILE_PATH       195
+#define CFG_DB_DD_LOGFILEGROUP_SPEC   196
+#define CFG_DB_DD_TABLEPACE_SPEC      197
+
 #define CFG_DB_SGA                    198 /* super pool mem */
 #define CFG_DB_DATA_MEM_2             199 /* used in special build in 5.1 */
 
+#define CFG_DB_LCP_TRY_LOCK_TIMEOUT   605
+
 #define CFG_NODE_ARBIT_RANK           200
 #define CFG_NODE_ARBIT_DELAY          201
 #define CFG_202                       202       /* used in later version */

=== modified file 'storage/ndb/include/mgmapi/ndb_logevent.h'
--- a/storage/ndb/include/mgmapi/ndb_logevent.h	2008-12-18 09:34:44 +0000
+++ b/storage/ndb/include/mgmapi/ndb_logevent.h	2009-03-11 15:53:24 +0000
@@ -195,6 +195,8 @@ extern "C" {
     NDB_LE_SubscriptionStatus = 69
 
     /* 70 unused */
+
+    ,NDB_LE_RedoStatus = 73
   };
 
   /**
@@ -738,6 +740,18 @@ extern "C" {
         unsigned report_type;
 	unsigned node_id;
       } SubscriptionStatus;
+      /** Log event data @ref NDB_LE_RedoStatus */
+      struct {
+	unsigned log_part;
+	unsigned head_file_no;
+        unsigned head_mbyte;
+        unsigned tail_file_no;
+        unsigned tail_mbyte;
+        unsigned total_hi;
+        unsigned total_lo;
+        unsigned free_hi;
+        unsigned free_lo;
+      } RedoStatus;
 #ifndef DOXYGEN_FIX
     };
 #else

=== modified file 'storage/ndb/include/ndbapi/Ndb.hpp'
--- a/storage/ndb/include/ndbapi/Ndb.hpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/include/ndbapi/Ndb.hpp	2009-03-12 10:51:59 +0000
@@ -1339,7 +1339,9 @@ public:
 
 
   /**
-   * Structure for passing in pointers to startTransaction
+   * Structure for passing in pointers to distribution key values
+   * When distribution key has multiple parts, they should be
+   * passed as an array, with the last part's ptr == NULL.
    * 
    */
   struct Key_part_ptr
@@ -1349,6 +1351,47 @@ public:
   };
 
   /**
+   * Structure for describing a table partition in terms of either
+   * 
+   * PS_NONE
+   *   No partitioning info provided.
+   *
+   * PS_USER_DEFINED
+   *   A specific partition id for a table with user defined 
+   *   partitioning
+   *
+   * PS_DISTR_KEY_PART_PTR
+   *   An array of a table's distribution key values for a 
+   *   table with native partitioning.
+   *
+   */
+
+  struct PartitionSpec
+  {
+    enum SpecType
+    {
+      PS_NONE                = 0,
+      PS_USER_DEFINED        = 1,
+      PS_DISTR_KEY_PART_PTR  = 2
+    };
+
+    Uint32 type;
+    
+    union
+    {
+      struct {
+        Uint32 partitionId;
+      } UserDefined;
+      
+      struct {
+        const Key_part_ptr* tableKeyParts;
+        void* xfrmbuf;
+        Uint32 xfrmbuflen;
+      } KeyPartPtr;
+    };
+  };
+
+  /**
    * Start a transaction
    *
    * @note When the transaction is completed it must be closed using
@@ -1384,7 +1427,7 @@ public:
                                    Uint32 partitionId);
 
   /**
-   * Compute hash value given table/keys
+   * Compute distribution hash value given table/keys
    *
    * @param  hashvalueptr - OUT, is set to hashvalue if return value is 0
    * @param  table    Pointer to table object
@@ -1398,6 +1441,7 @@ public:
    *
    * @note if xfrmbuf is null (default) malloc/free will be made
    *       if xfrmbuf is not null but length is too short, method will fail
+   *       Only for use with natively partitioned tables.
    *
    * @return 0 - ok - hashvalueptr is set
    *         else - fail, return error code

=== modified file 'storage/ndb/include/ndbapi/NdbBlob.hpp'
--- a/storage/ndb/include/ndbapi/NdbBlob.hpp	2008-11-08 20:40:15 +0000
+++ b/storage/ndb/include/ndbapi/NdbBlob.hpp	2009-03-02 16:08:11 +0000
@@ -386,6 +386,7 @@ private:
   NdbOperation* theHeadInlineReadOp;
   bool theHeadInlineUpdateFlag;
   // partition id for data events
+  bool userDefinedPartitioning;
   Uint32 noPartitionId() { return ~(Uint32)0; }
   Uint32 thePartitionId;
   NdbRecAttr* thePartitionIdRecAttr;
@@ -440,6 +441,8 @@ private:
   int getHeadInlineValue(NdbOperation* anOp);
   void getHeadFromRecAttr();
   int setHeadInlineValue(NdbOperation* anOp);
+  void setHeadPartitionId(NdbOperation* anOp);
+  void setPartPartitionId(NdbOperation* anOp);
   // data operations
   int readDataPrivate(char* buf, Uint32& bytes);
   int writeDataPrivate(const char* buf, Uint32 bytes);

=== modified file 'storage/ndb/include/ndbapi/NdbIndexScanOperation.hpp'
--- a/storage/ndb/include/ndbapi/NdbIndexScanOperation.hpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/include/ndbapi/NdbIndexScanOperation.hpp	2009-03-12 10:51:59 +0000
@@ -197,24 +197,39 @@ public:
   };
 
   /**
-   * Add a bound to an NdbRecord defined Index scan
+   * Add a range to an NdbRecord defined Index scan
    * 
-   * This method is called to add a bound to an IndexScan operation
+   * This method is called to add a range to an IndexScan operation
    * which has been defined with a call to NdbTransaction::scanIndex().
-   * To add extra bounds, the index scan operation must have been
+   * To add more than one range, the index scan operation must have been
    * defined with the the SF_MultiRange flag set.
    *
    * Where multiple numbered ranges are defined with multiple calls to 
-   * setBound, and the scan is ordered, the range number for each bound 
-   * must be larger than the range number for the previously defined bound.
+   * setBound, and the scan is ordered, the range number for each range 
+   * must be larger than the range number for the previously defined range.
    * 
-   * @param key_record NdbRecord structure for the key the bound is 
-   *        to be added to
+   * When the application knows that rows in-range will only be found in
+   * a particular partition, a PartitionSpecification can be supplied.
+   * This may be used to limit the scan to a single partition, improving
+   * system efficiency
+   * The sizeOfPartInfo parameter should be set to the 
+   * sizeof(PartitionSpec) to enable backwards compatibility.
+   * 
+   * @param key_record NdbRecord structure for the key the index is 
+   *        defined on
    * @param bound The bound to add
+   * @param partInfo Extra information to enable a reduced set of
+   *        partitions to be scanned.
+   * @param sizeOfPartInfo
+   *
    * @return 0 for Success, other for Failure.
    */
   int setBound(const NdbRecord *key_record,
                const IndexBound& bound);
+  int setBound(const NdbRecord *key_record,
+               const IndexBound& bound,
+               const Ndb::PartitionSpec* partInfo,
+               Uint32 sizeOfPartInfo= 0);
 
   /**
    * Return size of data, in 32-bit words, that will be send to data nodes for
@@ -308,10 +323,10 @@ private:
   virtual int equal_impl(const NdbColumnImpl*, const char*);
   virtual NdbRecAttr* getValue_impl(const NdbColumnImpl*, char*);
 
-  void setDistKeyFromRange(const NdbRecord *key_record,
-                           const NdbRecord *result_record,
-                           const char *row,
-                           Uint32 distkeyMax);
+  int getDistKeyFromRange(const NdbRecord* key_record,
+                          const NdbRecord* result_record,
+                          const char* row,
+                          Uint32* distKey);
   void fix_get_values();
   int next_result_ordered(bool fetchAllowed, bool forceSend = false);
   int next_result_ordered_ndbrecord(const char * & out_row,

=== modified file 'storage/ndb/include/ndbapi/NdbOperation.hpp'
--- a/storage/ndb/include/ndbapi/NdbOperation.hpp	2008-12-09 15:47:14 +0000
+++ b/storage/ndb/include/ndbapi/NdbOperation.hpp	2009-03-06 18:06:17 +0000
@@ -1063,8 +1063,6 @@ public:
 
 
 protected:
-  int handle_distribution_key(const NdbColumnImpl*, const Uint64 *, Uint32 len);
-protected:
 /******************************************************************************
  * These are the methods used to create and delete the NdbOperation objects.
  *****************************************************************************/

=== modified file 'storage/ndb/include/ndbapi/NdbScanOperation.hpp'
--- a/storage/ndb/include/ndbapi/NdbScanOperation.hpp	2009-02-10 18:39:11 +0000
+++ b/storage/ndb/include/ndbapi/NdbScanOperation.hpp	2009-03-12 10:51:59 +0000
@@ -114,7 +114,9 @@ public:
                 SO_GETVALUE     = 0x08,
                 SO_PARTITION_ID = 0x10,
                 SO_INTERPRETED  = 0x20,
-                SO_CUSTOMDATA   = 0x40 };
+                SO_CUSTOMDATA   = 0x40,
+                SO_PART_INFO    = 0x80
+    };
 
     /* Flags controlling scan behaviour
      * See NdbScanOperation::ScanFlag for details
@@ -138,7 +140,11 @@ public:
     NdbOperation::GetValueSpec *extraGetValues;
     Uint32                     numExtraGetValues;
 
-    /* Specific partition to limit this scan to */
+    /* Specific partition to limit this scan to
+     * Alternatively, an Ndb::PartitionSpec can be supplied.
+     * For Index Scans, partitioning information can be supplied for
+     * each range
+     */
     Uint32 partitionId;
 
     /* Interpreted code to execute as part of the scan */
@@ -146,6 +152,10 @@ public:
 
     /* CustomData ptr to associate with the scan operation */
     void * customData;
+
+    /* Partition information for bounding this scan */
+    const Ndb::PartitionSpec* partitionInfo;
+    Uint32 sizeOfPartInfo;
   };
 
 
@@ -185,6 +195,58 @@ public:
   inline int readTuplesExclusive(int parallell = 0){
     return readTuples(LM_Exclusive, 0, parallell);
   }
+
+  /* First version of ScanOptions, defined here for backwards
+   * compatibility reasons
+   */
+  struct ScanOptions_v1
+  {
+    /* Which options are present - see below for possibilities */
+    Uint64 optionsPresent;
+
+    enum Type { SO_SCANFLAGS    = 0x01,
+                SO_PARALLEL     = 0x02,
+                SO_BATCH        = 0x04,
+                SO_GETVALUE     = 0x08,
+                SO_PARTITION_ID = 0x10,
+                SO_INTERPRETED  = 0x20,
+                SO_CUSTOMDATA   = 0x40 };
+
+    /* Flags controlling scan behaviour
+     * See NdbScanOperation::ScanFlag for details
+     */
+    Uint32 scan_flags;
+
+    /* Desired scan parallelism.
+     * Default == 0 == Maximum parallelism
+     */
+    Uint32 parallel;
+
+    /* Desired scan batchsize in rows 
+     * for NDBD -> API transfers
+     * Default == 0 == Automatically chosen size
+     */
+    Uint32 batch;
+    
+    /* Extra values to be read for each row meeting
+     * scan criteria
+     */
+    NdbOperation::GetValueSpec *extraGetValues;
+    Uint32                     numExtraGetValues;
+
+    /* Specific partition to limit this scan to
+     * Only applicable for tables defined with UserDefined partitioning
+     * For Index Scans, partitioning information can be supplied for
+     * each range
+     */
+    Uint32 partitionId;
+
+    /* Interpreted code to execute as part of the scan */
+    const NdbInterpretedCode *interpretedCode;
+
+    /* CustomData ptr to associate with the scan operation */
+    void * customData;
+  };
 #endif
   
 #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
@@ -388,6 +450,14 @@ public:
    */
   NdbTransaction* getNdbTransaction() const;
 
+
+  /**
+   * Is scan operation pruned to a single table partition?
+   * For NdbRecord defined scans, valid before+after execute.
+   * For Old Api defined scans, valid only after execute.
+   */
+  bool getPruned() const;
+
 protected:
   NdbScanOperation(Ndb* aNdb,
                    NdbOperation::Type aType = NdbOperation::TableScan);
@@ -400,7 +470,15 @@ protected:
   int handleScanGetValuesOldApi();
   int addInterpretedCode(Uint32 aTC_ConncetPtr,
                          Uint64 aTransId);
+  int handleScanOptionsVersion(const ScanOptions*& optionsPtr, 
+                               Uint32 sizeOfOptions,
+                               ScanOptions& currOptions);
   int handleScanOptions(const ScanOptions *options);
+  int validatePartInfoPtr(const Ndb::PartitionSpec*& partInfo,
+                          Uint32 sizeOfPartInfo);
+  int getPartValueFromInfo(const Ndb::PartitionSpec* partInfo,
+                           const NdbTableImpl* table,
+                           Uint32* partValue);
   int generatePackedReadAIs(const NdbRecord *reseult_record, bool& haveBlob);
   int scanImpl(const NdbScanOperation::ScanOptions *options);
   int scanTableImpl(const NdbRecord *result_record,
@@ -565,6 +643,16 @@ protected:
    * old NdbScanFilter Api
    */
   NdbInterpretedCode* m_interpretedCodeOldApi;
+
+  enum ScanPruningState {
+    SPS_UNKNOWN,           // Initial state
+    SPS_FIXED,             // Explicit partitionId passed in ScanOptions
+    SPS_ONE_PARTITION,     // Scan pruned to one partition by previous range
+    SPS_MULTI_PARTITION    // Scan cannot be pruned due to previous ranges
+  };
+  
+  ScanPruningState m_pruneState;
+  Uint32 m_pruningKey;  // Can be distr key hash or actual partition id.
 };
 
 inline

=== modified file 'storage/ndb/src/common/debugger/EventLogger.cpp'
--- a/storage/ndb/src/common/debugger/EventLogger.cpp	2008-11-07 10:33:31 +0000
+++ b/storage/ndb/src/common/debugger/EventLogger.cpp	2009-03-11 15:53:24 +0000
@@ -715,6 +715,21 @@ void getTextStartREDOLog(QQQQ) {
 		       theData[3],
 		       theData[4]);
 }
+void getTextRedoStatus(QQQQ) {
+  Uint64 total = (Uint64(theData[6]) << 32) + theData[7];
+  Uint64 free = (Uint64(theData[8]) << 32) + theData[9];
+  
+  BaseString::snprintf(m_text, m_text_len, 
+		       "Logpart: %u head=[ file: %u mbyte: %u ] tail=[ file: %u mbyte: %u ] total mb: %llu free mb: %llu free%%: %u",
+		       theData[1],
+		       theData[2],
+		       theData[3],
+		       theData[4],
+		       theData[5],
+                       total,
+                       free,
+                       Uint32((100 * free) / total));
+}
 void getTextUNDORecordsExecuted(QQQQ) {
   const char* line = "";
   if (theData[1] == DBTUP){
@@ -813,7 +828,7 @@ void getTextMemoryUsage(QQQQ) {
 
 void getTextBackupStarted(QQQQ) {
   BaseString::snprintf(m_text, m_text_len, 
-		       "Backup %d started from node %d", 
+		       "Backup %u started from node %d", 
 		       theData[2], refToNode(theData[1]));
 }
 void getTextBackupFailedToStart(QQQQ) {
@@ -848,7 +863,7 @@ void getTextBackupStatus(QQQQ) {
 }
 void getTextBackupAborted(QQQQ) {
   BaseString::snprintf(m_text, m_text_len, 
-		       "Backup %d started from %d has been aborted. Error: %d",
+		       "Backup %u started from %d has been aborted. Error: %d",
 		       theData[2], 
 		       refToNode(theData[1]), 
 		       theData[3]);
@@ -1053,6 +1068,7 @@ const EventLoggerBase::EventRepLogLevelM
   ROW(LCPStoppedInCalcKeepGci, LogLevel::llCheckpoint,  0, Logger::LL_ALERT ),
   ROW(LCPFragmentCompleted,    LogLevel::llCheckpoint, 11, Logger::LL_INFO ),
   ROW(UndoLogBlocked,          LogLevel::llCheckpoint,  7, Logger::LL_INFO ),
+  ROW(RedoStatus,              LogLevel::llCheckpoint,  7, Logger::LL_INFO ),
 
   // STARTUP
   ROW(NDBStartStarted,         LogLevel::llStartUp,     1, Logger::LL_INFO ),

=== modified file 'storage/ndb/src/common/debugger/signaldata/DihContinueB.cpp'
--- a/storage/ndb/src/common/debugger/signaldata/DihContinueB.cpp	2007-11-23 07:15:16 +0000
+++ b/storage/ndb/src/common/debugger/signaldata/DihContinueB.cpp	2009-02-20 10:20:59 +0000
@@ -192,6 +192,14 @@ printCONTINUEB_DBDIH(FILE * output, cons
     fprintf(output, " Wait drop tab FailedNodeId: %d TableId: %d\n", 
 	    theData[1], theData[2]);
     return true;
+  case DihContinueB::ZLCP_TRY_LOCK:
+    fprintf(output, " Lcp trylock: attempt %u\n",
+            theData[1]);
+    break;
+  case DihContinueB::ZDELAY_RELEASE_FRAGMENT_INFO_MUTEX:
+    fprintf(output, " Delay release fragment-info mutex (handle: 0x%x)",
+            theData[1]);
+    break;
   default:
     fprintf(output, " Default system error lab...\n");
     break;

=== modified file 'storage/ndb/src/kernel/blocks/backup/Backup.cpp'
--- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp	2009-01-27 14:39:44 +0000
+++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp	2009-03-02 10:33:22 +0000
@@ -465,7 +465,7 @@ Backup::execDUMP_STATE_ORD(Signal* signa
      */
     BackupRecordPtr ptr LINT_SET_PTR;
     for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)){
-      infoEvent("BackupRecord %d: BackupId: %d MasterRef: %x ClientRef: %x",
+      infoEvent("BackupRecord %d: BackupId: %u MasterRef: %x ClientRef: %x",
 		ptr.i, ptr.p->backupId, ptr.p->masterRef, ptr.p->clientRef);
       infoEvent(" State: %d", ptr.p->slaveState.getState());
       BackupFilePtr filePtr;
@@ -659,7 +659,7 @@ Backup::execBACKUP_CONF(Signal* signal)
   jamEntry();
   BackupConf * conf = (BackupConf*)signal->getDataPtr();
   
-  ndbout_c("Backup %d has started", conf->backupId);
+  ndbout_c("Backup %u has started", conf->backupId);
 }
 
 void
@@ -668,7 +668,7 @@ Backup::execBACKUP_REF(Signal* signal)
   jamEntry();
   BackupRef * ref = (BackupRef*)signal->getDataPtr();
 
-  ndbout_c("Backup (%d) has NOT started %d", ref->senderData, ref->errorCode);
+  ndbout_c("Backup (%u) has NOT started %d", ref->senderData, ref->errorCode);
 }
 
 void
@@ -679,7 +679,7 @@ Backup::execBACKUP_COMPLETE_REP(Signal* 
  
   startTime = NdbTick_CurrentMillisecond() - startTime;
   
-  ndbout_c("Backup %d has completed", rep->backupId);
+  ndbout_c("Backup %u has completed", rep->backupId);
   const Uint64 bytes =
     rep->noOfBytesLow + (((Uint64)rep->noOfBytesHigh) << 32);
   const Uint64 records =
@@ -711,7 +711,7 @@ Backup::execBACKUP_ABORT_REP(Signal* sig
   jamEntry();
   BackupAbortRep* rep = (BackupAbortRep*)signal->getDataPtr();
   
-  ndbout_c("Backup %d has been aborted %d", rep->backupId, rep->reason);
+  ndbout_c("Backup %u has been aborted %d", rep->backupId, rep->reason);
 }
 
 const TriggerEvent::Value triggerEventValues[] = {
@@ -3096,18 +3096,25 @@ Backup::openFilesReply(Signal* signal, 
 
   if (ERROR_INSERTED(10037)) {
     jam();
-    ptr.p->errorCode = DefineBackupRef::FailedForBackupFilesAleadyExist;
+    /**
+     * Dont return FailedForBackupFilesAleadyExist
+     * cause this will make NdbBackup auto-retry with higher number :-)
+     */
+    ptr.p->errorCode = DefineBackupRef::FailedInsertFileHeader;
     defineBackupRef(signal, ptr);
     return;
   }
   /**
    * Did open succeed for all files
    */
-  if(ptr.p->checkError()) {
+  if(ptr.p->checkError()) 
+  {
     jam();
     if(ptr.p->errorCode == FsRef::fsErrFileExists)
+    {
+      jam();
       ptr.p->errorCode = DefineBackupRef::FailedForBackupFilesAleadyExist;
-
+    }
     defineBackupRef(signal, ptr);
     return;
   }//if

=== modified file 'storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp'
--- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2008-11-08 21:22:57 +0000
+++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2009-02-23 11:27:59 +0000
@@ -428,6 +428,12 @@ void Cmvmi::execSTTOR(Signal* signal)
 
     if(m_ctx.m_config.lockPagesInMainMemory() == 1)
     {
+      jam();
+      /**
+       * Notify watchdog that we're locking memory...
+       *   which can be equally "heavy" as allocating it
+       */
+      refresh_watch_dog(9);
       int res = NdbMem_MemLockAll(0);
       if(res != 0){
         g_eventLogger->warning("Failed to memlock pages");
@@ -435,6 +441,19 @@ void Cmvmi::execSTTOR(Signal* signal)
       }
     }
     
+    /**
+     * Install "normal" watchdog value
+     */
+    {
+      Uint32 db_watchdog_interval = 0;
+      const ndb_mgm_configuration_iterator * p = 
+        m_ctx.m_config.getOwnConfigIterator();
+      ndb_mgm_get_int_parameter(p, CFG_DB_WATCHDOG_INTERVAL, 
+                                &db_watchdog_interval);
+      ndbrequire(db_watchdog_interval);
+      update_watch_dog_timer(db_watchdog_interval);
+    }
+    
     sendSTTORRY(signal);
     return;
   } else if (theStartPhase == 3) {

=== modified file 'storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2008-12-02 12:45:39 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2009-02-19 12:39:56 +0000
@@ -4979,7 +4979,7 @@ void Dbdict::printTables()
   DLHashTable<DictObject>::Iterator iter;
   bool moreTables = c_obj_hash.first(iter);
   printf("OBJECTS IN DICT:\n");
-  char name[MAX_TAB_NAME_SIZE];
+  char name[PATH_MAX];
   while (moreTables) {
     Ptr<DictObject> tablePtr = iter.curr;
     ConstRope r(c_rope_pool, tablePtr.p->m_name);
@@ -7793,14 +7793,14 @@ void Dbdict::execGET_TABINFOREQ(Signal* 
     ndbrequire(handle.m_cnt == 1);
     const Uint32 len = req->tableNameLen;
     
-    if(len > MAX_TAB_NAME_SIZE){
+    if(len > PATH_MAX){
       jam();
       releaseSections(handle);
       sendGET_TABINFOREF(signal, req, GetTabInfoRef::TableNameTooLong);
       return;
     }
 
-    Uint32 tableName[(MAX_TAB_NAME_SIZE + 3) / 4];
+    Uint32 tableName[(PATH_MAX + 3) / 4];
     SegmentedSectionPtr ssPtr;
     handle.getSection(ssPtr,GetTabInfoReq::TABLE_NAME);
     copy(tableName, ssPtr);
@@ -8118,7 +8118,7 @@ void Dbdict::sendOLD_LIST_TABLES_CONF(Si
       pos = 0;
     }
     Uint32 i = 0;
-    char tmp[MAX_TAB_NAME_SIZE];
+    char tmp[PATH_MAX];
     name.copy(tmp);
     while (i < size) {
       char* p = (char*)&conf->tableData[pos];
@@ -8178,7 +8178,7 @@ void Dbdict::sendLIST_TABLES_CONF(Signal
    */
   ListTablesData ltd;
   const Uint32 listTablesDataSizeInWords = (sizeof(ListTablesData) + 3) / 4;
-  char tname[MAX_TAB_NAME_SIZE];
+  char tname[PATH_MAX];
   SimplePropertiesSectionWriter tableDataWriter(getSectionSegmentPool());
   SimplePropertiesSectionWriter tableNamesWriter(getSectionSegmentPool());
 
@@ -16000,6 +16000,15 @@ Dbdict::createObj_prepare_complete_done(
 void
 Dbdict::createObj_commit(Signal * signal, SchemaOp * op)
 {
+  if (ERROR_INSERTED(6016))
+  {
+    jam();
+    NodeReceiverGroup rg(CMVMI, c_aliveNodes);
+    signal->theData[0] = 9999;
+    sendSignal(rg, GSN_NDB_TAMPER, signal, 1, JBB);
+    return;
+  }
+
   OpCreateObj * createObj = (OpCreateObj*)op;
 
   createObj->m_callback.m_callbackFunction = 
@@ -16608,9 +16617,22 @@ Dbdict::create_fg_prepare_start(Signal* 
     {
       //fg.TS_DataGrow = group.m_grow_spec;
       fg_ptr.p->m_tablespace.m_extent_size = fg.TS_ExtentSize;
-      fg_ptr.p->m_tablespace.m_default_logfile_group_id = fg.TS_LogfileGroupId;
 
       Ptr<Filegroup> lg_ptr;
+      if (fg.TS_LogfileGroupId == RNIL && fg.TS_LogfileGroupVersion == RNIL)
+      {
+        jam();
+        Filegroup_hash::Iterator it;
+        if (c_filegroup_hash.first(it))
+        {
+          jam();
+          fg.TS_LogfileGroupId = it.curr.p->key;
+          fg.TS_LogfileGroupVersion = it.curr.p->m_version;
+        }
+      }
+
+      fg_ptr.p->m_tablespace.m_default_logfile_group_id = fg.TS_LogfileGroupId;
+
       if (!c_filegroup_hash.find(lg_ptr, fg.TS_LogfileGroupId))
       {
         jam();
@@ -16797,6 +16819,28 @@ Dbdict::create_file_prepare_start(Signal
 
     // Get Filegroup
     FilegroupPtr fg_ptr;
+    if (f.FilegroupId == RNIL && f.FilegroupVersion == RNIL)
+    {
+      jam();
+      Filegroup_hash::Iterator it;
+      c_filegroup_hash.first(it);
+      while (!it.isNull())
+      {
+        jam();
+        if ((f.FileType == DictTabInfo::Undofile &&
+             it.curr.p->m_type == DictTabInfo::LogfileGroup) ||
+            (f.FileType == DictTabInfo::Datafile &&
+             it.curr.p->m_type == DictTabInfo::Tablespace))
+        {
+          jam();
+          f.FilegroupId = it.curr.p->key;
+          f.FilegroupVersion = it.curr.p->m_version;
+          break;
+        }
+        c_filegroup_hash.next(it);
+      }
+    }
+
     if(!c_filegroup_hash.find(fg_ptr, f.FilegroupId)){
       jam();
       op->m_errorCode = CreateFileRef::NoSuchFilegroup;
@@ -17007,7 +17051,7 @@ Dbdict::create_file_prepare_complete(Sig
     ndbrequire(false);
   }
   
-  char name[MAX_TAB_NAME_SIZE];
+  char name[PATH_MAX];
   ConstRope tmp(c_rope_pool, f_ptr.p->m_path);
   tmp.copy(name);
   LinearSectionPtr ptr[3];
@@ -17043,6 +17087,15 @@ Dbdict::execCREATE_FILE_CONF(Signal* sig
 void
 Dbdict::create_file_commit_start(Signal* signal, SchemaOp* op)
 {
+  if (ERROR_INSERTED(6017))
+  {
+    jam();
+    NodeReceiverGroup rg(CMVMI, c_aliveNodes);
+    signal->theData[0] = 9999;
+    sendSignal(rg, GSN_NDB_TAMPER, signal, 1, JBB);
+    return;
+  }
+
   /**
    * CONTACT TSMAN LGMAN PGMAN 
    */

=== modified file 'storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp	2008-09-12 07:21:54 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/Dbdih.hpp	2009-03-11 16:10:40 +0000
@@ -25,6 +25,7 @@
 #include <signaldata/MasterLCP.hpp>
 #include <signaldata/CopyGCIReq.hpp>
 #include <blocks/mutexes.hpp>
+#include <signaldata/LCP.hpp>
 
 #ifdef DBDIH_C
 
@@ -689,7 +690,6 @@ private:
   void updateToReq_fragmentMutex_locked(Signal*, Uint32, Uint32);
 
   MutexHandle2<DIH_FRAGMENT_INFO> c_fragmentInfoMutex_lcp;
-  MutexHandle2<DIH_FRAGMENT_INFO> c_fragmentInfoMutex_copyTab;
 
   void execBLOCK_COMMIT_ORD(Signal *);
   void execUNBLOCK_COMMIT_ORD(Signal *);
@@ -947,6 +947,7 @@ private:
   void ndbsttorry10Lab(Signal *, Uint32 _line);
   void createMutexes(Signal* signal, Uint32 no);
   void createMutex_done(Signal* signal, Uint32 no, Uint32 retVal);
+  void dumpGcpStop();
   void crashSystemAtGcpStop(Signal *, bool);
   void sendFirstDictfragsreq(Signal *, TabRecordPtr regTabPtr);
   void addtabrefuseLab(Signal *, ConnectRecordPtr regConnectPtr, Uint32 errorCode);
@@ -1409,6 +1410,7 @@ private:
     
     Uint64 m_start_time; // When last LCP was started
     Uint64 m_lcp_time;   // How long last LCP took
+    Uint32 m_lcp_trylock_timeout;
 
     struct CurrentFragment {
       Uint32 tableId;
@@ -1747,6 +1749,40 @@ private:
   NdbNodeBitmask m_to_nodes;
 
   void startme_copygci_conf(Signal*);
+
+  /**
+   * Local LCP state
+   *   This struct is more or less a copy of lcp-state
+   *   Reason for duplicating it is that
+   *   - not to mess with current code
+   *   - this one is "distributed", i.e maintained by *all* nodes,
+   *     not like c_lcpState which mixed master/slave state in a "unnatural"
+   *     way
+   */
+  struct LocalLCPState
+  {
+    enum State {
+      LS_INITIAL = 0,
+      LS_RUNNING = 1,
+      LS_COMPLETE = 2
+    } m_state;
+    
+    StartLcpReq m_start_lcp_req;
+    Uint32 m_keep_gci; // Min GCI is needed to restore LCP
+    Uint32 m_stop_gci; // This GCI needs to be complete before LCP is restorable
+
+    LocalLCPState() { reset();}
+    
+    void reset();
+    void init(const StartLcpReq*);
+    void lcp_frag_rep(const LcpFragRep*);
+    void lcp_complete_rep(Uint32 gci);
+    
+    /**
+     * @param gci - current GCI being made restorable (COPY_GCI)
+     */
+    bool check_cut_log_tail(Uint32 gci) const;
+  } m_local_lcp_state;
 };
 
 #if (DIH_CDATA_SIZE < _SYSFILE_SIZE32)

=== modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp	2008-03-27 21:38:55 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihInit.cpp	2009-02-20 10:20:59 +0000
@@ -61,6 +61,7 @@ void Dbdih::initData() 
 
   cgcpOrderBlocked = 0;
   c_lcpState.ctcCounter = 0;
+  c_lcpState.m_lcp_trylock_timeout = 0;
   cwaitLcpSr       = false;
   c_blockCommit    = false;
   c_blockCommitNo  = 1;

=== modified file 'storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2009-02-05 12:22:39 +0000
+++ b/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2009-03-12 10:51:59 +0000
@@ -626,6 +626,25 @@ void Dbdih::execCONTINUEB(Signal* signal
     lcpBlockedLab(signal, true, signal->theData[1]);
     return;
   }
+  case DihContinueB::ZLCP_TRY_LOCK:
+  {
+    jam();
+    Mutex mutex(signal, c_mutexMgr, c_fragmentInfoMutex_lcp);
+    Callback c = { safe_cast(&Dbdih::lcpFragmentMutex_locked), 
+                   signal->theData[1] };
+    ndbrequire(mutex.trylock(c, false));
+    return;
+  }
+  case DihContinueB::ZDELAY_RELEASE_FRAGMENT_INFO_MUTEX:
+  {
+    jam();
+    MutexHandle2<DIH_FRAGMENT_INFO> mh;
+    mh.setHandle(signal->theData[1]);
+    Mutex mutex(signal, c_mutexMgr, mh);
+    mutex.unlock();
+    return;
+  }
+  
   }//switch
   
   ndbrequire(false);
@@ -702,6 +721,28 @@ done:  
   CRASH_INSERTION2(7020, reason==CopyGCIReq::LOCAL_CHECKPOINT);
   CRASH_INSERTION2(7008, reason==CopyGCIReq::GLOBAL_CHECKPOINT);
 
+  if (m_local_lcp_state.check_cut_log_tail(c_newest_restorable_gci))
+  {
+    jam();
+
+#if NOT_YET
+    LcpCompleteRep* rep = (LcpCompleteRep*)signal->getDataPtrSend();
+    rep->nodeId = getOwnNodeId();
+    rep->blockNo = 0;
+    rep->lcpId = m_local_lcp_state.m_start_lcp_req.lcpId;
+    rep->keepGci = m_local_lcp_state.m_keep_gci;
+    sendSignal(DBLQH_REF, GSN_LCP_COMPLETE_REP, signal, 
+               LcpCompleteRep::SignalLength, JBB);
+
+    warningEvent("CUT LOG TAIL: reason: %u lcp: %u m_keep_gci: %u stop: %u",
+                 reason,
+                 m_local_lcp_state.m_start_lcp_req.lcpId,
+                 m_local_lcp_state.m_keep_gci,
+                 m_local_lcp_state.m_stop_gci);
+#endif
+    m_local_lcp_state.reset();
+  }
+  
   /* -------------------------------------------------------------------------*/
   /*     WE SET THE REQUESTER OF THE COPY GCI TO THE CURRENT MASTER. IF THE   */
   /*     CURRENT MASTER WE DO NOT WANT THE NEW MASTER TO RECEIVE CONFIRM OF   */
@@ -1215,6 +1256,10 @@ void Dbdih::execREAD_CONFIG_REQ(Signal* 
 		NDBD_EXIT_INVALID_CONFIG);
   ndbrequireErr(!ndb_mgm_get_int_parameter(p, CFG_DIH_TABLE, &ctabFileSize),
 		NDBD_EXIT_INVALID_CONFIG);
+  
+  ndb_mgm_get_int_parameter(p, CFG_DB_LCP_TRY_LOCK_TIMEOUT, 
+                            &c_lcpState.m_lcp_trylock_timeout);
+
   cfileFileSize = (2 * ctabFileSize) + 2;
   initRecords();
   initialiseRecordsLab(signal, 0, ref, senderData);
@@ -2471,8 +2516,18 @@ void Dbdih::execINCL_NODECONF(Signal* si
   signal->theData[0] = reference();
   sendSignal(reference(), GSN_UNBLO_DICTCONF, signal, 1, JBB);
 
-  Mutex mutex(signal, c_mutexMgr, c_nodeStartMaster.m_fragmentInfoMutex);
-  mutex.unlock();
+  /**
+   * To increase likelyhood that multiple nodes starting simulatanious
+   *   gets to copy fragment-info before a new LCP is started
+   *   we delay the releasing of this mutex. So that node that (might)
+   *   be started when GSN_START_PERMREP arrives will get mutex
+   *   before LCP (which does trylock for 60s)
+   */
+  signal->theData[0] = DihContinueB::ZDELAY_RELEASE_FRAGMENT_INFO_MUTEX;
+  signal->theData[1] = c_nodeStartMaster.m_fragmentInfoMutex.getHandle();
+  c_nodeStartMaster.m_fragmentInfoMutex.clear();
+  sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 500, 2);
+
 }//Dbdih::execINCL_NODECONF()
 
 void Dbdih::execUNBLO_DICTCONF(Signal* signal) 
@@ -9235,8 +9290,15 @@ void Dbdih::writingCopyGciLab(Signal* si
   return;
 }//Dbdih::writingCopyGciLab()
 
-void Dbdih::execSTART_LCP_REQ(Signal* signal){
+void Dbdih::execSTART_LCP_REQ(Signal* signal)
+{
+  jamEntry();
   StartLcpReq * req = (StartLcpReq*)signal->getDataPtr();
+
+  /**
+   * Init m_local_lcp_state
+   */
+  m_local_lcp_state.init(req);
  
   CRASH_INSERTION2(7021, isMaster());
   CRASH_INSERTION2(7022, !isMaster());
@@ -9265,6 +9327,58 @@ void Dbdih::execSTART_LCP_REQ(Signal* si
   sendSignal(reference(), GSN_CONTINUEB, signal, 3, JBB);
 }
 
+void
+Dbdih::LocalLCPState::reset()
+{
+  m_state = LS_INITIAL;
+  m_keep_gci = RNIL;
+  m_stop_gci = RNIL;
+}
+
+void
+Dbdih::LocalLCPState::init(const StartLcpReq * req)
+{
+  m_state = LS_RUNNING;
+  m_start_lcp_req = *req;
+  m_keep_gci = ~(Uint32)0;
+  m_stop_gci = 0;
+}
+
+void
+Dbdih::LocalLCPState::lcp_frag_rep(const LcpFragRep * rep)
+{
+  assert(m_state == LS_RUNNING);
+  if (rep->maxGciCompleted < m_keep_gci)
+  {
+    m_keep_gci = rep->maxGciCompleted;
+  }
+
+  if (rep->maxGciStarted > m_stop_gci)
+  {
+    m_stop_gci = rep->maxGciStarted;
+  }
+}
+
+void
+Dbdih::LocalLCPState::lcp_complete_rep(Uint32 gci)
+{
+  assert(m_state == LS_RUNNING);
+  m_state = LS_COMPLETE;
+  if (gci > m_stop_gci)
+    m_stop_gci = gci;
+}
+
+bool
+Dbdih::LocalLCPState::check_cut_log_tail(Uint32 gci) const
+{
+  if (m_state == LS_COMPLETE)
+  {
+    if (gci >= m_stop_gci)
+      return true;
+  }
+  return false;
+}
+
 void Dbdih::initLcpLab(Signal* signal, Uint32 senderRef, Uint32 tableId) 
 {
   TabRecordPtr tabPtr;
@@ -10711,10 +10825,13 @@ void Dbdih::execTCGETOPSIZECONF(Signal* 
   /*    WHILE COPYING DICTIONARY AND DISTRIBUTION INFO TO A STARTING NODE   */
   /*    WE WILL ALSO NOT ALLOW THE LOCAL CHECKPOINT TO PROCEED.             */
   /*----------------------------------------------------------------------- */
-  if (c_lcpState.immediateLcpStart == false) {
-    if ((c_lcpState.ctcCounter < 
-	 ((Uint32)1 << c_lcpState.clcpDelay)) ||
-        (c_nodeStartMaster.blockLcp == true)) {
+  if (c_lcpState.immediateLcpStart == false) 
+  {
+    Uint64 cnt = Uint64(c_lcpState.ctcCounter);
+    Uint64 limit = Uint64(1) << c_lcpState.clcpDelay;
+    bool dostart = cnt >= limit; 
+    if (dostart == false || c_nodeStartMaster.blockLcp == true) 
+    {
       jam();
       c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__);
 
@@ -10742,6 +10859,19 @@ void Dbdih::execTCGETOPSIZECONF(Signal* 
   c_lcpState.keepGci = m_micro_gcp.m_old_gci >> 32;
   c_lcpState.oldestRestorableGci = SYSFILE->oldestRestorableGCI;
 
+  CRASH_INSERTION(7014);
+  c_lcpState.setLcpStatus(LCP_TC_CLOPSIZE, __LINE__);
+  sendLoopMacro(TC_CLOPSIZEREQ, sendTC_CLOPSIZEREQ, RNIL);
+}
+
+void Dbdih::execTC_CLOPSIZECONF(Signal* signal) 
+{
+  jamEntry();
+  Uint32 senderNodeId = signal->theData[0];
+  receiveLoopMacro(TC_CLOPSIZEREQ, senderNodeId);
+  
+  ndbrequire(c_lcpState.lcpStatus == LCP_TC_CLOPSIZE);
+
   /* ----------------------------------------------------------------------- */
   /*       UPDATE THE NEW LATEST LOCAL CHECKPOINT ID.                        */
   /* ----------------------------------------------------------------------- */
@@ -10756,11 +10886,9 @@ void Dbdih::execTCGETOPSIZECONF(Signal* 
     return;
   }//if
 
-  c_lcpState.m_start_time = c_current_time;
-
   Mutex mutex(signal, c_mutexMgr, c_fragmentInfoMutex_lcp);
   Callback c = { safe_cast(&Dbdih::lcpFragmentMutex_locked), 0 };
-  ndbrequire(mutex.lock(c, false));
+  ndbrequire(mutex.trylock(c, false));
 }
 
 void
@@ -10769,8 +10897,37 @@ Dbdih::lcpFragmentMutex_locked(Signal* s
                                Uint32 retVal)
 {
   jamEntry();
+
+  if (retVal == UtilLockRef::LockAlreadyHeld)
+  {
+    jam();
+    Mutex mutex(signal, c_mutexMgr, c_fragmentInfoMutex_lcp);
+    mutex.release();
+
+    if (senderData == 0)
+    {
+      jam();
+      infoEvent("Local checkpoint blocked waiting for node-restart");
+    }
+    
+    // 2* is as parameter is in seconds, and we sendSignalWithDelay 500ms
+    if (senderData >= 2*c_lcpState.m_lcp_trylock_timeout)
+    {
+      jam();
+      Callback c = { safe_cast(&Dbdih::lcpFragmentMutex_locked), 0 };
+      ndbrequire(mutex.lock(c, false));
+      return;
+    }
+    signal->theData[0] = DihContinueB::ZLCP_TRY_LOCK;
+    signal->theData[1] = senderData + 1;
+    sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 500, 2);
+    return;
+  }
+
   ndbrequire(retVal == 0);
   
+  c_lcpState.m_start_time = c_current_time;
+  
   setLcpActiveStatusStart(signal);
   
   signal->theData[0] = DihContinueB::ZCALCULATE_KEEP_GCI;
@@ -10951,27 +11108,15 @@ Dbdih::startLcpMutex_unlocked(Signal* si
   Mutex mutex(signal, c_mutexMgr, c_startLcpMutexHandle);
   mutex.release();
   
-  CRASH_INSERTION(7014);
-  c_lcpState.setLcpStatus(LCP_TC_CLOPSIZE, __LINE__);
-  sendLoopMacro(TC_CLOPSIZEREQ, sendTC_CLOPSIZEREQ, RNIL);
-}
-
-void Dbdih::execTC_CLOPSIZECONF(Signal* signal) {
-  jamEntry();
-  Uint32 senderNodeId = signal->theData[0];
-  receiveLoopMacro(TC_CLOPSIZEREQ, senderNodeId);
-  
-  ndbrequire(c_lcpState.lcpStatus == LCP_TC_CLOPSIZE);
   /* ----------------------------------------------------------------------- */
-  /*     ALL TC'S HAVE CLEARED THEIR OPERATION SIZE COUNTERS. NOW PROCEED BY */
-  /*     STARTING THE LOCAL CHECKPOINT IN EACH LQH.                          */
+  /*     NOW PROCEED BY STARTING THE LOCAL CHECKPOINT IN EACH LQH.           */
   /* ----------------------------------------------------------------------- */
   c_lcpState.m_LAST_LCP_FRAG_ORD = c_lcpState.m_participatingLQH;
 
   CRASH_INSERTION(7015);
   c_lcpState.setLcpStatus(LCP_START_LCP_ROUND, __LINE__);
   startLcpRoundLoopLab(signal, 0, 0);
-}//Dbdih::execTC_CLOPSIZECONF()
+}
 
 void
 Dbdih::master_lcp_fragmentMutex_locked(Signal* signal, 
@@ -11287,6 +11432,14 @@ void Dbdih::execLCP_FRAG_REP(Signal* sig
     c_lcpState.lcpStopGcp = started;
   }
 
+  /**
+   * Update m_local_lcp_state
+   *
+   * we could only look fragments that we have locally...
+   *   but for now we look at all fragments
+   */
+  m_local_lcp_state.lcp_frag_rep(lcpReport);
+
   if(tableDone){
     jam();
 
@@ -11844,6 +11997,11 @@ void Dbdih::allNodesLcpCompletedLab(Sign
 
   c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__);
 
+  /**
+   * Update m_local_lcp_state
+   */
+  m_local_lcp_state.lcp_complete_rep(c_newest_restorable_gci);
+  
   if (isMaster())
   {
     /**
@@ -12140,12 +12298,59 @@ void Dbdih::checkGcpStopLab(Signal* sign
   return;
 }//Dbdih::checkGcpStopLab()
 
+void
+Dbdih::dumpGcpStop()
+{
+  ndbout_c("c_nodeStartMaster.blockGcp: %u %u",
+           c_nodeStartMaster.blockGcp,
+           c_nodeStartMaster.startNode);
+  ndbout_c("m_gcp_save.m_counter: %u m_gcp_save.m_max_lag: %u",
+           m_gcp_monitor.m_gcp_save.m_counter, 
+           m_gcp_monitor.m_gcp_save.m_max_lag);
+  ndbout_c("m_micro_gcp.m_counter: %u m_micro_gcp.m_max_lag: %u",
+           m_gcp_monitor.m_micro_gcp.m_counter, 
+           m_gcp_monitor.m_micro_gcp.m_max_lag);
+  
+  ndbout_c("m_gcp_save.m_master.m_state: %u", m_gcp_save.m_master.m_state);
+  ndbout_c("m_micro_gcp.m_master.m_state: %u", m_micro_gcp.m_master.m_state);
+  
+  ndbout_c("c_COPY_GCIREQ_Counter = %s", c_COPY_GCIREQ_Counter.getText());
+  ndbout_c("c_COPY_TABREQ_Counter = %s", c_COPY_TABREQ_Counter.getText());
+  ndbout_c("c_CREATE_FRAGREQ_Counter = %s", c_CREATE_FRAGREQ_Counter.getText());
+  ndbout_c("c_DIH_SWITCH_REPLICA_REQ_Counter = %s", 
+	   c_DIH_SWITCH_REPLICA_REQ_Counter.getText());
+  ndbout_c("c_EMPTY_LCP_REQ_Counter = %s",c_EMPTY_LCP_REQ_Counter.getText());
+  ndbout_c("c_GCP_COMMIT_Counter = %s", c_GCP_COMMIT_Counter.getText());
+  ndbout_c("c_GCP_PREPARE_Counter = %s", c_GCP_PREPARE_Counter.getText());
+  ndbout_c("c_GCP_SAVEREQ_Counter = %s", c_GCP_SAVEREQ_Counter.getText());
+  ndbout_c("c_INCL_NODEREQ_Counter = %s", c_INCL_NODEREQ_Counter.getText());
+  ndbout_c("c_MASTER_GCPREQ_Counter = %s", c_MASTER_GCPREQ_Counter.getText());
+  ndbout_c("c_MASTER_LCPREQ_Counter = %s", c_MASTER_LCPREQ_Counter.getText());
+  ndbout_c("c_START_INFOREQ_Counter = %s", c_START_INFOREQ_Counter.getText());
+  ndbout_c("c_START_RECREQ_Counter = %s", c_START_RECREQ_Counter.getText());
+  ndbout_c("c_STOP_ME_REQ_Counter = %s", c_STOP_ME_REQ_Counter.getText());
+  ndbout_c("c_TC_CLOPSIZEREQ_Counter = %s", c_TC_CLOPSIZEREQ_Counter.getText());
+  ndbout_c("c_TCGETOPSIZEREQ_Counter = %s", c_TCGETOPSIZEREQ_Counter.getText());
+
+  ndbout_c("m_copyReason: %d m_waiting: %u %u",
+           c_copyGCIMaster.m_copyReason,
+           c_copyGCIMaster.m_waiting[0],
+           c_copyGCIMaster.m_waiting[1]);
+  
+  ndbout_c("c_copyGCISlave: sender{Data, Ref} %d %x reason: %d nextWord: %d",
+	   c_copyGCISlave.m_senderData,
+	   c_copyGCISlave.m_senderRef,
+	   c_copyGCISlave.m_copyReason,
+	   c_copyGCISlave.m_expectedNextWord);
+}
+
 /**
  * GCP stop detected, 
  * send SYSTEM_ERROR to all other alive nodes
  */
 void Dbdih::crashSystemAtGcpStop(Signal* signal, bool local)
 {
+  dumpGcpStop();
   Uint32 save_counter = m_gcp_monitor.m_gcp_save.m_counter;
   Uint32 micro_counter = m_gcp_monitor.m_micro_gcp.m_counter;
   m_gcp_monitor.m_gcp_save.m_counter = 0;
@@ -12314,16 +12519,6 @@ void Dbdih::crashSystemAtGcpStop(Signal*
   }
 
 dolocal:  
-  ndbout_c("m_copyReason: %d m_waiting: %d",
-           c_copyGCIMaster.m_copyReason,
-           c_copyGCIMaster.m_waiting[0]);
-  
-  ndbout_c("c_copyGCISlave: sender{Data, Ref} %d %x reason: %d nextWord: %d",
-	   c_copyGCISlave.m_senderData,
-	   c_copyGCISlave.m_senderRef,
-	   c_copyGCISlave.m_copyReason,
-	   c_copyGCISlave.m_expectedNextWord);
-
   FileRecordPtr file0Ptr;
   file0Ptr.i = crestartInfoFile[0];
   ptrCheckGuard(file0Ptr, cfileFileSize, fileRecord);
@@ -12344,32 +12539,6 @@ dolocal:  
   signal->theData[1] = file1Ptr.p->fileRef;
   EXECUTE_DIRECT(NDBFS, GSN_DUMP_STATE_ORD, signal, 2);
 
-  ndbout_c("c_COPY_GCIREQ_Counter = %s", 
-	   c_COPY_GCIREQ_Counter.getText());
-  ndbout_c("c_COPY_TABREQ_Counter = %s", 
-	   c_COPY_TABREQ_Counter.getText());
-  ndbout_c("c_CREATE_FRAGREQ_Counter = %s", 
-	   c_CREATE_FRAGREQ_Counter.getText());
-  ndbout_c("c_DIH_SWITCH_REPLICA_REQ_Counter = %s", 
-	   c_DIH_SWITCH_REPLICA_REQ_Counter.getText());
-  ndbout_c("c_EMPTY_LCP_REQ_Counter = %s",c_EMPTY_LCP_REQ_Counter.getText());
-  ndbout_c("c_GCP_COMMIT_Counter = %s", c_GCP_COMMIT_Counter.getText());
-  ndbout_c("c_GCP_PREPARE_Counter = %s", c_GCP_PREPARE_Counter.getText());
-  ndbout_c("c_GCP_SAVEREQ_Counter = %s", c_GCP_SAVEREQ_Counter.getText());
-  ndbout_c("c_INCL_NODEREQ_Counter = %s", c_INCL_NODEREQ_Counter.getText());
-  ndbout_c("c_MASTER_GCPREQ_Counter = %s", 
-	   c_MASTER_GCPREQ_Counter.getText());
-  ndbout_c("c_MASTER_LCPREQ_Counter = %s", 
-	   c_MASTER_LCPREQ_Counter.getText());
-  ndbout_c("c_START_INFOREQ_Counter = %s", 
-	   c_START_INFOREQ_Counter.getText());
-  ndbout_c("c_START_RECREQ_Counter = %s", c_START_RECREQ_Counter.getText());
-  ndbout_c("c_STOP_ME_REQ_Counter = %s", c_STOP_ME_REQ_Counter.getText());
-  ndbout_c("c_TC_CLOPSIZEREQ_Counter = %s", 
-	   c_TC_CLOPSIZEREQ_Counter.getText());
-  ndbout_c("c_TCGETOPSIZEREQ_Counter = %s", 
-	   c_TCGETOPSIZEREQ_Counter.getText());
-
   jam();
   SystemError * const sysErr = (SystemError*)&signal->theData[0];
   sysErr->errorCode = SystemError::GCPStopDetected;
@@ -14967,7 +15136,7 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal
 	Uint32 nodeOrder[MAX_REPLICAS];
 	const Uint32 noOfReplicas = extractNodeInfo(fragPtr.p, nodeOrder);
 	char buf[100];
-	BaseString::snprintf(buf, sizeof(buf), " Table %d Fragment %d - ", tabPtr.i, j);
+	BaseString::snprintf(buf, sizeof(buf), " Table %d Fragment %d LP: %u - ", tabPtr.i, j, fragPtr.p->m_log_part_id);
 	for(Uint32 k = 0; k < noOfReplicas; k++){
 	  char tmp[100];
 	  BaseString::snprintf(tmp, sizeof(tmp), "%d ", nodeOrder[k]);
@@ -15348,6 +15517,13 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal
     crashSystemAtGcpStop(signal, true);
   }
 
+  if (arg == 7025)
+  {
+    jam();
+    dumpGcpStop();
+    return;
+  }
+
 #ifdef GCP_TIMER_HACK
   if (signal->theData[0] == 7901)
     globalData.gcp_timer_limit = signal->theData[1];

=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2009-02-02 21:23:43 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2009-03-11 15:53:24 +0000
@@ -169,6 +169,47 @@ static NdbOut * traceopout = 0;
 #define TRACE_OP(x, y) {}
 #endif
 
+struct LogPosition
+{
+  Uint32 m_file_no;
+  Uint32 m_mbyte;
+};
+
+int
+cmp(const LogPosition& pos1, const LogPosition& pos2)
+{
+  if (pos1.m_file_no > pos2.m_file_no)
+    return 1;
+  if (pos1.m_file_no < pos2.m_file_no)
+    return -1;
+  if (pos1.m_mbyte > pos2.m_mbyte)
+    return 1;
+  if (pos1.m_mbyte < pos2.m_mbyte)
+    return -1;
+
+  return 0;
+}
+
+/**
+ * head - tail
+ */
+static
+Uint64
+free_log(const LogPosition& head, const LogPosition& tail, 
+         Uint32 cnt, Uint32 size)
+{
+  Uint64 headmb = head.m_file_no*Uint64(size) + head.m_mbyte;
+  Uint64 tailmb = tail.m_file_no*Uint64(size) + tail.m_mbyte;
+  if (headmb >= tailmb)
+  {
+    return (cnt * Uint64(size)) - headmb + tailmb;
+  }
+  else
+  {
+    return tailmb - headmb;
+  }
+}
+
 /* ------------------------------------------------------------------------- */
 /* -------               SEND SYSTEM ERROR                           ------- */
 /*                                                                           */
@@ -12159,6 +12200,18 @@ void Dblqh::sendLCP_COMPLETE_REP(Signal*
   
 }//Dblqh::sendCOMP_LCP_ROUND()
 
+#if NOT_YET
+void
+Dblqh::execLCP_COMPLETE_REP(Signal* signal)
+{
+  /**
+   * This is sent when last LCP is restorable
+   */
+  LcpCompleteRep * rep = (LcpCompleteRep*)signal->getDataPtr();
+  Uint32 keepGci = rep->keepGci;
+  setLogTail(signal, keepGci);
+}
+#endif
 
 /* ------------------------------------------------------------------------- */
 /* -------               SEND ACC_LCPREQ AND TUP_LCPREQ              ------- */
@@ -12184,24 +12237,10 @@ void Dblqh::sendStartLcp(Signal* signal)
 /*FOR SHORT LOGS.                                                            */
 /* ------------------------------------------------------------------------- */
 
-// this function has not been verified yet
-Uint32 Dblqh::remainingLogSize(const LogFileRecordPtr &sltCurrLogFilePtr,
-			       const LogPartRecordPtr &sltLogPartPtr)
-{
-  Uint32 hf = sltCurrLogFilePtr.p->fileNo*clogFileSize+sltCurrLogFilePtr.p->currentMbyte;
-  Uint32 tf = sltLogPartPtr.p->logTailFileNo*clogFileSize+sltLogPartPtr.p->logTailMbyte;
-  Uint32 sz = sltLogPartPtr.p->noLogFiles*clogFileSize;
-  if (tf > hf) hf += sz;
-  return sz-(hf-tf);
-}
-
 void Dblqh::setLogTail(Signal* signal, Uint32 keepGci) 
 {
   LogPartRecordPtr sltLogPartPtr;
   LogFileRecordPtr sltLogFilePtr;
-#if 0
-  LogFileRecordPtr sltCurrLogFilePtr;
-#endif
   UintR tsltMbyte;
   UintR tsltStartMbyte;
   UintR tsltIndex;
@@ -12213,13 +12252,6 @@ void Dblqh::setLogTail(Signal* signal, U
     findLogfile(signal, sltLogPartPtr.p->logTailFileNo,
                 sltLogPartPtr, &sltLogFilePtr);
 
-#if 0
-    sltCurrLogFilePtr.i = sltLogPartPtr.p->currentLogfile;
-    ptrCheckGuard(sltCurrLogFilePtr, clogFileFileSize, logFileRecord);
-    infoEvent("setLogTail: Available log file %d size = %d[mbytes]+%d[words]", sltLogPartPtr.i,
-	      remainingLogSize(sltCurrLogFilePtr, sltLogPartPtr), sltCurrLogFilePtr.p->remainingWordsInMbyte);
-#endif
-
     tsltMbyte = sltLogPartPtr.p->logTailMbyte;
     tsltStartMbyte = tsltMbyte;
     tsltFlag = ZFALSE;
@@ -12327,10 +12359,6 @@ void Dblqh::setLogTail(Signal* signal, U
         }//if
       }//if
     }
-#if 0
-    infoEvent("setLogTail: Available log file %d size = %d[mbytes]+%d[words]", sltLogPartPtr.i,
-	      remainingLogSize(sltCurrLogFilePtr, sltLogPartPtr), sltCurrLogFilePtr.p->remainingWordsInMbyte);
-#endif
   }//for
 
 }//Dblqh::setLogTail()
@@ -12398,6 +12426,9 @@ void Dblqh::execGCP_SAVEREQ(Signal* sign
     return;
   }
 
+  Uint32 saveNewestCompletedGci = cnewestCompletedGci;
+  cnewestCompletedGci = gci;
+
   if (cstartRecReq < SRR_REDO_COMPLETE)
   {
     /**
@@ -12413,9 +12444,10 @@ void Dblqh::execGCP_SAVEREQ(Signal* sign
     return;
   }
   
-  ndbrequire(gci >= cnewestCompletedGci);
+  ndbrequire(gci >= saveNewestCompletedGci);
   
-  if (gci == cnewestCompletedGci) {
+  if (gci == saveNewestCompletedGci) 
+  {
 /*---------------------------------------------------------------------------*/
 /* GLOBAL CHECKPOINT HAVE ALREADY BEEN HANDLED. REQUEST MUST HAVE BEEN SENT  */
 /* FROM NEW MASTER DIH.                                                      */
@@ -14545,7 +14577,8 @@ void Dblqh::execSTART_FRAGREQ(Signal* si
   fragptr.p->logFlag = Fragrecord::STATE_FALSE;
   fragptr.p->srStatus = Fragrecord::SS_IDLE;
 
-  if (noOfLogNodes > 0) {
+  if (noOfLogNodes > 0) 
+  {
     jam();
     for (Uint32 i = 0; i < noOfLogNodes; i++) {
       jam();
@@ -14554,8 +14587,19 @@ void Dblqh::execSTART_FRAGREQ(Signal* si
       fragptr.p->srLqhLognode[i] = startFragReq->lqhLogNode[i];
     }//for
     fragptr.p->newestGci = startFragReq->lastGci[noOfLogNodes - 1];
-  } else {
-    fragptr.p->newestGci = cnewestGci;
+  } 
+  else
+  {
+    jam();
+    /**
+     * This is a really weird piece of code
+     *   it's probably incorrect, but seems to mask problems...
+     */
+    if (cnewestGci > fragptr.p->newestGci) 
+    {
+      jam();
+      fragptr.p->newestGci = cnewestGci;
+    }
   }//if
   
   if (lcpNo == ZNIL)
@@ -19131,20 +19175,13 @@ void Dblqh::writeNextLog(Signal* signal)
     twnlNextMbyte = logFilePtr.p->currentMbyte + 1;
     twnlNextFileNo = logFilePtr.p->fileNo;
   }//if
-  if (twnlNextFileNo == logPartPtr.p->logTailFileNo) {
-    if (logPartPtr.p->logTailMbyte == twnlNextMbyte) {
-      jam();
-/* -------------------------------------------------- */
-/*       THE NEXT MBYTE WILL BE THE TAIL. WE MUST     */
-/*       STOP LOGGING NEW OPERATIONS. THIS OPERATION  */
-/*       ALLOWED TO PASS. ALSO COMMIT, NEXT, COMPLETED*/
-/*       GCI, ABORT AND FRAGMENT SPLIT IS ALLOWED.    */
-/*       OPERATIONS ARE ALLOWED AGAIN WHEN THE TAIL   */
-/*       IS MOVED FORWARD AS A RESULT OF A START_LCP  */
-/*       _ROUND SIGNAL ARRIVING FROM DBDIH.           */
-/* -------------------------------------------------- */
-      logPartPtr.p->logPartState = LogPartRecord::TAIL_PROBLEM;
-    }//if
+
+  LogPosition head = { twnlNextFileNo, twnlNextMbyte };
+  LogPosition tail = { logPartPtr.p->logTailFileNo, logPartPtr.p->logTailMbyte};
+  if (free_log(head, tail, logPartPtr.p->noLogFiles, clogFileSize) <= 4)
+  {
+    jam();
+    logPartPtr.p->logPartState = LogPartRecord::TAIL_PROBLEM;
   }//if
 }//Dblqh::writeNextLog()
 
@@ -20068,6 +20105,44 @@ Dblqh::execDUMP_STATE_ORD(Signal* signal
       EXECUTE_DIRECT(DBLQH, GSN_DUMP_STATE_ORD, signal, 1);
     }
   }
+
+  if(arg == 2399)
+  {
+    jam();
+
+    if (cstartRecReq < SRR_REDO_COMPLETE)
+    {
+      jam();
+      return;
+    }
+
+    for(Uint32 i = 0; i<4; i++)
+    {
+      logPartPtr.i = i;
+      ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
+      LogFileRecordPtr logFile;
+      logFile.i = logPartPtr.p->currentLogfile;
+      ptrCheckGuard(logFile, clogFileFileSize, logFileRecord);
+      
+      LogPosition head = { logFile.p->fileNo, logFile.p->currentMbyte };
+      LogPosition tail = { logPartPtr.p->logTailFileNo, 
+                           logPartPtr.p->logTailMbyte};
+      Uint64 mb = free_log(head, tail, logPartPtr.p->noLogFiles, clogFileSize);
+      Uint64 total = logPartPtr.p->noLogFiles * Uint64(clogFileSize);
+      signal->theData[0] = NDB_LE_RedoStatus;
+      signal->theData[1] = i;
+      signal->theData[2] = head.m_file_no;
+      signal->theData[3] = head.m_mbyte;
+      signal->theData[4] = tail.m_file_no;
+      signal->theData[5] = tail.m_mbyte;
+      signal->theData[6] = Uint32(total >> 32);
+      signal->theData[7] = Uint32(total);
+      signal->theData[8] = Uint32(mb >> 32);
+      signal->theData[9] = Uint32(mb);
+      sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 10, JBB);
+    }
+  }
+
 }//Dblqh::execDUMP_STATE_ORD()
 
 /* **************************************************************** */

=== modified file 'storage/ndb/src/kernel/blocks/dbutil/DbUtil.cpp'
--- a/storage/ndb/src/kernel/blocks/dbutil/DbUtil.cpp	2009-01-27 14:39:44 +0000
+++ b/storage/ndb/src/kernel/blocks/dbutil/DbUtil.cpp	2009-02-27 15:30:33 +0000
@@ -1097,7 +1097,6 @@ DbUtil::prepareOperation(Signal* signal,
   Uint32 noOfPKAttribsStored = 0;
   Uint32 noOfNonPKAttribsStored = 0;
   Uint32 attrLength = 0;
-  Uint32 pkAttrLength = 0;
   char attrNameRequested[MAX_ATTR_NAME_SIZE];
   Uint32 attrIdRequested;
 
@@ -1248,8 +1247,6 @@ DbUtil::prepareOperation(Signal* signal,
 	break;
       }
       attrLength += len;
-      if (attrDesc.AttributeKeyFlag)
-	pkAttrLength += len;
 
       if (operationType == UtilPrepareReq::Read) {
 	AttributeHeader::init(rsInfoIt.data, 
@@ -1299,14 +1296,7 @@ DbUtil::prepareOperation(Signal* signal,
   prepOpPtr.p->tckey.tableId = tableDesc.TableId;
   prepOpPtr.p->tckey.tableSchemaVersion = tableDesc.TableVersion;
   prepOpPtr.p->noOfKeyAttr = tableDesc.NoOfKeyAttr;
-  prepOpPtr.p->keyLen = tableDesc.KeyLength; // Total no of words in PK
-  if (prepOpPtr.p->keyLen > TcKeyReq::MaxKeyInfo) {
-    jam();
-    prepOpPtr.p->tckeyLenInBytes = (static_len + TcKeyReq::MaxKeyInfo) * 4;
-  } else {
-    jam();
-    prepOpPtr.p->tckeyLenInBytes = (static_len + prepOpPtr.p->keyLen) * 4;
-  }
+  prepOpPtr.p->tckeyLen = static_len;
   prepOpPtr.p->keyDataPos = static_len;  // Start of keyInfo[] in tckeyreq
   
   Uint32 requestInfo = 0;
@@ -1415,14 +1405,13 @@ DbUtil::hardcodedPrepare() {
   /**
    * Prepare SequenceCurrVal (READ)
    */
+  Uint32 keyLen = 1;
   {
     PreparedOperationPtr ptr;
     ndbrequire(c_preparedOperationPool.seizeId(ptr, 0));
-    ptr.p->keyLen = 1;
     ptr.p->tckey.attrLen = 1;
     ptr.p->rsLen = 3;
-    ptr.p->tckeyLenInBytes = (TcKeyReq::StaticLength +
-                              ptr.p->keyLen + ptr.p->tckey.attrLen) * 4;
+    ptr.p->tckeyLen = TcKeyReq::StaticLength + keyLen + ptr.p->tckey.attrLen;
     ptr.p->keyDataPos = TcKeyReq::StaticLength; 
     ptr.p->tckey.tableId = 0;
     Uint32 requestInfo = 0;
@@ -1448,9 +1437,8 @@ DbUtil::hardcodedPrepare() {
   {
     PreparedOperationPtr ptr;
     ndbrequire(c_preparedOperationPool.seizeId(ptr, 1));
-    ptr.p->keyLen = 1;
     ptr.p->rsLen = 3;
-    ptr.p->tckeyLenInBytes = (TcKeyReq::StaticLength + ptr.p->keyLen + 5) * 4;
+    ptr.p->tckeyLen = TcKeyReq::StaticLength + keyLen + 5;
     ptr.p->keyDataPos = TcKeyReq::StaticLength; 
     ptr.p->tckey.attrLen = 11;
     ptr.p->tckey.tableId = 0;
@@ -1504,11 +1492,9 @@ DbUtil::hardcodedPrepare() {
   {
     PreparedOperationPtr ptr;
     ndbrequire(c_preparedOperationPool.seizeId(ptr, 2));
-    ptr.p->keyLen = 1;
     ptr.p->tckey.attrLen = 5;
     ptr.p->rsLen = 0;
-    ptr.p->tckeyLenInBytes = (TcKeyReq::StaticLength +
-                              ptr.p->keyLen + ptr.p->tckey.attrLen) * 4;
+    ptr.p->tckeyLen = TcKeyReq::StaticLength + keyLen + ptr.p->tckey.attrLen;
     ptr.p->keyDataPos = TcKeyReq::StaticLength;
     ptr.p->tckey.tableId = 0;
     Uint32 requestInfo = 0;
@@ -1526,9 +1512,8 @@ DbUtil::hardcodedPrepare() {
   {
     PreparedOperationPtr ptr;
     ndbrequire(c_preparedOperationPool.seizeId(ptr, 3));
-    ptr.p->keyLen = 1;
     ptr.p->rsLen = 0;
-    ptr.p->tckeyLenInBytes = (TcKeyReq::StaticLength + ptr.p->keyLen + 5) * 4;
+    ptr.p->tckeyLen = TcKeyReq::StaticLength + keyLen + 5;
     ptr.p->keyDataPos = TcKeyReq::StaticLength;
     ptr.p->tckey.attrLen = 9;
     ptr.p->tckey.tableId = 0;
@@ -1543,9 +1528,9 @@ DbUtil::hardcodedPrepare() {
 
     Uint32 * attrInfo = &ptr.p->tckey.distrGroupHashValue;
     attrInfo[0] = 0; // IntialReadSize
-    attrInfo[1] = 3; // InterpretedSize
+    attrInfo[1] = 4; // InterpretedSize
     attrInfo[2] = 0; // FinalUpdateSize
-    attrInfo[3] = 1; // FinalReadSize
+    attrInfo[3] = 0; // FinalReadSize
     attrInfo[4] = 0; // SubroutineSize
   }
 }
@@ -1587,7 +1572,7 @@ DbUtil::execUTIL_SEQUENCE_REQ(Signal* si
   ndbrequire(transPtr.p->operations.seize(opPtr));
   
   ndbrequire(opPtr.p->rs.seize(prepOp->rsLen));
-  ndbrequire(opPtr.p->keyInfo.seize(prepOp->keyLen));
+  ndbrequire(opPtr.p->keyInfo.seize(1));
 
   transPtr.p->gsn = GSN_UTIL_SEQUENCE_REQ;
   transPtr.p->clientRef = signal->senderBlockRef();
@@ -1627,14 +1612,13 @@ DbUtil::execUTIL_SEQUENCE_REQ(Signal* si
     ndbrequire(opPtr.p->attrInfo.seize(4));
     AttrInfoBuffer::DataBufferIterator it;
     opPtr.p->attrInfo.first(it);
-    * it.data = Interpreter::LoadConst16(7, req->value);
+    * it.data = Interpreter::LoadConst32(7);
+    ndbrequire(opPtr.p->attrInfo.next(it));
+    * it.data = req->value;
     ndbrequire(opPtr.p->attrInfo.next(it));
     * it.data = Interpreter::Write(1, 7);
     ndbrequire(opPtr.p->attrInfo.next(it))
     * it.data = Interpreter::ExitOK();
-
-    ndbrequire(opPtr.p->attrInfo.next(it));
-    AttributeHeader::init(it.data, 1, 0);
   }
  
   transPtr.p->noOfRetries = 3;
@@ -1717,7 +1701,6 @@ DbUtil::reportSequence(Signal* signal, c
     }
     case UtilSequenceReq::SetVal:
       ok = true;
-      break;
     case UtilSequenceReq::Create:
       ok = true;
       ret->sequenceValue[0] = 0;
@@ -1855,7 +1838,7 @@ DbUtil::execUTIL_EXECUTE_REQ(Signal* sig
   ndbrequire(transPtr.p->operations.seize(opPtr));
   opPtr.p->prepOp   = prepOpPtr.p;
   opPtr.p->prepOp_i = prepOpPtr.i;
-  
+
 #if 0 //def EVENT_DEBUG
   printf("opPtr.p->rs.seize( %u )\n", prepOpPtr.p->rsLen);
 #endif
@@ -1930,13 +1913,6 @@ DbUtil::execUTIL_EXECUTE_REQ(Signal* sig
     return;
   }
 
-  // quick hack for hash index build
-  if (TcKeyReq::getOperationType(prepOpPtr.p->tckey.requestInfo) != ZREAD){
-    prepOpPtr.p->tckey.attrLen =
-      prepOpPtr.p->attrInfo.getSize() + opPtr.p->attrInfo.getSize();
-    TcKeyReq::setKeyLength(prepOpPtr.p->tckey.requestInfo, keyInfo->getSize());
-  }
-
 #if 0
   const Uint32 l1 = prepOpPtr.p->tckey.attrLen;
   const Uint32 l2 = 
@@ -2020,7 +1996,7 @@ DbUtil::runOperation(Signal* signal, Tra
   
   TcKeyReq * tcKey = (TcKeyReq*)signal->getDataPtrSend();
   //ndbout << "*** 6 ***"<< endl; pop->print();
-  memcpy(tcKey, &pop->tckey, pop->tckeyLenInBytes);
+  memcpy(tcKey, &pop->tckey, 4*pop->tckeyLen);
   //ndbout << "*** 6b ***"<< endl; 
   //printTCKEYREQ(stdout, signal->getDataPtrSend(), 
   //              pop->tckeyLenInBytes >> 2, 0);
@@ -2037,7 +2013,12 @@ DbUtil::runOperation(Signal* signal, Tra
   printf("DbUtil::runOperation: ATTRINFO\n");
   op->attrInfo.print(stdout);
 #endif
-
+  
+  Uint32 attrLen = pop->attrInfo.getSize() + op->attrInfo.getSize();
+  Uint32 keyLen = op->keyInfo.getSize();
+  tcKey->attrLen = attrLen + TcKeyReq::getAIInTcKeyReq(tcKey->requestInfo);
+  TcKeyReq::setKeyLength(tcKey->requestInfo, keyLen);
+  
   /**
    * Key Info
    */
@@ -2051,12 +2032,13 @@ DbUtil::runOperation(Signal* signal, Tra
   //ndbout << "*** 7 ***" << endl;
   //printTCKEYREQ(stdout, signal->getDataPtrSend(), 
   //		pop->tckeyLenInBytes >> 2, 0);
-
+  
 #if 0 //def EVENT_DEBUG
-    printf("DbUtil::runOperation: sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, %d , JBB)\n",  pop->tckeyLenInBytes >> 2);
-    printTCKEYREQ(stdout, signal->getDataPtr(), pop->tckeyLenInBytes >> 2,0);
+  printf("DbUtil::runOperation: sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, %d , JBB)\n",  pop->tckeyLenInBytes >> 2);
+  printTCKEYREQ(stdout, signal->getDataPtr(), pop->tckeyLenInBytes >> 2,0);
 #endif
-  sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, pop->tckeyLenInBytes >> 2, JBB);
+  Uint32 sigLen = pop->tckeyLen + (keyLen > 8 ? 8 : keyLen);
+  sendSignal(DBTC_REF, GSN_TCKEYREQ, signal, sigLen, JBB);
   
   /**
    * More the 8 words of key info not implemented

=== modified file 'storage/ndb/src/kernel/blocks/dbutil/DbUtil.hpp'
--- a/storage/ndb/src/kernel/blocks/dbutil/DbUtil.hpp	2007-12-23 12:52:25 +0000
+++ b/storage/ndb/src/kernel/blocks/dbutil/DbUtil.hpp	2009-02-27 15:30:33 +0000
@@ -211,7 +211,6 @@ public:
     }
 
     /*** Various Operation Info ***/
-    Uint32    keyLen;          // Length of primary key (fixed size is assumed)
     Uint32    rsLen;           // Size of result set
     Uint32    noOfKeyAttr;     // Number of key attributes
     Uint32    noOfAttr;        // Number of attributes
@@ -233,7 +232,7 @@ public:
     AttrMappingBuffer    attrMapping;
 
     /*** First signal in tckeyreq train ***/
-    Uint32    tckeyLenInBytes;    // TcKeyReq total signal length (in bytes)
+    Uint32    tckeyLen;           // TcKeyReq total signal length
     Uint32    keyDataPos;         // Where to store keydata[] in tckey signal
                                   // (in #words from base in tckey signal)
     TcKeyReq  tckey;              // Signaldata for first signal in train
@@ -254,11 +253,10 @@ public:
     
     void print() const {
       ndbout << "[-PreparedOperation-" << endl
-	     << " keyLen: " << keyLen
 	     << ", rsLen: " << rsLen
 	     << ", noOfKeyAttr: " << noOfKeyAttr 
 	     << ", noOfAttr: " << noOfAttr 
-	     << ", tckeyLenInBytes: " << tckeyLenInBytes 
+	     << ", tckeyLen: " << tckeyLen 
 	     << ", keyDataPos: " << keyDataPos << endl
 	     << "-AttrMapping- (AttrId, KeyPos)-pairs "
 	     << "(Pos=3fff if non-key attr):" << endl;

=== modified file 'storage/ndb/src/kernel/blocks/lgman.cpp'
--- a/storage/ndb/src/kernel/blocks/lgman.cpp	2008-12-20 19:51:09 +0000
+++ b/storage/ndb/src/kernel/blocks/lgman.cpp	2009-02-19 14:27:30 +0000
@@ -120,7 +120,8 @@ Lgman::execREAD_CONFIG_REQ(Signal* signa
   m_log_waiter_pool.wo_pool_init(RT_LGMAN_LOG_WAITER, pc);
   m_file_pool.init(RT_LGMAN_FILE, pc);
   m_logfile_group_pool.init(RT_LGMAN_FILEGROUP, pc);
-  m_data_buffer_pool.setSize(10);
+  // 10 -> 150M
+  m_data_buffer_pool.setSize(40);
 
   ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
   conf->senderRef = reference();
@@ -191,11 +192,13 @@ Lgman::execCONTINUEB(Signal* signal){
     Ptr<Logfile_group> ptr;
     if(ptrI != RNIL)
     {
+      jam();
       m_logfile_group_pool.getPtr(ptr, ptrI);
       find_log_head(signal, ptr);
     }
     else
     {
+      jam();
       init_run_undo_log(signal);
     }
     return;
@@ -930,8 +933,18 @@ Lgman::alloc_logbuffer_memory(Ptr<Logfil
 	Buffer_idx range;
 	range.m_ptr_i= ptrI;
 	range.m_idx = cnt;
-	
-	ndbrequire(map.append((Uint32*)&range, 2));
+        
+	if (map.append((Uint32*)&range, 2) == false)
+        {
+          /**
+           * Failed to append page-range...
+           *   jump out of alloc routine
+           */
+          jam();
+          m_ctx.m_mm.release_pages(RG_DISK_OPERATIONS, 
+                                   range.m_ptr_i, range.m_idx);
+          break;
+        }
 	pages -= range.m_idx;
       }
       else
@@ -2487,6 +2500,8 @@ Lgman::init_run_undo_log(Signal* signal)
   Logfile_group_list& list= m_logfile_group_list;
   Logfile_group_list tmp(m_logfile_group_pool);
 
+  bool found_any = false;
+
   list.first(group);
   while(!group.isNull())
   {
@@ -2494,6 +2509,18 @@ Lgman::init_run_undo_log(Signal* signal)
     list.next(group);
     list.remove(ptr);
 
+    if (ptr.p->m_state & Logfile_group::LG_ONLINE)
+    {
+      /**
+       * No logfiles in group
+       */
+      jam();
+      tmp.addLast(ptr);
+      continue;
+    }
+    
+    found_any = true;
+
     {
       /**
        * Init buffer pointers
@@ -2536,6 +2563,17 @@ Lgman::init_run_undo_log(Signal* signal)
   }
   list = tmp;
 
+  if (found_any == false)
+  {
+    /**
+     * No logfilegroup had any logfiles
+     */
+    jam();
+    signal->theData[0] = reference();
+    sendSignal(DBLQH_REF, GSN_START_RECCONF, signal, 1, JBB);
+    return;
+  }
+  
   execute_undo_record(signal);
 }
 

=== modified file 'storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp'
--- a/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp	2008-08-11 11:24:12 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/Ndbcntr.hpp	2009-02-17 08:13:18 +0000
@@ -184,6 +184,10 @@ private:
   void execDIH_RESTARTREF(Signal* signal);
   void execCREATE_TABLE_REF(Signal* signal);
   void execCREATE_TABLE_CONF(Signal* signal);
+  void execCREATE_FILEGROUP_REF(Signal* signal);
+  void execCREATE_FILEGROUP_CONF(Signal* signal);
+  void execCREATE_FILE_REF(Signal* signal);
+  void execCREATE_FILE_CONF(Signal* signal);
   void execNDB_STTORRY(Signal* signal);
   void execNDB_STARTCONF(Signal* signal);
   void execREAD_NODESREQ(Signal* signal);
@@ -225,6 +229,7 @@ private:
   void systemErrorLab(Signal* signal, int line);
 
   void createSystableLab(Signal* signal, unsigned index);
+  void createDDObjects(Signal*, unsigned index);
   void crSystab7Lab(Signal* signal);
   void crSystab8Lab(Signal* signal);
   void crSystab9Lab(Signal* signal);

=== modified file 'storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrInit.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrInit.cpp	2007-11-30 11:00:31 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrInit.cpp	2009-02-17 08:13:18 +0000
@@ -78,6 +78,10 @@ Ndbcntr::Ndbcntr(Block_context& ctx):
   addRecSignal(GSN_DIH_RESTARTREF, &Ndbcntr::execDIH_RESTARTREF);
   addRecSignal(GSN_CREATE_TABLE_REF, &Ndbcntr::execCREATE_TABLE_REF);
   addRecSignal(GSN_CREATE_TABLE_CONF, &Ndbcntr::execCREATE_TABLE_CONF);
+  addRecSignal(GSN_CREATE_FILEGROUP_REF, &Ndbcntr::execCREATE_FILEGROUP_REF);
+  addRecSignal(GSN_CREATE_FILEGROUP_CONF, &Ndbcntr::execCREATE_FILEGROUP_CONF);
+  addRecSignal(GSN_CREATE_FILE_REF, &Ndbcntr::execCREATE_FILE_REF);
+  addRecSignal(GSN_CREATE_FILE_CONF, &Ndbcntr::execCREATE_FILE_CONF);
   addRecSignal(GSN_NDB_STTORRY, &Ndbcntr::execNDB_STTORRY);
   addRecSignal(GSN_NDB_STARTCONF, &Ndbcntr::execNDB_STARTCONF);
   addRecSignal(GSN_READ_NODESREQ, &Ndbcntr::execREAD_NODESREQ);

=== modified file 'storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp	2008-04-25 11:01:45 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp	2009-02-24 12:58:43 +0000
@@ -51,6 +51,7 @@
 #include <NdbTick.h>
 
 #include <signaldata/TakeOver.hpp>
+#include <signaldata/CreateFilegroup.hpp>
 
 // used during shutdown for reporting current startphase
 // accessed from Emulator.cpp, NdbShutdown()
@@ -204,12 +205,16 @@ void Ndbcntr::execSYSTEM_ERROR(Signal* s
   jamEntry();
   switch (sysErr->errorCode){
   case SystemError::GCPStopDetected:
+  {
     BaseString::snprintf(buf, sizeof(buf), 
 	     "Node %d killed this node because "
 	     "GCP stop was detected",     
 	     killingNode);
+    signal->theData[0] = 7025;
+    EXECUTE_DIRECT(DBDIH, GSN_DUMP_STATE_ORD, signal, 1);
+    jamEntry();
     break;
-
+  }
   case SystemError::CopyFragRefError:
     CRASH_INSERTION(1000);
     BaseString::snprintf(buf, sizeof(buf), 
@@ -250,6 +255,131 @@ void Ndbcntr::execSYSTEM_ERROR(Signal* s
   return;
 }//Ndbcntr::execSYSTEM_ERROR()
 
+
+struct ddentry
+{
+  Uint32 type;
+  const char * name;
+  Uint64 size;
+};
+
+/**
+ * f_dd[] = {
+ * { DictTabInfo::LogfileGroup, "DEFAULT-LG", 32*1024*1024 },
+ * { DictTabInfo::Undofile, "undofile.dat", 64*1024*1024 },
+ * { DictTabInfo::Tablespace, "DEFAULT-TS", 1024*1024 },
+ * { DictTabInfo::Datafile, "datafile.dat", 64*1024*1024 },
+ * { ~0, 0, 0 }
+ * };
+ */
+Vector<ddentry> f_dd;
+
+Uint64
+parse_size(const char * src)
+{
+  Uint64 num = 0;
+  char * endptr = 0;
+  num = strtoll(src, &endptr, 10);
+
+  if (endptr)
+  {
+    switch(* endptr){
+    case 'k':
+    case 'K':
+      num *= 1024;
+      break;
+    case 'm':
+    case 'M':
+      num *= 1024;
+      num *= 1024;
+      break;
+    case 'g':
+    case 'G':
+      num *= 1024;
+      num *= 1024;
+      num *= 1024;
+      break;
+    }
+  }
+  return num;
+}
+
+static
+int
+parse_spec(Vector<ddentry> & dst,
+           const char * src,
+           Uint32 type)
+{
+  const char * key;
+  Uint32 filetype;
+
+  struct ddentry group;
+  if (type == DictTabInfo::LogfileGroup)
+  {
+    key = "undo_buffer_size=";
+    group.size = 64*1024*1024;
+    group.name = "DEFAULT-LG";
+    group.type = type;
+    filetype = DictTabInfo::Undofile;
+  }
+  else
+  {
+    key = "extent_size=";
+    group.size = 1024*1024;
+    group.name = "DEFAULT-TS";
+    group.type = type;
+    filetype = DictTabInfo::Datafile;
+  }
+  size_t keylen = strlen(key);
+
+  BaseString arg(src);
+  Vector<BaseString> list;
+  arg.split(list, ";");
+
+  bool first = true;
+  for (Uint32 i = 0; i<list.size(); i++)
+  {
+    list[i].trim();
+    if (strncasecmp(list[i].c_str(), "name=", sizeof("name=")-1) == 0)
+    {
+      group.name= strdup(list[i].c_str() + sizeof("name=")-1);
+    }
+    else if (strncasecmp(list[i].c_str(), key, keylen) == 0)
+    {
+      group.size = parse_size(list[i].c_str() + keylen);
+    }
+    else
+    {
+      /**
+       * interpret as filespec
+       */
+      struct ddentry entry;
+      const char * path = list[i].c_str();
+      char * sizeptr = const_cast<char*>(strchr(path, ':'));
+      if (sizeptr == 0)
+      {
+        return -1;
+      }
+      * sizeptr = 0;
+
+      entry.name = strdup(path);
+      entry.size = parse_size(sizeptr + 1);
+      entry.type = filetype;
+
+      if (first)
+      {
+        /**
+         * push group aswell
+         */
+        first = false;
+        dst.push_back(group);
+      }
+      dst.push_back(entry);
+    }
+  }
+  return 0;
+}
+
 void 
 Ndbcntr::execREAD_CONFIG_REQ(Signal* signal)
 {
@@ -264,6 +394,50 @@ Ndbcntr::execREAD_CONFIG_REQ(Signal* sig
     m_ctx.m_config.getOwnConfigIterator();
   ndbrequire(p != 0);
 
+  Uint32 dl = 0;
+  ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &dl);
+  if (dl == 0)
+  {
+    const char * lgspec = 0;
+    char buf[1024];
+    if (!ndb_mgm_get_string_parameter(p, CFG_DB_DD_LOGFILEGROUP_SPEC, &lgspec))
+    {
+      jam();
+
+      if (parse_spec(f_dd, lgspec, DictTabInfo::LogfileGroup))
+      {
+        BaseString::snprintf(buf, sizeof(buf),
+                             "Unable to parse InitalLogfileGroup: %s", lgspec);
+        progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
+      }
+    }
+
+    const char * tsspec = 0;
+    if (!ndb_mgm_get_string_parameter(p, CFG_DB_DD_TABLEPACE_SPEC, &tsspec))
+    {
+      if (f_dd.size() == 0)
+      {
+        warningEvent("InitalTablespace specified, "
+                     "but InitalLogfileGroup is not!");
+        warningEvent("Ignoring InitalTablespace: %s",
+                     tsspec);
+      }
+      else
+      {
+        if (parse_spec(f_dd, tsspec, DictTabInfo::Tablespace))
+        {
+          BaseString::snprintf(buf, sizeof(buf),
+                               "Unable to parse InitalTablespace: %s", tsspec);
+          progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
+        }
+      }
+    }
+  }
+
+  struct ddentry empty;
+  empty.type = ~0;
+  f_dd.push_back(empty);
+
   ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
   conf->senderRef = reference();
   conf->senderData = senderData;
@@ -291,14 +465,6 @@ void Ndbcntr::execSTTOR(Signal* signal) 
     break;
   case ZSTART_PHASE_1:
     jam();
-    {
-      Uint32 db_watchdog_interval = 0;
-      const ndb_mgm_configuration_iterator * p = 
-        m_ctx.m_config.getOwnConfigIterator();
-      ndb_mgm_get_int_parameter(p, CFG_DB_WATCHDOG_INTERVAL, &db_watchdog_interval);
-      ndbrequire(db_watchdog_interval);
-      update_watch_dog_timer(db_watchdog_interval);
-    }
     startPhase1Lab(signal);
     break;
   case ZSTART_PHASE_2:
@@ -1820,11 +1986,169 @@ void Ndbcntr::systemErrorLab(Signal* sig
 /*       |  :  |   :             |                   v                       */
 /*       | 2048|   0             |                   v                       */
 /*---------------------------------------------------------------------------*/
+void
+Ndbcntr::createDDObjects(Signal * signal, unsigned index)
+{
+  const ndb_mgm_configuration_iterator * p =
+    m_ctx.m_config.getOwnConfigIterator();
+  ndbrequire(p != 0);
+
+  Uint32 propPage[256];
+  LinearWriter w(propPage, 256);
+
+  const ddentry* entry = &f_dd[index];
+
+  switch(entry->type){
+  case DictTabInfo::LogfileGroup:
+  case DictTabInfo::Tablespace:
+  {
+    jam();
+
+    DictFilegroupInfo::Filegroup fg; fg.init();
+    BaseString::snprintf(fg.FilegroupName, sizeof(fg.FilegroupName),
+                         entry->name);
+    fg.FilegroupType = entry->type;
+    if (entry->type == DictTabInfo::LogfileGroup)
+    {
+      jam();
+      fg.LF_UndoBufferSize = Uint32(entry->size);
+    }
+    else
+    {
+      jam();
+      fg.TS_ExtentSize = Uint32(entry->size);
+      fg.TS_LogfileGroupId = RNIL;
+      fg.TS_LogfileGroupVersion = RNIL;
+    }
+
+    SimpleProperties::UnpackStatus s;
+    s = SimpleProperties::pack(w,
+                               &fg,
+                               DictFilegroupInfo::Mapping,
+                               DictFilegroupInfo::MappingSize, true);
+
+
+    Uint32 length = w.getWordsUsed();
+    LinearSectionPtr ptr[3];
+    ptr[0].p = &propPage[0];
+    ptr[0].sz = length;
+
+    CreateFilegroupReq * req = (CreateFilegroupReq*)signal->getDataPtrSend();
+    req->senderRef = reference();
+    req->senderData = index;
+    req->objType = entry->type;
+    sendSignal(DBDICT_REF, GSN_CREATE_FILEGROUP_REQ, signal,
+               CreateFilegroupReq::SignalLength, JBB, ptr, 1);
+    return;
+  }
+  case DictTabInfo::Undofile:
+  case DictTabInfo::Datafile:
+  {
+    jam();
+    Uint32 propPage[256];
+    LinearWriter w(propPage, 256);
+    DictFilegroupInfo::File f; f.init();
+    BaseString::snprintf(f.FileName, sizeof(f.FileName), entry->name);
+    f.FileType = entry->type;
+    f.FilegroupId = RNIL;
+    f.FilegroupVersion = RNIL;
+    f.FileSizeHi = Uint32(entry->size >> 32);
+    f.FileSizeLo = Uint32(entry->size);
+
+    SimpleProperties::UnpackStatus s;
+    s = SimpleProperties::pack(w,
+                               &f,
+                               DictFilegroupInfo::FileMapping,
+                               DictFilegroupInfo::FileMappingSize, true);
+
+    Uint32 length = w.getWordsUsed();
+    LinearSectionPtr ptr[3];
+    ptr[0].p = &propPage[0];
+    ptr[0].sz = length;
+
+    CreateFileReq * req = (CreateFileReq*)signal->getDataPtrSend();
+    req->senderRef = reference();
+    req->senderData = index;
+    req->objType = entry->type;
+    req->requestInfo = CreateFileReq::ForceCreateFile;
+    sendSignal(DBDICT_REF, GSN_CREATE_FILE_REQ, signal,
+               CreateFileReq::SignalLength, JBB, ptr, 1);
+    return;
+  }
+  default:
+    break;
+  }
+
+  startInsertTransactions(signal);
+}
+
+void
+Ndbcntr::execCREATE_FILEGROUP_REF(Signal* signal)
+{
+  jamEntry();
+  CreateFilegroupRef* ref = (CreateFilegroupRef*)signal->getDataPtr();
+  char buf[1024];
+
+  const ddentry* entry = &f_dd[ref->senderData];
+
+  if (entry->type == DictTabInfo::LogfileGroup)
+  {
+    BaseString::snprintf(buf, sizeof(buf), "create logfilegroup err %u",
+                         ref->errorCode);
+  }
+  else if (entry->type == DictTabInfo::Tablespace)
+  {
+    BaseString::snprintf(buf, sizeof(buf), "create tablespace err %u",
+                         ref->errorCode);
+  }
+  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
+}
+
+void
+Ndbcntr::execCREATE_FILEGROUP_CONF(Signal* signal)
+{
+  jamEntry();
+  CreateFilegroupConf* conf = (CreateFilegroupConf*)signal->getDataPtr();
+  createDDObjects(signal, conf->senderData + 1);
+}
+
+void
+Ndbcntr::execCREATE_FILE_REF(Signal* signal)
+{
+  jamEntry();
+  CreateFileRef* ref = (CreateFileRef*)signal->getDataPtr();
+  char buf[1024];
+
+  const ddentry* entry = &f_dd[ref->senderData];
+
+  if (entry->type == DictTabInfo::Undofile)
+  {
+    BaseString::snprintf(buf, sizeof(buf), "create undofile %s err %u",
+                         entry->name,
+                         ref->errorCode);
+  }
+  else if (entry->type == DictTabInfo::Datafile)
+  {
+    BaseString::snprintf(buf, sizeof(buf), "create datafile %s err %u",
+                         entry->name,
+                         ref->errorCode);
+  }
+  progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf);
+}
+
+void
+Ndbcntr::execCREATE_FILE_CONF(Signal* signal)
+{
+  jamEntry();
+  CreateFileConf* conf = (CreateFileConf*)signal->getDataPtr();
+  createDDObjects(signal, conf->senderData + 1);
+}
+
 void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
 {
   if (index >= g_sysTableCount) {
     ndbassert(index == g_sysTableCount);
-    startInsertTransactions(signal);
+    createDDObjects(signal, 0);
     return;
   }
   const SysTable& table = *g_sysTableList[index];
@@ -2917,25 +3241,30 @@ void Ndbcntr::execSTART_ORD(Signal* sign
 
 #define CLEAR_DX 13
 #define CLEAR_LCP 3
+#define CLEAR_DD 2
+// FileSystemPathDataFiles FileSystemPathUndoFiles
 
 void
 Ndbcntr::clearFilesystem(Signal* signal)
 {
-  const Uint32 lcp = c_fsRemoveCount >= CLEAR_DX;
-  
+  jam();
   FsRemoveReq * req  = (FsRemoveReq *)signal->getDataPtrSend();
   req->userReference = reference();
   req->userPointer   = 0;
   req->directory     = 1;
   req->ownDirectory  = 1;
 
-  if (lcp == 0)
+  const Uint32 DX = CLEAR_DX;
+  const Uint32 LCP = CLEAR_DX + CLEAR_LCP;
+  const Uint32 DD = CLEAR_DX + CLEAR_LCP + CLEAR_DD;
+
+  if (c_fsRemoveCount < DX)
   {
     FsOpenReq::setVersion(req->fileNumber, 3);
     FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_CTL); // Can by any...
     FsOpenReq::v1_setDisk(req->fileNumber, c_fsRemoveCount);
   }
-  else
+  else if (c_fsRemoveCount < LCP)
   {
     FsOpenReq::setVersion(req->fileNumber, 5);
     FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
@@ -2943,6 +3272,19 @@ Ndbcntr::clearFilesystem(Signal* signal)
     FsOpenReq::v5_setTableId(req->fileNumber, 0);
     FsOpenReq::v5_setFragmentId(req->fileNumber, 0);
   }
+  else if (c_fsRemoveCount < DD)
+  {
+    req->ownDirectory  = 0;
+    FsOpenReq::setVersion(req->fileNumber, 6);
+    FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
+    FsOpenReq::v5_setLcpNo(req->fileNumber,
+                           FsOpenReq::BP_DD_DF + c_fsRemoveCount - LCP);
+  }
+  else
+  {
+    ndbrequire(false);
+  }
+
   sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
              FsRemoveReq::SignalLength, JBA);
   c_fsRemoveCount++;
@@ -2951,12 +3293,12 @@ Ndbcntr::clearFilesystem(Signal* signal)
 void
 Ndbcntr::execFSREMOVECONF(Signal* signal){
   jamEntry();
-  if(c_fsRemoveCount == CLEAR_DX + CLEAR_LCP){
+  if(c_fsRemoveCount == CLEAR_DX + CLEAR_LCP + CLEAR_DD){
     jam();
     sendSttorry(signal);
   } else {
     jam();
-    ndbrequire(c_fsRemoveCount < CLEAR_DX + CLEAR_LCP);
+    ndbrequire(c_fsRemoveCount < CLEAR_DX + CLEAR_LCP + CLEAR_DD);
     clearFilesystem(signal);
   }//if
 }
@@ -3271,3 +3613,5 @@ UpgradeStartup::execCNTR_MASTER_REPLY(Si
   block.progError(__LINE__,NDBD_EXIT_NDBREQUIRE,
 		  "UpgradeStartup::execCNTR_MASTER_REPLY");
 }
+
+template class Vector<ddentry>;

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Filename.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Filename.cpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Filename.cpp	2009-02-20 08:46:10 +0000
@@ -46,7 +46,7 @@ Filename::~Filename(){
 }
 
 void 
-Filename::set(Filename::NameSpec& spec,
+Filename::set(const BaseString basepath[],
 	      BlockReference blockReference, 
 	      const Uint32 filenumber[4], bool dir) 
 {
@@ -59,14 +59,14 @@ Filename::set(Filename::NameSpec& spec,
   if (version == 2)
   {
     sz = BaseString::snprintf(theName, sizeof(theName), "%s", 
-         spec.backup_path.c_str());
-    m_base_name = theName + spec.backup_path.length();
+                              basepath[FsOpenReq::BP_BACKUP].c_str());
+    m_base_name = theName + basepath[FsOpenReq::BP_BACKUP].length();
   }
   else
   {
     sz = BaseString::snprintf(theName, sizeof(theName), "%s", 
-         spec.fs_path.c_str());
-    m_base_name = theName + spec.fs_path.length();
+                              basepath[FsOpenReq::BP_FS].c_str());
+    m_base_name = theName + basepath[FsOpenReq::BP_FS].length();
   }
   
   switch(version){
@@ -120,14 +120,14 @@ Filename::set(Filename::NameSpec& spec,
     const Uint32 nodeId = FsOpenReq::v2_getNodeId(filenumber);
     const Uint32 count = FsOpenReq::v2_getCount(filenumber);
     
-    BaseString::snprintf(buf, sizeof(buf), "BACKUP%sBACKUP-%d%s",
+    BaseString::snprintf(buf, sizeof(buf), "BACKUP%sBACKUP-%u%s",
 	     DIR_SEPARATOR, seq, DIR_SEPARATOR); 
     strcat(theName, buf);
     if(count == 0xffffffff) {
-      BaseString::snprintf(buf, sizeof(buf), "BACKUP-%d.%d",
+      BaseString::snprintf(buf, sizeof(buf), "BACKUP-%u.%d",
 	       seq, nodeId); strcat(theName, buf);
     } else {
-      BaseString::snprintf(buf, sizeof(buf), "BACKUP-%d-%d.%d",
+      BaseString::snprintf(buf, sizeof(buf), "BACKUP-%u-%d.%d",
 	       seq, count, nodeId); strcat(theName, buf);
     }
     break;
@@ -153,6 +153,13 @@ Filename::set(Filename::NameSpec& spec,
     strcat(theName, buf);
     break;
   }
+  case 6:
+  {
+    Uint32 bp = FsOpenReq::v5_getLcpNo(filenumber);
+    sz = BaseString::snprintf(theName, sizeof(theName), "%s",
+                              basepath[bp].c_str());
+    break;
+  }
   default:
     ERROR_SET(ecError, NDBD_EXIT_AFS_PARAMETER,"","Wrong version");
   }
@@ -173,7 +180,7 @@ Filename::set(Filename::NameSpec& spec,
 }
 
 void 
-Filename::set(Filename::NameSpec& spec,
+Filename::set(const BaseString & basepath,
 	      SegmentedSectionPtr ptr, class SectionSegmentPool& pool)
 {
   char buf[PATH_MAX];
@@ -185,7 +192,8 @@ Filename::set(Filename::NameSpec& spec,
   }
   else 
   {
-    snprintf(theName, sizeof(theName), "%s%s", spec.fs_path.c_str(), buf);
-    m_base_name = theName + spec.fs_path.length();
+    snprintf(theName, sizeof(theName), "%s%s",
+             basepath.c_str(), buf);
+    m_base_name = theName + basepath.length();
   }
 }

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Filename.hpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Filename.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Filename.hpp	2009-02-17 07:52:13 +0000
@@ -62,19 +62,12 @@ public:
   Filename();
   ~Filename();
 
-  struct NameSpec {
-    NameSpec(BaseString& f, BaseString&b) :
-      fs_path(f), backup_path(b) {}
-    BaseString& fs_path;
-    BaseString& backup_path;
-  };
-  
-  void set(NameSpec& spec, 
+  void set(const BaseString basepath[],
 	   BlockReference, const Uint32 fileno[4], bool = false);
-  void set(NameSpec& spec, 
+  void set(const BaseString & basepath,
 	   SegmentedSectionPtr ptr, class SectionSegmentPool&);
   
-  const char* c_str() const;     // Complete name including dirname
+  const char* c_str() const;         // Complete name including dirname
   const char* get_base_name() const; // Exclude fs (or backup) path
 private:
   char theName[PATH_MAX];

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp	2008-11-18 10:24:01 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp	2009-02-17 08:15:07 +0000
@@ -90,6 +90,53 @@ Ndbfs::~Ndbfs()
     delete theRequestPool;
 }
 
+static
+bool
+do_mkdir(const char * path)
+{
+#ifdef NDB_WIN32
+  return CreateDirectory(path, 0);
+#else
+  return ::mkdir(path, S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP) == 0;
+#endif
+}
+
+static
+void
+add_path(BaseString& dst, const char * add)
+{
+  const char * tmp = dst.c_str();
+  unsigned len = dst.length();
+  unsigned dslen = (unsigned)strlen(DIR_SEPARATOR);
+
+  if (len > dslen && strcmp(tmp+(len - dslen), DIR_SEPARATOR) != 0)
+    dst.append(DIR_SEPARATOR);
+  dst.append(add);
+}
+
+static
+bool
+validate_path(BaseString & dst,
+              const char * path)
+{
+  char buf2[PATH_MAX];
+  memset(buf2, 0,sizeof(buf2));
+#ifdef NDB_WIN32
+  CreateDirectory(path, 0);
+  char* szFilePart;
+  if(!GetFullPathName(path, sizeof(buf2), buf2, &szFilePart) ||
+     (GetFileAttributes(buf2) & FILE_ATTRIBUTE_READONLY))
+    return false;
+#else
+  if (::realpath(path, buf2) == NULL ||
+      ::access(buf2, W_OK) != 0)
+    return false;
+#endif
+  dst.assign(buf2);
+  add_path(dst, "");
+  return true;
+}
+
 void 
 Ndbfs::execREAD_CONFIG_REQ(Signal* signal)
 {
@@ -101,12 +148,67 @@ Ndbfs::execREAD_CONFIG_REQ(Signal* signa
   const ndb_mgm_configuration_iterator * p = 
     m_ctx.m_config.getOwnConfigIterator();
   ndbrequire(p != 0);
-  theFileSystemPath.assfmt("%sndb_%u_fs%s", m_ctx.m_config.fileSystemPath(),
-			   getOwnNodeId(), DIR_SEPARATOR);
-  theBackupFilePath.assign(m_ctx.m_config.backupFilePath());
+  BaseString tmp;
+  tmp.assfmt("ndb_%u_fs%s", getOwnNodeId(), DIR_SEPARATOR);
+  m_base_path[FsOpenReq::BP_FS].assfmt("%s%s",
+                                       m_ctx.m_config.fileSystemPath(),
+                                       tmp.c_str());
+  m_base_path[FsOpenReq::BP_BACKUP].assign(m_ctx.m_config.backupFilePath());
 
   theRequestPool = new Pool<Request>;
 
+  const char * ddpath = 0;
+  ndb_mgm_get_string_parameter(p, CFG_DB_DD_FILESYSTEM_PATH, &ddpath);
+
+  {
+    const char * datapath = 0;
+    ndb_mgm_get_string_parameter(p, CFG_DB_DD_DATAFILE_PATH, &datapath);
+    if (datapath == 0)
+    {
+      if (ddpath)
+        datapath = ddpath;
+      else
+        datapath = m_ctx.m_config.fileSystemPath();
+    }
+
+    BaseString path;
+    add_path(path, datapath);
+    do_mkdir(path.c_str());
+    add_path(path, tmp.c_str());
+    do_mkdir(path.c_str());
+    if (!validate_path(m_base_path[FsOpenReq::BP_DD_DF], path.c_str()))
+    {
+      ERROR_SET(fatal, NDBD_EXIT_AFS_INVALIDPATH,
+                m_base_path[FsOpenReq::BP_DD_DF].c_str(),
+                "FileSystemPathDataFiles");
+    }
+  }
+
+  {
+    const char * undopath = 0;
+    ndb_mgm_get_string_parameter(p, CFG_DB_DD_UNDOFILE_PATH, &undopath);
+    if (undopath == 0)
+    {
+      if (ddpath)
+        undopath = ddpath;
+      else
+        undopath = m_ctx.m_config.fileSystemPath();
+    }
+
+    BaseString path;
+    add_path(path, undopath);
+    do_mkdir(path.c_str());
+    add_path(path, tmp.c_str());
+    do_mkdir(path.c_str());
+
+    if (!validate_path(m_base_path[FsOpenReq::BP_DD_UF], path.c_str()))
+    {
+      ERROR_SET(fatal, NDBD_EXIT_AFS_INVALIDPATH,
+                m_base_path[FsOpenReq::BP_DD_UF].c_str(),
+                "FileSystemPathUndoFiles");
+    }
+  }
+
   m_maxFiles = 0;
   ndb_mgm_get_int_parameter(p, CFG_DB_MAX_OPEN_FILES, &m_maxFiles);
   Uint32 noIdleFiles = 27;
@@ -143,14 +245,7 @@ Ndbfs::execSTTOR(Signal* signal)
   if(signal->theData[1] == 0){ // StartPhase 0
     jam();
     
-    {
-#ifdef NDB_WIN32
-      CreateDirectory(theFileSystemPath.c_str(), 0);
-#else
-      mkdir(theFileSystemPath.c_str(),
-	    S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IRGRP);
-#endif
-    }      
+    do_mkdir(m_base_path[FsOpenReq::BP_FS].c_str());
     
     cownref = NDBFS_REF;
     // close all open files
@@ -184,7 +279,6 @@ Ndbfs::execFSOPENREQ(Signal* signal)
   const BlockReference userRef = fsOpenReq->userReference;
   AsyncFile* file = getIdleFile();
   ndbrequire(file != NULL);
-  Filename::NameSpec spec(theFileSystemPath, theBackupFilePath);
 
   Uint32 userPointer = fsOpenReq->userPointer;
   
@@ -219,13 +313,28 @@ Ndbfs::execFSOPENREQ(Signal* signal)
   
   if(signal->getNoOfSections() == 0){
     jam();
-    file->theFileName.set(spec, userRef, fsOpenReq->fileNumber);
+    file->theFileName.set(m_base_path, userRef, fsOpenReq->fileNumber);
   } else {
     jam();
     SectionHandle handle(this, signal);
     SegmentedSectionPtr ptr;
     handle.getSection(ptr, FsOpenReq::FILENAME);
-    file->theFileName.set(spec, ptr, g_sectionSegmentPool);
+    // QOD, should be arg to FSOPEN
+    if (refToMain(userRef) == TSMAN)
+    {
+      file->theFileName.set(m_base_path[FsOpenReq::BP_DD_DF],
+                            ptr, g_sectionSegmentPool);
+    }
+    else if (refToMain(userRef) == LGMAN)
+    {
+      file->theFileName.set(m_base_path[FsOpenReq::BP_DD_UF],
+                            ptr, g_sectionSegmentPool);
+    }
+    else
+    {
+      file->theFileName.set(m_base_path[FsOpenReq::BP_FS],
+                            ptr, g_sectionSegmentPool);
+    }
     releaseSections(handle);
   }
   file->reportTo(&theFromThreads);
@@ -257,10 +366,11 @@ Ndbfs::execFSREMOVEREQ(Signal* signal)
   AsyncFile* file = getIdleFile();
   ndbrequire(file != NULL);
 
-  Filename::NameSpec spec(theFileSystemPath, theBackupFilePath);
-  file->theFileName.set(spec, userRef, req->fileNumber, req->directory);
+  Uint32 version = FsOpenReq::getVersion(req->fileNumber);
+  Uint32 bp = FsOpenReq::v5_getLcpNo(req->fileNumber);
+  file->theFileName.set(m_base_path, userRef, req->fileNumber, req->directory);
   file->reportTo(&theFromThreads);
-  
+
   Request* request = theRequestPool->get();
   request->action = Request::rmrf;
   request->par.rmrf.directory = req->directory;
@@ -270,7 +380,16 @@ Ndbfs::execFSREMOVEREQ(Signal* signal)
   request->file = file;
   request->theTrace = signal->getTrace();
   
+  if (version == 6)
+  {
+    if (m_base_path[FsOpenReq::BP_FS] == m_base_path[bp])
+      goto ignore;
+  }
+
   ndbrequire(forward(file, request));
+  return;
+ignore:
+  report(request, signal);
 }
 
 /*

=== modified file 'storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.hpp'
--- a/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.hpp	2009-02-17 07:52:13 +0000
@@ -21,7 +21,7 @@
 #include "Pool.hpp"
 #include "AsyncFile.hpp"
 #include "OpenFiles.hpp"
-
+#include <signaldata/FsOpenReq.hpp>
 
 
 // Because one NDB Signal request can result in multiple requests to
@@ -81,8 +81,7 @@ private:
   Vector<AsyncFile*> theIdleFiles; // List of idle AsyncFiles
   OpenFiles theOpenFiles;          // List of open AsyncFiles
 
-  BaseString theFileSystemPath;
-  BaseString theBackupFilePath;
+  BaseString m_base_path[FsOpenReq::BP_MAX];
   
   // Statistics variables
   Uint32 m_maxOpenedFiles;

=== modified file 'storage/ndb/src/kernel/blocks/print_file.cpp'
--- a/storage/ndb/src/kernel/blocks/print_file.cpp	2006-12-31 00:04:59 +0000
+++ b/storage/ndb/src/kernel/blocks/print_file.cpp	2009-02-18 21:56:20 +0000
@@ -193,7 +193,7 @@ print_extent_page(int count, void* ptr, 
   int no = count * per_page;
   
   const int max = count < g_df_zero.m_extent_pages ? 
-    per_page : g_df_zero.m_extent_count % per_page;
+    per_page : g_df_zero.m_extent_count - (g_df_zero.m_extent_count - 1) * per_page;
 
   File_formats::Datafile::Extent_page * page = 
     (File_formats::Datafile::Extent_page*)ptr;
@@ -201,7 +201,7 @@ print_extent_page(int count, void* ptr, 
   ndbout << "Extent page: " << count
 	 << ", lsn = [ " 
 	 << page->m_page_header.m_page_lsn_hi << " " 
-	 << page->m_page_header.m_page_lsn_lo << "]" 
+	 << page->m_page_header.m_page_lsn_lo << "] " 
 	 << endl;
   for(int i = 0; i<max; i++)
   {

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2008-11-13 13:15:56 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/Qmgr.hpp	2009-02-18 14:29:58 +0000
@@ -156,6 +156,8 @@ public:
     QmgrState sendPresToStatus;
     FailState failState;
     BlockReference blockRef;
+    Uint64 m_secret;
+    Uint64 m_alloc_timeout;
 
     NodeRec() { }
   }; /* p2c: size = 52 bytes */
@@ -308,7 +310,7 @@ private:
   void electionWon(Signal* signal);
   void cmInfoconf010Lab(Signal* signal);
   
-  void apiHbHandlingLab(Signal* signal);
+  void apiHbHandlingLab(Signal* signal, Uint64 now);
   void timerHandlingLab(Signal* signal);
   void hbReceivedLab(Signal* signal);
   void sendCmRegrefLab(Signal* signal, BlockReference ref, 

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp	2008-11-13 13:15:56 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrInit.cpp	2009-02-18 14:29:58 +0000
@@ -27,6 +27,10 @@ void Qmgr::initData() 
 
   // Records with constant sizes
   nodeRec = new NodeRec[MAX_NODES];
+  for (Uint32 i = 0; i<MAX_NODES; i++)
+  {
+    nodeRec[i].m_secret = 0;
+  }
 
   cnoCommitFailedNodes = 0;
   c_maxDynamicId = 0;

=== modified file 'storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp'
--- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2009-01-29 16:42:07 +0000
+++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp	2009-03-12 10:51:59 +0000
@@ -436,9 +436,14 @@ void Qmgr::execCONNECT_REP(Signal* signa
     infoEvent("Discarding CONNECT_REP(%d)", nodeId);
     return;
   }
-  
+
   c_connectedNodes.set(nodeId);
+
   NodeRecPtr nodePtr;
+  nodePtr.i = nodeId;
+  ptrCheckGuard(nodePtr, MAX_NODES, nodeRec);
+  nodePtr.p->m_secret = 0;
+
   nodePtr.i = getOwnNodeId();
   ptrCheckGuard(nodePtr, MAX_NODES, nodeRec);
   NodeInfo nodeInfo = getNodeInfo(nodeId);
@@ -2367,7 +2372,7 @@ void Qmgr::timerHandlingLab(Signal* sign
   {
     jam();
     hb_api_timer.reset();
-    apiHbHandlingLab(signal);
+    apiHbHandlingLab(signal, TcurrentTime);
   }
 
   if (cactivateApiCheck != 0) {
@@ -2473,7 +2478,7 @@ void Qmgr::checkHeartbeat(Signal* signal
   }//if
 }//Qmgr::checkHeartbeat()
 
-void Qmgr::apiHbHandlingLab(Signal* signal) 
+void Qmgr::apiHbHandlingLab(Signal* signal, Uint64 now)
 {
   NodeRecPtr TnodePtr;
 
@@ -2518,6 +2523,14 @@ void Qmgr::apiHbHandlingLab(Signal* sign
         api_failed(signal, nodeId);
       }//if
     }//if
+    else if (TnodePtr.p->phase == ZAPI_INACTIVE &&
+             TnodePtr.p->m_secret != 0 && now > TnodePtr.p->m_alloc_timeout)
+    {
+      jam();
+      TnodePtr.p->m_secret = 0;
+      warningEvent("Releasing node id allocation for node %u",
+                   TnodePtr.i);
+    }
   }//for
   return;
 }//Qmgr::apiHbHandlingLab()
@@ -2552,6 +2565,7 @@ void Qmgr::checkStartInterface(Signal* s
 	 * IS COMPLETE.
 	 *-------------------------------------------------------------------*/
         nodePtr.p->failState = NORMAL;
+        nodePtr.p->m_secret = 0;
         Uint32 type = getNodeInfo(nodePtr.i).m_type;
         switch(type){
         case NodeInfo::DB:
@@ -2848,6 +2862,7 @@ void Qmgr::node_failed(Signal* signal, U
    *-----------------------------------------------------------------------*/
   failedNodePtr.i = aFailedNode;
   ptrCheckGuard(failedNodePtr, MAX_NODES, nodeRec);
+  failedNodePtr.p->m_secret = 0; // Not yet Uint64(rand()) << 32 + rand();
 
   ndbrequire(getNodeInfo(failedNodePtr.i).getType() == NodeInfo::DB);
   
@@ -2918,7 +2933,8 @@ Qmgr::api_failed(Signal* signal, Uint32 
    *-----------------------------------------------------------------------*/
   failedNodePtr.i = nodeId;
   ptrCheckGuard(failedNodePtr, MAX_NODES, nodeRec);
-  
+  failedNodePtr.p->m_secret = 0; // Not yet Uint64(rand()) << 32 + rand();
+
   if (failedNodePtr.p->phase == ZFAIL_CLOSING)
   {
     /**
@@ -5337,22 +5353,37 @@ void
 Qmgr::execALLOC_NODEID_REQ(Signal * signal)
 {
   jamEntry();
-  const AllocNodeIdReq * req = (AllocNodeIdReq*)signal->getDataPtr();
-  Uint32 senderRef = req->senderRef;
-  Uint32 nodeId = req->nodeId;
-  Uint32 nodeType = req->nodeType;
+  AllocNodeIdReq req = *(AllocNodeIdReq*)signal->getDataPtr();
   Uint32 error = 0;
 
-  if (refToBlock(senderRef) != QMGR) // request from management server
+  NodeRecPtr nodePtr;
+  nodePtr.i = req.nodeId;
+  ptrAss(nodePtr, nodeRec);
+
+  if (refToBlock(req.senderRef) != QMGR) // request from management server
   {
     /* master */
 
     if (getOwnNodeId() != cpresident)
+    {
+      jam();
       error = AllocNodeIdRef::NotMaster;
+    }
     else if (!opAllocNodeIdReq.m_tracker.done())
+    {
+      jam();
       error = AllocNodeIdRef::Busy;
-    else if (c_connectedNodes.get(nodeId))
+    }
+    else if (c_connectedNodes.get(req.nodeId))
+    {
+      jam();
       error = AllocNodeIdRef::NodeConnected;
+    }
+    else if (nodePtr.p->m_secret != 0)
+    {
+      jam();
+      error = AllocNodeIdRef::NodeReserved;
+    }
 
     if (error)
     {
@@ -5361,60 +5392,99 @@ Qmgr::execALLOC_NODEID_REQ(Signal * sign
       ref->senderRef = reference();
       ref->errorCode = error;
       ref->masterRef = numberToRef(QMGR, cpresident);
-      sendSignal(senderRef, GSN_ALLOC_NODEID_REF, signal,
+      ref->senderData = req.senderData;
+      ref->nodeId = req.nodeId;
+      sendSignal(req.senderRef, GSN_ALLOC_NODEID_REF, signal,
                  AllocNodeIdRef::SignalLength, JBB);
       return;
     }
 
-    if (ERROR_INSERTED(934) && nodeId != getOwnNodeId())
+    if (ERROR_INSERTED(934) && req.nodeId != getOwnNodeId())
     {
       CRASH_INSERTION(934);
     }
+
+    /**
+     * generate secret
+     */
+    Uint64 now = NdbTick_CurrentMillisecond();
+    Uint32 secret_hi = now >> 24;
+    Uint32 secret_lo = Uint32(now << 8) + getOwnNodeId();
+    req.secret_hi = secret_hi;
+    req.secret_lo = secret_lo;
+
+    if (req.timeout > 60000)
+      req.timeout = 60000;
+
+    nodePtr.p->m_secret = (Uint64(secret_hi) << 32) + secret_lo;
+    nodePtr.p->m_alloc_timeout = now + req.timeout;
     
-    opAllocNodeIdReq.m_req = *req;
+    opAllocNodeIdReq.m_req = req;
     opAllocNodeIdReq.m_error = 0;
-    opAllocNodeIdReq.m_connectCount = getNodeInfo(refToNode(senderRef)).m_connectCount;
+    opAllocNodeIdReq.m_connectCount =
+      getNodeInfo(refToNode(req.senderRef)).m_connectCount;
 
     jam();
-    AllocNodeIdReq * req = (AllocNodeIdReq*)signal->getDataPtrSend();
-    req->senderRef = reference();
+    AllocNodeIdReq * req2 = (AllocNodeIdReq*)signal->getDataPtrSend();
+    * req2 = req;
+    req2->senderRef = reference();
     NodeReceiverGroup rg(QMGR, c_clusterNodes);
     RequestTracker & p = opAllocNodeIdReq.m_tracker;
     p.init<AllocNodeIdRef>(c_counterMgr, rg, GSN_ALLOC_NODEID_REF, 0);
 
     sendSignal(rg, GSN_ALLOC_NODEID_REQ, signal,
-               AllocNodeIdReq::SignalLength, JBB);
+               AllocNodeIdReq::SignalLengthQMGR, JBB);
     return;
   }
 
   /* participant */
-
-  if (c_connectedNodes.get(nodeId))
+  if (c_connectedNodes.get(req.nodeId))
+  {
+    jam();
     error = AllocNodeIdRef::NodeConnected;
-  else
+  }
+  else if (req.nodeType != getNodeInfo(req.nodeId).m_type)
   {
-    NodeRecPtr nodePtr;
-    nodePtr.i = nodeId;
-    ptrAss(nodePtr, nodeRec);
-    if (nodeType != getNodeInfo(nodeId).m_type)
-      error = AllocNodeIdRef::NodeTypeMismatch;
-    else if (nodePtr.p->failState != NORMAL)
-      error = AllocNodeIdRef::NodeFailureHandlingNotCompleted;
+    jam();
+    error = AllocNodeIdRef::NodeTypeMismatch;
+  }
+  else if (nodePtr.p->failState != NORMAL)
+  {
+    jam();
+    error = AllocNodeIdRef::NodeFailureHandlingNotCompleted;
+  }
+#if 0
+  /**
+   * For now only make "time/secret" based reservation on master
+   *   as we otherwise also need to clear it on failure + handle
+   *   master failure
+   */
+  else if (nodePtr.p->m_secret != 0)
+  {
+    jam();
+    error = AllocNodeIdRef::NodeReserved;
   }
+#endif
 
   if (error)
   {
+    jam();
     AllocNodeIdRef * ref = (AllocNodeIdRef*)signal->getDataPtrSend();
     ref->senderRef = reference();
     ref->errorCode = error;
-    sendSignal(senderRef, GSN_ALLOC_NODEID_REF, signal,
+    ref->senderData = req.senderData;
+    ref->nodeId = req.nodeId;
+    ref->masterRef = numberToRef(QMGR, cpresident);
+    sendSignal(req.senderRef, GSN_ALLOC_NODEID_REF, signal,
                AllocNodeIdRef::SignalLength, JBB);
     return;
   }
 
   AllocNodeIdConf * conf = (AllocNodeIdConf*)signal->getDataPtrSend();
   conf->senderRef = reference();
-  sendSignal(senderRef, GSN_ALLOC_NODEID_CONF, signal,
+  conf->secret_hi = req.secret_hi;
+  conf->secret_lo = req.secret_lo;
+  sendSignal(req.senderRef, GSN_ALLOC_NODEID_CONF, signal,
              AllocNodeIdConf::SignalLength, JBB);
 }
 
@@ -5427,6 +5497,22 @@ Qmgr::execALLOC_NODEID_CONF(Signal * sig
   const AllocNodeIdConf * conf = (AllocNodeIdConf*)signal->getDataPtr();
   opAllocNodeIdReq.m_tracker.reportConf(c_counterMgr,
                                         refToNode(conf->senderRef));
+
+  if (signal->getLength() >= AllocNodeIdConf::SignalLength)
+  {
+    jam();
+    if (opAllocNodeIdReq.m_req.secret_hi != conf->secret_hi ||
+        opAllocNodeIdReq.m_req.secret_lo != conf->secret_lo)
+    {
+      jam();
+      if (opAllocNodeIdReq.m_error == 0)
+      {
+        jam();
+        opAllocNodeIdReq.m_error = AllocNodeIdRef::Undefined;
+      }
+    }
+  }
+
   completeAllocNodeIdReq(signal);
 }
 
@@ -5440,15 +5526,20 @@ Qmgr::execALLOC_NODEID_REF(Signal * sign
   const AllocNodeIdRef * ref = (AllocNodeIdRef*)signal->getDataPtr();
   if (ref->errorCode == AllocNodeIdRef::NF_FakeErrorREF)
   {
+    jam();
     opAllocNodeIdReq.m_tracker.ignoreRef(c_counterMgr,
                                          refToNode(ref->senderRef));    
   }
   else
   {
+    jam();
     opAllocNodeIdReq.m_tracker.reportRef(c_counterMgr,
                                          refToNode(ref->senderRef));
     if (opAllocNodeIdReq.m_error == 0)
+    {
+      jam();
       opAllocNodeIdReq.m_error = ref->errorCode;
+    }
   }
   completeAllocNodeIdReq(signal);
 }
@@ -5475,6 +5566,17 @@ Qmgr::completeAllocNodeIdReq(Signal *sig
   if (opAllocNodeIdReq.m_tracker.hasRef())
   {
     jam();
+
+    {
+      /**
+       * Clear reservation
+       */
+      NodeRecPtr nodePtr;
+      nodePtr.i = opAllocNodeIdReq.m_req.nodeId;
+      ptrAss(nodePtr, nodeRec);
+      nodePtr.p->m_secret = 0;
+    }
+
     AllocNodeIdRef * ref = (AllocNodeIdRef*)signal->getDataPtrSend();
     ref->senderRef = reference();
     ref->senderData = opAllocNodeIdReq.m_req.senderData;
@@ -5486,12 +5588,15 @@ Qmgr::completeAllocNodeIdReq(Signal *sig
                AllocNodeIdRef::SignalLength, JBB);
     return;
   }
+
   jam();
+
   AllocNodeIdConf * conf = (AllocNodeIdConf*)signal->getDataPtrSend();
   conf->senderRef = reference();
   conf->senderData = opAllocNodeIdReq.m_req.senderData;
   conf->nodeId = opAllocNodeIdReq.m_req.nodeId;
-  ndbassert(AllocNodeIdConf::SignalLength == 3);
+  conf->secret_lo = opAllocNodeIdReq.m_req.secret_lo;
+  conf->secret_hi = opAllocNodeIdReq.m_req.secret_hi;
   sendSignal(opAllocNodeIdReq.m_req.senderRef, GSN_ALLOC_NODEID_CONF, signal,
              AllocNodeIdConf::SignalLength, JBB);
 }

=== modified file 'storage/ndb/src/kernel/blocks/trix/Trix.cpp'
--- a/storage/ndb/src/kernel/blocks/trix/Trix.cpp	2008-09-30 08:23:31 +0000
+++ b/storage/ndb/src/kernel/blocks/trix/Trix.cpp	2009-02-27 15:30:33 +0000
@@ -34,6 +34,17 @@
 
 #define CONSTRAINT_VIOLATION 893
 
+static
+bool
+check_timeout(Uint32 errCode)
+{
+  switch(errCode){
+  case 266:
+    return true;
+  }
+  return false;
+}
+
 #define DEBUG(x) { ndbout << "TRIX::" << x << endl; }
 
 /**
@@ -604,9 +615,20 @@ void Trix::execUTIL_EXECUTE_REF(Signal* 
   subRecPtr.p = subRec;
   ndbrequire(utilExecuteRef->errorCode == UtilExecuteRef::TCError);
   if(utilExecuteRef->TCErrorCode == CONSTRAINT_VIOLATION)
+  {
+    jam();
     buildFailed(signal, subRecPtr, BuildIndxRef::IndexNotUnique);
+  }
+  else if (check_timeout(utilExecuteRef->TCErrorCode))
+  {
+    jam();
+    buildFailed(signal, subRecPtr, BuildIndxRef::DeadlockError);
+  }
   else
+  {
+    jam();
     buildFailed(signal, subRecPtr, BuildIndxRef::InternalError);
+  }
 }
 
 void Trix::execSUB_CREATE_CONF(Signal* signal)

=== modified file 'storage/ndb/src/kernel/blocks/tsman.cpp'
--- a/storage/ndb/src/kernel/blocks/tsman.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/src/kernel/blocks/tsman.cpp	2009-03-12 10:51:59 +0000
@@ -844,7 +844,7 @@ Tsman::execFSWRITEREQ(Signal* signal)
     }
     if (page_no == extent_pages)
     {
-      Uint32 last = extents % per_page; 
+      Uint32 last = extents - ((extent_pages - 1) * per_page);
       page->get_header(last - 1, size)->m_next_free_extent = RNIL;
     }
   }
@@ -1142,6 +1142,8 @@ Tsman::load_extent_page_callback(Signal*
   Ptr<Tablespace> ts_ptr;
   m_tablespace_pool.getPtr(ts_ptr, ptr.p->m_tablespace_ptr_i);
   if (getNodeState().startLevel >= NodeState::SL_STARTED ||
+      (getNodeState().startLevel == NodeState::SL_STARTING &&
+       getNodeState().starting.restartType == NodeState::ST_INITIAL_START) ||
       (getNodeState().getNodeRestartInProgress() &&
        getNodeState().starting.restartType == NodeState::ST_INITIAL_NODE_RESTART))
   {
@@ -1246,7 +1248,8 @@ Tsman::scan_extent_headers(Signal* signa
        * Last extent header page...
        *   set correct no of extent headers
        */
-      extents= (datapages / size) % per_page;
+      Uint32 total_extents = datapages / size;
+      extents= total_extents - (pages - 1)*per_page;
     }
     for(Uint32 j = 0; j<extents; j++)
     {

=== modified file 'storage/ndb/src/kernel/vm/DataBuffer.hpp'
--- a/storage/ndb/src/kernel/vm/DataBuffer.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/src/kernel/vm/DataBuffer.hpp	2009-02-19 10:01:01 +0000
@@ -325,7 +325,6 @@ DataBuffer<sz>::seize(Uint32 n){
    */
   Uint32 free = thePool.getNoOfFree() * sz + rest;
   if(n > free){
-    release();
     return false;
   }
     

=== modified file 'storage/ndb/src/kernel/vm/Mutex.hpp'
--- a/storage/ndb/src/kernel/vm/Mutex.hpp	2007-11-12 16:13:49 +0000
+++ b/storage/ndb/src/kernel/vm/Mutex.hpp	2009-02-20 10:20:59 +0000
@@ -51,6 +51,10 @@ public:
   bool isNull() const;
   void release(SimulatedBlock::MutexManager & mgr);
 
+  Uint32 getHandle() const;
+  void setHandle(Uint32 handle);
+  void clear(); // disassociate handle from activemutexptr
+
 private:
   Uint32 m_activeMutexPtrI;
 };
@@ -134,6 +138,35 @@ MutexHandle2<MutexId>::release(Simulated
   }
 }
 
+template<Uint32 MutexId>
+inline
+Uint32
+MutexHandle2<MutexId>::getHandle() const
+{
+  return m_activeMutexPtrI;
+}
+
+template<Uint32 MutexId>
+inline
+void
+MutexHandle2<MutexId>::clear()
+{
+  m_activeMutexPtrI = RNIL;
+}
+
+template<Uint32 MutexId>
+inline
+void
+MutexHandle2<MutexId>::setHandle(Uint32 val)
+{
+  if (m_activeMutexPtrI == RNIL)
+  {
+    m_activeMutexPtrI = val;
+    return;
+  }
+  ErrorReporter::handleAssert("Mutex::setHandle mutex alreay inuse", 
+			      __FILE__, __LINE__);
+}
 
 inline
 Mutex::Mutex(Signal* signal, SimulatedBlock::MutexManager & mgr, 

=== modified file 'storage/ndb/src/mgmclient/CommandInterpreter.cpp'
--- a/storage/ndb/src/mgmclient/CommandInterpreter.cpp	2008-12-17 07:52:05 +0000
+++ b/storage/ndb/src/mgmclient/CommandInterpreter.cpp	2009-02-20 08:51:22 +0000
@@ -747,7 +747,7 @@ printLogEvent(struct ndb_logevent* event
 #undef  EVENT
 #define EVENT BackupStarted
   case NDB_LE_BackupStarted:
-      ndbout_c("Node %u: Backup %d started from node %d",
+      ndbout_c("Node %u: Backup %u started from node %d",
                R, Q(backup_id), Q(starting_node));
       break;
 #undef EVENT
@@ -787,7 +787,7 @@ printLogEvent(struct ndb_logevent* event
 #undef  EVENT
 #define EVENT BackupAborted
     case NDB_LE_BackupAborted:
-      ndbout_c("Node %u: Backup %d started from %d has been aborted. Error: %d",
+      ndbout_c("Node %u: Backup %u started from %d has been aborted. Error: %d",
                R, Q(backup_id), Q(starting_node), Q(error));
       break;
     /** 

=== modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp	2009-03-12 10:51:59 +0000
@@ -1547,6 +1547,73 @@ const ConfigInfo::ParamInfo ConfigInfo::
     "false",
     "true"},
 
+  {
+    CFG_DB_DD_FILESYSTEM_PATH,
+    "FileSystemPathDD",
+    DB_TOKEN,
+    "Path to directory where the "DB_TOKEN_PRINT" node stores its disk-data/undo-files",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
+    CFG_DB_DD_DATAFILE_PATH,
+    "FileSystemPathDataFiles",
+    DB_TOKEN,
+    "Path to directory where the "DB_TOKEN_PRINT" node stores its disk-data-files",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
+    CFG_DB_DD_UNDOFILE_PATH,
+    "FileSystemPathUndoFiles",
+    DB_TOKEN,
+    "Path to directory where the "DB_TOKEN_PRINT" node stores its disk-undo-files",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
+    CFG_DB_DD_LOGFILEGROUP_SPEC,
+    "InitialLogfileGroup",
+    DB_TOKEN,
+    "Logfile group that will be created during initial start",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
+    CFG_DB_DD_TABLEPACE_SPEC,
+    "InitialTablespace",
+    DB_TOKEN,
+    "Tablespace that will be created during initial start",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_STRING,
+    UNDEFINED,
+    0, 0 },
+
+  {
+    CFG_DB_LCP_TRY_LOCK_TIMEOUT,
+    "MaxLCPStartDelay",
+    DB_TOKEN,
+    "Time in seconds that LCP will poll for checkpoint mutex, before putting it self in lock-queue",
+    ConfigInfo::CI_USED,
+    false,
+    ConfigInfo::CI_INT,
+    "0",
+    "0",
+    "600" },
+
   /***************************************************************************
    * API
    ***************************************************************************/

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.cpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2009-01-08 15:25:14 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2009-02-23 11:16:08 +0000
@@ -496,7 +496,7 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_
     int error_code;
 
     if (!alloc_node_id(&tmp, NDB_MGM_NODE_TYPE_MGM,
-		       0, 0, error_code, error_string)){
+		       0, 0, error_code, error_string, 20)){
       ndbout << "Unable to obtain requested nodeid: "
 	     << error_string.c_str() << endl;
       require(false);
@@ -2144,7 +2144,9 @@ MgmtSrvr::get_connected_nodes(NodeBitmas
 }
 
 int
-MgmtSrvr::alloc_node_id_req(NodeId free_node_id, enum ndb_mgm_node_type type)
+MgmtSrvr::alloc_node_id_req(NodeId free_node_id,
+                            enum ndb_mgm_node_type type,
+                            Uint32 timeout_ms)
 {
   SignalSender ss(theFacade);
   ss.lock(); // lock will be released on exit
@@ -2158,6 +2160,7 @@ MgmtSrvr::alloc_node_id_req(NodeId free_
   req->senderData = 19;
   req->nodeId = free_node_id;
   req->nodeType = type;
+  req->timeout = timeout_ms;
 
   int do_send = 1;
   NodeId nodeId = 0;
@@ -2241,141 +2244,165 @@ MgmtSrvr::alloc_node_id_req(NodeId free_
   return 0;
 }
 
-bool
-MgmtSrvr::alloc_node_id(NodeId * nodeId, 
-			enum ndb_mgm_node_type type,
-			struct sockaddr *client_addr, 
-			SOCKET_SIZE_TYPE *client_addr_len,
-			int &error_code, BaseString &error_string,
-                        int log_event)
+int
+MgmtSrvr::match_hostname(const struct sockaddr *clnt_addr,
+                         const char *config_hostname) const
 {
-  DBUG_ENTER("MgmtSrvr::alloc_node_id");
-  DBUG_PRINT("enter", ("nodeid: %d  type: %d  client_addr: 0x%ld",
-		       *nodeId, type, (long) client_addr));
-  if (g_no_nodeid_checks) {
-    if (*nodeId == 0) {
-      error_string.appfmt("no-nodeid-checks set in management server.\n"
-			  "node id must be set explicitly in connectstring");
-      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-      DBUG_RETURN(false);
+  struct in_addr config_addr= {0};
+  if (clnt_addr)
+  {
+    const struct in_addr *clnt_in_addr = &((sockaddr_in*)clnt_addr)->sin_addr;
+
+    if (Ndb_getInAddr(&config_addr, config_hostname) != 0
+        || memcmp(&config_addr, clnt_in_addr, sizeof(config_addr)) != 0)
+    {
+      struct in_addr tmp_addr;
+      if (Ndb_getInAddr(&tmp_addr, "localhost") != 0
+          || memcmp(&tmp_addr, clnt_in_addr, sizeof(config_addr)) != 0)
+      {
+        // not localhost
+#if 0
+        ndbout << "MgmtSrvr::getFreeNodeId compare failed for \""
+               << config_hostname
+               << "\" id=" << tmp << endl;
+#endif
+        return -1;
+      }
+
+      // connecting through localhost
+      // check if config_hostname is local
+      if (!SocketServer::tryBind(0, config_hostname))
+        return -1;
     }
-    DBUG_RETURN(true);
   }
-  Guard g(m_node_id_mutex);
-  int no_mgm= 0;
-  NodeBitmask connected_nodes(m_reserved_nodes);
-  get_connected_nodes(connected_nodes);
+  else
   {
-    for(Uint32 i = 0; i < MAX_NODES; i++)
-      if (getNodeType(i) == NDB_MGM_NODE_TYPE_MGM)
-	no_mgm++;
+    if (!SocketServer::tryBind(0, config_hostname))
+      return -1;
   }
-  bool found_matching_id= false;
-  bool found_matching_type= false;
-  bool found_free_node= false;
-  unsigned id_found= 0;
-  const char *config_hostname= 0;
-  struct in_addr config_addr= {0};
-  int r_config_addr= -1;
-  unsigned type_c= 0;
+  return 0;
+}
+
+int
+MgmtSrvr::find_node_type(unsigned node_id, enum ndb_mgm_node_type type,
+                         const struct sockaddr *client_addr,
+                         NodeBitmask &nodes,
+                         NodeBitmask &exact_nodes,
+                         Vector<struct nodeid_and_host> &nodes_info,
+                         int &error_code, BaseString &error_string)
+{
+  const char *found_config_hostname= 0;
+  unsigned type_c= (unsigned)type;
+
+  Guard g(m_configMutex);
 
-  if(NdbMutex_Lock(m_configMutex))
-  {
-    // should not happen
-    error_string.appfmt("unable to lock configuration mutex");
-    error_code = NDB_MGM_ALLOCID_ERROR;
-    DBUG_RETURN(false);
-  }
   ndb_mgm_configuration_iterator
     iter(* _config->m_configValues, CFG_SECTION_NODE);
-  for(iter.first(); iter.valid(); iter.next()) {
-    unsigned tmp= 0;
-    if(iter.get(CFG_NODE_ID, &tmp)) require(false);
-    if (*nodeId && *nodeId != tmp)
-      continue;
-    found_matching_id= true;
-    if(iter.get(CFG_TYPE_OF_SECTION, &type_c)) require(false);
-    if(type_c != (unsigned)type)
-      continue;
-    found_matching_type= true;
-    if (connected_nodes.get(tmp))
+  for(iter.first(); iter.valid(); iter.next())
+  {
+    unsigned id;
+    if (iter.get(CFG_NODE_ID, &id))
+      require(false);
+    if (node_id && node_id != id)
       continue;
-    found_free_node= true;
-    if(iter.get(CFG_NODE_HOST, &config_hostname)) require(false);
-    if (config_hostname && config_hostname[0] == 0)
-      config_hostname= 0;
-    else if (client_addr) {
-      // check hostname compatability
-      const void *tmp_in= &(((sockaddr_in*)client_addr)->sin_addr);
-      if((r_config_addr= Ndb_getInAddr(&config_addr, config_hostname)) != 0
-	 || memcmp(&config_addr, tmp_in, sizeof(config_addr)) != 0) {
-	struct in_addr tmp_addr;
-	if(Ndb_getInAddr(&tmp_addr, "localhost") != 0
-	   || memcmp(&tmp_addr, tmp_in, sizeof(config_addr)) != 0) {
-	  // not localhost
-#if 0
-	  ndbout << "MgmtSrvr::getFreeNodeId compare failed for \""
-		 << config_hostname
-		 << "\" id=" << tmp << endl;
-#endif
-	  continue;
-	}
-	// connecting through localhost
-	// check if config_hostname is local
-	if (!SocketServer::tryBind(0,config_hostname)) {
-	  continue;
-	}
-      }
-    } else { // client_addr == 0
-      if (!SocketServer::tryBind(0,config_hostname)) {
-	continue;
+    if (iter.get(CFG_TYPE_OF_SECTION, &type_c))
+      require(false);
+    if (type_c != (unsigned)type)
+    {
+      if (!node_id)
+        continue;
+      goto error;
+    }
+    const char *config_hostname= 0;
+    if (iter.get(CFG_NODE_HOST, &config_hostname))
+      require(false);
+    if (config_hostname == 0 || config_hostname[0] == 0)
+    {
+      config_hostname= "";
+    }
+    else
+    {
+      found_config_hostname= config_hostname;
+      if (match_hostname(client_addr, config_hostname))
+      {
+        if (!node_id)
+          continue;
+        goto error;
       }
+      exact_nodes.set(id);
     }
-    if (*nodeId != 0 ||
-	type != NDB_MGM_NODE_TYPE_MGM ||
-	no_mgm == 1) { // any match is ok
-
-      if (config_hostname == 0 &&
-	  *nodeId == 0 &&
-	  type != NDB_MGM_NODE_TYPE_MGM)
-      {
-	if (!id_found) // only set if not set earlier
-	  id_found= tmp;
-	continue; /* continue looking for a nodeid with specified
-		   * hostname
-		   */
-      }
-      assert(id_found == 0);
-      id_found= tmp;
-      break;
-    }
-    if (id_found) { // mgmt server may only have one match
-      error_string.appfmt("Ambiguous node id's %d and %d.\n"
-			  "Suggest specifying node id in connectstring,\n"
-			  "or specifying unique host names in config file.",
-			  id_found, tmp);
-      NdbMutex_Unlock(m_configMutex);
-      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-      DBUG_RETURN(false);
+    nodes.set(id);
+    struct nodeid_and_host a= {id, config_hostname};
+    nodes_info.push_back(a);
+    if (node_id)
+      break;
+  }
+  if (nodes_info.size() != 0)
+  {
+    return 0;
+  }
+
+ error:
+  /*
+    lock on m_configMutex held because found_config_hostname may have
+    reference inot config structure
+  */
+  error_code= NDB_MGM_ALLOCID_CONFIG_MISMATCH;
+  if (node_id)
+  {
+    if (type_c != (unsigned) type)
+    {
+      BaseString type_string, type_c_string;
+      const char *alias, *str;
+      alias= ndb_mgm_get_node_type_alias_string(type, &str);
+      type_string.assfmt("%s(%s)", alias, str);
+      alias= ndb_mgm_get_node_type_alias_string((enum ndb_mgm_node_type)type_c,
+                                                &str);
+      type_c_string.assfmt("%s(%s)", alias, str);
+      error_string.appfmt("Id %d configured as %s, connect attempted as %s.",
+                          node_id, type_c_string.c_str(),
+                          type_string.c_str());
+      return -1;
     }
-    if (config_hostname == 0) {
-      error_string.appfmt("Ambiguity for node id %d.\n"
-			  "Suggest specifying node id in connectstring,\n"
-			  "or specifying unique host names in config file,\n"
-			  "or specifying just one mgmt server in config file.",
-			  tmp);
-      NdbMutex_Unlock(m_configMutex);
-      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-      DBUG_RETURN(false);
+    if (found_config_hostname)
+    {
+      struct in_addr config_addr= {0};
+      int r_config_addr= Ndb_getInAddr(&config_addr, found_config_hostname);
+      error_string.appfmt("Connection with id %d done from wrong host ip %s,",
+                          node_id, inet_ntoa(((struct sockaddr_in *)
+                                              (client_addr))->sin_addr));
+      error_string.appfmt(" expected %s(%s).", found_config_hostname,
+                          r_config_addr ?
+                          "lookup failed" : inet_ntoa(config_addr));
+      return -1;
     }
-    id_found= tmp; // mgmt server matched, check for more matches
+    error_string.appfmt("No node defined with id=%d in config file.", node_id);
+    return -1;
   }
-  NdbMutex_Unlock(m_configMutex);
 
-  if (id_found && client_addr != 0)
+  // node_id == 0 and nodes_info.size() == 0
+  if (found_config_hostname)
   {
-    int res = alloc_node_id_req(id_found, type);
-    unsigned save_id_found = id_found;
+    error_string.appfmt("Connection done from wrong host ip %s.",
+                        (client_addr)?
+                        inet_ntoa(((struct sockaddr_in *)
+                                   (client_addr))->sin_addr):"");
+    return -1;
+  }
+
+  error_string.append("No nodes defined in config file.");
+  return -1;
+}
+
+int
+MgmtSrvr::try_alloc(unsigned id, const char *config_hostname,
+                    enum ndb_mgm_node_type type,
+                    const struct sockaddr *client_addr,
+                    Uint32 timeout_ms)
+{
+  if (client_addr != 0)
+  {
+    int res = alloc_node_id_req(id, type, timeout_ms);
     switch (res)
     {
     case 0:
@@ -2386,155 +2413,176 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
       break;
     default:
       // something wrong
-      id_found = 0;
-      break;
-
-    }
-    if (id_found == 0)
-    {
-      char buf[128];
-      ndb_error_string(res, buf, sizeof(buf));
-      error_string.appfmt("Cluster refused allocation of id %d. Error: %d (%s).",
-			  save_id_found, res, buf);
-      g_eventLogger->warning("Cluster refused allocation of id %d. "
-                             "Connection from ip %s. "
-                             "Returned error string \"%s\"", save_id_found,
-                             inet_ntoa(((struct sockaddr_in *)
-                                        (client_addr))->sin_addr),
-                             error_string.c_str());
-      DBUG_RETURN(false);
+      return -1;
     }
   }
 
-  if (id_found)
+  DBUG_PRINT("info", ("allocating node id %d",id));
   {
-    *nodeId= id_found;
-    DBUG_PRINT("info", ("allocating node id %d",*nodeId));
+    int r= 0;
+    if (client_addr)
+    {
+      m_connect_address[id]= ((struct sockaddr_in *)client_addr)->sin_addr;
+    }
+    else if (config_hostname)
+    {
+      r= Ndb_getInAddr(&(m_connect_address[id]), config_hostname);
+    }
+    else
     {
-      int r= 0;
-      if (client_addr)
-	m_connect_address[id_found]=
-	  ((struct sockaddr_in *)client_addr)->sin_addr;
-      else if (config_hostname)
-	r= Ndb_getInAddr(&(m_connect_address[id_found]), config_hostname);
-      else {
-	char name[256];
-	r= gethostname(name, sizeof(name));
-	if (r == 0) {
-	  name[sizeof(name)-1]= 0;
-	  r= Ndb_getInAddr(&(m_connect_address[id_found]), name);
-	}
-      }
-      if (r)
-	m_connect_address[id_found].s_addr= 0;
-    }
-    m_reserved_nodes.set(id_found);
-    if (theFacade && id_found != theFacade->ownId())
-    {
-      /**
-       * Make sure we're ready to accept connections from this node
-       */
-      theFacade->lock_mutex();
-      theFacade->doConnect(id_found);
-      theFacade->unlock_mutex();
+      char name[256];
+      r= gethostname(name, sizeof(name));
+      if (r == 0)
+      {
+        name[sizeof(name)-1]= 0;
+        r= Ndb_getInAddr(&(m_connect_address[id]), name);
+      }
+    }
+    if (r)
+    {
+      m_connect_address[id].s_addr= 0;
     }
+  }
+  m_reserved_nodes.set(id);
+  if (theFacade && id != theFacade->ownId())
+  {
+    /**
+     * Make sure we're ready to accept connections from this node
+     */
+    theFacade->lock_mutex();
+    theFacade->doConnect(id);
+    theFacade->unlock_mutex();
+  }
     
-    char tmp_str[128];
-    m_reserved_nodes.getText(tmp_str);
-    g_eventLogger->info("Mgmt server state: nodeid %d reserved for ip %s, "
-                        "m_reserved_nodes %s.",
-                        id_found, get_connect_address(id_found), tmp_str);
+  char tmp_str[128];
+  m_reserved_nodes.getText(tmp_str);
+  g_eventLogger->info("Mgmt server state: nodeid %d reserved for ip %s, "
+                      "m_reserved_nodes %s.",
+                      id, get_connect_address(id), tmp_str);
+
+  return 0;
+}
+
+bool
+MgmtSrvr::alloc_node_id(NodeId * nodeId,
+			enum ndb_mgm_node_type type,
+			const struct sockaddr *client_addr,
+			SOCKET_SIZE_TYPE *client_addr_len,
+			int &error_code, BaseString &error_string,
+                        int log_event,
+                        int timeout_s)
+{
+  DBUG_ENTER("MgmtSrvr::alloc_node_id");
+  DBUG_PRINT("enter", ("nodeid: %d  type: %d  client_addr: 0x%ld",
+		       *nodeId, type, (long) client_addr));
+
+  if (g_no_nodeid_checks) {
+    if (*nodeId == 0) {
+      error_string.appfmt("no-nodeid-checks set in management server. "
+			  "node id must be set explicitly in connectstring");
+      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
+      DBUG_RETURN(false);
+    }
     DBUG_RETURN(true);
   }
 
-  if (found_matching_type && !found_free_node) {
-    // we have a temporary error which might be due to that 
-    // we have got the latest connect status from db-nodes.  Force update.
-    updateStatus();
-  }
+  Uint32 timeout_ms = Uint32(1000 * timeout_s);
+
+  Guard g(m_node_id_mutex);
+
+  NodeBitmask connected_nodes;
+  get_connected_nodes(connected_nodes);
+
+  NodeBitmask nodes, exact_nodes;
+  Vector<struct nodeid_and_host> nodes_info;
+
+  /* find all nodes with correct type */
+  if (find_node_type(*nodeId, type, client_addr, nodes, exact_nodes, nodes_info,
+                     error_code, error_string))
+    goto error;
 
-  BaseString type_string, type_c_string;
+  // nodes_info.size() == 0 handled inside find_node_type
+  DBUG_ASSERT(nodes_info.size() != 0);
+
+  if (type == NDB_MGM_NODE_TYPE_MGM && nodes_info.size() > 1)
   {
-    const char *alias, *str;
-    alias= ndb_mgm_get_node_type_alias_string(type, &str);
-    type_string.assfmt("%s(%s)", alias, str);
-    alias= ndb_mgm_get_node_type_alias_string((enum ndb_mgm_node_type)type_c,
-					      &str);
-    type_c_string.assfmt("%s(%s)", alias, str);
+    // mgmt server may only have one match
+    error_string.appfmt("Ambiguous node id's %d and %d. "
+                        "Suggest specifying node id in connectstring, "
+                        "or specifying unique host names in config file.",
+                        nodes_info[0].id, nodes_info[1].id);
+    error_code= NDB_MGM_ALLOCID_CONFIG_MISMATCH;
+    goto error;
   }
 
-  if (*nodeId == 0)
+  /* remove connected and reserved nodes from possible nodes to allocate */
+  nodes.bitANDC(connected_nodes);
+  nodes.bitANDC(m_reserved_nodes);
+
+  /* first try all nodes with exact match of hostname */
+  for (Uint32 i = 0; i < nodes_info.size(); i++)
   {
-    if (found_matching_id)
+    unsigned id= nodes_info[i].id;
+    if (!nodes.get(id))
+      continue;
+
+    if (!exact_nodes.get(id))
+      continue;
+
+    const char *config_hostname= nodes_info[i].host.c_str();
+    if (!try_alloc(id, config_hostname, type, client_addr, timeout_ms))
     {
-      if (found_matching_type)
-      {
-	if (found_free_node)
-        {
-	  error_string.appfmt("Connection done from wrong host ip %s.",
-			      (client_addr)?
-                              inet_ntoa(((struct sockaddr_in *)
-					 (client_addr))->sin_addr):"");
-          error_code = NDB_MGM_ALLOCID_ERROR;
-        }
-	else
-        {
-	  error_string.appfmt("No free node id found for %s.",
-			      type_string.c_str());
-          error_code = NDB_MGM_ALLOCID_ERROR;
-        }
-      }
-      else
-      {
-	error_string.appfmt("No %s node defined in config file.",
-			    type_string.c_str());
-        error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-      }
+      // success
+      *nodeId= id;
+      DBUG_RETURN(true);
     }
-    else
+  }
+
+  /* now try the open nodes */
+  for (Uint32 i = 0; i < nodes_info.size(); i++)
+  {
+    unsigned id= nodes_info[i].id;
+    if (!nodes.get(id))
+      continue;
+
+    /**
+     * exact node tried in loop above
+     */
+    if (exact_nodes.get(id))
+      continue;
+
+    if (!try_alloc(id, NULL, type, client_addr, timeout_ms))
     {
-      error_string.append("No nodes defined in config file.");
-      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
+      // success
+      *nodeId= id;
+      DBUG_RETURN(true);
     }
   }
+
+  /*
+    there are nodes with correct type available but
+    allocation failed for some reason
+  */
+  if (*nodeId)
+  {
+    error_string.appfmt("Id %d already allocated by another node.",
+                        *nodeId);
+  }
   else
   {
-    if (found_matching_id)
-    {
-      if (found_matching_type)
-      {
-	if (found_free_node)
-        {
-	  // have to split these into two since inet_ntoa overwrites itself
-	  error_string.appfmt("Connection with id %d done from wrong host ip %s,",
-			      *nodeId, inet_ntoa(((struct sockaddr_in *)
-						  (client_addr))->sin_addr));
-	  error_string.appfmt(" expected %s(%s).", config_hostname,
-			      r_config_addr ?
-			      "lookup failed" : inet_ntoa(config_addr));
-          error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-	}
-        else
-        {
-	  error_string.appfmt("Id %d already allocated by another node.",
-			      *nodeId);
-          error_code = NDB_MGM_ALLOCID_ERROR;
-        }
-      }
-      else
-      {
-	error_string.appfmt("Id %d configured as %s, connect attempted as %s.",
-			    *nodeId, type_c_string.c_str(),
-			    type_string.c_str());
-        error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-      }
-    }
-    else
-    {
-      error_string.appfmt("No node defined with id=%d in config file.",
-			  *nodeId);
-      error_code = NDB_MGM_ALLOCID_CONFIG_MISMATCH;
-    }
+    const char *alias, *str;
+    alias= ndb_mgm_get_node_type_alias_string(type, &str);
+    error_string.appfmt("No free node id found for %s(%s).",
+                        alias, str);
+  }
+  error_code = NDB_MGM_ALLOCID_ERROR;
+
+ error:
+  if (error_code != NDB_MGM_ALLOCID_CONFIG_MISMATCH)
+  {
+    // we have a temporary error which might be due to that
+    // we have got the latest connect status from db-nodes.  Force update.
+    updateStatus();
   }
 
   if (log_event || error_code == NDB_MGM_ALLOCID_CONFIG_MISMATCH)
@@ -2548,27 +2596,35 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
 			   : "<none>",
 			   error_string.c_str());
 
-    NodeBitmask connected_nodes2;
-    get_connected_nodes(connected_nodes2);
     BaseString tmp_connected, tmp_not_connected;
     for(Uint32 i = 0; i < MAX_NODES; i++)
     {
-      if (connected_nodes2.get(i))
+      if (connected_nodes.get(i))
       {
-	if (!m_reserved_nodes.get(i))
-	  tmp_connected.appfmt(" %d", i);
+        if (!m_reserved_nodes.get(i))
+        {
+          tmp_connected.appfmt("%d ", i);
+        }
       }
       else if (m_reserved_nodes.get(i))
       {
-	tmp_not_connected.appfmt(" %d", i);
+        tmp_not_connected.appfmt("%d ", i);
       }
     }
+
     if (tmp_connected.length() > 0)
-      g_eventLogger->info("Mgmt server state: node id's %s connected but not reserved", 
-			  tmp_connected.c_str());
+    {
+      g_eventLogger->info
+        ("Mgmt server state: node id's %sconnected but not reserved",
+         tmp_connected.c_str());
+    }
+
     if (tmp_not_connected.length() > 0)
-      g_eventLogger->info("Mgmt server state: node id's %s not connected but reserved",
-			  tmp_not_connected.c_str());
+    {
+      g_eventLogger->info
+        ("Mgmt server state: node id's %snot connected but reserved",
+         tmp_not_connected.c_str());
+    }
   }
   DBUG_RETURN(false);
 }
@@ -3112,3 +3168,4 @@ template class MutexVector<NodeId>;
 template class MutexVector<Ndb_mgmd_event_service::Event_listener>;
 template class Vector<EventSubscribeReq>;
 template class MutexVector<EventSubscribeReq>;
+template class Vector<MgmtSrvr::nodeid_and_host>;

=== modified file 'storage/ndb/src/mgmsrv/MgmtSrvr.hpp'
--- a/storage/ndb/src/mgmsrv/MgmtSrvr.hpp	2009-01-08 15:25:14 +0000
+++ b/storage/ndb/src/mgmsrv/MgmtSrvr.hpp	2009-02-18 14:33:50 +0000
@@ -399,10 +399,11 @@ public:
    */
   bool getNextNodeId(NodeId * _nodeId, enum ndb_mgm_node_type type) const ;
   bool alloc_node_id(NodeId * _nodeId, enum ndb_mgm_node_type type,
-		     struct sockaddr *client_addr,
+		     const struct sockaddr *client_addr,
                      SOCKET_SIZE_TYPE *client_addr_len,
 		     int &error_code, BaseString &error_string,
-                     int log_event = 1);
+                     int log_event = 1,
+                     int timeout_s = 20);
   
   /**
    *
@@ -491,7 +492,9 @@ private:
    */
   int getBlockNumber(const BaseString &blockName);
 
-  int alloc_node_id_req(NodeId free_node_id, enum ndb_mgm_node_type type);
+  int alloc_node_id_req(NodeId free_node_id,
+                        enum ndb_mgm_node_type type,
+                        Uint32 timeout_ms);
 
   int check_nodes_starting();
   int check_nodes_stopping();
@@ -644,6 +647,21 @@ private:
   Config *_props;
 
   ConfigRetriever *m_config_retriever;
+
+  struct nodeid_and_host
+  {
+    unsigned id;
+    BaseString host;
+  };
+  int find_node_type(unsigned node_id, enum ndb_mgm_node_type type,
+                     const struct sockaddr *client_addr,
+                     NodeBitmask &nodes,
+                     NodeBitmask &exact_nodes,
+                     Vector<nodeid_and_host> &nodes_info,
+                     int &error_code, BaseString &error_string);
+  int match_hostname(const struct sockaddr *, const char *) const;
+  int try_alloc(unsigned id,  const char *, enum ndb_mgm_node_type type,
+                const struct sockaddr *client_addr, Uint32 timeout_ms);
 };
 
 inline

=== modified file 'storage/ndb/src/mgmsrv/Services.cpp'
--- a/storage/ndb/src/mgmsrv/Services.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/src/mgmsrv/Services.cpp	2009-03-12 10:51:59 +0000
@@ -510,7 +510,8 @@ MgmApiSession::get_nodeid(Parser_t::Cont
     while (!m_mgmsrv.alloc_node_id(&tmp, (enum ndb_mgm_node_type)nodetype, 
                                    (struct sockaddr*)&addr, &addrlen,
                                    error_code, error_string,
-                                   tick == 0 ? 0 : log_event))
+                                   tick == 0 ? 0 : log_event,
+                                   timeout))
     {
       /* NDB_MGM_ALLOCID_CONFIG_MISMATCH is a non retriable error */
       if (tick == 0 && error_code != NDB_MGM_ALLOCID_CONFIG_MISMATCH)

=== modified file 'storage/ndb/src/ndbapi/Ndb.cpp'
--- a/storage/ndb/src/ndbapi/Ndb.cpp	2009-02-16 14:43:39 +0000
+++ b/storage/ndb/src/ndbapi/Ndb.cpp	2009-03-12 10:51:59 +0000
@@ -300,11 +300,12 @@ Ndb::waitUntilReady(int timeout)
 }
 
 /*****************************************************************************
-NdbTransaction* startTransaction();
+NdbTransaction* computeHash()
 
-Return Value:   Returns a pointer to a connection object.
-                Return NULL otherwise.
-Remark:         Start transaction. Synchronous.
+Return Value:   Returns 0 for success, NDBAPI error code otherwise
+Remark:         Computes the distribution hash value for a row with the
+                supplied distribtion key values.
+                Only relevant for natively partitioned tables.
 *****************************************************************************/ 
 int
 Ndb::computeHash(Uint32 *retval,
@@ -321,6 +322,15 @@ Ndb::computeHash(Uint32 *retval,
 
   Uint32 colcnt = impl->m_columns.size();
   Uint32 parts = impl->m_noOfDistributionKeys;
+
+  if (unlikely(impl->m_fragmentType == NdbDictionary::Object::UserDefined))
+  {
+    /* Calculating native hash on keys in user defined 
+     * partitioned table is probably part of a bug
+     */
+    goto euserdeftable;
+  }
+
   if (parts == 0)
   {
     parts = impl->m_noOfKeys;
@@ -455,6 +465,9 @@ Ndb::computeHash(Uint32 *retval,
   
   return 0;
   
+euserdeftable:
+  return 4544;
+  
 enullptr:
   return 4316;
   
@@ -1608,6 +1621,20 @@ int Ndb::setDatabaseAndSchemaName(const 
         setDatabaseName(buf);
         sprintf(buf, "%.*s", (int) (s2 - (s1 + 1)), s1 + 1);
         setDatabaseSchemaName(buf);
+#ifdef VM_TRACE
+        // verify that m_prefix looks like abc/def/
+        const char* s0 = theImpl->m_prefix.c_str();
+        const char* s1 = s0 ? strchr(s0, table_name_separator) : 0;
+        const char* s2 = s1 ? strchr(s1 + 1, table_name_separator) : 0;
+        if (!(s1 && s1 != s0 && s2 && s2 != s1 + 1 && *(s2 + 1) == 0))
+        {
+          ndbout_c("t->m_impl.m_internalName.c_str(): %s", t->m_impl.m_internalName.c_str());
+          ndbout_c("s0: %s", s0);
+          ndbout_c("s1: %s", s1);
+          ndbout_c("s2: %s", s2);
+          assert(s1 && s1 != s0 && s2 && s2 != s1 + 1 && *(s2 + 1) == 0);
+        }
+#endif
         return 0;
       }
     }
@@ -1684,7 +1711,13 @@ Ndb::internalize_table_name(const char *
     const char* s0 = theImpl->m_prefix.c_str();
     const char* s1 = s0 ? strchr(s0, table_name_separator) : 0;
     const char* s2 = s1 ? strchr(s1 + 1, table_name_separator) : 0;
-    assert(s1 && s1 != s0 && s2 && s2 != s1 + 1 && *(s2 + 1) == 0);
+    if (!(s1 && s1 != s0 && s2 && s2 != s1 + 1 && *(s2 + 1) == 0))
+    {
+      ndbout_c("s0: %s", s0);
+      ndbout_c("s1: %s", s1);
+      ndbout_c("s2: %s", s2);
+      assert(s1 && s1 != s0 && s2 && s2 != s1 + 1 && *(s2 + 1) == 0);
+    }
 #endif
     ret.assfmt("%s%s",
                theImpl->m_prefix.c_str(),

=== modified file 'storage/ndb/src/ndbapi/NdbBlob.cpp'
--- a/storage/ndb/src/ndbapi/NdbBlob.cpp	2008-12-24 10:48:24 +0000
+++ b/storage/ndb/src/ndbapi/NdbBlob.cpp	2009-03-12 10:51:59 +0000
@@ -97,8 +97,6 @@ NdbBlob::getBlobTable(NdbTableImpl& bt, 
   bt.setLogging(t->getLogging());
   /*
     BLOB tables use the same fragmentation as the original table
-    but may change the fragment type if it is UserDefined since it
-    must be hash based so that the kernel can handle it on its own.
     It also uses the same tablespaces and it never uses any range or
     list arrays.
   */
@@ -109,25 +107,8 @@ NdbBlob::getBlobTable(NdbTableImpl& bt, 
   bt.setFragmentCount(t->getFragmentCount());
   bt.m_tablespace_id = t->m_tablespace_id;
   bt.m_tablespace_version = t->m_tablespace_version;
-  switch (t->getFragmentType())
-  {
-    case NdbDictionary::Object::FragAllSmall:
-    case NdbDictionary::Object::FragAllMedium:
-    case NdbDictionary::Object::FragAllLarge:
-    case NdbDictionary::Object::FragSingle:
-      bt.setFragmentType(t->getFragmentType());
-      break;
-    case NdbDictionary::Object::DistrKeyLin:
-    case NdbDictionary::Object::DistrKeyHash:
-      bt.setFragmentType(t->getFragmentType());
-      break;
-    case NdbDictionary::Object::UserDefined:
-      bt.setFragmentType(NdbDictionary::Object::DistrKeyHash);
-      break;
-    default:
-      DBUG_ASSERT(0);
-      break;
-  }
+  bt.setFragmentType(t->getFragmentType());
+
   DBUG_PRINT("info", ("Define BLOB table V%d with"
                       " primary table = %u and Fragment Type = %u",
                       blobVersion,
@@ -362,6 +343,7 @@ NdbBlob::init()
   theHeadInlineRecAttr = NULL;
   theHeadInlineReadOp = NULL;
   theHeadInlineUpdateFlag = false;
+  userDefinedPartitioning = false;
   thePartitionId = noPartitionId();
   thePartitionIdRecAttr = NULL;
   theNullFlag = -1;
@@ -546,6 +528,37 @@ NdbBlob::getDistKey(Uint32 part)
   return dist;
 }
 
+inline void
+NdbBlob::setHeadPartitionId(NdbOperation* anOp)
+{
+  /* For UserDefined partitioned tables,
+   * we must set the head row's partition id
+   * manually when reading/modifying it with
+   * primary key or unique key.
+   * For scans we do not have to.
+   */
+  if (userDefinedPartitioning &&
+      (thePartitionId != noPartitionId())) {
+    anOp->setPartitionId(thePartitionId);
+  }
+}
+
+inline void
+NdbBlob::setPartPartitionId(NdbOperation* anOp)
+{
+  /* For UserDefined partitioned tables
+   * we must set the part row's partition 
+   * id manually when performing operations.
+   * This means that stripe size is ignored
+   * for UserDefined partitioned tables.
+   * All part row operations use primary keys
+   */
+  if (userDefinedPartitioning) {
+    assert(thePartitionId != noPartitionId());
+    anOp->setPartitionId(thePartitionId);
+  }
+}
+
 // pack/unpack table/index key  XXX support routines, shortcuts
 
 int
@@ -937,6 +950,7 @@ NdbBlob::setPartKeyValue(NdbOperation* a
       DBUG_RETURN(-1);
     }
   }
+  setPartPartitionId(anOp);
   DBUG_RETURN(0);
 }
 
@@ -1012,14 +1026,26 @@ NdbBlob::getHeadInlineValue(NdbOperation
    * specific checks
    */
   theHeadInlineRecAttr = anOp->getValue_impl(theColumn, theHeadInlineBuf.data);
-  thePartitionIdRecAttr = 
-    anOp->getValue_impl(&NdbColumnImpl::getImpl(*NdbDictionary::Column::FRAGMENT));
-  
-  if (theHeadInlineRecAttr == NULL ||
-      thePartitionIdRecAttr == NULL) {
+  if (theHeadInlineRecAttr == NULL) {
     setErrorCode(anOp);
     DBUG_RETURN(-1);
   }
+  if (userDefinedPartitioning)
+  {
+    /* For UserDefined partitioned tables, we ask for the partition
+     * id of the main table row to use for the parts
+     * Not technically needed for main table access via PK, which must
+     * have partition id set for access, but we do it anyway and check
+     * it's as expected.
+     */
+    thePartitionIdRecAttr = 
+      anOp->getValue_impl(&NdbColumnImpl::getImpl(*NdbDictionary::Column::FRAGMENT));
+    
+    if (thePartitionIdRecAttr == NULL) {
+      setErrorCode(anOp);
+      DBUG_RETURN(-1);
+    }
+  }
   /*
    * If we get no data from this op then the operation is aborted
    * one way or other.  Following hack in 5.0 makes sure we don't read
@@ -1041,20 +1067,30 @@ NdbBlob::getHeadFromRecAttr()
   if (theNullFlag == 0) {
     unpackBlobHead();
     theLength = theHead.length;
-    if (theEventBlobVersion == -1) {
+  } else {
+    theLength = 0;
+  }
+  if (theEventBlobVersion == -1) {
+    if (userDefinedPartitioning)
+    {
+      /* Use main table fragment id as partition id
+       * for blob parts table
+       */
       Uint32 id = thePartitionIdRecAttr->u_32_value();
       DBUG_PRINT("info", ("table partition id: %u", id));
       if (thePartitionId == noPartitionId()) {
         DBUG_PRINT("info", ("discovered here"));
-        // setting even in non-partitioned case
         thePartitionId = id;
       } else {
         assert(thePartitionId == id);
       }
     }
-  } else {
-    theLength = 0;
+    else
+    {
+      assert(thePartitionIdRecAttr == NULL);
+    }
   }
+
   DBUG_PRINT("info", ("theNullFlag=%d theLength=%llu",
                       theNullFlag, theLength));
   DBUG_VOID_RETURN;
@@ -1679,10 +1715,7 @@ NdbBlob::readTablePart(char* buf, Uint32
     setErrorCode(tOp);
     DBUG_RETURN(-1);
   }
-  if (thePartitionId != noPartitionId() &&
-      theStripeSize == 0) {
-    tOp->setPartitionId(thePartitionId);
-  }
+
   tOp->m_abortOption = NdbOperation::AbortOnError;
   thePendingBlobOps |= (1 << NdbOperation::ReadRequest);
   theNdbCon->thePendingBlobOps |= (1 << NdbOperation::ReadRequest);
@@ -1742,10 +1775,7 @@ NdbBlob::insertPart(const char* buf, Uin
     setErrorCode(tOp);
     DBUG_RETURN(-1);
   }
-  if (thePartitionId != noPartitionId() &&
-      theStripeSize == 0) {
-    tOp->setPartitionId(thePartitionId);
-  }
+
   tOp->m_abortOption = NdbOperation::AbortOnError;
   thePendingBlobOps |= (1 << NdbOperation::InsertRequest);
   theNdbCon->thePendingBlobOps |= (1 << NdbOperation::InsertRequest);
@@ -1782,10 +1812,7 @@ NdbBlob::updatePart(const char* buf, Uin
     setErrorCode(tOp);
     DBUG_RETURN(-1);
   }
-  if (thePartitionId != noPartitionId() &&
-      theStripeSize == 0) {
-    tOp->setPartitionId(thePartitionId);
-  }
+
   tOp->m_abortOption = NdbOperation::AbortOnError;
   thePendingBlobOps |= (1 << NdbOperation::UpdateRequest);
   theNdbCon->thePendingBlobOps |= (1 << NdbOperation::UpdateRequest);
@@ -1806,10 +1833,7 @@ NdbBlob::deleteParts(Uint32 part, Uint32
       setErrorCode(tOp);
       DBUG_RETURN(-1);
     }
-    if (thePartitionId != noPartitionId() &&
-        theStripeSize == 0) {
-      tOp->setPartitionId(thePartitionId);
-    }
+
     tOp->m_abortOption = NdbOperation::AbortOnError;
     n++;
     thePendingBlobOps |= (1 << NdbOperation::DeleteRequest);
@@ -1846,10 +1870,6 @@ NdbBlob::deletePartsUnknown(Uint32 part)
         setErrorCode(tOp);
         DBUG_RETURN(-1);
       }
-      if (thePartitionId != noPartitionId() &&
-          theStripeSize == 0) {
-        tOp->setPartitionId(thePartitionId);
-      }
       tOp->m_abortOption= NdbOperation::AO_IgnoreError;
       tOp->m_noErrorPropagation = true;
       n++;
@@ -2009,8 +2029,14 @@ NdbBlob::atPrepareCommon(NdbTransaction*
   // prepare blob column and table
   if (prepareColumn() == -1)
     return -1;
-  // check if mysql or user has set partition id
-  if (theNdbOp->theDistrKeyIndicator_) {
+  userDefinedPartitioning= (theTable->getFragmentType() == 
+                            NdbDictionary::Object::UserDefined);
+  /* UserDefined Partitioning
+   * If user has set partitionId specifically, take it for
+   * Blob head and part operations
+   */
+  if (userDefinedPartitioning && 
+      theNdbOp->theDistrKeyIndicator_) {
     thePartitionId = theNdbOp->getPartitionId();
     DBUG_PRINT("info", ("op partition id: %u", thePartitionId));
   }
@@ -2460,9 +2486,8 @@ NdbBlob::preExecute(NdbTransaction::Exec
           setErrorCode(NdbBlobImpl::ErrAbort);
           DBUG_RETURN(-1);
         }
-        if (thePartitionId != noPartitionId()) {
-          tOp->setPartitionId(thePartitionId);
-        }
+        setHeadPartitionId(tOp);
+
         DBUG_PRINT("info", ("Insert : added op to update head+inline in preExecute"));
       }
     }
@@ -2503,9 +2528,8 @@ NdbBlob::preExecute(NdbTransaction::Exec
         setErrorCode(tOp);
         DBUG_RETURN(-1);
       }
-      if (thePartitionId != noPartitionId()) {
-        tOp->setPartitionId(thePartitionId);
-      }
+      setHeadPartitionId(tOp);
+
       if (isWriteOp()) {
         /* There may be no data currently, so ignore tuple not found etc. */
         tOp->m_abortOption = NdbOperation::AO_IgnoreError;
@@ -2535,6 +2559,11 @@ NdbBlob::preExecute(NdbTransaction::Exec
     if (this == tFirstBlob) {
       // first blob does it for all
       if (g_ndb_blob_ok_to_read_index_table) {
+        /* Cannot work for userDefinedPartitioning + write() op as
+         * we need to read the 'main' partition Id
+         * Maybe this branch should be removed?
+         */
+        assert(!userDefinedPartitioning);
         Uint32 pkAttrId = theAccessTable->getNoOfColumns() - 1;
         NdbOperation* tOp = theNdbCon->getNdbOperation(theAccessTable, theNdbOp);
         if (tOp == NULL ||
@@ -2553,6 +2582,20 @@ NdbBlob::preExecute(NdbTransaction::Exec
           setErrorCode(tOp);
           DBUG_RETURN(-1);
         }
+        if (userDefinedPartitioning && isWriteOp())
+        {
+          /* Index Write op does not perform head read before deleting parts
+           * as it cannot safely IgnoreErrors.
+           * To get partitioning right we read partition id for main row
+           * here.
+           */
+          thePartitionIdRecAttr = tOp->getValue_impl(&NdbColumnImpl::getImpl(*NdbDictionary::Column::FRAGMENT));
+          
+          if (thePartitionIdRecAttr == NULL) {
+            setErrorCode(tOp);
+            DBUG_RETURN(-1);
+          }
+        } 
       }
       DBUG_PRINT("info", ("Index op : added op before to read table key"));
     }
@@ -2621,9 +2664,8 @@ NdbBlob::preExecute(NdbTransaction::Exec
             setErrorCode(NdbBlobImpl::ErrAbort);
             DBUG_RETURN(-1);
           }
-          if (thePartitionId != noPartitionId()) {
-            tOp->setPartitionId(thePartitionId);
-          }
+          setHeadPartitionId(tOp);
+
           DBUG_PRINT("info", ("NdbRecord table write : added op to update head+inline"));
         }
       }
@@ -2755,9 +2797,8 @@ NdbBlob::postExecute(NdbTransaction::Exe
             setErrorCode(NdbBlobImpl::ErrAbort);
             DBUG_RETURN(-1);
           }
-          if (thePartitionId != noPartitionId()) {
-            tOp->setPartitionId(thePartitionId);
-          }
+          setHeadPartitionId(tOp);
+
           DBUG_PRINT("info", ("Insert : added op to update head+inline"));
         }
       }
@@ -2822,6 +2863,33 @@ NdbBlob::postExecute(NdbTransaction::Exe
   }
   if (isWriteOp() && isIndexOp()) {
     // XXX until IgnoreError fixed for index op
+    if (userDefinedPartitioning)
+    {
+      /* For Index Write with UserDefined partitioning, we get the
+       * partition id from the main table key read created in 
+       * preExecute().
+       * Extra complexity as only the first Blob does the read, other
+       * Blobs grab result from first.
+       */
+      if (thePartitionIdRecAttr != NULL)
+      {
+        assert( this == theNdbOp->theBlobList );
+        Uint32 id= thePartitionIdRecAttr->u_32_value();
+        assert( id != noPartitionId() );
+        DBUG_PRINT("info", ("Index write, setting partition id to %d", id));
+        thePartitionId= id;
+      }
+      else
+      {
+        /* First Blob (not us) in this op got the partition Id */
+        assert( theNdbOp->theBlobList );
+        assert( this != theNdbOp->theBlobList );
+
+        thePartitionId= theNdbOp->theBlobList->thePartitionId;
+
+        assert(thePartitionId != noPartitionId());
+      }
+    }
     if (deletePartsUnknown(0) == -1)
       DBUG_RETURN(-1);
     if (theSetFlag && theGetSetBytes > theInlineSize) {
@@ -2855,9 +2923,8 @@ NdbBlob::postExecute(NdbTransaction::Exe
       setErrorCode(NdbBlobImpl::ErrAbort);
       DBUG_RETURN(-1);
     }
-    if (thePartitionId != noPartitionId()) {
-      tOp->setPartitionId(thePartitionId);
-    }
+    setHeadPartitionId(tOp);
+
     tOp->m_abortOption = NdbOperation::AbortOnError;
     DBUG_PRINT("info", ("added op to update head+inline"));
   }
@@ -2889,9 +2956,8 @@ NdbBlob::preCommit()
           setErrorCode(NdbBlobImpl::ErrAbort);
           DBUG_RETURN(-1);
         }
-        if (thePartitionId != noPartitionId()) {
-          tOp->setPartitionId(thePartitionId);
-        }
+        setHeadPartitionId(tOp);
+        
         tOp->m_abortOption = NdbOperation::AbortOnError;
         DBUG_PRINT("info", ("added op to update head+inline"));
     }

=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2009-03-12 10:51:59 +0000
@@ -506,7 +506,7 @@ NdbTableImpl::init(){
   m_min_rows = 0;
   m_max_rows = 0;
   m_tablespace_name.clear();
-  m_tablespace_id = ~0;
+  m_tablespace_id = RNIL;
   m_tablespace_version = ~0;
   m_single_user_mode = 0;
 }
@@ -1746,7 +1746,7 @@ NdbDictionaryImpl::fetchGlobalTableImplR
                                  m_ndb.usingFullyQualifiedNames());
     else
       m_error.code = 4000;
-    if (impl != 0 && (obj.init(*impl)))
+    if (impl != 0 && (obj.init(this, *impl)))
     {
       delete impl;
       impl = 0;
@@ -3168,7 +3168,7 @@ NdbDictInterface::serializeTableDesc(Ndb
 
   const char *tablespace_name= impl.m_tablespace_name.c_str();
 loop:
-  if(impl.m_tablespace_id != ~(Uint32)0)
+  if(impl.m_tablespace_version != ~(Uint32)0)
   {
     tmpTab->TablespaceId = impl.m_tablespace_id;
     tmpTab->TablespaceVersion = impl.m_tablespace_version;
@@ -4305,7 +4305,7 @@ NdbDictionaryImpl::getEvent(const char *
   DBUG_PRINT("info",("table %s", ev->getTableName()));
   if (tab == NULL)
   {
-    tab= fetchGlobalTableImplRef(InitTable(this, ev->getTableName()));
+    tab= fetchGlobalTableImplRef(InitTable(ev->getTableName()));
     if (tab == 0)
     {
       DBUG_PRINT("error",("unable to find table %s", ev->getTableName()));
@@ -4319,7 +4319,7 @@ NdbDictionaryImpl::getEvent(const char *
     {
       DBUG_PRINT("info", ("mismatch on verison in cache"));
       releaseTableGlobal(*tab, 1);
-      tab= fetchGlobalTableImplRef(InitTable(this, ev->getTableName()));
+      tab= fetchGlobalTableImplRef(InitTable(ev->getTableName()));
       if (tab == 0)
       {
         DBUG_PRINT("error",("unable to find table %s", ev->getTableName()));
@@ -5420,7 +5420,7 @@ NdbFilegroupImpl::NdbFilegroupImpl(NdbDi
 {
   m_extent_size = 0;
   m_undo_buffer_size = 0;
-  m_logfile_group_id = ~0;
+  m_logfile_group_id = RNIL;
   m_logfile_group_version = ~0;
 }
 
@@ -5501,7 +5501,7 @@ NdbFileImpl::NdbFileImpl(NdbDictionary::
 {
   m_size = 0;
   m_free = 0;
-  m_filegroup_id = ~0;
+  m_filegroup_id = RNIL;
   m_filegroup_version = ~0;
 }
 
@@ -6857,7 +6857,7 @@ NdbDictInterface::get_filegroup(NdbFileg
 		     DICT_WAITFOR_TIMEOUT, 100);
   if (r)
   {
-    dst.m_id = -1;
+    dst.m_id = RNIL;
     dst.m_version = ~0;
     
     DBUG_PRINT("info", ("get_filegroup failed dictSignal"));

=== modified file 'storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp'
--- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp	2008-11-11 11:47:00 +0000
+++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp	2009-02-25 16:01:16 +0000
@@ -688,15 +688,12 @@ class NdbDictionaryImpl;
 class GlobalCacheInitObject
 {
 public:
-  NdbDictionaryImpl *m_dict;
   const BaseString &m_name;
-  GlobalCacheInitObject(NdbDictionaryImpl *dict,
-                        const BaseString &name) :
-    m_dict(dict),
+  GlobalCacheInitObject(const BaseString &name) :
     m_name(name)
   {}
   virtual ~GlobalCacheInitObject() {}
-  virtual int init(NdbTableImpl &tab) const = 0;
+  virtual int init(NdbDictionaryImpl *dict, NdbTableImpl &tab) const = 0;
 };
 
 class NdbDictionaryImpl : public NdbDictionary::Dictionary {
@@ -1176,15 +1173,14 @@ NdbDictionaryImpl::getImpl(const NdbDict
 class InitTable : public GlobalCacheInitObject
 {
 public:
-  InitTable(NdbDictionaryImpl *dict,
-            const BaseString &name) :
-    GlobalCacheInitObject(dict, name)
+  InitTable(const BaseString &name) :
+    GlobalCacheInitObject(name)
   {}
-  int init(NdbTableImpl &tab) const
+  int init(NdbDictionaryImpl *dict, NdbTableImpl &tab) const
   {
-    int res= m_dict->getBlobTables(tab);
+    int res= dict->getBlobTables(tab);
     if (res == 0)
-      res= m_dict->createDefaultNdbRecord(&tab, NULL);
+      res= dict->createDefaultNdbRecord(&tab, NULL);
     
     return res;
   }
@@ -1195,7 +1191,7 @@ NdbTableImpl *
 NdbDictionaryImpl::getTableGlobal(const char * table_name)
 {
   const BaseString internal_tabname(m_ndb.internalize_table_name(table_name));
-  return fetchGlobalTableImplRef(InitTable(this, internal_tabname));
+  return fetchGlobalTableImplRef(InitTable(internal_tabname));
 }
 
 inline
@@ -1234,7 +1230,7 @@ NdbDictionaryImpl::get_local_table_info(
   if (info == 0)
   {
     NdbTableImpl *tab=
-      fetchGlobalTableImplRef(InitTable(this, internalTableName));
+      fetchGlobalTableImplRef(InitTable(internalTableName));
     if (tab)
     {
       info= Ndb_local_table_info::create(tab, m_local_table_data_size);
@@ -1256,12 +1252,12 @@ public:
   InitIndex(const BaseString &internal_indexname,
 	    const char *index_name,
 	    const NdbTableImpl &prim) :
-    GlobalCacheInitObject(0, internal_indexname),
+    GlobalCacheInitObject(internal_indexname),
     m_index_name(index_name),
     m_prim(prim)
     {}
   
-  int init(NdbTableImpl &tab) const {
+  int init(NdbDictionaryImpl *dict, NdbTableImpl &tab) const {
     DBUG_ENTER("InitIndex::init");
     DBUG_ASSERT(tab.m_indexType != NdbDictionary::Object::TypeUndefined);
     /**
@@ -1277,7 +1273,7 @@ public:
       tab.m_index = idx;
 
       /* Finally, create default NdbRecord for this index */
-      DBUG_RETURN(m_dict->createDefaultNdbRecord(&tab, &m_prim));
+      DBUG_RETURN(dict->createDefaultNdbRecord(&tab, &m_prim));
     }
     DBUG_RETURN(1);
   }

=== modified file 'storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp'
--- a/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp	2009-03-12 10:51:59 +0000
@@ -860,7 +860,7 @@ NdbEventOperationImpl::receive_event()
   DBUG_PRINT_EVENT("info",("sdata->operation %u  this: %p", operation, this));
   // now move the data into the RecAttrs
     
-  int is_update= operation == NdbDictionary::Event::_TE_UPDATE;
+  int is_insert= operation == NdbDictionary::Event::_TE_INSERT;
 
   Uint32 *aAttrPtr = m_data_item->ptr[0].p;
   Uint32 *aAttrEndPtr = aAttrPtr + m_data_item->ptr[0].sz;
@@ -883,7 +883,7 @@ NdbEventOperationImpl::receive_event()
       assert(tAttr->attrId() ==
 	     AttributeHeader(*aAttrPtr).getAttributeId());
       receive_data(tAttr, aDataPtr, tDataSz);
-      if (is_update)
+      if (!is_insert)
 	receive_data(tAttr1, aDataPtr, tDataSz);
       else
         tAttr1->setUNDEFINED(); // do not leave unspecified
@@ -900,7 +900,7 @@ NdbEventOperationImpl::receive_event()
   Uint32 tRecAttrId;
   Uint32 tAttrId;
   Uint32 tDataSz;
-  int hasSomeData=0;
+  int hasSomeData= (operation != NdbDictionary::Event::_TE_UPDATE);
   while ((aAttrPtr < aAttrEndPtr) && (tWorkingRecAttr != NULL)) {
     tRecAttrId = tWorkingRecAttr->attrId();
     tAttrId = AttributeHeader(*aAttrPtr).getAttributeId();
@@ -919,7 +919,7 @@ NdbEventOperationImpl::receive_event()
       break;
     
     if (tAttrId == tRecAttrId) {
-      hasSomeData++;
+      hasSomeData=1;
       
       DBUG_PRINT_EVENT("info",("set [%u] %u 0x%x [%u] 0x%x",
                                tAttrId, tDataSz, *aDataPtr, tRecAttrId, aDataPtr));
@@ -958,7 +958,7 @@ NdbEventOperationImpl::receive_event()
       break;
     if (tAttrId == tRecAttrId) {
       assert(!m_eventImpl->m_tableImpl->getColumn(tRecAttrId)->getPrimaryKey());
-      hasSomeData++;
+      hasSomeData=1;
       
       receive_data(tWorkingRecAttr, aDataPtr, tDataSz);
       tWorkingRecAttr = tWorkingRecAttr->next();
@@ -970,7 +970,7 @@ NdbEventOperationImpl::receive_event()
     tWorkingRecAttr = tWorkingRecAttr->next();
   }
   
-  if (hasSomeData || !is_update)
+  if (hasSomeData)
   {
     DBUG_RETURN_EVENT(1);
   }

=== modified file 'storage/ndb/src/ndbapi/NdbOperationSearch.cpp'
--- a/storage/ndb/src/ndbapi/NdbOperationSearch.cpp	2008-12-24 10:48:24 +0000
+++ b/storage/ndb/src/ndbapi/NdbOperationSearch.cpp	2009-03-12 10:51:59 +0000
@@ -522,49 +522,6 @@ NdbOperation::getKeyFromTCREQ(Uint32* da
   return 0;
 }
 
-int
-NdbOperation::handle_distribution_key(const NdbColumnImpl* tAttrInfo,
-                                      const Uint64* value, Uint32 len)
-{
-  DBUG_ENTER("NdbOperation::handle_distribution_key");
-
-  if (theDistrKeyIndicator_ == 1)
-    DBUG_RETURN(0);
-
-  if (theNoOfTupKeyLeft > 0 || m_accessTable->m_noOfDistributionKeys > 1)
-    DBUG_RETURN(0);
-  
-  DBUG_DUMP("value", (const uchar*)value, len << 2);
-
-  if(m_accessTable->m_noOfDistributionKeys == 1)
-  {
-    Ndb::Key_part_ptr ptrs[2];
-    ptrs[0].ptr = value;
-    ptrs[0].len = len;
-    ptrs[1].ptr = 0;
-    
-    const Uint32 MaxKeyLenInLongWords= (NDB_MAX_KEY_SIZE + 7)/ 8; 
-    Uint64 tmp[ MaxKeyLenInLongWords ]; 
-    Uint32 hashValue;
-    int ret = Ndb::computeHash(&hashValue, 
-                               m_currentTable,
-                               ptrs, tmp, sizeof(tmp));
-    
-    if (ret == 0)
-    {
-      setPartitionId(m_currentTable->getPartitionId(hashValue));
-    }
-#ifdef VM_TRACE
-    else
-    {
-      ndbout << "Err: " << ret << endl;
-      assert(false);
-    }
-#endif
-  }
-  DBUG_RETURN(0);
-}
-
 void
 NdbOperation::setPartitionId(Uint32 value)
 {
@@ -576,6 +533,14 @@ NdbOperation::setPartitionId(Uint32 valu
     return; // TODO : Consider adding int rc for error
   }
 
+  /* Todo - 6.4
+   * Should only be allowed for user-defined partitioned tables
+   * Add an #ifdef STRICT_SET_PARTITION_ID
+   * Cannot be on at least until Blobs stop setting partition
+   * id for parts and MySQLD stops setting it for Alter table.
+   * operations.
+   */
+
   theDistributionKey = value;
   theDistrKeyIndicator_ = 1;
   DBUG_PRINT("info", ("NdbOperation::setPartitionId: %u",

=== modified file 'storage/ndb/src/ndbapi/NdbScanOperation.cpp'
--- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2009-02-10 18:43:02 +0000
+++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2009-03-12 10:51:59 +0000
@@ -123,6 +123,7 @@ NdbScanOperation::init(const NdbTableImp
   m_scanUsingOldApi= true;
   m_readTuplesCalled= false;
   m_interpretedCodeOldApi= NULL;
+  m_pruneState= SPS_UNKNOWN;
 
   m_api_receivers_count = 0;
   m_current_api_receiver = 0;
@@ -288,6 +289,20 @@ NdbScanOperation::handleScanOptions(cons
   {
     /* Should not have any blobs defined at this stage */
     assert(theBlobList == NULL);
+    assert(m_pruneState == SPS_UNKNOWN);
+    
+    // TODO - 6.4
+    //      : Ideally we could insist that an explicit partition id
+    //        is only allowed for user-defined partitioned tables.
+    //        However, alter table for partitions currently uses this
+    //        (ndb_partition_key test)
+    //
+    //assert(m_attribute_record->table->m_fragmentType == 
+    //  NdbDictionary::Object::UserDefined);
+    m_pruneState= SPS_FIXED;
+    m_pruningKey= options->partitionId;
+    
+    /* And set the vars in the operation now too */
     theDistributionKey = options->partitionId;
     theDistrKeyIndicator_ = 1;
     DBUG_PRINT("info", ("NdbScanOperation::handleScanOptions(dist key): %u",
@@ -327,6 +342,28 @@ NdbScanOperation::handleScanOptions(cons
     m_customData = options->customData;
   }
 
+  /* Preferred form of partitioning information */
+  if (options->optionsPresent & ScanOptions::SO_PART_INFO)
+  {
+    Uint32 partValue;
+    const Ndb::PartitionSpec* pSpec= options->partitionInfo;
+    if (unlikely(validatePartInfoPtr(pSpec,
+                                     options->sizeOfPartInfo) ||
+                 getPartValueFromInfo(pSpec,
+                                      m_currentTable,
+                                      &partValue)))
+      return -1;
+    
+    assert(m_pruneState == SPS_UNKNOWN);
+    m_pruneState= SPS_FIXED;
+    m_pruningKey= partValue;
+    
+    theDistributionKey= partValue;
+    theDistrKeyIndicator_= 1;
+    DBUG_PRINT("info", ("Set distribution key from partition spec to %u",
+                        partValue));
+  }
+
   return 0;
 }
 
@@ -473,6 +510,50 @@ NdbScanOperation::scanImpl(const NdbScan
   return 0;
 }
 
+int
+NdbScanOperation::handleScanOptionsVersion(const ScanOptions*& optionsPtr, 
+                                           Uint32 sizeOfOptions,
+                                           ScanOptions& currOptions)
+{
+  /* Handle different sized ScanOptions */
+  if (unlikely((sizeOfOptions !=0) &&
+               (sizeOfOptions != sizeof(ScanOptions))))
+  {
+    /* Different size passed, perhaps it's an old client */
+    if (sizeOfOptions == sizeof(ScanOptions_v1))
+    {
+      const ScanOptions_v1* oldOptions= 
+        (const ScanOptions_v1*) optionsPtr;
+
+      /* v1 of ScanOptions, copy into current version
+       * structure and update options ptr
+       */
+      currOptions.optionsPresent= oldOptions->optionsPresent;
+      currOptions.scan_flags= oldOptions->scan_flags;
+      currOptions.parallel= oldOptions->parallel;
+      currOptions.batch= oldOptions->batch;
+      currOptions.extraGetValues= oldOptions->extraGetValues;
+      currOptions.numExtraGetValues= oldOptions->numExtraGetValues;
+      currOptions.partitionId= oldOptions->partitionId;
+      currOptions.interpretedCode= oldOptions->interpretedCode;
+      currOptions.customData= oldOptions->customData;
+      
+      /* New fields */
+      currOptions.partitionInfo= NULL;
+      currOptions.sizeOfPartInfo= 0;
+      
+      optionsPtr= &currOptions;
+    }
+    else
+    {
+      /* No other versions supported currently */
+      setErrorCodeAbort(4298);
+      /* Invalid or unsupported ScanOptions structure */
+      return -1;
+    }
+  }
+  return 0;
+}
 
 int
 NdbScanOperation::scanTableImpl(const NdbRecord *result_record,
@@ -486,21 +567,12 @@ NdbScanOperation::scanTableImpl(const Nd
   Uint32 parallel = 0;
   Uint32 batch = 0;
 
+  ScanOptions currentOptions;
+
   if (options != NULL)
   {
-    /* Check options size for versioning... */
-    if (unlikely((sizeOfOptions !=0) &&
-                 (sizeOfOptions != sizeof(ScanOptions))))
-    {
-      /* Handle different sized ScanOptions
-       * Probably smaller is old version, larger is new version
-       */
-      
-      /* No other versions supported currently */
-      setErrorCodeAbort(4298);
-      /* Invalid or unsupported ScanOptions structure */
+    if (handleScanOptionsVersion(options, sizeOfOptions, currentOptions))
       return -1;
-    }
     
     /* Process some initial ScanOptions - most are 
      * handled later
@@ -534,6 +606,42 @@ NdbScanOperation::scanTableImpl(const Nd
 }
 
 
+int
+NdbScanOperation::getPartValueFromInfo(const Ndb::PartitionSpec* partInfo,
+                                       const NdbTableImpl* table,
+                                       Uint32* partValue)
+{
+  if (partInfo->type == Ndb::PartitionSpec::PS_USER_DEFINED)
+  {
+    assert(table->m_fragmentType == NdbDictionary::Object::UserDefined);
+    *partValue= partInfo->UserDefined.partitionId;
+    return 0;
+  }
+  if (partInfo->type == Ndb::PartitionSpec::PS_DISTR_KEY_PART_PTR)
+  {
+    assert(table->m_fragmentType != NdbDictionary::Object::UserDefined);
+    Uint32 hashVal;
+    int ret= Ndb::computeHash(&hashVal, table, 
+                              partInfo->KeyPartPtr.tableKeyParts,
+                              partInfo->KeyPartPtr.xfrmbuf, 
+                              partInfo->KeyPartPtr.xfrmbuflen);
+    if (ret == 0)
+    {
+      *partValue= table->getPartitionId(hashVal);
+      return 0;
+    }
+    else
+    {
+      setErrorCodeAbort(ret);
+      return -1;
+    }
+  }
+  
+  /* 4542 : Unknown partition information type */
+  setErrorCodeAbort(4542);
+  return -1;
+}
+
 /*
   Compare two rows on some prefix of the index.
   This is used to see if we can determine that all rows in an index range scan
@@ -548,6 +656,9 @@ compare_index_row_prefix(const NdbRecord
 {
   Uint32 i;
 
+  if (row1 == row2) // Easy case with same ptrs
+    return 0;
+
   for (i= 0; i<prefix_length; i++)
   {
     const NdbRecord::Attr *col= &rec->columns[rec->key_indexes[i]];
@@ -583,17 +694,21 @@ compare_index_row_prefix(const NdbRecord
   return 0;
 }
 
-void
-NdbIndexScanOperation::setDistKeyFromRange(const NdbRecord *key_record,
+int
+NdbIndexScanOperation::getDistKeyFromRange(const NdbRecord *key_record,
                                            const NdbRecord *result_record,
                                            const char *row,
-                                           Uint32 distkeyMax)
+                                           Uint32* distKey)
 {
   const Uint32 MaxKeySizeInLongWords= (NDB_MAX_KEY_SIZE + 7) / 8; 
   Uint64 tmp[ MaxKeySizeInLongWords ];
   char* tmpshrink = (char*)tmp;
   size_t tmplen = sizeof(tmp);
   
+  /* This can't work for User Defined partitioning */
+  assert(key_record->table->m_fragmentType != 
+         NdbDictionary::Object::UserDefined);
+
   Ndb::Key_part_ptr ptrs[NDB_MAX_NO_OF_ATTRIBUTES_IN_KEY+1];
   Uint32 i;
   for (i = 0; i<key_record->distkey_index_length; i++)
@@ -608,8 +723,9 @@ NdbIndexScanOperation::setDistKeyFromRan
         bool len_ok = col->shrink_varchar(row, len, tmpshrink);
         if (!len_ok)
         {
-          assert(false);
-          return;
+          /* 4209 : Length parameter in equal/setValue is incorrect */
+          setErrorCodeAbort(4209);
+          return -1;
         }
         ptrs[i].ptr = tmpshrink;
         tmpshrink += len;
@@ -617,8 +733,9 @@ NdbIndexScanOperation::setDistKeyFromRan
       }
       else
       {
-        // no buffer...
-        return;
+        /* 4207 : Key size is limited to 4092 bytes */
+        setErrorCodeAbort(4207);
+        return -1;
       }
     }
     else
@@ -634,41 +751,82 @@ NdbIndexScanOperation::setDistKeyFromRan
                              ptrs, tmpshrink, tmplen);
   if (ret == 0)
   {
-    theDistributionKey= result_record->table->getPartitionId(hashValue);
-    theDistrKeyIndicator_= 1;
-
-    ScanTabReq *req= CAST_PTR(ScanTabReq, theSCAN_TABREQ->getDataPtrSend());
-    ScanTabReq::setDistributionKeyFlag(req->requestInfo, 1);
-    req->distributionKey= theDistributionKey;
-    theSCAN_TABREQ->setLength(ScanTabReq::StaticLength + 1);
+    /* Return actual partitionId determined by hash */
+    *distKey= result_record->table->getPartitionId(hashValue);
+    return 0;
   }
-#ifdef VM_TRACE
   else
   {
+#ifdef VM_TRACE
     ndbout << "err: " << ret << endl;
-    assert(false);
-  }
 #endif
+    setErrorCodeAbort(ret);
+    return -1;
+  }
 }
 
+int
+NdbScanOperation::validatePartInfoPtr(const Ndb::PartitionSpec*& partInfo,
+                                      Uint32 sizeOfPartInfo)
+{  
+  if (unlikely((sizeOfPartInfo != sizeof(Ndb::PartitionSpec)) &&
+               (sizeOfPartInfo != 0)))
+  {
+    /* 4545 : Invalid or Unsupported PartitionInfo structure */
+    setErrorCodeAbort(4545);
+    return -1;
+  }
+  
+  if (partInfo->type != Ndb::PartitionSpec::PS_NONE)
+  {
+    if (m_pruneState == SPS_FIXED)
+    {
+      /* 4543 : Duplicate partitioning information supplied */
+      setErrorCodeAbort(4543);
+      return -1;
+    }
+    
+    if ((partInfo->type == Ndb::PartitionSpec::PS_USER_DEFINED) !=
+        ((m_currentTable->m_fragmentType == NdbDictionary::Object::UserDefined)))
+    {
+      /* Mismatch between type of partitioning info supplied, and table's
+       * partitioning type
+       */
+      /* 4544 : Wrong partitionInfo type for table */
+      setErrorCodeAbort(4544);
+      return -1;
+    }
+  }
+  else
+  {
+    /* PartInfo supplied, but set to NONE */
+    partInfo= NULL;
+  }
+
+  return 0;
+}
+
+
+int
+NdbIndexScanOperation::setBound(const NdbRecord* key_record,
+                                const IndexBound& bound)
+{
+  return setBound(key_record, bound, NULL, 0);
+}
 
 /** 
  * setBound()
  *
  * This method is called from scanIndex() and setBound().  
  * It adds a bound to an Index Scan.
+ * It can be passed extra partitioning information.
  */
 int 
 NdbIndexScanOperation::setBound(const NdbRecord *key_record,
-                                const IndexBound& bound)
+                                const IndexBound& bound,
+                                const Ndb::PartitionSpec* partInfo,
+                                Uint32 sizeOfPartInfo)
 {
-  /*
-    Set up index range bounds, write into keyinfo.
-    
-    ToDo: We only set scan distribution key if there's only one
-    scan bound. (see BUG#25821).  MRR/BKA does not use it.
-  */
-
   if (unlikely((theStatus != NdbOperation::UseNdbRecord)))
   {
     setErrorCodeAbort(4284);
@@ -691,6 +849,21 @@ NdbIndexScanOperation::setBound(const Nd
     return -1;
   }
 
+  /* Check the base table's partitioning scheme 
+   * (Ordered index itself has 'undefined' fragmentation)
+   */
+  bool tabHasUserDefPartitioning= (m_currentTable->m_fragmentType == 
+                                   NdbDictionary::Object::UserDefined);
+
+  /* Validate explicit partitioning info if it's supplied */
+  if (partInfo)
+  {
+    /* May update the PartInfo ptr */
+    if (validatePartInfoPtr(partInfo,
+                            sizeOfPartInfo))
+      return -1;
+  }
+
   m_num_bounds++;
 
   if (unlikely((m_num_bounds > 1) &&
@@ -777,34 +950,125 @@ NdbIndexScanOperation::setBound(const Nd
   m_first_bound_word= theKEYINFOptr + theTotalNrOfKeyWordInSignal;
   m_this_bound_start= theTupKeyLen;
 
-  /*
-    Now check if the range bounds a single distribution key. If so, we need
-    scan only a single fragment.
-    
-    ToDo: we do not attempt to identify the case where we have multiple
-    ranges, but they all bound the same single distribution key. It seems
-    not really worth the effort to optimise this case, better to fix the
-    multi-range protocol so that the distribution key could be specified
-    individually for each of the multiple ranges.
-  */
-  if (m_num_bounds == 1 &&  
-      ! theDistrKeyIndicator_ && // Partitioning not already specified.
-      ! m_multi_range)           // Only single range optimisation currently
-  {
-    Uint32 index_distkeys = key_record->m_no_of_distribution_keys;
-    Uint32 table_distkeys = m_attribute_record->m_no_of_distribution_keys;
-    Uint32 distkey_min= key_record->m_min_distkey_prefix_length;
-    if (index_distkeys == table_distkeys &&
-        common_key_count >= distkey_min &&
-        bound.low_key &&
-        bound.high_key &&
-        0==compare_index_row_prefix(key_record,
-                                    bound.low_key,
-                                    bound.high_key,
-                                    distkey_min))
-      setDistKeyFromRange(key_record, m_attribute_record,
-                          bound.low_key, distkey_min);
-  }
+
+  /* Now determine if the scan can (continue to) be pruned to one
+   * partition
+   * 
+   * This can only be the case if 
+   *   - There's no overriding partition id/info specified in 
+   *     ScanOptions 
+   *     AND
+   *   - This range scan can be pruned to 1 partition 'value'
+   *     AND
+   *   - All previous ranges (MRR) were partition pruned 
+   *     to the same partition 'value'
+   *
+   * Where partition 'value' is either a partition id or a hash
+   * that maps to one in the kernel.
+   */
+  if ((m_pruneState == SPS_UNKNOWN) ||      // First range
+      (m_pruneState == SPS_ONE_PARTITION))  // Previous ranges are commonly pruned
+  {
+    bool currRangeHasOnePartVal= false;
+    Uint32 currRangePartValue= 0;
+
+    /* Determine whether this range scan can be pruned */
+    if (partInfo)
+    {
+      /* Explicit partitioning info supplied, use it to get a value */
+      currRangeHasOnePartVal= true;
+
+      if (getPartValueFromInfo(partInfo,
+                               m_attribute_record->table,
+                               &currRangePartValue))
+      {
+        return -1;
+      }
+    }
+    else
+    {
+      if (likely(!tabHasUserDefPartitioning))
+      {
+        /* Attempt to get implicit partitioning info from range bounds - 
+         * only possible if they are present and bound a single value 
+         * of the table's distribution keys
+         */
+        Uint32 index_distkeys = key_record->m_no_of_distribution_keys;
+        Uint32 table_distkeys = m_attribute_record->m_no_of_distribution_keys;
+        Uint32 distkey_min= key_record->m_min_distkey_prefix_length;
+        if (index_distkeys == table_distkeys &&   // Index has all base table d-keys
+            common_key_count >= distkey_min &&    // Bounds have all d-keys
+            bound.low_key &&                      // Have both bounds
+            bound.high_key &&
+            0==compare_index_row_prefix(key_record,     // Both bounds are same
+                                        bound.low_key,
+                                        bound.high_key,
+                                        distkey_min))
+        {
+          currRangeHasOnePartVal= true;
+          if (getDistKeyFromRange(key_record, m_attribute_record,
+                                  bound.low_key,
+                                  &currRangePartValue))
+            return -1;
+        }
+      }
+    }
+     
+
+    /* Determine whether this pruned range fits with any existing
+     * range pruning
+     * As we can currently only prune a single scan to one partition
+     * (Not a set of partitions, or a set of partitions per range)
+     * we can only prune if all ranges happen to be prune-able to the
+     * same partition.
+     * In future perhaps Ndb can be enhanced to support partition sets
+     * and/or per-range partition pruning.
+     */
+    const ScanPruningState prevPruneState= m_pruneState;
+    if (currRangeHasOnePartVal)
+    {
+      if (m_pruneState == SPS_UNKNOWN)
+      {
+        /* Prune the scan to use this range's partition value */
+        m_pruneState= SPS_ONE_PARTITION;
+        m_pruningKey= currRangePartValue;
+      }
+      else
+      {
+        /* If this range's partition value is the same as the previous
+         * ranges then we can stay pruned, otherwise we cannot
+         */
+        assert(m_pruneState == SPS_ONE_PARTITION);
+        if (currRangePartValue != m_pruningKey)
+        {
+          /* This range is found in a different partition to previous
+           * range(s).  We cannot prune this scan.
+           */
+          m_pruneState= SPS_MULTI_PARTITION;
+        }
+      }
+    }
+    else
+    {
+      /* This range cannot be scanned by scanning a single partition
+       * Therefore the scan must scan all partitions
+       */
+      m_pruneState= SPS_MULTI_PARTITION;
+    }
+
+    /* Now modify the SCANTABREQ */
+    if (m_pruneState != prevPruneState)
+    {
+      theDistrKeyIndicator_= (m_pruneState == SPS_ONE_PARTITION);
+      theDistributionKey= m_pruningKey;
+
+      ScanTabReq *req= CAST_PTR(ScanTabReq, theSCAN_TABREQ->getDataPtrSend());
+      ScanTabReq::setDistributionKeyFlag(req->requestInfo, theDistrKeyIndicator_);
+      req->distributionKey= theDistributionKey;
+      theSCAN_TABREQ->setLength(ScanTabReq::StaticLength + theDistrKeyIndicator_);
+    }
+  } // if (m_pruneState == UNKNOWN / SPS_ONE_PARTITION)
+
   return 0;
 } // ::setBound();
 
@@ -824,21 +1088,12 @@ NdbIndexScanOperation::scanIndexImpl(con
   Uint32 parallel = 0;
   Uint32 batch = 0;
 
+  ScanOptions currentOptions;
+
   if (options != NULL)
   {
-    /* Check options size for versioning... */
-    if (unlikely((sizeOfOptions !=0) &&
-                 (sizeOfOptions != sizeof(ScanOptions))))
-    {
-      /* Handle different sized ScanOptions
-       * Probably smaller is old version, larger is new version
-       */
-      
-      /* No other versions supported currently */
-      setErrorCodeAbort(4298);
-      /* Invalid or unsupported ScanOptions structure */
+    if (handleScanOptionsVersion(options, sizeOfOptions, currentOptions))
       return -1;
-    }
     
     /* Process some initial ScanOptions here
      * The rest will be handled later
@@ -985,6 +1240,7 @@ NdbScanOperation::processTableScanDefs(N
                                        Uint32 batch)
 {
   m_ordered = m_descending = false;
+  m_pruneState= SPS_UNKNOWN;
   Uint32 fragCount = m_currentTable->m_fragmentCount;
 
   if (parallel > fragCount || parallel == 0) {
@@ -1781,7 +2037,14 @@ int NdbScanOperation::finaliseScanOldApi
   options.parallel= m_savedParallelOldApi;
   options.batch= m_savedBatchOldApi;
 
-  /* customData, interpretedCode or partitionId should 
+  if (theDistrKeyIndicator_ == 1)
+  {
+    /* User has defined a partition id specifically */
+    options.optionsPresent |= ScanOptions::SO_PARTITION_ID;
+    options.partitionId= theDistributionKey;
+  }
+
+  /* customData or interpretedCode should 
    * already be set in the operation members - no need 
    * to pass in as ScanOptions
    */
@@ -2876,8 +3139,6 @@ NdbIndexScanOperation::getIndexBoundFrom
 {
   return &((OldApiScanRangeDefinition*)recAttr->aRef())->ib;
 }
-
-
 /* Method called to release any resources allocated by the old 
  * Index Scan bound API
  */
@@ -3624,3 +3885,15 @@ NdbIndexScanOperation::get_range_no()
   }
   return -1;
 }
+
+
+bool
+NdbScanOperation::getPruned() const
+{
+  /* Note that for old Api scans, the bounds are not added until 
+   * execute() time, so this will return false until after execute
+   */
+  return ((m_pruneState == SPS_ONE_PARTITION) ||
+          (m_pruneState == SPS_FIXED));
+}
+

=== modified file 'storage/ndb/src/ndbapi/ndberror.c'
--- a/storage/ndb/src/ndbapi/ndberror.c	2009-02-10 18:39:11 +0000
+++ b/storage/ndb/src/ndbapi/ndberror.c	2009-03-12 10:51:59 +0000
@@ -288,6 +288,7 @@ ErrorBundle ErrorCodes[] = {
   { 4348, DMEC, IE, "Inconsistency detected at alter index" },
   { 4349, DMEC, IE, "Inconsistency detected at index usage" },
   { 4350, DMEC, IE, "Transaction already aborted" },
+  { 4351, DMEC, TO, "Timeout/deadlock during index build" },
 
   /**
    * Application error
@@ -589,6 +590,10 @@ ErrorBundle ErrorCodes[] = {
   { 4539, DMEC, AE, "NdbInterpretedCode not supported for operation type" },
   { 4540, DMEC, AE, "Attempt to pass an Index column to createRecord.  Use base table columns only" },
   { 4541, DMEC, AE, "IndexBound has no bound information" },
+  { 4542, DMEC, AE, "Unknown partition information type" },
+  { 4543, DMEC, AE, "Duplicate partitioning information supplied" },
+  { 4544, DMEC, AE, "Wrong partitionInfo type for table" },
+  { 4545, DMEC, AE, "Invalid or Unsupported PartitionInfo structure" },
 
   { 4200, DMEC, AE, "Status Error when defining an operation" },
   { 4201, DMEC, AE, "Variable Arrays not yet supported" },

=== modified file 'storage/ndb/test/include/HugoOperations.hpp'
--- a/storage/ndb/test/include/HugoOperations.hpp	2008-11-17 09:26:25 +0000
+++ b/storage/ndb/test/include/HugoOperations.hpp	2009-03-06 18:06:17 +0000
@@ -91,6 +91,8 @@ public:  
 		   int rowId);
 
   int equalForRow(NdbOperation*, int rowid);
+
+  bool getPartIdForRow(const NdbOperation* pOp, int rowid, Uint32& partId);
   
   int setValues(NdbOperation*, int rowId, int updateId);
   

=== modified file 'storage/ndb/test/include/NdbBackup.hpp'
--- a/storage/ndb/test/include/NdbBackup.hpp	2006-12-23 19:20:40 +0000
+++ b/storage/ndb/test/include/NdbBackup.hpp	2009-03-09 09:24:02 +0000
@@ -39,6 +39,8 @@ public:
   int FailSlave(NdbRestarter& _restarter);
   int Fail(NdbRestarter& _restarter, int *Fail_codes, const int sz, bool onMaster);
 
+  int clearOldBackups();
+
 private:
 
   int execRestore(bool _restore_data,

=== modified file 'storage/ndb/test/ndbapi/bank/Bank.cpp'
--- a/storage/ndb/test/ndbapi/bank/Bank.cpp	2008-02-19 15:00:29 +0000
+++ b/storage/ndb/test/ndbapi/bank/Bank.cpp	2009-03-11 15:33:32 +0000
@@ -522,7 +522,7 @@ int Bank::performMakeGLs(int yield){
 	g_err << "performValidateGLs verification failed" << endl;
 	return NDBT_FAILED;
       }
-      g_info << "performValidateGLs failed" << endl;
+      g_info << "performValidateGLs failed: " << result << endl;
       return NDBT_FAILED;
       continue;
     }
@@ -619,7 +619,7 @@ int Bank::performValidateAllGLs(){
 	g_err << "performValidateGLs verification failed" << endl;
 	return NDBT_FAILED;
       }
-      g_err << "performValidateGLs failed" << endl;
+      g_err << "performValidateGLs failed: " << result << endl;
       return NDBT_FAILED;
     }
 
@@ -1090,7 +1090,7 @@ int Bank::sumTransactionsForGL(const Uin
     
     int result = performValidateGL(glTime);
     if (result != NDBT_OK){
-      g_err << "performValidateGL failed" << endl;
+      g_err << "performValidateGL failed: " << result << endl;
       return result;
     }
     

=== modified file 'storage/ndb/test/ndbapi/testBackup.cpp'
--- a/storage/ndb/test/ndbapi/testBackup.cpp	2008-03-03 11:12:37 +0000
+++ b/storage/ndb/test/ndbapi/testBackup.cpp	2009-03-09 09:24:02 +0000
@@ -26,6 +26,13 @@
   result = NDBT_FAILED; \
   continue; } 
 
+int
+clearOldBackups(NDBT_Context* ctx, NDBT_Step* step)
+{
+  NdbBackup backup(GETNDB(step)->getNodeId());
+  backup.clearOldBackups();
+  return NDBT_OK;
+}
 
 int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
 
@@ -481,6 +488,7 @@ TESTCASE("BackupOne", 
 	 "3. Drop tables and restart \n"
 	 "4. Restore\n"
 	 "5. Verify count and content of table\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(runLoadTable);
   INITIALIZER(runBackupOne);
   INITIALIZER(runDropTablesRestart);
@@ -495,6 +503,7 @@ TESTCASE("BackupRandom", 
 	 "3. Drop tables and restart \n"
 	 "4. Restore\n"
 	 "5. Verify count and content of table\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(runLoadTable);
   INITIALIZER(runBackupRandom);
   INITIALIZER(runDropTablesRestart);
@@ -505,6 +514,7 @@ TESTCASE("BackupRandom", 
 TESTCASE("BackupDDL", 
 	 "Test that backup and restore works on with DDL ongoing\n"
 	 "1. Backups and DDL (create,drop,table.index)"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(runLoadTable);
   STEP(runBackupLoop);
   STEP(runDDL);
@@ -521,6 +531,7 @@ TESTCASE("BackupBank", 
 	 "3.  Restart ndb -i and reload each backup\n"
 	 "    let bank verify that the backup is consistent\n"
 	 "4.  Drop bank\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
   STEP(runBankTransactions);
@@ -541,36 +552,42 @@ TESTCASE("BackupBank", 
 }
 TESTCASE("NFMaster", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setMaster);
   STEP(runAbort);
 
 }
 TESTCASE("NFMasterAsSlave", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setMasterAsSlave);
   STEP(runAbort);
 
 }
 TESTCASE("NFSlave", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setSlave);
   STEP(runAbort);
 
 }
 TESTCASE("FailMaster", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setMaster);
   STEP(runFail);
 
 }
 TESTCASE("FailMasterAsSlave", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setMasterAsSlave);
   STEP(runFail);
 
 }
 TESTCASE("FailSlave", 
 	 "Test that backup behaves during node failiure\n"){
+  INITIALIZER(clearOldBackups);
   INITIALIZER(setSlave);
   STEP(runFail);
 

=== modified file 'storage/ndb/test/ndbapi/testBlobs.cpp'
--- a/storage/ndb/test/ndbapi/testBlobs.cpp	2008-05-23 10:20:10 +0000
+++ b/storage/ndb/test/ndbapi/testBlobs.cpp	2009-03-02 16:08:11 +0000
@@ -210,6 +210,9 @@ static Uint32 g_batchSize= 0;
 static Uint32 g_scanFlags= 0;
 static Uint32 g_parallel= 0;
 static Uint32 g_usingDisk= false;
+static const Uint32 MAX_FRAGS=48 * 8 * 4; // e.g. 48 nodes, 8 frags/node, 4 replicas
+static Uint16 frag_ng_mappings[MAX_FRAGS];
+
 
 static const char* stylename[3] = {
   "style=getValue/setValue",
@@ -480,6 +483,12 @@ dropTable()
   return 0;
 }
 
+static unsigned
+urandom(unsigned n)
+{
+  return n == 0 ? 0 : random() % n;
+}
+
 static int
 createTable(int storageType)
 {
@@ -494,7 +503,39 @@ createTable(int storageType)
   if (storageType == STORAGE_DISK)
     tab.setTablespaceName(g_tsName);
   tab.setLogging(loggingRequired);
-  tab.setFragmentType(NdbDictionary::Object::FragAllLarge);
+  
+  /* Choose from the interesting fragmentation types :
+   * DistrKeyHash, DistrKeyLin, UserDefined
+   * Others are obsolete fragment-count setting variants 
+   * of DistrKeyLin
+   * For UserDefined partitioning, we need to set the partition
+   * id for all PK operations.
+   */
+  Uint32 fragTypeRange= 1 + (NdbDictionary::Object::UserDefined - 
+                             NdbDictionary::Object::DistrKeyHash);
+  Uint32 fragType= NdbDictionary::Object::DistrKeyHash + urandom(fragTypeRange);
+
+  tab.setFragmentType((NdbDictionary::Object::FragmentType)fragType);
+
+  if (fragType == NdbDictionary::Object::UserDefined)
+  {
+    /* Need to set the FragmentCount and fragment to NG mapping
+     * for this partitioning type 
+     */
+    const Uint32 numNodes= g_ncc->no_db_nodes();
+    const Uint32 numReplicas= 2; // Assumption
+    const Uint32 guessNumNgs= numNodes/2;
+    const Uint32 numNgs= guessNumNgs?guessNumNgs : 1;
+    const Uint32 numFragsPerNode= 2 + (rand() % 3);
+    const Uint32 numPartitions= numReplicas * numNgs * numFragsPerNode;
+    
+    tab.setFragmentCount(numPartitions);
+    for (Uint32 i=0; i<numPartitions; i++)
+    {
+      frag_ng_mappings[i]= i % numNgs;
+    }
+    tab.setFragmentData(frag_ng_mappings, sizeof(uint16) * numPartitions);
+  }
   const Chr& pk2chr = g_opt.m_pk2chr;
   // col PK1 - Uint32
   { NdbDictionary::Column col("PK1");
@@ -615,12 +656,6 @@ createTable(int storageType)
 
 // tuples
 
-static unsigned
-urandom(unsigned n)
-{
-  return n == 0 ? 0 : random() % n;
-}
-
 struct Bval {
   const Bcol& m_bcol;
   char* m_val;
@@ -730,6 +765,11 @@ struct Tup {
       return m_pk2;
     return urandom(2) == 0 ? m_pk2 : m_pk2eq;
   }
+  Uint32 getPartitionId(Uint32 numParts) const {
+    /* Only for UserDefined tables really */
+    return m_pk1 % numParts; // MySQLD hash(PK1) style partitioning
+  }
+
 private:
   Tup(const Tup&);
   Tup& operator=(const Tup&);
@@ -738,6 +778,32 @@ private:
 static Tup* g_tups;
 
 static void
+setUDpartId(const Tup& tup, NdbOperation* op)
+{
+  const NdbDictionary::Table* tab= op->getTable();
+  if (tab->getFragmentType() == NdbDictionary::Object::UserDefined)
+  {
+    Uint32 partId= tup.getPartitionId(tab->getFragmentCount());
+    DBG("Setting partition id to " << partId << " out of " << 
+        tab->getFragmentCount());
+    op->setPartitionId(partId);
+  }
+}
+
+static void
+setUDpartIdNdbRecord(const Tup& tup, 
+                     const NdbDictionary::Table* tab, 
+                     NdbOperation::OperationOptions& opts)
+{
+  opts.optionsPresent= 0;
+  if (tab->getFragmentType() == NdbDictionary::Object::UserDefined)
+  {
+    opts.optionsPresent= NdbOperation::OperationOptions::OO_PARTITION_ID;
+    opts.partitionId= tup.getPartitionId(tab->getFragmentCount());
+  } 
+}
+
+static void
 calcBval(const Bcol& b, Bval& v, bool keepsize)
 {
   if (b.m_nullable && urandom(10) == 0) {
@@ -1163,6 +1229,7 @@ verifyHeadInline(Tup& tup)
     CHK(g_opr->equal("PK2", tup.pk2()) == 0);
     CHK(g_opr->equal("PK3", (char*)&tup.m_pk3) == 0);
   }
+  setUDpartId(tup, g_opr);
   NdbRecAttr* ra1;
   NdbRecAttr* ra2;
   NdbRecAttr* ra_frag;
@@ -1229,6 +1296,10 @@ verifyBlobTable(const Bval& v, Uint32 pk
     CHK((ra_data = g_ops->getValue("NDB$DATA")) != 0);
   }
 
+  /* No partition id set on Blob part table scan so that we
+   * find any misplaced parts in other partitions
+   */
+
   CHK((ra_frag = g_ops->getValue(NdbDictionary::Column::FRAGMENT)) != 0);
   CHK(g_con->execute(NoCommit) == 0);
   unsigned partcount;
@@ -1251,7 +1322,8 @@ verifyBlobTable(const Bval& v, Uint32 pk
         continue;
     }
     Uint32 part = ra_part->u_32_value();
-    DBG("part " << part << " of " << partcount);
+    Uint32 frag2 = ra_frag->u_32_value();
+    DBG("part " << part << " of " << partcount << " from fragment " << frag2);
     CHK(part < partcount && ! seen[part]);
     seen[part] = 1;
     unsigned n = b.m_inline + part * b.m_partsize;
@@ -1293,7 +1365,6 @@ verifyBlobTable(const Bval& v, Uint32 pk
         i++;
       }
     }
-    Uint32 frag2 = ra_frag->u_32_value();
     DBG("frags main=" << frag << " blob=" << frag2 << " stripe=" << b.m_stripe);
     if (b.m_stripe == 0)
       CHK(frag == frag2);
@@ -1352,6 +1423,7 @@ insertPk(int style, int api)
         CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
         CHK(g_opr->equal("PK3", tup.m_pk3) == 0);
       }
+      setUDpartId(tup, g_opr);
       CHK(getBlobHandles(g_opr) == 0);
     }
     else
@@ -1361,7 +1433,15 @@ insertPk(int style, int api)
         memcpy(&tup.m_row[g_pk2_offset], tup.m_pk2, g_opt.m_pk2chr.m_totlen);
         memcpy(&tup.m_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
       }
-      CHK((g_const_opr = g_con->insertTuple(g_full_record, tup.m_row)) != 0);
+      NdbOperation::OperationOptions opts;
+      setUDpartIdNdbRecord(tup,
+                           g_ndb->getDictionary()->getTable(g_opt.m_tname),
+                           opts);
+      CHK((g_const_opr = g_con->insertTuple(g_full_record, 
+                                            tup.m_row,
+                                            NULL,
+                                            &opts,
+                                            sizeof(opts))) != 0);
       CHK(getBlobHandles(g_const_opr) == 0);
     }
     if (style == 0) {
@@ -1414,6 +1494,7 @@ readPk(int style, int api)
         CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
         CHK(g_opr->equal("PK3", tup.m_pk3) == 0);
       }
+      setUDpartId(tup, g_opr);
       CHK(getBlobHandles(g_opr) == 0);
     }
     else
@@ -1423,13 +1504,24 @@ readPk(int style, int api)
         memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
         memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
       }
+      NdbOperation::OperationOptions opts;
+      setUDpartIdNdbRecord(tup,
+                           g_ndb->getDictionary()->getTable(g_opt.m_tname),
+                           opts);
       if (urandom(2) == 0)
         CHK((g_const_opr = g_con->readTuple(g_key_record, tup.m_key_row,
-                                            g_blob_record, tup.m_row)) != 0);
+                                            g_blob_record, tup.m_row,
+                                            NdbOperation::LM_Read,
+                                            NULL,
+                                            &opts,
+                                            sizeof(opts))) != 0);
       else
         CHK((g_const_opr = g_con->readTuple(g_key_record, tup.m_key_row,
                                             g_blob_record, tup.m_row,
-                                            NdbOperation::LM_CommittedRead)) != 0);
+                                            NdbOperation::LM_CommittedRead,
+                                            NULL,
+                                            &opts,
+                                            sizeof(opts))) != 0);
       CHK(getBlobHandles(g_const_opr) == 0);
     }
     if (style == 0) {
@@ -1485,6 +1577,7 @@ updatePk(int style, int api)
           CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
           CHK(g_opr->equal("PK3", tup.m_pk3) == 0);
         }
+        setUDpartId(tup, g_opr);
         CHK(getBlobHandles(g_opr) == 0);
       }
       else
@@ -1494,19 +1587,27 @@ updatePk(int style, int api)
           memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
           memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
         }
+        NdbOperation::OperationOptions opts;
+        setUDpartIdNdbRecord(tup,
+                             g_ndb->getDictionary()->getTable(g_opt.m_tname),
+                             opts);
         if (mode == 0) {
           DBG("using updateTuple");
           CHK((g_const_opr= g_con->updateTuple(g_key_record, tup.m_key_row,
-                                               g_blob_record, tup.m_row)) != 0);
+                                               g_blob_record, tup.m_row,
+                                               NULL, &opts, sizeof(opts))) != 0);
         } else if (mode == 1) {
           DBG("using readTuple exclusive");
           CHK((g_const_opr= g_con->readTuple(g_key_record, tup.m_key_row,
                                              g_blob_record, tup.m_row,
-                                             NdbOperation::LM_Exclusive)) != 0);
+                                             NdbOperation::LM_Exclusive,
+                                             NULL, &opts, sizeof(opts))) != 0);
         } else {
           DBG("using readTuple - will fail and retry");
           CHK((g_const_opr= g_con->readTuple(g_key_record, tup.m_key_row,
-                                             g_blob_record, tup.m_row)) != 0);
+                                             g_blob_record, tup.m_row,
+                                             NdbOperation::LM_Read,
+                                             NULL, &opts, sizeof(opts))) != 0);
         }
         CHK(getBlobHandles(g_const_opr) == 0);
       }
@@ -1552,6 +1653,7 @@ writePk(int style, int api)
         CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
         CHK(g_opr->equal("PK3", tup.m_pk3) == 0);
       }
+      setUDpartId(tup, g_opr);
       CHK(getBlobHandles(g_opr) == 0);
     }
     else
@@ -1564,8 +1666,13 @@ writePk(int style, int api)
         memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
         memcpy(&tup.m_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
       }
+      NdbOperation::OperationOptions opts;
+      setUDpartIdNdbRecord(tup,
+                           g_ndb->getDictionary()->getTable(g_opt.m_tname),
+                           opts);
       CHK((g_const_opr= g_con->writeTuple(g_key_record, tup.m_key_row,
-                                          g_full_record, tup.m_row)) != 0);
+                                          g_full_record, tup.m_row,
+                                          NULL, &opts, sizeof(opts))) != 0);
       CHK(getBlobHandles(g_const_opr) == 0);
     }
     if (style == 0) {
@@ -1601,6 +1708,11 @@ deletePk(int api)
     {
       CHK((g_opr = g_con->getNdbOperation(g_opt.m_tname)) != 0);
       CHK(g_opr->deleteTuple() == 0);
+      /* Must set explicit partitionId before equal() calls as that's
+       * where implicit Blob handles are created which need the 
+       * partitioning info
+       */
+      setUDpartId(tup, g_opr);
       CHK(g_opr->equal("PK1", tup.m_pk1) == 0);
       if (g_opt.m_pk2chr.m_len != 0)
       {
@@ -1615,8 +1727,13 @@ deletePk(int api)
         memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
         memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
       }
+      NdbOperation::OperationOptions opts;
+      setUDpartIdNdbRecord(tup,
+                           g_ndb->getDictionary()->getTable(g_opt.m_tname),
+                           opts);
       CHK((g_const_opr= g_con->deleteTuple(g_key_record, tup.m_key_row,
-                                           g_full_record)) != 0);
+                                           g_full_record, NULL,
+                                           NULL, &opts, sizeof(opts))) != 0);
     }
     if (++n == g_opt.m_batch) {
       CHK(g_con->execute(Commit) == 0);
@@ -1665,6 +1782,7 @@ deleteNoPk()
   DBG("deletePk pk1=" << hex << tup.m_pk1);
   CHK((g_opr = g_con->getNdbOperation(g_opt.m_tname)) != 0);
   CHK(g_opr->deleteTuple() == 0);
+  setUDpartId(tup, g_opr);
   CHK(g_opr->equal("PK1", tup.m_pk1) == 0);
   if (pk2chr.m_len != 0) {
     CHK(g_opr->equal("PK2", tup.m_pk2) == 0);
@@ -1700,12 +1818,14 @@ readIdx(int style, int api)
         CHK(g_opx->readTuple(NdbOperation::LM_CommittedRead) == 0);
       CHK(g_opx->equal("PK2", tup.m_pk2) == 0);
       CHK(g_opx->equal("PK3", tup.m_pk3) == 0);
+      /* No need to set partition Id for unique indexes */
       CHK(getBlobHandles(g_opx) == 0);
     }
     else
     {
       memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
       memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
+      /* No need to set partition Id for unique indexes */
       if (urandom(2) == 0)
         CHK((g_const_opr= g_con->readTuple(g_idx_record, tup.m_key_row,
                                            g_blob_record, tup.m_row)) != 0);
@@ -1753,12 +1873,14 @@ updateIdx(int style, int api)
       CHK(g_opx->updateTuple() == 0);
       CHK(g_opx->equal("PK2", tup.m_pk2) == 0);
       CHK(g_opx->equal("PK3", tup.m_pk3) == 0);
+      /* No need to set partition Id for unique indexes */
       CHK(getBlobHandles(g_opx) == 0);
     }
     else
     {
       memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
       memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
+      /* No need to set partition Id for unique indexes */
       CHK((g_const_opr= g_con->updateTuple(g_idx_record, tup.m_key_row,
                                            g_blob_record, tup.m_row)) != 0);
       CHK(getBlobHandles(g_const_opr) == 0);
@@ -1795,6 +1917,7 @@ writeIdx(int style, int api)
       CHK(g_opx->writeTuple() == 0);
       CHK(g_opx->equal("PK2", tup.m_pk2) == 0);
       CHK(g_opx->equal("PK3", tup.m_pk3) == 0);
+      /* No need to set partition Id for unique indexes */
       CHK(getBlobHandles(g_opx) == 0);
     }
     else
@@ -1804,6 +1927,7 @@ writeIdx(int style, int api)
       memcpy(&tup.m_row[g_pk1_offset], &tup.m_pk1, sizeof(tup.m_pk1));
       memcpy(&tup.m_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
       memcpy(&tup.m_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
+      /* No need to set partition Id for unique indexes */
       CHK((g_const_opr= g_con->writeTuple(g_idx_record, tup.m_key_row,
                                           g_full_record, tup.m_row)) != 0);
       CHK(getBlobHandles(g_const_opr) == 0);
@@ -1845,11 +1969,13 @@ deleteIdx(int api)
       CHK(g_opx->deleteTuple() == 0);
       CHK(g_opx->equal("PK2", tup.m_pk2) == 0);
       CHK(g_opx->equal("PK3", tup.m_pk3) == 0);
+      /* No need to set partition Id for unique indexes */
     }
     else
     {
       memcpy(&tup.m_key_row[g_pk2_offset], tup.pk2(), g_opt.m_pk2chr.m_totlen);
       memcpy(&tup.m_key_row[g_pk3_offset], &tup.m_pk3, sizeof(tup.m_pk3));
+      /* No need to set partition Id for unique indexes */
       CHK((g_const_opr= g_con->deleteTuple(g_idx_record, tup.m_key_row,
                                            g_full_record)) != 0);
     }
@@ -1906,10 +2032,12 @@ readScan(int style, int api, bool idx)
       CHK(g_ops->getValue("PK2", tup.m_pk2) != 0);
       CHK(g_ops->getValue("PK3", (char *) &tup.m_pk3) != 0);
     }
+    /* Don't bother setting UserDefined partitions for scan tests */
     CHK(getBlobHandles(g_ops) == 0);   
   }
   else
   {
+    /* Don't bother setting UserDefined partitions for scan tests */
     if (urandom(2) == 0)
       if (! idx)
         CHK((g_ops= g_con->scanTable(g_full_record,
@@ -2008,9 +2136,11 @@ updateScan(int style, int api, bool idx)
       CHK(g_ops->getValue("PK2", tup.m_pk2) != 0);
       CHK(g_ops->getValue("PK3", (char *) &tup.m_pk3) != 0);
     }
+    /* Don't bother setting UserDefined partitions for scan tests */
   }
   else
   {
+    /* Don't bother setting UserDefined partitions for scan tests */
     if (! idx)
       CHK((g_ops= g_con->scanTable(g_key_record,
                                    NdbOperation::LM_Exclusive)) != 0);
@@ -2108,9 +2238,11 @@ deleteScan(int api, bool idx)
       CHK(g_ops->getValue("PK2", tup.m_pk2) != 0);
       CHK(g_ops->getValue("PK3", (char *) &tup.m_pk3) != 0);
     }
+    /* Don't bother setting UserDefined partitions for scan tests */
   }
   else
   {
+    /* Don't bother setting UserDefined partitions for scan tests */
     if (! idx)
       CHK((g_ops= g_con->scanTable(g_key_record,
                                    NdbOperation::LM_Exclusive)) != 0);
@@ -2291,6 +2423,7 @@ setupOperation(NdbOperation*& op, OpType
   
   if (pkop)
   {
+    setUDpartId(tup, op);
     CHK(op->equal("PK1", tup.m_pk1) == 0);
     if (g_opt.m_pk2chr.m_len != 0)
     {
@@ -2431,6 +2564,7 @@ bugtest_36756()
       CHK(g_opr->equal("PK2", tupExists.m_pk2) == 0);
       CHK(g_opr->equal("PK3", tupExists.m_pk3) == 0);
     }
+    setUDpartId(tupExists, g_opr);
     CHK(getBlobHandles(g_opr) == 0);
     
     CHK(setBlobValue(tupExists) == 0);
@@ -2497,6 +2631,7 @@ bugtest_36756()
     CHK((g_con= g_ndb->startTransaction()) != 0);
     CHK((g_opr= g_con->getNdbOperation(g_opt.m_tname)) != 0);
     CHK(g_opr->deleteTuple() == 0);
+    setUDpartId(tupExists, g_opr);
     CHK(g_opr->equal("PK1", tupExists.m_pk1) == 0);
     if (g_opt.m_pk2chr.m_len != 0)
     {
@@ -2546,7 +2681,7 @@ testmain()
     srandom(g_opt.m_seed);
   }
   for (g_loop = 0; g_opt.m_loop == 0 || g_loop < g_opt.m_loop; g_loop++) {
-        for (int storage= 0; storage < 2; storage++) {
+    for (int storage= 0; storage < 2; storage++) {
       if (!testcase(storageSymbol[storage]))
         continue;
       
@@ -2555,6 +2690,7 @@ testmain()
       CHK(createTable(storage) == 0);
       { /* Dump created table information */
         Bcol& b1 = g_blob1;
+        DBG("FragType: " << g_dic->getTable(g_opt.m_tname)->getFragmentType()); 
         CHK(NdbBlob::getBlobTableName(b1.m_btname, g_ndb, g_opt.m_tname, "BL1") == 0);
         DBG("BL1: inline=" << b1.m_inline << " part=" << b1.m_partsize << " table=" << b1.m_btname);
         if (! g_opt.m_oneblob) {

=== modified file 'storage/ndb/test/ndbapi/testIndex.cpp'
--- a/storage/ndb/test/ndbapi/testIndex.cpp	2008-08-21 22:05:42 +0000
+++ b/storage/ndb/test/ndbapi/testIndex.cpp	2009-02-27 13:18:49 +0000
@@ -199,7 +199,10 @@ int create_index(NDBT_Context* ctx, int 
     ndbout << "FAILED!" << endl;
     const NdbError err = pNdb->getDictionary()->getNdbError();
     ERR(err);
-    if(err.classification == NdbError::ApplicationError)
+    if (err.classification == NdbError::ApplicationError)
+      return SKIP_INDEX;
+
+    if (err.status == NdbError::TemporaryError)
       return SKIP_INDEX;
     
     return NDBT_FAILED;

=== modified file 'storage/ndb/test/ndbapi/testPartitioning.cpp'
--- a/storage/ndb/test/ndbapi/testPartitioning.cpp	2008-02-19 15:00:29 +0000
+++ b/storage/ndb/test/ndbapi/testPartitioning.cpp	2009-03-06 18:06:17 +0000
@@ -22,6 +22,13 @@
 #define GETNDB(ps) ((NDBT_NdbApiStep*)ps)->getNdb()
 
 static Uint32 max_dks = 0;
+static const Uint32 MAX_FRAGS=48 * 8 * 4; // e.g. 48 nodes, 8 frags/node, 4 replicas
+static Uint16 frag_ng_mappings[MAX_FRAGS];
+static const char* DistTabName= "DistTest";
+static const char* DistTabDKeyCol= "DKey";
+static const char* DistTabPKey2Col= "PKey2";
+static const char* DistTabResultCol= "Result";
+static const char* DistIdxName= "ResultIndex";
 
 static
 int
@@ -34,7 +41,7 @@ run_drop_table(NDBT_Context* ctx, NDBT_S
 
 static
 int
-add_distribution_key(Ndb*, NdbDictionary::Table& tab, int when, void* arg)
+setNativePartitioning(Ndb* ndb, NdbDictionary::Table& tab, int when, void* arg)
 {
   switch(when){
   case 0: // Before
@@ -45,6 +52,41 @@ add_distribution_key(Ndb*, NdbDictionary
     return 0;
   }
 
+  /* Use rand to choose one of the native partitioning schemes */
+  const Uint32 rType= rand() % 2;
+  Uint32 fragType= -1;
+  switch(rType)
+  {
+  case 0 :
+    fragType = NdbDictionary::Object::DistrKeyHash;
+    break;
+  case 1 :
+    fragType = NdbDictionary::Object::DistrKeyLin;
+    break;
+  }
+
+  ndbout << "Setting fragment type to " << fragType << endl;
+  tab.setFragmentType((NdbDictionary::Object::FragmentType)fragType);
+  return 0;
+}
+
+
+static
+int
+add_distribution_key(Ndb* ndb, NdbDictionary::Table& tab, int when, void* arg)
+{
+  switch(when){
+  case 0: // Before
+    break;
+  case 1: // After
+    return 0;
+  default:
+    return 0;
+  }
+
+  /* Choose a partitioning type */
+  setNativePartitioning(ndb, tab, when, arg);
+
   int keys = tab.getNoOfPrimaryKeys();
   Uint32 dks = (2 * keys + 2) / 3; dks = (dks > max_dks ? max_dks : dks);
   
@@ -101,13 +143,49 @@ add_distribution_key(Ndb*, NdbDictionary
     }
   }
 
-  Uint32 linear_hash_ind = rand() & 1;
-  NdbDictionary::Table::FragmentType ftype;
-  if (linear_hash_ind)
-    ftype = NdbDictionary::Table::DistrKeyLin;
-  else
-    ftype = NdbDictionary::Table::DistrKeyHash;
-  tab.setFragmentType(ftype);
+  ndbout << (NDBT_Table&)tab << endl;
+
+  return 0;
+}
+
+
+static
+int
+setupUDPartitioning(Ndb* ndb, NdbDictionary::Table& tab)
+{
+  /* Following should really be taken from running test system : */
+  const Uint32 numNodes= ndb->get_ndb_cluster_connection().no_db_nodes();
+  const Uint32 numReplicas= 2; // Assumption
+  const Uint32 guessNumNgs= numNodes/2;
+  const Uint32 numNgs= guessNumNgs?guessNumNgs : 1;
+  const Uint32 numFragsPerNode= 2 + (rand() % 3);
+  const Uint32 numPartitions= numReplicas * numNgs * numFragsPerNode;
+
+  tab.setFragmentType(NdbDictionary::Table::UserDefined);
+  tab.setFragmentCount(numPartitions);
+  for (Uint32 i=0; i<numPartitions; i++)
+  {
+    frag_ng_mappings[i]= i % numNgs;
+  }
+  tab.setFragmentData(frag_ng_mappings, sizeof(uint16) * numPartitions);
+
+  return 0;
+}
+
+static
+int
+setUserDefPartitioning(Ndb* ndb, NdbDictionary::Table& tab, int when, void* arg)
+{
+  switch(when){
+  case 0: // Before
+    break;
+  case 1: // After
+    return 0;
+  default:
+    return 0;
+  }
+  
+  setupUDPartitioning(ndb, tab);
 
   ndbout << (NDBT_Table&)tab << endl;
 
@@ -116,7 +194,7 @@ add_distribution_key(Ndb*, NdbDictionary
 
 static
 int
-one_distribution_key(Ndb*, NdbDictionary::Table& tab, int when, void* arg)
+one_distribution_key(Ndb* ndb, NdbDictionary::Table& tab, int when, void* arg)
 {
   switch(when){
   case 0: // Before
@@ -127,6 +205,8 @@ one_distribution_key(Ndb*, NdbDictionary
     return 0;
   }
 
+  setNativePartitioning(ndb, tab, when, arg);
+
   int keys = tab.getNoOfPrimaryKeys();
   int dist_key_no = rand()% keys;
   
@@ -149,15 +229,118 @@ one_distribution_key(Ndb*, NdbDictionary
   return 0;
 }
 
+static 
+const NdbDictionary::Table*
+create_dist_table(Ndb* pNdb, 
+                  bool userDefined)
+{
+  NdbDictionary::Dictionary* dict= pNdb->getDictionary();
+
+  do {
+    NdbDictionary::Table tab;
+    tab.setName(DistTabName);
+    
+    if (userDefined)
+    {
+      setupUDPartitioning(pNdb, tab);
+    }
+    
+    NdbDictionary::Column dk;
+    dk.setName(DistTabDKeyCol);
+    dk.setType(NdbDictionary::Column::Unsigned);
+    dk.setLength(1);
+    dk.setNullable(false);
+    dk.setPrimaryKey(true);
+    dk.setPartitionKey(true);
+    tab.addColumn(dk);
+
+    NdbDictionary::Column pk2;
+    pk2.setName(DistTabPKey2Col);
+    pk2.setType(NdbDictionary::Column::Unsigned);
+    pk2.setLength(1);
+    pk2.setNullable(false);
+    pk2.setPrimaryKey(true);
+    pk2.setPartitionKey(false);
+    tab.addColumn(pk2);
+
+    NdbDictionary::Column result;
+    result.setName(DistTabResultCol);
+    result.setType(NdbDictionary::Column::Unsigned);
+    result.setLength(1);
+    result.setNullable(true);
+    result.setPrimaryKey(false);
+    tab.addColumn(result);
+
+    dict->dropTable(tab.getName());
+    if(dict->createTable(tab) == 0)
+    {
+      ndbout << (NDBT_Table&)tab << endl;
+
+      do {
+        /* Primary key index */
+        NdbDictionary::Index idx;
+        idx.setType(NdbDictionary::Index::OrderedIndex);
+        idx.setLogging(false);
+        idx.setTable(DistTabName);
+        idx.setName("PRIMARY");
+        idx.addColumnName(DistTabDKeyCol);
+        idx.addColumnName(DistTabPKey2Col);
+      
+        dict->dropIndex("PRIMARY",
+                        tab.getName());
+        
+        if (dict->createIndex(idx) == 0)
+        {
+          ndbout << "Primary Index created successfully" << endl;          
+          break;
+        }
+        ndbout << "Primary Index create failed with " << 
+          dict->getNdbError().code << 
+          " retrying " << endl;
+      } while (0);
+
+      do {
+        /* Now the index on the result column */
+        NdbDictionary::Index idx;
+        idx.setType(NdbDictionary::Index::OrderedIndex);
+        idx.setLogging(false);
+        idx.setTable(DistTabName);
+        idx.setName(DistIdxName);
+        idx.addColumnName(DistTabResultCol);
+      
+        dict->dropIndex(idx.getName(),
+                        tab.getName());
+        
+        if (dict->createIndex(idx) == 0)
+        {
+          ndbout << "Index on Result created successfully" << endl;          
+          return dict->getTable(tab.getName());
+        }
+        ndbout << "Index create failed with " << 
+          dict->getNdbError().code << endl;
+      } while (0);
+    }
+  } while (0);
+  return 0;
+};
+
 static int
 run_create_table(NDBT_Context* ctx, NDBT_Step* step)
 {
+  /* Create table, optionally with extra distribution keys
+   * or UserDefined partitioning
+   */
   max_dks = ctx->getProperty("distributionkey", (unsigned)0);
-  
+  bool userDefined = ctx->getProperty("UserDefined", (unsigned) 0);
+
   if(NDBT_Tables::createTable(GETNDB(step), 
 			      ctx->getTab()->getName(), 
 			      false, false, 
-			      max_dks?add_distribution_key:0) == NDBT_OK)
+			      max_dks?
+                              add_distribution_key:
+                              userDefined? 
+                              setUserDefPartitioning :
+                              setNativePartitioning) == NDBT_OK)
   {
     return NDBT_OK;
   }
@@ -262,29 +445,47 @@ static int run_create_pk_index_drop(NDBT
 }
 
 static int
-run_tests(Ndb* p_ndb, HugoTransactions& hugoTrans, int records)
+run_create_dist_table(NDBT_Context* ctx, NDBT_Step* step)
 {
-  if (hugoTrans.loadTable(p_ndb, records) != 0)
+  bool userDefined = ctx->getProperty("UserDefined", (unsigned)0);
+  if(create_dist_table(GETNDB(step),
+                       userDefined))
+    return NDBT_OK;
+  
+  return NDBT_FAILED;
+}
+
+static int
+run_drop_dist_table(NDBT_Context* ctx, NDBT_Step* step)
+{
+  GETNDB(step)->getDictionary()->dropTable(DistTabName);
+  return NDBT_OK;
+}
+
+static int
+run_tests(Ndb* p_ndb, HugoTransactions& hugoTrans, int records, Uint32 batchSize = 1)
+{
+  if (hugoTrans.loadTable(p_ndb, records, batchSize) != 0)
   {
     return NDBT_FAILED;
   }
 
-  if(hugoTrans.pkReadRecords(p_ndb, records) != 0)
+  if(hugoTrans.pkReadRecords(p_ndb, records, batchSize) != 0)
   {
     return NDBT_FAILED;
   }
 
-  if(hugoTrans.pkUpdateRecords(p_ndb, records) != 0)
+  if(hugoTrans.pkUpdateRecords(p_ndb, records, batchSize) != 0)
   {
     return NDBT_FAILED;
   }
 
-  if(hugoTrans.pkDelRecords(p_ndb, records) != 0)
+  if(hugoTrans.pkDelRecords(p_ndb, records, batchSize) != 0)
   {
     return NDBT_FAILED;
   }
 
-  if (hugoTrans.loadTable(p_ndb, records) != 0)
+  if (hugoTrans.loadTable(p_ndb, records, batchSize) != 0)
   {
     return NDBT_FAILED;
   }
@@ -335,8 +536,10 @@ run_pk_dk(NDBT_Context* ctx, NDBT_Step* 
     return NDBT_OK;
 
   HugoTransactions hugoTrans(*tab);
+
+  Uint32 batchSize= ctx->getProperty("BatchSize", (unsigned) 1);
   
-  return run_tests(p_ndb, hugoTrans, records);
+  return run_tests(p_ndb, hugoTrans, records, batchSize);
 }
 
 int
@@ -363,10 +566,11 @@ run_index_dk(NDBT_Context* ctx, NDBT_Ste
     ndbout << "Failed to retreive index: " << name.c_str() << endl;
     return NDBT_FAILED;
   }
+  Uint32 batchSize= ctx->getProperty("BatchSize", (unsigned) 1);
 
   HugoTransactions hugoTrans(*pTab, idx);
   
-  return run_tests(p_ndb, hugoTrans, records);
+  return run_tests(p_ndb, hugoTrans, records, batchSize);
 }
 
 static int
@@ -474,6 +678,8 @@ run_startHint_ordered_index(NDBT_Context
   int result = NDBT_OK;
   for(int i = 0; i<records && result == NDBT_OK; i++)
   {
+    NdbTransaction* pTrans= NULL;
+
     char buffer[8000];
     char* start= buffer + (rand() & 7);
     char* pos= start;
@@ -496,8 +702,8 @@ run_startHint_ordered_index(NDBT_Context
     ptrs[k].ptr = 0;
     
     // Now we have the pk, start a hinted transaction
-    NdbTransaction* pTrans= p_ndb->startTransaction(tab, ptrs);
-    
+    pTrans= p_ndb->startTransaction(tab, ptrs);
+  
     // Because we pass an Ordered index here, pkReadRecord will
     // use an index scan on the Ordered index
     HugoOperations ops(*tab, idx);
@@ -531,6 +737,409 @@ run_startHint_ordered_index(NDBT_Context
   return result;
 }
 
+#define CHECK(x, y) {int res= (x);                    \
+    if (res != 0) { ndbout << "Assert failed at "     \
+                           << __LINE__ << endl        \
+                           << res << endl             \
+                           << " error : "             \
+                           << (y)->getNdbError().code \
+                           << endl;                   \
+      return NDBT_FAILED; } }
+
+#define CHECKNOTNULL(x, y) {                              \
+    if ((x) == NULL) { ndbout << "Assert failed at line "    \
+                              << __LINE__ << endl            \
+                              << " with "                    \
+                              << (y)->getNdbError().code     \
+                              << endl;                       \
+      return NDBT_FAILED; } }
+
+
+static int
+load_dist_table(Ndb* pNdb, int records, int parts)
+{
+  const NdbDictionary::Table* tab= pNdb->getDictionary()->getTable(DistTabName);
+  bool userDefined= (tab->getFragmentType() == 
+                     NdbDictionary::Object::UserDefined);
+
+  const NdbRecord* distRecord= tab->getDefaultRecord();
+  CHECKNOTNULL(distRecord, pNdb);
+  
+  char* buf= (char*) malloc(NdbDictionary::getRecordRowLength(distRecord));
+
+  CHECKNOTNULL(buf, pNdb);
+
+  /* We insert a number of records with a constrained number of
+   * values for the distribution key column
+   */
+  for (int r=0; r < records; r++)
+  {
+    NdbTransaction* trans= pNdb->startTransaction();
+    CHECKNOTNULL(trans, pNdb);
+
+    int& dKeyVal= *((int*) NdbDictionary::getValuePtr(distRecord,
+                                                      buf,
+                                                      tab->getColumn(DistTabDKeyCol)->getAttrId()));
+    int& pKey2Val= *((int*) NdbDictionary::getValuePtr(distRecord,
+                                                      buf,
+                                                      tab->getColumn(DistTabPKey2Col)->getAttrId()));
+    int& resultVal=  *((int*) NdbDictionary::getValuePtr(distRecord,
+                                                      buf,
+                                                      tab->getColumn(DistTabResultCol)->getAttrId()));
+    dKeyVal= r % parts;
+    pKey2Val= r;
+    resultVal= r*r;
+
+    NdbOperation::OperationOptions opts;
+    opts.optionsPresent= 0;
+
+    if (userDefined)
+    {
+      /* For user-defined partitioning, we set the partition id
+       * to be the distribution key value modulo the number
+       * of partitions in the table
+       */
+      opts.optionsPresent= NdbOperation::OperationOptions::OO_PARTITION_ID;
+      opts.partitionId= (r%parts) % tab->getFragmentCount();
+    }
+    
+    CHECKNOTNULL(trans->insertTuple(distRecord, buf, 
+                                    NULL, &opts, sizeof(opts)), trans);
+
+    CHECK(trans->execute(NdbTransaction::Commit), trans);
+    trans->close();
+  }
+
+  free(buf);
+  
+  return NDBT_OK;
+};
+
+struct PartInfo
+{
+  NdbTransaction* trans;
+  NdbIndexScanOperation* op;
+  int dKeyVal;
+  int valCount;
+};
+
+class Ap
+{
+public:
+  void* ptr;
+  
+  Ap(void* _ptr) : ptr(_ptr)
+    {};
+  ~Ap()
+    {
+      if (ptr != 0)
+      {
+        free(ptr);
+        ptr= 0;
+      }
+    }
+};
+
+static int
+dist_scan_body(Ndb* pNdb, int records, int parts, PartInfo* partInfo, bool usePrimary)
+{
+  const NdbDictionary::Table* tab= pNdb->getDictionary()->getTable(DistTabName);
+  CHECKNOTNULL(tab, pNdb->getDictionary());
+  const char* indexName= usePrimary ? "PRIMARY" : DistIdxName;
+  const NdbDictionary::Index* idx= pNdb->getDictionary()->getIndex(indexName,
+                                                                   DistTabName);
+  CHECKNOTNULL(idx, pNdb->getDictionary());
+  const NdbRecord* tabRecord= tab->getDefaultRecord();
+  const NdbRecord* idxRecord= idx->getDefaultRecord();
+  bool userDefined= (tab->getFragmentType() == 
+                     NdbDictionary::Object::UserDefined);
+
+  char* boundBuf= (char*) malloc(NdbDictionary::getRecordRowLength(idx->getDefaultRecord()));
+
+  if (usePrimary)
+    ndbout << "Checking MRR indexscan distribution awareness when distribution key part of bounds" << endl;
+  else
+    ndbout << "Checking MRR indexscan distribution awareness when distribution key provided explicitly" << endl;
+
+  if (userDefined)
+    ndbout << "User Defined Partitioning scheme" << endl;
+  else
+    ndbout << "Native Partitioning scheme" << endl;
+
+  Ap boundAp(boundBuf);
+
+  for (int r=0; r < records; r++)
+  {
+    int partValue= r % parts;
+    PartInfo& pInfo= partInfo[partValue];
+
+    if (pInfo.trans == NULL)
+    {
+      /* Provide the partition key as a hint for this transaction */
+      if (!userDefined)
+      {
+        Ndb::Key_part_ptr keyParts[2];
+        keyParts[0].ptr= &partValue;
+        keyParts[0].len= sizeof(partValue);
+        keyParts[1].ptr= NULL;
+        keyParts[1].len= 0;
+        
+        /* To test that bad hinting causes failure, uncomment */
+        // int badPartVal= partValue+1;
+        // keyParts[0].ptr= &badPartVal;
+        
+        CHECKNOTNULL(pInfo.trans= pNdb->startTransaction(tab, keyParts), 
+                     pNdb);
+      }
+      else
+      {
+        /* User Defined partitioning */
+        Uint32 partId= partValue % tab->getFragmentCount();
+        CHECKNOTNULL(pInfo.trans= pNdb->startTransaction(tab,
+                                                         partId),
+                     pNdb);
+      }
+      pInfo.valCount= 0;
+      pInfo.dKeyVal= partValue;
+
+      NdbScanOperation::ScanOptions opts;
+      opts.optionsPresent= NdbScanOperation::ScanOptions::SO_SCANFLAGS;
+      opts.scan_flags= NdbScanOperation::SF_MultiRange;
+
+      // Define the scan operation for this partition.
+      CHECKNOTNULL(pInfo.op= pInfo.trans->scanIndex(idx->getDefaultRecord(),
+                                                    tab->getDefaultRecord(),
+                                                    NdbOperation::LM_Read,
+                                                    NULL,
+                                                    NULL,
+                                                    &opts,
+                                                    sizeof(opts)), 
+                   pInfo.trans);
+    }
+    
+    NdbIndexScanOperation* op= pInfo.op;
+
+    if (usePrimary)
+    {
+      /* Scanning the primary index, set bound on the pk */
+      int& dKeyVal= *((int*) NdbDictionary::getValuePtr(idxRecord,
+                                                        boundBuf,
+                                                        tab->getColumn(DistTabDKeyCol)->getAttrId()));
+      int& pKey2Val= *((int*) NdbDictionary::getValuePtr(idxRecord,
+                                                         boundBuf,
+                                                         tab->getColumn(DistTabPKey2Col)->getAttrId()));
+      dKeyVal= partValue;
+      pKey2Val= r;
+
+      NdbIndexScanOperation::IndexBound ib;
+      ib.low_key= boundBuf;
+      ib.low_key_count= 2;
+      ib.low_inclusive= true;
+      ib.high_key= ib.low_key;
+      ib.high_key_count= ib.low_key_count;
+      ib.high_inclusive= true;
+      ib.range_no= pInfo.valCount++;
+
+      /* No partitioning info for native, PK index scan
+       * NDBAPI can determine it from PK */
+      Ndb::PartitionSpec pSpec;
+      pSpec.type= Ndb::PartitionSpec::PS_NONE;
+
+      if (userDefined)
+      {
+        /* We'll provide partition info */
+        pSpec.type= Ndb::PartitionSpec::PS_USER_DEFINED;
+        pSpec.UserDefined.partitionId= partValue % tab->getFragmentCount();
+      }
+
+      CHECK(op->setBound(idxRecord,
+                         ib,
+                         &pSpec,
+                         sizeof(pSpec)),
+            op);
+    }
+    else
+    {
+      /* Scanning the secondary index, set bound on the result */
+      int& resultVal= *((int*) NdbDictionary::getValuePtr(idxRecord,
+                                                          boundBuf,
+                                                          tab->getColumn(DistTabResultCol)->getAttrId()));
+      resultVal= r*r;
+      
+      NdbIndexScanOperation::IndexBound ib;
+      ib.low_key= boundBuf;
+      ib.low_key_count= 1;
+      ib.low_inclusive= true;
+      ib.high_key= ib.low_key;
+      ib.high_key_count= ib.low_key_count;
+      ib.high_inclusive= true;      
+      ib.range_no= pInfo.valCount++;
+
+      Ndb::Key_part_ptr keyParts[2];
+      keyParts[0].ptr= &partValue;
+      keyParts[0].len= sizeof(partValue);
+      keyParts[1].ptr= NULL;
+      keyParts[1].len= 0;
+      
+      /* To test that bad hinting causes failure, uncomment */
+      //int badPartVal= partValue+1;
+      //keyParts[0].ptr= &badPartVal;
+      
+      Ndb::PartitionSpec pSpec;
+      
+      if (userDefined)
+      {
+        /* We'll provide partition info */
+        pSpec.type= Ndb::PartitionSpec::PS_USER_DEFINED;
+        pSpec.UserDefined.partitionId= partValue % tab->getFragmentCount();
+      }
+      else
+      {
+        pSpec.type= Ndb::PartitionSpec::PS_DISTR_KEY_PART_PTR;
+        pSpec.KeyPartPtr.tableKeyParts= keyParts;
+        pSpec.KeyPartPtr.xfrmbuf= NULL;
+        pSpec.KeyPartPtr.xfrmbuflen= 0;
+      }
+
+      CHECK(op->setBound(idxRecord,
+                         ib,
+                         &pSpec,
+                         sizeof(pSpec)),
+            op);
+    }
+  }
+
+  for (int p=0; p < parts; p++)
+  {
+    PartInfo& pInfo= partInfo[p];
+    //ndbout << "D-key val " << p << " has " << pInfo.valCount
+    //       << " ranges specified. " << endl;
+    //ndbout << "Is Pruned? " << pInfo.op->getPruned() << endl;
+    if (! pInfo.op->getPruned())
+    {
+      ndbout << "MRR Scan Operation should have been pruned, but was not." << endl;
+      return NDBT_FAILED;
+    }
+    
+    CHECK(pInfo.trans->execute(NdbTransaction::NoCommit), pInfo.trans);
+    
+    int resultCount=0;
+    
+    const char* resultPtr;
+    int rc= 0;
+    
+    while ((rc= pInfo.op->nextResult(&resultPtr, true, true)) == 0)
+    {
+      int& dKeyVal= *((int*) NdbDictionary::getValuePtr(tabRecord,
+                                                        resultPtr,
+                                                        tab->getColumn(DistTabDKeyCol)->getAttrId()));
+      int& pKey2Val= *((int*) NdbDictionary::getValuePtr(tabRecord,
+                                                         resultPtr,
+                                                         tab->getColumn(DistTabPKey2Col)->getAttrId()));
+      int& resultVal= *((int*) NdbDictionary::getValuePtr(tabRecord,
+                                                          resultPtr,
+                                                          tab->getColumn(DistTabResultCol)->getAttrId()));
+      
+      if ((dKeyVal != pInfo.dKeyVal) ||
+          (resultVal != (pKey2Val * pKey2Val)))
+      {
+        ndbout << "Got bad values.  Dkey : " << dKeyVal
+               << " Pkey2 : " << pKey2Val
+               << " Result : " << resultVal
+               << endl;
+        return NDBT_FAILED;
+      }
+      resultCount++;
+    }
+
+    if (rc != 1)
+    {
+      ndbout << "Got bad scan rc " << rc << endl;
+      ndbout << "Error : " << pInfo.op->getNdbError().code << endl;
+      ndbout << "Trans Error : " << pInfo.trans->getNdbError().code << endl;
+      return NDBT_FAILED;
+    }
+  
+    if (resultCount != pInfo.valCount)
+    {
+      ndbout << "Error resultCount was " << resultCount << endl;
+      return NDBT_FAILED;
+    }
+    CHECK(pInfo.trans->execute(NdbTransaction::Commit), pInfo.trans);
+    pInfo.trans->close();
+  };
+
+  ndbout << "Success" << endl;
+
+  return NDBT_OK;
+}
+
+static int
+dist_scan(Ndb* pNdb, int records, int parts, bool usePk)
+{
+  PartInfo* partInfo= new PartInfo[parts];
+
+  NdbRestarter restarter;
+  if(restarter.insertErrorInAllNodes(8050) != 0)
+  {
+    delete[] partInfo;
+    return NDBT_FAILED;
+  }
+
+  for (int p=0; p<parts; p++)
+  {
+    partInfo[p].trans= NULL;
+    partInfo[p].op= NULL;
+    partInfo[p].dKeyVal= 0;
+    partInfo[p].valCount= 0;
+  }
+  
+  int result= dist_scan_body(pNdb, 
+                             records, 
+                             parts, 
+                             partInfo, 
+                             usePk);
+
+  restarter.insertErrorInAllNodes(0);
+  delete[] partInfo;
+  
+  return result;
+}
+
+static int
+run_dist_test(NDBT_Context* ctx, NDBT_Step* step)
+{
+  int records= ctx->getNumRecords();
+  
+  /* Choose an interesting number of discrete
+   * distribution key values to work with
+   */
+  int numTabPartitions= GETNDB(step)
+    ->getDictionary()
+    ->getTable(DistTabName)
+    ->getFragmentCount();
+  int numDkeyValues= 2*numTabPartitions + (rand() % 6);
+  
+  ndbout << "Table has " << numTabPartitions
+         << " physical partitions" << endl;
+  ndbout << "Testing with " << numDkeyValues 
+         << " discrete distribution key values " << endl;
+
+  if (load_dist_table(GETNDB(step), records, numDkeyValues) != NDBT_OK)
+    return NDBT_FAILED;
+  
+  /* Test access via PK ordered index (including Dkey) */
+  if (dist_scan(GETNDB(step), records, numDkeyValues, true) != NDBT_OK)
+    return NDBT_FAILED;
+
+  /* Test access via secondary ordered index (not including Dkey) */
+  if (dist_scan(GETNDB(step), records, numDkeyValues, false) != NDBT_OK)
+    return NDBT_FAILED;
+  
+  return NDBT_OK;
+}
+
+
 
 NDBT_TESTSUITE(testPartitioning);
 TESTCASE("pk_dk", 
@@ -543,7 +1152,7 @@ TESTCASE("pk_dk", 
   INITIALIZER(run_drop_table);
 }
 TESTCASE("hash_index_dk", 
-	 "Unique index operatations with distribution key")
+	 "Unique index operations with distribution key")
 {
   TC_PROPERTY("distributionkey", ~0);
   TC_PROPERTY("OrderedIndex", (unsigned)0);
@@ -555,7 +1164,7 @@ TESTCASE("hash_index_dk", 
   INITIALIZER(run_drop_table);
 }
 TESTCASE("ordered_index_dk", 
-	 "Ordered index operatations with distribution key")
+	 "Ordered index operations with distribution key")
 {
   TC_PROPERTY("distributionkey", (unsigned)1);
   TC_PROPERTY("OrderedIndex", (unsigned)1);
@@ -567,7 +1176,7 @@ TESTCASE("ordered_index_dk", 
   INITIALIZER(run_drop_table);
 }
 TESTCASE("smart_scan", 
-	 "Ordered index operatations with distribution key")
+	 "Ordered index operations with distribution key")
 {
   TC_PROPERTY("OrderedIndex", (unsigned)1);
   INITIALIZER(run_drop_table);
@@ -580,6 +1189,7 @@ TESTCASE("smart_scan", 
 TESTCASE("startTransactionHint", 
 	 "Test startTransactionHint wo/ distribution key")
 {
+  /* If hint is incorrect, node failure occurs */
   TC_PROPERTY("distributionkey", (unsigned)0);
   INITIALIZER(run_drop_table);
   INITIALIZER(run_create_table);
@@ -589,6 +1199,7 @@ TESTCASE("startTransactionHint", 
 TESTCASE("startTransactionHint_dk", 
 	 "Test startTransactionHint with distribution key")
 {
+  /* If hint is incorrect, node failure occurs */
   TC_PROPERTY("distributionkey", (unsigned)~0);
   INITIALIZER(run_drop_table);
   INITIALIZER(run_create_table);
@@ -598,6 +1209,7 @@ TESTCASE("startTransactionHint_dk", 
 TESTCASE("startTransactionHint_orderedIndex",
          "Test startTransactionHint and ordered index reads")
 {
+  /* If hint is incorrect, node failure occurs */
   TC_PROPERTY("distributionkey", (unsigned)0);
   TC_PROPERTY("OrderedIndex", (unsigned)1);
   INITIALIZER(run_drop_table);
@@ -610,6 +1222,7 @@ TESTCASE("startTransactionHint_orderedIn
 TESTCASE("startTransactionHint_orderedIndex_dk",
          "Test startTransactionHint and ordered index reads with distribution key")
 {
+  /* If hint is incorrect, node failure occurs */
   TC_PROPERTY("distributionkey", (unsigned)~0);
   TC_PROPERTY("OrderedIndex", (unsigned)1);
   INITIALIZER(run_drop_table);
@@ -619,6 +1232,60 @@ TESTCASE("startTransactionHint_orderedIn
   INITIALIZER(run_create_pk_index_drop);
   INITIALIZER(run_drop_table);
 }
+TESTCASE("startTransactionHint_orderedIndex_mrr_native",
+         "Test hinting and MRR Ordered Index Scans for native partitioned table")
+{
+  TC_PROPERTY("UserDefined", (unsigned)0);
+  INITIALIZER(run_create_dist_table);
+  INITIALIZER(run_dist_test);
+  INITIALIZER(run_drop_dist_table);
+}
+TESTCASE("pk_userDefined",
+         "Test primary key operations on table with user-defined partitioning")
+{
+  /* Check PK ops against user-defined partitioned table */
+  TC_PROPERTY("UserDefined", (unsigned) 1);
+  INITIALIZER(run_drop_table);
+  INITIALIZER(run_create_table);
+  INITIALIZER(run_create_pk_index);
+  INITIALIZER(run_pk_dk);
+  INITIALIZER(run_create_pk_index_drop);
+  INITIALIZER(run_drop_table);
+};
+TESTCASE("hash_index_userDefined",
+         "Unique index operations on table with user-defined partitioning")
+{
+  /* Check hash index ops against user-defined partitioned table */
+  TC_PROPERTY("OrderedIndex", (unsigned)0);
+  TC_PROPERTY("UserDefined", (unsigned)1);
+  INITIALIZER(run_drop_table);
+  INITIALIZER(run_create_table);
+  INITIALIZER(run_create_pk_index);
+  INITIALIZER(run_index_dk);
+  INITIALIZER(run_create_pk_index_drop);
+  INITIALIZER(run_drop_table);
+}
+TESTCASE("ordered_index_userDefined", 
+	 "Ordered index operations on table with user-defined partitioning")
+{
+  /* Check ordered index operations against user-defined partitioned table */
+  TC_PROPERTY("OrderedIndex", (unsigned)1);
+  TC_PROPERTY("UserDefined", (unsigned)1);
+  INITIALIZER(run_drop_table);
+  INITIALIZER(run_create_table);
+  INITIALIZER(run_create_pk_index);
+  INITIALIZER(run_index_dk);
+  INITIALIZER(run_create_pk_index_drop);
+  INITIALIZER(run_drop_table);
+}
+TESTCASE("startTransactionHint_orderedIndex_mrr_userDefined",
+         "Test hinting and MRR Ordered Index Scans for user defined partitioned table")
+{
+  TC_PROPERTY("UserDefined", (unsigned)1);
+  INITIALIZER(run_create_dist_table);
+  INITIALIZER(run_dist_test);
+  INITIALIZER(run_drop_dist_table);
+}
 
 NDBT_TESTSUITE_END(testPartitioning);
 

=== modified file 'storage/ndb/test/ndbapi/testSRBank.cpp'
--- a/storage/ndb/test/ndbapi/testSRBank.cpp	2008-04-28 15:17:02 +0000
+++ b/storage/ndb/test/ndbapi/testSRBank.cpp	2009-03-11 15:33:32 +0000
@@ -101,9 +101,10 @@ int runBankGL(NDBT_Context* ctx, NDBT_St
           ctx->getProperty(NMR_SR) <= NdbMixRestarter::SR_STOPPING)
       if (bank.performMakeGLs(yield) != NDBT_OK)
       {
-	if(ctx->getProperty(NMR_SR) != NdbMixRestarter::SR_RUNNING)
+        Uint32 state = ctx->getProperty(NMR_SR);
+	if(state != NdbMixRestarter::SR_RUNNING)
 	  break;
-	ndbout << "bank.performMakeGLs FAILED" << endl;
+	ndbout << "bank.performMakeGLs FAILED: " << state << endl;
         abort();
 	return NDBT_FAILED;
       }
@@ -212,19 +213,11 @@ TESTCASE("SR", 
   TC_PROPERTY("Type", NdbMixRestarter::RTM_SR);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
+  STEPS(runBankTransactions, 10);
   STEP(runBankGL);
   STEP(runBankSrValidator);
   STEP(runMixRestart);
+  FINALIZER(runDropBank);
 }
 TESTCASE("NR", 
 	 " Test that a consistent bank is restored after graceful shutdown\n"
@@ -236,16 +229,7 @@ TESTCASE("NR", 
   TC_PROPERTY("Type", NdbMixRestarter::RTM_NR);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
+  STEPS(runBankTransactions, 10);
   STEP(runBankGL);
   STEP(runMixRestart);
   FINALIZER(runDropBank);
@@ -260,16 +244,7 @@ TESTCASE("Mix", 
   TC_PROPERTY("Type", NdbMixRestarter::RTM_ALL);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
-  STEP(runBankTransactions);
+  STEPS(runBankTransactions, 10);
   STEP(runBankGL);
   STEP(runMixRestart);
   STEP(runBankSrValidator);

=== modified file 'storage/ndb/test/ndbapi/test_event_merge.cpp'
--- a/storage/ndb/test/ndbapi/test_event_merge.cpp	2007-09-05 14:19:04 +0000
+++ b/storage/ndb/test/ndbapi/test_event_merge.cpp	2009-03-12 10:51:59 +0000
@@ -999,11 +999,11 @@ checkop(const Op* op, Uint32& pk1)
     if (c.pk) {
       chkrc(ind0 == 0); // always PK in post data
       if (optype == Op::INS)
-        chkrc(ind1 == -1);
-      if (optype == Op::DEL)
         chkrc(ind1 == -1); // no PK in pre data
+      if (optype == Op::DEL)
+        chkrc(ind1 == 0); // always PK in pre data (note change from 6.3.23)
       if (optype == Op::UPD)
-        chkrc(ind1 == 0);
+        chkrc(ind1 == 0); // always PK in pre data
     }
     if (! c.pk) {
       if (optype == Op::INS)
@@ -1131,14 +1131,14 @@ compop(const Op* op1, const Op* op2, Op*
   }
   if (res_op->type == Op::DEL) {
     // UPD o DEL
-    copydata(op2->data[0], res_op->data[0], true, false); // PK
-    copydata(op1->data[1], res_op->data[1], false, true); // non-PK
+    copydata(op2->data[0], res_op->data[0], true, false); // PK only
+    copydata(op1->data[1], res_op->data[1], true, true); // PK + non-PK
   } 
   if (res_op->type == Op::UPD && op1->type == Op::DEL) {
     // DEL o INS
     copydata(op2->data[0], res_op->data[0], true, true);
-    copydata(op1->data[0], res_op->data[1], true, false); // PK
-    copydata(op1->data[1], res_op->data[1], false, true); // non-PK
+    copydata(op1->data[0], res_op->data[1], true, false); // PK only
+    copydata(op1->data[1], res_op->data[1], true, true); // PK + non-PK
   }
   if (res_op->type == Op::UPD && op1->type == Op::UPD) {
     // UPD o UPD
@@ -1465,10 +1465,7 @@ makeop(const Op* prev_op, Op* op, Uint32
       d1.ind[i] = -1;
     } else if (optype == Op::DEL) {
       assert(dp.ind[i] >= 0);
-      if (c.pk)
-        d1.ind[i] = -1;
-      else
-        copycol(c, dp, d1);
+      copycol(c, dp, d1);
     } else if (optype == Op::UPD) {
       assert(dp.ind[i] >= 0);
       if (d0.ind[i] == -1) // not updating this col

=== added file 'storage/ndb/test/run-test/check-tests.sh'
--- a/storage/ndb/test/run-test/check-tests.sh	1970-01-01 00:00:00 +0000
+++ b/storage/ndb/test/run-test/check-tests.sh	2009-02-20 14:39:37 +0000
@@ -0,0 +1,60 @@
+#!/bin/sh
+
+set -e
+
+files="daily-basic-tests.txt daily-devel-tests.txt upgrade-tests.txt"
+
+die(){
+    echo "error at $1 : $2"
+    exit 1
+}
+
+check_state(){
+    if  [ $1 != $2 ]
+    then
+	die $3 $4
+    fi
+}
+
+check_file(){
+    file=$1
+    lineno=0
+    testcase=0
+
+    echo -n "-- checking $file..."
+    cat $file | awk '{ print "^" $0 "$";}' | while read line
+    do
+	lineno=$(expr $lineno + 1)
+	if [ $(echo $line | grep -c "^^#") -ne 0 ]
+	then
+	    continue
+	fi
+	
+	case "$line" in
+	    ^max-time*)
+		testcase=$(expr $testcase + 1);;
+	    ^cmd*)
+		testcase=$(expr $testcase + 2);;
+	    ^args*)
+		testcase=$(expr $testcase + 4);;
+	    ^type*)
+		;;
+	    ^$) 
+                if [ $testcase -ne 7 ]
+		then
+		    die $file $lineno
+		else
+		    testcase=0
+		    cnt=$(expr $cnt + 1)
+		fi;;
+	    *)
+	        die $file $lineno
+	esac
+   done
+   echo "ok"
+}
+   
+for file in $files
+do
+    check_file $file
+done

=== modified file 'storage/ndb/test/run-test/conf-dl145a.cnf'
--- a/storage/ndb/test/run-test/conf-dl145a.cnf	2007-11-15 07:57:00 +0000
+++ b/storage/ndb/test/run-test/conf-dl145a.cnf	2009-02-17 08:13:18 +0000
@@ -26,3 +26,7 @@ FragmentLogFileSize = 64M
 CompressedLCP=1
 CompressedBackup=1
 ODirect=1
+
+SharedGlobalMemory=256M
+InitialLogfileGroup=undo_buffer_size=64M;undofile01.dat:256M;undofile02.dat:128M
+InitialTablespace=datafile01.dat:128M;datafile02.dat:64M

=== modified file 'storage/ndb/test/run-test/conf-ndbmaster.cnf'
--- a/storage/ndb/test/run-test/conf-ndbmaster.cnf	2007-02-13 01:38:54 +0000
+++ b/storage/ndb/test/run-test/conf-ndbmaster.cnf	2009-02-17 07:52:13 +0000
@@ -21,3 +21,7 @@ BackupMemory = 64M
 MaxNoOfConcurrentScans = 100
 MaxNoOfSavedMessages= 1000
 SendBufferMemory = 2M
+
+SharedGlobalMemory=256M
+InitialLogfileGroup=undo_buffer_size=64M;undofile01.dat:256M;undofile02.dat:128M
+InitialTablespace=datafile01.dat:128M;datafile02.dat:64M

=== modified file 'storage/ndb/test/run-test/daily-basic-tests.txt'
--- a/storage/ndb/test/run-test/daily-basic-tests.txt	2009-02-05 12:22:39 +0000
+++ b/storage/ndb/test/run-test/daily-basic-tests.txt	2009-03-12 10:51:59 +0000
@@ -255,10 +255,30 @@ max-time: 500
 cmd: testBasic
 args: -n Bug20535
 
+#
+# INDEX
+#
+max-time: 1500
+cmd: testIndex
+args: -n CreateAll T1 T13 T14
+
+max-time: 3600
+cmd: testIndex
+args: -n InsertDelete T1 
+
+max-time: 3600
+cmd: testIndex
+args: -n CreateLoadDrop T1 
+
 max-time: 500
 cmd: testIndex
-args: -n Bug25059 -r 3000 T1
+args: -n MixedTransaction T1 
 
+max-time: 2500
+cmd: testIndex
+args: -n BuildDuring T6 
+
+#
 # SCAN TESTS
 #
 max-time: 500
@@ -517,10 +537,6 @@ max-time: 500
 cmd: testNodeRestart
 args: -n Bug15685 T1
 
-max-time: 500
-cmd: testNodeRestart
-args: -n Bug16772 T1
-
 #max-time: 500
 #cmd: testSystemRestart
 #args: -n Bug18385 T1
@@ -635,14 +651,6 @@ max-time: 1500
 cmd: testDict
 args: -n CreateInvalidTables 
 
-max-time: 1500
-cmd: testDict
-args: -n CreateTableWhenDbIsFull T6 
-
-max-time: 1500
-cmd: testDict
-args: -n CreateMaxTables T6 
-
 max-time: 500
 cmd: testDict
 args: -n FragmentTypeSingle T1 
@@ -669,10 +677,6 @@ args: -n Bug21755 T1
 
 max-time: 1500
 cmd: testDict
-args: -l 25 -n DictRestart T1
-
-max-time: 1500
-cmd: testDict
 args: -n TableAddAttrs
 
 max-time: 1500
@@ -702,10 +706,6 @@ args: -n MaxTransactions T1 T6 T13 
 
 max-time: 500
 cmd: testNdbApi
-args: -n MaxOperations T1 T6 T13 
-
-max-time: 500
-cmd: testNdbApi
 args: -n MaxGetValue T1 T6 T13 
 
 max-time: 500
@@ -840,7 +840,7 @@ max-time: 1500
 cmd: testSystemRestart
 args: -n basic T1 
 
-max-time: 1500
+max-time: 2500
 cmd: testSystemRestart
 args: -n SR1 T1 
 
@@ -880,17 +880,22 @@ max-time: 1500
 cmd: testSystemRestart
 args: -n SR_UNDO T6 
 
-max-time: 1000
-cmd: testSRBank
-args: -n SR -l 300 -r 15 T1
+#
+max-time: 1500
+cmd: testSystemRestart
+args: -l 1 -n SR6 T1 
 
-max-time: 1000
-cmd: testSRBank
-args: -n NR -l 300 -r 15 T1
+max-time: 1500
+cmd: testSystemRestart
+args: -l 1 -n SR7 T1 
 
-max-time: 1000
-cmd: testSRBank
-args: -n Mix -l 300 -r 15 T1
+max-time: 1500
+cmd: testSystemRestart
+args: -l 1 -n SR8 T1 
+
+max-time: 1500
+cmd: testSystemRestart
+args: -l 1 -n SR9 T1 
 
 max-time: 300
 cmd: testNodeRestart
@@ -916,10 +921,77 @@ max-time: 1000
 cmd: test_event
 args: -l 10 -n Bug27169 T1
 
+#
+max-time: 600
+cmd: test_event_merge
+args: --no-implicit-nulls --separate-events --blob-version 1
+
+#
+max-time: 600
+cmd: test_event_merge
+args: --no-implicit-nulls --separate-events
+
+#
+max-time: 600
+cmd: test_event_merge
+args: --no-implicit-nulls --no-multiops --blob-version 1
+
+#
+max-time: 600
+cmd: test_event_merge
+args: --no-implicit-nulls --no-multiops
+
+max-time: 600
+cmd: testBasic
+args: -n PkRead T1
+
 max-time: 300
 cmd: testNodeRestart
 args: -n Bug31980 T1
 
+max-time: 2500
+cmd: testNodeRestart
+args: -n CommittedRead T1
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartRandomNode T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n LateCommit T1
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartMasterNodeError T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartAllNodes T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartAllNodesAbort T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartAllNodesError9999 T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n RestartRandomNodeInitial T6 T13 
+
+max-time: 2500
+cmd: testNodeRestart
+args: -n NoLoad T6
+
+#
+# MGMAPI AND MGSRV
+#
+max-time: 1800
+cmd: testMgm
+args: -n SingleUserMode T1 
+
 # OLD FLEX
 max-time: 500
 cmd: flexBench
@@ -929,6 +1001,10 @@ max-time: 500
 cmd: flexHammer
 args: -r 5 -t 32 
 
+max-time: 2500
+cmd: testNodeRestart
+args: -n NF_Hammer -r 5 T1
+
 max-time: 300
 cmd: DbCreate
 args:
@@ -1074,7 +1150,7 @@ max-time: 300
 cmd: test_event
 args: -n Bug31701 T1
 
-max-time: 300
+max-time: 600
 cmd: testSystemRestart
 args: -n Bug22696 T1
 
@@ -1115,10 +1191,6 @@ cmd: testNodeRestart
 args: -n mixedmultiop T1 I2 I3 D2
 
 max-time: 600
-cmd: test_event
-args: -l 1 -n SubscribeNR T1
-
-max-time: 600
 cmd: testNodeRestart
 args: -n Bug34702 T1
 

=== modified file 'storage/ndb/test/run-test/daily-devel-tests.txt'
--- a/storage/ndb/test/run-test/daily-devel-tests.txt	2008-12-03 19:44:54 +0000
+++ b/storage/ndb/test/run-test/daily-devel-tests.txt	2009-02-27 13:18:49 +0000
@@ -1,33 +1,41 @@
 #
-# INDEX
+# BACKUP
 #
+max-time: 1000
+cmd: atrt-testBackup
+args: -n BackupBank T6 
+
+max-time: 500
+cmd: testNdbApi
+args: -n MaxOperations T1 T6 T13 
+
 max-time: 1500
-cmd: testIndex
-args: -n CreateAll T1 T13 T14
+cmd: testDict
+args: -n CreateTableWhenDbIsFull T6 
 
-#-m 7200 1: testIndex -n InsertDeleteGentle T6
-max-time: 3600
-cmd: testIndex
-args: -n InsertDelete T1 
+max-time: 1500
+cmd: testDict
+args: -n CreateMaxTables T6 
 
-#-m 3600 1: testIndex -n CreateLoadDropGentle T6
-max-time: 3600
+max-time: 1500
+cmd: testDict
+args: -l 25 -n DictRestart T1
+
+max-time: 500
 cmd: testIndex
-args: -n CreateLoadDrop T1 
+args: -n Bug25059 -r 3000 T1
 
-#
-# BACKUP
-#
 max-time: 1000
-cmd: atrt-testBackup
-args: -n BackupBank T6 
+cmd: testSRBank
+args: -n SR -l 300 -r 15 T1
 
-#
-# MGMAPI AND MGSRV
-#
-max-time: 1800
-cmd: testMgm
-args: -n SingleUserMode T1 
+max-time: 1000
+cmd: testSRBank
+args: -n NR -l 300 -r 15 T1
+
+max-time: 1000
+cmd: testSRBank
+args: -n Mix -l 300 -r 15 T1
 
 #
 #
@@ -51,10 +59,6 @@ args: -n SR_FULLDB T6 
 #
 max-time: 2500
 cmd: testNodeRestart
-args: -n NoLoad T6
-
-max-time: 2500
-cmd: testNodeRestart
 args: -n MixedPkRead T6 T13 
 
 max-time: 2500
@@ -67,14 +71,6 @@ args: -l 1 -n MixedReadUpdateScan 
 
 max-time: 2500
 cmd: testNodeRestart
-args: -n CommittedRead T1
-
-max-time: 2500
-cmd: testNodeRestart
-args: -n LateCommit T1
-
-max-time: 2500
-cmd: testNodeRestart
 args: -n Terror T6 T13 
 
 max-time: 2500
@@ -83,24 +79,12 @@ args: -n FullDb T6 T13 
 
 max-time: 2500
 cmd: testNodeRestart
-args: -n RestartRandomNode T6 T13 
-
-max-time: 2500
-cmd: testNodeRestart
 args: -n RestartRandomNodeError T6 T13 
 
-max-time: 2500
-cmd: testNodeRestart
-args: -n RestartRandomNodeInitial T6 T13 
-
 max-time: 3600
 cmd: testNodeRestart
 args: -l 1 -n RestartNFDuringNR T6 T13 
 
-max-time: 2500
-cmd: testNodeRestart
-args: -n RestartMasterNodeError T6 T13 
-
 max-time: 3600
 cmd: testNodeRestart
 args: -n RestartNodeDuringLCP T6 
@@ -119,23 +103,11 @@ args: -n FiftyPercentFail T6 T13 
 
 max-time: 2500
 cmd: testNodeRestart
-args: -n RestartAllNodes T6 T13 
-
-max-time: 2500
-cmd: testNodeRestart
-args: -n RestartAllNodesAbort T6 T13 
-
-max-time: 2500
-cmd: testNodeRestart
-args: -n RestartAllNodesError9999 T6 T13 
-
-max-time: 2500
-cmd: testNodeRestart
 args: -n FiftyPercentStopAndWait T6 T13 
 
-max-time: 2500
+max-time: 500
 cmd: testNodeRestart
-args: -n NF_Hammer -r 5 T1
+args: -n Bug16772 T1
 
 #max-time: 500
 #cmd: testNodeRestart
@@ -156,10 +128,6 @@ args: -n NFNR3 T6 T13 
 
 max-time: 2500
 cmd: testIndex
-args: -n BuildDuring T6 
-
-max-time: 2500
-cmd: testIndex
 args: -l 2 -n SR1 T6 T13 
 
 max-time: 2500
@@ -182,32 +150,11 @@ max-time: 2500
 cmd: testIndex
 args: -l 2 -n SR1_O T6 T13 
 
-max-time: 500
-cmd: testIndex
-args: -n MixedTransaction T1 
-
 max-time: 2500
 cmd: testDict
 args: -n NF1 T1 T6 T13 
 
 #
-max-time: 1500
-cmd: testSystemRestart
-args: -l 1 -n SR6 T1 
-
-max-time: 1500
-cmd: testSystemRestart
-args: -l 1 -n SR7 T1 
-
-max-time: 1500
-cmd: testSystemRestart
-args: -l 1 -n SR8 T1 
-
-max-time: 1500
-cmd: testSystemRestart
-args: -l 1 -n SR9 T1 
-
-#
 max-time: 3600
 cmd: test_event
 args: -n EventOperationApplier -l 2
@@ -227,32 +174,12 @@ max-time: 2500
 cmd: test_event
 args: -n Multi
 
+max-time: 600
+cmd: test_event
+args: -l 1 -n SubscribeNR T1
+
 #
 max-time: 3600
 cmd: test_event
 args: -n CreateDropNR -l 1
 
-#
-max-time: 600
-cmd: test_event_merge
-args: --no-implicit-nulls --separate-events --blob-version 1
-
-#
-max-time: 600
-cmd: test_event_merge
-args: --no-implicit-nulls --separate-events
-
-#
-max-time: 600
-cmd: test_event_merge
-args: --no-implicit-nulls --no-multiops --blob-version 1
-
-#
-max-time: 600
-cmd: test_event_merge
-args: --no-implicit-nulls --no-multiops
-
-max-time: 600
-cmd: testBasic
-args: -n PkRead T1
-

=== modified file 'storage/ndb/test/src/HugoOperations.cpp'
--- a/storage/ndb/test/src/HugoOperations.cpp	2008-11-17 09:28:34 +0000
+++ b/storage/ndb/test/src/HugoOperations.cpp	2009-03-06 18:06:17 +0000
@@ -72,7 +72,7 @@ int HugoOperations::pkReadRecord(Ndb* pN
 				 NdbOperation::LockMode lm){
   int a;  
   allocRows(numRecords);
-  indexScans.clear();
+  indexScans.clear();  
   int check;
 
   NdbOperation* pOp = 0;
@@ -95,13 +95,17 @@ rand_lock_mode:
     case NdbOperation::LM_Exclusive:
     case NdbOperation::LM_CommittedRead:
     case NdbOperation::LM_SimpleRead:
-      if(idx && idx->getType() == NdbDictionary::Index::OrderedIndex && 
-	 pIndexScanOp == 0)
+      if(idx && idx->getType() == NdbDictionary::Index::OrderedIndex)
       {
-	pIndexScanOp = ((NdbIndexScanOperation*)pOp);
-	check = pIndexScanOp->readTuples(lm);
-        /* Record NdbIndexScanOperation ptr for later... */
-        indexScans.push_back(pIndexScanOp);
+        if (pIndexScanOp == 0)
+        {
+          pIndexScanOp = ((NdbIndexScanOperation*)pOp);
+          bool mrrScan= (numRecords > 1);
+          Uint32 flags= mrrScan? NdbScanOperation::SF_MultiRange : 0; 
+          check = pIndexScanOp->readTuples(lm, flags);
+          /* Record NdbIndexScanOperation ptr for later... */
+          indexScans.push_back(pIndexScanOp);
+        }
       }
       else
 	check = pOp->readTuple(lm);
@@ -120,6 +124,14 @@ rand_lock_mode:
     if (equalForRow(pOp, r+recordNo) != 0)
       return NDBT_FAILED;
 
+    Uint32 partId;
+    /* Do we need to set the partitionId for this operation? */
+    if (getPartIdForRow(pOp, r+recordNo, partId))
+    {
+      g_info << "Setting operation partition Id" << endl;
+      pOp->setPartitionId(partId);
+    }
+
     if(pIndexScanOp)
       pIndexScanOp->end_of_bound(r);
     
@@ -192,10 +204,20 @@ rand_lock_mode:
       return NDBT_FAILED;
     }
     
+    int rowid= rand() % records;
+
     // Define primary keys
-    if (equalForRow(pOp, rand() % records) != 0)
+    if (equalForRow(pOp, rowid) != 0)
       return NDBT_FAILED;
 
+    Uint32 partId;
+    /* Do we need to set the partitionId for this operation? */
+    if (getPartIdForRow(pOp, rowid, partId))
+    {
+      g_info << "Setting operation partition Id" << endl;
+      pOp->setPartitionId(partId);
+    }
+
     if(pIndexScanOp)
       pIndexScanOp->end_of_bound(r);
     
@@ -241,6 +263,11 @@ int HugoOperations::pkUpdateRecord(Ndb* 
     {
       return NDBT_FAILED;
     }
+
+    Uint32 partId;
+    if(getPartIdForRow(pOp, r+recordNo, partId))
+      pOp->setPartitionId(partId);
+    
   }
   return NDBT_OK;
 }
@@ -288,6 +315,11 @@ int HugoOperations::pkInsertRecord(Ndb* 
     {
       return NDBT_FAILED;
     }
+
+    Uint32 partId;
+    if(getPartIdForRow(pOp, r+recordNo, partId))
+      pOp->setPartitionId(partId);
+    
   }
   return NDBT_OK;
 }
@@ -315,6 +347,11 @@ int HugoOperations::pkWriteRecord(Ndb* p
     if (equalForRow(pOp, r+recordNo) != 0)
       return NDBT_FAILED;
     
+    Uint32 partId;
+    if(getPartIdForRow(pOp, r+recordNo, partId))
+      pOp->setPartitionId(partId);
+    
+
     // Define attributes to update
     for(a = 0; a<tab.getNoOfColumns(); a++){
       if (tab.getColumn(a)->getPrimaryKey() == false){
@@ -349,6 +386,11 @@ int HugoOperations::pkWritePartialRecord
     // Define primary keys
     if (equalForRow(pOp, r+recordNo) != 0)
       return NDBT_FAILED;
+
+    Uint32 partId;
+    if(getPartIdForRow(pOp, r+recordNo, partId))
+      pOp->setPartitionId(partId);
+    
   }
   return NDBT_OK;
 }
@@ -374,6 +416,10 @@ int HugoOperations::pkDeleteRecord(Ndb* 
     // Define primary keys
     if (equalForRow(pOp, r+recordNo) != 0)
       return NDBT_FAILED;
+
+    Uint32 partId;
+    if(getPartIdForRow(pOp, r+recordNo, partId))
+      pOp->setPartitionId(partId);
   }
   return NDBT_OK;
 }
@@ -397,7 +443,7 @@ int HugoOperations::execute_Commit(Ndb* 
     return err.code;
   }
 
-  for(int i = 0; i<m_result_sets.size(); i++){
+  for(unsigned int i = 0; i<m_result_sets.size(); i++){
     m_executed_result_sets.push_back(m_result_sets[i]);
 
     int rows = m_result_sets[i].records;
@@ -449,7 +495,7 @@ int HugoOperations::execute_NoCommit(Ndb
     return err.code;
   }
 
-  for(int i = 0; i<m_result_sets.size(); i++){
+  for(unsigned int i = 0; i<m_result_sets.size(); i++){
     m_executed_result_sets.push_back(m_result_sets[i]);
 
     int rows = m_result_sets[i].records;
@@ -562,6 +608,7 @@ HugoOperations::wait_async(Ndb* pNdb, in
 HugoOperations::HugoOperations(const NdbDictionary::Table& _tab,
 			       const NdbDictionary::Index* idx):
   UtilTransactions(_tab, idx),
+  pIndexScanOp(NULL),
   calc(_tab)
 {
 }
@@ -592,10 +639,39 @@ HugoOperations::equalForRow(NdbOperation
   return NDBT_OK;
 }
 
+bool HugoOperations::getPartIdForRow(const NdbOperation* pOp,
+                                     int rowid,
+                                     Uint32& partId)
+{
+  if (tab.getFragmentType() == NdbDictionary::Object::UserDefined)
+  {
+    /* Primary keys and Ordered indexes are partitioned according
+     * to the row number
+     * PartitionId must be set for PK access.  Ordered indexes
+     * can scan all partitions.
+     */
+    if (pOp->getType() == NdbOperation::PrimaryKeyAccess)
+    {
+      /* Need to set the partitionId for this op
+       * For Hugo, we use 'HASH' partitioning, which is probably
+       * better called 'MODULO' partitioning with
+       * FragId == rowNum % NumPartitions
+       * This gives a good balance with the normal Hugo data, but different
+       * row to partition assignments than normal key partitioning.
+       */
+      const Uint32 numFrags= tab.getFragmentCount();
+      partId= rowid % numFrags;
+      g_info << "Returning partition Id of " << partId << endl;
+      return true;
+    }
+  }
+  partId= ~0;
+  return false;
+}
+
 int HugoOperations::equalForAttr(NdbOperation* pOp,
 				   int attrId, 
 				   int rowId){
-  int check = -1;
   const NdbDictionary::Column* attr = tab.getColumn(attrId);  
   if (attr->getPrimaryKey() == false){
     g_info << "Can't call equalForAttr on non PK attribute" << endl;
@@ -614,7 +690,6 @@ int HugoOperations::setValueForAttr(NdbO
 				      int attrId, 
 				      int rowId,
 				      int updateId){
-  int check = -1;
   const NdbDictionary::Column* attr = tab.getColumn(attrId);     
   
   int len = attr->getSizeInBytes();

=== modified file 'storage/ndb/test/src/HugoTransactions.cpp'
--- a/storage/ndb/test/src/HugoTransactions.cpp	2009-02-05 12:22:39 +0000
+++ b/storage/ndb/test/src/HugoTransactions.cpp	2009-03-12 10:51:59 +0000
@@ -1080,13 +1080,19 @@ HugoTransactions::pkUpdateRecords(Ndb* p
           do {
             
             if (calc.verifyRowValues(rows[0]) != 0){
+              g_info << "Row validation failure" << endl;
               closeTransaction(pNdb);
               return NDBT_FAILED;
             }
             
             int updates = calc.getUpdatesValue(rows[0]) + 1;
             
-            if(pkUpdateRecord(pNdb, r+rows_found, 1, updates) != NDBT_OK)
+            /* Rows may not arrive in the order they were requested
+             * (When multiple partitions scanned without ORDERBY)
+             * therefore we use the id from the row to update it
+             */
+            const Uint32 rowId= calc.getIdValue(rows[0]);
+            if(pkUpdateRecord(pNdb, rowId, 1, updates) != NDBT_OK)
             {
               ERR(pTrans->getNdbError());
               closeTransaction(pNdb);
@@ -1103,6 +1109,7 @@ HugoTransactions::pkUpdateRecords(Ndb* p
 
         if(check != 1)
         {
+          g_info << "Check failed" << endl;
           closeTransaction(pNdb);
           return NDBT_FAILED;
         } 
@@ -1110,6 +1117,8 @@ HugoTransactions::pkUpdateRecords(Ndb* p
 
       if (rows_found != batch)
       {
+        g_info << "Incorrect num of rows found.  Expected "
+               << batch << ". Found " << rows_found << endl;
         closeTransaction(pNdb);
         return NDBT_FAILED;
       }

=== modified file 'storage/ndb/test/src/NdbBackup.cpp'
--- a/storage/ndb/test/src/NdbBackup.cpp	2008-12-11 09:49:41 +0000
+++ b/storage/ndb/test/src/NdbBackup.cpp	2009-03-09 09:24:02 +0000
@@ -35,6 +35,45 @@
 #include <mgmapi_config_parameters.h>
 #include <mgmapi_configuration.hpp>
 
+int
+NdbBackup::clearOldBackups()
+{
+  if (!isConnected())
+    return -1;
+
+  if (getStatus() != 0)
+    return -1;
+
+  int retCode = 0;
+
+  for(size_t i = 0; i < ndbNodes.size(); i++)
+  {
+    int nodeId = ndbNodes[i].node_id;
+    const char* path = getBackupDataDirForNode(nodeId);
+    if (path == NULL)
+      return -1;  
+    
+    const char *host;
+    if (!getHostName(nodeId, &host))
+      return -1;
+
+    /* 
+     * Clear old backup files
+     */ 
+    BaseString tmp;
+    tmp.assfmt("ssh %s rm -rf %s/BACKUP", host, path);
+  
+    ndbout << "buf: "<< tmp.c_str() <<endl;
+    int res = system(tmp.c_str());  
+    ndbout << "ssh res: " << res << endl;
+
+    if (res && retCode == 0)
+      retCode = res;
+  }
+
+  return retCode;
+}
+
 int 
 NdbBackup::start(unsigned int & _backup_id){
 
@@ -45,6 +84,8 @@ NdbBackup::start(unsigned int & _backup_
   ndb_mgm_reply reply;
   reply.return_code = 0;
 
+  bool any = _backup_id == 0;
+
 loop:
   if (ndb_mgm_start_backup(handle,
 			   2, // wait until completed
@@ -52,8 +93,13 @@ loop:
 			   &reply) == -1) {
 
     if (ndb_mgm_get_latest_error(handle) == NDB_MGM_COULD_NOT_START_BACKUP &&
-        strstr(ndb_mgm_get_latest_error_desc(handle), "file already exists"))
+        strstr(ndb_mgm_get_latest_error_desc(handle), "file already exists") &&
+        any == true)
+    {
+      NdbSleep_SecSleep(3);
+      _backup_id += 100;
       goto loop;
+    }
     
     g_err << "Error: " << ndb_mgm_get_latest_error(handle) << endl;
     g_err << "Error msg: " << ndb_mgm_get_latest_error_msg(handle) << endl;
@@ -150,28 +196,30 @@ NdbBackup::execRestore(bool _restore_dat
   int res = system(tmp.c_str());  
   
   ndbout << "scp res: " << res << endl;
-  
-  tmp.assfmt("%sndb_restore -c \"%s:%d\" -n %d -b %d %s %s .", 
+
+  if (res == 0 && _restore_meta)
+  {
+    /** don't restore DD objects */
+    
+    tmp.assfmt("%sndb_restore -c \"%s:%d\" -n %d -b %d -m -d .", 
 #if 1
-             "",
+               "",
 #else
-             "valgrind --leak-check=yes -v "
+               "valgrind --leak-check=yes -v "
 #endif
-             ndb_mgm_get_connected_host(handle),
-             ndb_mgm_get_connected_port(handle),
-             _node_id, 
-             _backup_id,
-             _restore_data?"-r":"",
-             _restore_meta?"-m":"");
+               ndb_mgm_get_connected_host(handle),
+               ndb_mgm_get_connected_port(handle),
+               _node_id, 
+               _backup_id);
+    
+    ndbout << "buf: "<< tmp.c_str() <<endl;
+    res = system(tmp.c_str());
+  }
   
-  ndbout << "buf: "<< tmp.c_str() <<endl;
-  res = system(tmp.c_str());
-
-  if (res && _restore_meta)
+  if (res == 0 && _restore_data)
   {
-    /** try once wo/ restoring DD objects */
 
-    tmp.assfmt("%sndb_restore -c \"%s:%d\" -n %d -b %d -d %s %s .", 
+    tmp.assfmt("%sndb_restore -c \"%s:%d\" -n %d -b %d -r .", 
 #if 1
                "",
 #else
@@ -180,9 +228,7 @@ NdbBackup::execRestore(bool _restore_dat
                ndb_mgm_get_connected_host(handle),
                ndb_mgm_get_connected_port(handle),
                _node_id, 
-               _backup_id,
-               _restore_data?"-r":"",
-               _restore_meta?"-m":"");
+               _backup_id);
     
     ndbout << "buf: "<< tmp.c_str() <<endl;
     res = system(tmp.c_str());

=== modified file 'storage/ndb/test/src/NdbMixRestarter.cpp'
--- a/storage/ndb/test/src/NdbMixRestarter.cpp	2007-04-17 14:26:16 +0000
+++ b/storage/ndb/test/src/NdbMixRestarter.cpp	2009-03-11 13:45:13 +0000
@@ -98,8 +98,9 @@ NdbMixRestarter::restart_cluster(NDBT_Co
 }
 
 static
-ndb_mgm_node_state*
-select_node_to_stop(Vector<ndb_mgm_node_state>& nodes)
+void
+select_nodes_to_stop(Vector<ndb_mgm_node_state*>& victims,
+                     Vector<ndb_mgm_node_state>& nodes)
 {
   Uint32 i, j;
   Vector<ndb_mgm_node_state*> alive_nodes;
@@ -110,7 +111,6 @@ select_node_to_stop(Vector<ndb_mgm_node_
       alive_nodes.push_back(node);
   }
 
-  Vector<ndb_mgm_node_state*> victims;
   // Remove those with one in node group
   for(i = 0; i<alive_nodes.size(); i++)
   {
@@ -124,7 +124,15 @@ select_node_to_stop(Vector<ndb_mgm_node_
       }
     }
   }
+}
 
+static
+ndb_mgm_node_state*
+select_node_to_stop(Vector<ndb_mgm_node_state>& nodes)
+{
+  Vector<ndb_mgm_node_state*> victims;
+  select_nodes_to_stop(victims, nodes);
+  
   if (victims.size())
   {
     int victim = rand() % victims.size();
@@ -137,17 +145,25 @@ select_node_to_stop(Vector<ndb_mgm_node_
 }
 
 static
-ndb_mgm_node_state*
-select_node_to_start(Vector<ndb_mgm_node_state>& nodes)
+void
+select_nodes_to_start(Vector<ndb_mgm_node_state*>& victims, 
+                      Vector<ndb_mgm_node_state>& nodes)
 {
   Uint32 i;
-  Vector<ndb_mgm_node_state*> victims;
   for(i = 0; i<nodes.size(); i++)
   {
     ndb_mgm_node_state* node = &nodes[i];
     if (node->node_status == NDB_MGM_NODE_STATUS_NOT_STARTED)
       victims.push_back(node);
   }
+}
+
+static
+ndb_mgm_node_state*
+select_node_to_start(Vector<ndb_mgm_node_state>& nodes)
+{
+  Vector<ndb_mgm_node_state*> victims;
+  select_nodes_to_start(victims, nodes);
 
   if (victims.size())
   {

=== modified file 'storage/ndb/test/tools/copy_tab.cpp'
--- a/storage/ndb/test/tools/copy_tab.cpp	2009-01-27 14:05:16 +0000
+++ b/storage/ndb/test/tools/copy_tab.cpp	2009-03-09 09:02:46 +0000
@@ -73,6 +73,31 @@ int main(int argc, const char** argv){
     ndbout << endl << MyNdb.getDictionary()->getNdbError() << endl;
     return NDBT_ProgramExit(NDBT_FAILED);
   }
+
+  Vector<NdbDictionary::Index*> indexes;
+  {
+    NdbDictionary::Dictionary::List list;
+    int res = MyNdb.getDictionary()->listIndexes(list, *ptab);
+    for (unsigned i = 0; i<list.count; i++)
+    {
+      const NdbDictionary::Index* idx = 
+        MyNdb.getDictionary()->getIndex(list.elements[i].name,
+                                        _tabname);
+      if (idx)
+      {
+        ndbout << " found index " << list.elements[i].name << endl;
+        NdbDictionary::Index * copy = new NdbDictionary::Index();
+        copy->setName(idx->getName());
+        copy->setType(idx->getType());
+        copy->setLogging(idx->getLogging());
+        for (unsigned j = 0; j<idx->getNoOfColumns(); j++)
+        {
+          copy->addColumn(idx->getColumn(j)->getName());
+        }
+        indexes.push_back(copy);
+      }
+    }
+  }
   for (int i = optind + 1; i<argc; i++)
   {
     const char *_to_tabname = argv[i];
@@ -83,6 +108,20 @@ int main(int argc, const char** argv){
       ndbout << endl << MyNdb.getDictionary()->getNdbError() << endl;
       return NDBT_ProgramExit(NDBT_FAILED);
     }
+
+    for (unsigned j = 0; j<indexes.size(); j++)
+    {
+      NdbDictionary::Index * idx = indexes[j];
+      idx->setTable(_to_tabname);
+      int res = MyNdb.getDictionary()->createIndex(*idx);
+      if (res != 0)
+      {
+        ndbout << "Failed to create index: " << idx->getName() << " : " 
+               << MyNdb.getDictionary()->getNdbError() << endl;
+        return NDBT_ProgramExit(NDBT_FAILED);
+      }
+    }
+    
     ndbout << "OK" << endl;
     if (_copy_data){
       ndbout << "Copying data..."<<endl;
@@ -98,5 +137,13 @@ int main(int argc, const char** argv){
       ndbout << "OK" << endl;
     }
   }
+  
+  for (unsigned j = 0; j<indexes.size(); j++)
+  {
+    delete indexes[j];
+  }
+
   return NDBT_ProgramExit(NDBT_OK);
 }
+
+template class Vector<NdbDictionary::Index*>;

=== modified file 'storage/ndb/tools/restore/Restore.cpp'
--- a/storage/ndb/tools/restore/Restore.cpp	2009-01-27 13:03:36 +0000
+++ b/storage/ndb/tools/restore/Restore.cpp	2009-03-12 10:51:59 +0000
@@ -1212,7 +1212,7 @@ BackupFile::setCtlFile(Uint32 nodeId, Ui
   m_expectedFileHeader.FileType = BackupFormat::CTL_FILE;
 
   char name[PATH_MAX]; const Uint32 sz = sizeof(name);
-  BaseString::snprintf(name, sz, "BACKUP-%d.%d.ctl", backupId, nodeId);  
+  BaseString::snprintf(name, sz, "BACKUP-%u.%d.ctl", backupId, nodeId);  
   setName(path, name);
 }
 
@@ -1223,7 +1223,7 @@ BackupFile::setDataFile(const BackupFile
   m_expectedFileHeader.FileType = BackupFormat::DATA_FILE;
   
   char name[PATH_MAX]; const Uint32 sz = sizeof(name);
-  BaseString::snprintf(name, sz, "BACKUP-%d-%d.%d.Data", 
+  BaseString::snprintf(name, sz, "BACKUP-%u-%d.%d.Data", 
 	   m_expectedFileHeader.BackupId, no, m_nodeId);
   setName(bf.m_path, name);
 }
@@ -1235,7 +1235,7 @@ BackupFile::setLogFile(const BackupFile 
   m_expectedFileHeader.FileType = BackupFormat::LOG_FILE;
   
   char name[PATH_MAX]; const Uint32 sz = sizeof(name);
-  BaseString::snprintf(name, sz, "BACKUP-%d.%d.log", 
+  BaseString::snprintf(name, sz, "BACKUP-%u.%d.log", 
 	   m_expectedFileHeader.BackupId, m_nodeId);
   setName(bf.m_path, name);
 }

=== modified file 'storage/ndb/tools/restore/restore_main.cpp'
--- a/storage/ndb/tools/restore/restore_main.cpp	2009-02-04 07:51:06 +0000
+++ b/storage/ndb/tools/restore/restore_main.cpp	2009-03-12 10:51:59 +0000
@@ -917,7 +917,7 @@ main(int argc, char** argv)
     exitHandler(NDBT_FAILED);
   }
 
-  g_options.appfmt(" -b %d", ga_backupId);
+  g_options.appfmt(" -b %u", ga_backupId);
   g_options.appfmt(" -n %d", ga_nodeId);
   if (_restore_meta)
     g_options.appfmt(" -m");

Thread
bzr commit into mysql-6.0-telco-6.3 branch (tomas.ulin:2854) Tomas Ulin12 Mar