#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 Ulin | 12 Mar |