Merge mysql.com:/home/ram/work/mysql-5.1-engines
into mysql.com:/home/ram/work/b33304/b33304.5.1
This commit is contained in:
commit
28aaef3ccf
@ -527,6 +527,11 @@ void ProcessOldClientHello(input_buffer& input, SSL& ssl)
|
||||
input.read(len, sizeof(len));
|
||||
uint16 randomLen;
|
||||
ato16(len, randomLen);
|
||||
if (ch.suite_len_ > MAX_SUITE_SZ || sessionLen > ID_LEN ||
|
||||
randomLen > RAN_LEN) {
|
||||
ssl.SetError(bad_input);
|
||||
return;
|
||||
}
|
||||
|
||||
int j = 0;
|
||||
for (uint16 i = 0; i < ch.suite_len_; i += 3) {
|
||||
|
@ -101,6 +101,7 @@ template void ysArrayDelete<unsigned char>(unsigned char*);
|
||||
template void ysArrayDelete<char>(char*);
|
||||
|
||||
template int min<int>(int, int);
|
||||
template uint16 min<uint16>(uint16, uint16);
|
||||
template unsigned int min<unsigned int>(unsigned int, unsigned int);
|
||||
template unsigned long min<unsigned long>(unsigned long, unsigned long);
|
||||
}
|
||||
|
@ -621,6 +621,10 @@ void HandShakeHeader::Process(input_buffer& input, SSL& ssl)
|
||||
}
|
||||
|
||||
uint len = c24to32(length_);
|
||||
if (len > input.get_remaining()) {
|
||||
ssl.SetError(bad_input);
|
||||
return;
|
||||
}
|
||||
hashHandShake(ssl, input, len);
|
||||
|
||||
hs->set_length(len);
|
||||
@ -1391,10 +1395,15 @@ input_buffer& operator>>(input_buffer& input, ClientHello& hello)
|
||||
|
||||
// Suites
|
||||
byte tmp[2];
|
||||
uint16 len;
|
||||
tmp[0] = input[AUTO];
|
||||
tmp[1] = input[AUTO];
|
||||
ato16(tmp, hello.suite_len_);
|
||||
ato16(tmp, len);
|
||||
|
||||
hello.suite_len_ = min(len, static_cast<uint16>(MAX_SUITE_SZ));
|
||||
input.read(hello.cipher_suites_, hello.suite_len_);
|
||||
if (len > hello.suite_len_) // ignore extra suites
|
||||
input.set_current(input.get_current() + len - hello.suite_len_);
|
||||
|
||||
// Compression
|
||||
hello.comp_len_ = input[AUTO];
|
||||
|
@ -187,7 +187,7 @@ typedef int (*mysql_var_check_func)(MYSQL_THD thd,
|
||||
*/
|
||||
typedef void (*mysql_var_update_func)(MYSQL_THD thd,
|
||||
struct st_mysql_sys_var *var,
|
||||
void *var_ptr, void *save);
|
||||
void *var_ptr, const void *save);
|
||||
|
||||
|
||||
/* the following declarations are for internal use only */
|
||||
|
@ -50,17 +50,30 @@ insert into t1 values (1,2);
|
||||
--echo
|
||||
|
||||
connection master;
|
||||
# here is actually a bug, since there is no begin statement, the
|
||||
# query is autocommitted, and end_pos shows end of the insert and not
|
||||
# end of the commit
|
||||
--echo # Now check that that is in the apply_status table is consistant
|
||||
--echo # with what is in the binlog
|
||||
--echo
|
||||
--echo # since insert is done with transactional engine, expect a BEGIN
|
||||
--echo # at <start_pos>
|
||||
--echo
|
||||
--replace_result $start_pos <start_pos>
|
||||
--replace_column 5 #
|
||||
--eval show binlog events from $start_pos limit 1
|
||||
|
||||
--echo
|
||||
--echo # Now the insert, one step after
|
||||
--echo
|
||||
--replace_result $start_pos <start_pos>
|
||||
--replace_column 2 # 5 #
|
||||
--eval show binlog events from $start_pos limit 1,1
|
||||
|
||||
--echo
|
||||
--echo # and the COMMIT should be at <end_pos>
|
||||
--echo
|
||||
--replace_result $start_pos <start_pos> $end_pos <end_pos>
|
||||
--replace_column 2 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
--eval show binlog events from $start_pos limit 1,1
|
||||
--eval show binlog events from $start_pos limit 2,1
|
||||
|
||||
--echo
|
||||
|
||||
|
@ -889,6 +889,7 @@ our @tags=
|
||||
["include/have_ndb.inc", "ndb_test", 1],
|
||||
["include/have_multi_ndb.inc", "ndb_test", 1],
|
||||
["include/have_ndb_extra.inc", "ndb_extra", 1],
|
||||
["include/ndb_master-slave.inc", "ndb_test", 1],
|
||||
["require_manager", "require_manager", 1],
|
||||
);
|
||||
|
||||
|
@ -136,9 +136,12 @@ our $opt_suites;
|
||||
our $opt_suites_default= "main,binlog,rpl,rpl_ndb,ndb"; # Default suites to run
|
||||
our @extra_suites=
|
||||
(
|
||||
["mysql-5.1-new-ndb", "ndb_team"],
|
||||
["mysql-5.1-telco-6.2", "ndb_team"],
|
||||
["mysql-5.1-telco-6.3", "ndb_team"],
|
||||
["mysql-5.1-new-ndb", "ndb_team"],
|
||||
["mysql-5.1-new-ndb-merge", "ndb_team"],
|
||||
["mysql-5.1-telco-6.2", "ndb_team"],
|
||||
["mysql-5.1-telco-6.2-merge", "ndb_team"],
|
||||
["mysql-5.1-telco-6.3", "ndb_team"],
|
||||
["mysql-6.0-ndb", "ndb_team"],
|
||||
);
|
||||
|
||||
|
||||
@ -413,13 +416,20 @@ sub main () {
|
||||
{
|
||||
# use default and add any extra_suites as defined
|
||||
$opt_suites= $opt_suites_default;
|
||||
my $ddd= basename(dirname($glob_mysql_test_dir));
|
||||
foreach my $extra_suite (@extra_suites)
|
||||
my $ccc= dirname($glob_mysql_test_dir);
|
||||
my $found= 0;
|
||||
while (!$found and !($ccc eq "/") and !($ccc eq ""))
|
||||
{
|
||||
if ($extra_suite->[0] eq "$ddd")
|
||||
my $ddd= basename($ccc);
|
||||
foreach my $extra_suite (@extra_suites)
|
||||
{
|
||||
$opt_suites= "$extra_suite->[1],$opt_suites";
|
||||
if ($extra_suite->[0] eq "$ddd")
|
||||
{
|
||||
$opt_suites= "$extra_suite->[1],$opt_suites";
|
||||
$found= 1;
|
||||
}
|
||||
}
|
||||
$ccc= dirname($ccc);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -230,6 +230,9 @@ select min(a) from t1 group by inet_ntoa(a);
|
||||
min(a)
|
||||
-2
|
||||
drop table t1;
|
||||
SELECT NAME_CONST('var', 'value') COLLATE latin1_general_cs;
|
||||
NAME_CONST('var', 'value') COLLATE latin1_general_cs
|
||||
value
|
||||
End of 5.0 tests
|
||||
select connection_id() > 0;
|
||||
connection_id() > 0
|
||||
|
@ -421,10 +421,10 @@ select * from t1 order by a;
|
||||
a
|
||||
1
|
||||
20
|
||||
21
|
||||
33
|
||||
34
|
||||
35
|
||||
65
|
||||
insert into t1 values (100);
|
||||
insert into t1 values (NULL);
|
||||
insert into t1 values (NULL);
|
||||
@ -432,11 +432,11 @@ select * from t1 order by a;
|
||||
a
|
||||
1
|
||||
20
|
||||
21
|
||||
22
|
||||
33
|
||||
34
|
||||
35
|
||||
65
|
||||
66
|
||||
100
|
||||
101
|
||||
set auto_increment_offset = @old_auto_increment_offset;
|
||||
|
37
mysql-test/suite/ndb/r/ndb_autoinc.result
Normal file
37
mysql-test/suite/ndb/r/ndb_autoinc.result
Normal file
@ -0,0 +1,37 @@
|
||||
DROP TABLE IF EXISTS t1,t2,t3;
|
||||
USE test;
|
||||
CREATE TABLE t1 (
|
||||
id INT AUTO_INCREMENT,
|
||||
PRIMARY KEY(id)
|
||||
) ENGINE=NDBCLUSTER;
|
||||
CREATE TABLE t2 (
|
||||
id INT AUTO_INCREMENT,
|
||||
KEY(id)
|
||||
) ENGINE=NDBCLUSTER;
|
||||
ERROR HY000: Can't create table 'test.t2' (errno: 4335)
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
CREATE TABLE t3 (
|
||||
id INT AUTO_INCREMENT,
|
||||
KEY(id)
|
||||
) ENGINE=MYISAM;
|
||||
ALTER TABLE t3
|
||||
ENGINE NDBCLUSTER;
|
||||
SHOW CREATE TABLE t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
KEY `id` (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
ALTER TABLE t3
|
||||
ADD PRIMARY KEY (id);
|
||||
SHOW CREATE TABLE t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `id` (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1, t3;
|
||||
End of 5.1 tests
|
98
mysql-test/suite/ndb/r/ndb_bug31477.result
Normal file
98
mysql-test/suite/ndb/r/ndb_bug31477.result
Normal file
@ -0,0 +1,98 @@
|
||||
drop table if exists t1;
|
||||
create table t1(a int primary key, b int, c int, unique(b)) engine = ndb;
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
begin;
|
||||
update t1 set c = 2 where b = 1;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
rollback;
|
||||
drop table t1;
|
||||
create table t1(a int primary key, b int, c int, key(b)) engine = ndb;
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
begin;
|
||||
update t1 set c = 2 where b = 1;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
rollback;
|
||||
rollback;
|
||||
drop table t1;
|
||||
--con1
|
||||
create table t1(a int primary key, b int, c int, key(b)) engine = ndb;
|
||||
insert into t1 values (1,1,1);
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
begin;
|
||||
update t1 set c = 10 where a = 1;
|
||||
update t1 set c = 20 where a = 1;
|
||||
update t1 set c = 30 where a = 1;
|
||||
--con1 c=30
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
1 1 30
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con2 c=1
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
1 1 1
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con1
|
||||
delete from t1 where a = 1;
|
||||
--con1 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con2 c=1
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
1 1 1
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con1
|
||||
commit;
|
||||
--con1 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con2 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con1
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
update t1 set c = 10 where a = 1;
|
||||
update t1 set c = 20 where a = 1;
|
||||
update t1 set c = 30 where a = 1;
|
||||
--con1 c=30
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
1 1 30
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
--con2 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
a b c
|
||||
2 2 2
|
||||
3 3 3
|
||||
4 4 4
|
||||
drop table t1;
|
@ -1904,6 +1904,12 @@ a b d
|
||||
10 1 4369
|
||||
20 2 8738
|
||||
50 5 21845
|
||||
-- big filter just below limit
|
||||
a b d
|
||||
10 1 4369
|
||||
20 2 8738
|
||||
50 5 21845
|
||||
-- big filter just above limit
|
||||
a b d
|
||||
10 1 4369
|
||||
20 2 8738
|
||||
|
@ -406,6 +406,16 @@ a b c
|
||||
1 7 7
|
||||
2 2 2
|
||||
3 3 3
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES (3,'1','1');
|
||||
BEGIN;
|
||||
UPDATE t1 SET b = b + 2 WHERE A = 3;
|
||||
DELETE FROM t1 WHERE A = 3;
|
||||
INSERT INTO t1 VALUES (3,'0','0');
|
||||
COMMIT;
|
||||
SELECT * from t1 ORDER BY 1;
|
||||
a b c
|
||||
3 0 0
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (
|
||||
a INT NOT NULL PRIMARY KEY,
|
||||
@ -501,6 +511,18 @@ f1 f2
|
||||
111111 aaaaaa
|
||||
222222 bbbbbb
|
||||
drop table test.t1;
|
||||
CREATE TABLE t1 (
|
||||
id int unsigned NOT NULL,
|
||||
c1 int unsigned NOT NULL,
|
||||
c2 int DEFAULT NULL,
|
||||
PRIMARY KEY using hash (id),
|
||||
UNIQUE KEY c1 using hash (c1))
|
||||
TABLESPACE ts1 STORAGE DISK ENGINE=ndbcluster;
|
||||
insert into t1 values(1, 1, 3);
|
||||
insert into t1 values(2, 2, 3);
|
||||
update t1 set c1 = 1 where id = 2;
|
||||
ERROR 23000: Duplicate entry '1' for key 'c1'
|
||||
drop table t1;
|
||||
ALTER TABLESPACE ts1
|
||||
DROP DATAFILE 'datafile.dat'
|
||||
ENGINE = NDB;
|
||||
|
@ -38,6 +38,23 @@ a b c
|
||||
1 10 3
|
||||
1 11 3
|
||||
1 12 3
|
||||
select max(b) from t1 where a = 1;
|
||||
max(b)
|
||||
12
|
||||
select b from t1 where a = 1 order by b desc;
|
||||
b
|
||||
12
|
||||
11
|
||||
10
|
||||
9
|
||||
8
|
||||
7
|
||||
6
|
||||
5
|
||||
4
|
||||
3
|
||||
2
|
||||
1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT, b CHAR(10) COLLATE latin1_bin, c INT, d INT,
|
||||
PRIMARY KEY (a,b,c) USING HASH)
|
||||
|
@ -46,6 +46,14 @@ a b c
|
||||
1 1 1
|
||||
6 1 1
|
||||
10 1 1
|
||||
INSERT into t1 values (1, 2, 2);
|
||||
select max(b) from t1 where a = 1;
|
||||
max(b)
|
||||
2
|
||||
select b from t1 where a = 1 order by b desc;
|
||||
b
|
||||
2
|
||||
1
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
a int not null,
|
||||
|
@ -253,21 +253,41 @@ a
|
||||
2000
|
||||
3000
|
||||
10000
|
||||
show table status like 't1_c';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
X X X X X X X X X X 3001 X X X X X X X
|
||||
show table status like 't2_c';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
X X X X X X X X X X 501 X X X X X X X
|
||||
show table status like 't4_c';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
X X X X X X X X X X 290000001 X X X X X X X
|
||||
show table status like 't7_c';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
X X X X X X X X X X 29 X X X X X X X
|
||||
show table status like 't10_c';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
X X X X X X X X X X 10001 X X X X X X X
|
||||
select max(capgoaledatta) from t1_c;
|
||||
max(capgoaledatta)
|
||||
3000
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't1_c';
|
||||
auto_increment
|
||||
3001
|
||||
select max(capgotod) from t2_c;
|
||||
max(capgotod)
|
||||
500
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't2_c';
|
||||
auto_increment
|
||||
501
|
||||
select max(capfa) from t4_c;
|
||||
max(capfa)
|
||||
290000000
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't4_c';
|
||||
auto_increment
|
||||
290000001
|
||||
select max(dardtestard) from t7_c;
|
||||
max(dardtestard)
|
||||
28
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't7_c';
|
||||
auto_increment
|
||||
29
|
||||
select max(a) from t10_c;
|
||||
max(a)
|
||||
10000
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't10_c';
|
||||
auto_increment
|
||||
10001
|
||||
ALTER TABLE t7_c
|
||||
PARTITION BY LINEAR KEY (`dardtestard`);
|
||||
CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
|
||||
|
45
mysql-test/suite/ndb/t/ndb_autoinc.test
Normal file
45
mysql-test/suite/ndb/t/ndb_autoinc.test
Normal file
@ -0,0 +1,45 @@
|
||||
-- source include/have_ndb.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1,t2,t3;
|
||||
--enable_warnings
|
||||
|
||||
USE test;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
id INT AUTO_INCREMENT,
|
||||
PRIMARY KEY(id)
|
||||
) ENGINE=NDBCLUSTER;
|
||||
|
||||
# Test For bug#30417
|
||||
--error 1005
|
||||
|
||||
CREATE TABLE t2 (
|
||||
id INT AUTO_INCREMENT,
|
||||
KEY(id)
|
||||
) ENGINE=NDBCLUSTER;
|
||||
|
||||
SHOW TABLES;
|
||||
|
||||
CREATE TABLE t3 (
|
||||
id INT AUTO_INCREMENT,
|
||||
KEY(id)
|
||||
) ENGINE=MYISAM;
|
||||
|
||||
--disable_result_log
|
||||
--error 1005
|
||||
ALTER TABLE t3
|
||||
ENGINE NDBCLUSTER;
|
||||
--enable_result_log
|
||||
|
||||
SHOW CREATE TABLE t3;
|
||||
|
||||
ALTER TABLE t3
|
||||
ADD PRIMARY KEY (id);
|
||||
|
||||
SHOW CREATE TABLE t3;
|
||||
|
||||
DROP TABLE t1, t3;
|
||||
|
||||
--echo End of 5.1 tests
|
109
mysql-test/suite/ndb/t/ndb_bug31477.test
Normal file
109
mysql-test/suite/ndb/t/ndb_bug31477.test
Normal file
@ -0,0 +1,109 @@
|
||||
--source include/have_ndb.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
# setup
|
||||
|
||||
connect (con1,localhost,root,,test);
|
||||
connect (con2,localhost,root,,test);
|
||||
|
||||
# unique index
|
||||
connection con1;
|
||||
create table t1(a int primary key, b int, c int, unique(b)) engine = ndb;
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
--error 1205
|
||||
update t1 set c = 2 where b = 1;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
rollback;
|
||||
drop table t1;
|
||||
# ordered index
|
||||
|
||||
connection con1;
|
||||
create table t1(a int primary key, b int, c int, key(b)) engine = ndb;
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
|
||||
connection con2;
|
||||
begin;
|
||||
--error 1205
|
||||
update t1 set c = 2 where b = 1;
|
||||
rollback;
|
||||
|
||||
connection con1;
|
||||
rollback;
|
||||
drop table t1;
|
||||
|
||||
# multiple versions
|
||||
|
||||
--echo --con1
|
||||
connection con1;
|
||||
create table t1(a int primary key, b int, c int, key(b)) engine = ndb;
|
||||
insert into t1 values (1,1,1);
|
||||
insert into t1 values (2,2,2);
|
||||
insert into t1 values (3,3,3);
|
||||
insert into t1 values (4,4,4);
|
||||
|
||||
begin;
|
||||
update t1 set c = 10 where a = 1;
|
||||
update t1 set c = 20 where a = 1;
|
||||
update t1 set c = 30 where a = 1;
|
||||
|
||||
--echo --con1 c=30
|
||||
select * from t1 where b >= 1 order by b;
|
||||
--echo --con2 c=1
|
||||
connection con2;
|
||||
select * from t1 where b >= 1 order by b;
|
||||
|
||||
--echo --con1
|
||||
connection con1;
|
||||
delete from t1 where a = 1;
|
||||
|
||||
--echo --con1 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
--echo --con2 c=1
|
||||
connection con2;
|
||||
select * from t1 where b >= 1 order by b;
|
||||
|
||||
--echo --con1
|
||||
connection con1;
|
||||
commit;
|
||||
|
||||
--echo --con1 c=none
|
||||
select * from t1 where b >= 1 order by b;
|
||||
--echo --con2 c=none
|
||||
connection con2;
|
||||
select * from t1 where b >= 1 order by b;
|
||||
|
||||
--echo --con1
|
||||
connection con1;
|
||||
begin;
|
||||
insert into t1 values (1,1,1);
|
||||
update t1 set c = 10 where a = 1;
|
||||
update t1 set c = 20 where a = 1;
|
||||
update t1 set c = 30 where a = 1;
|
||||
|
||||
--echo --con1 c=30
|
||||
select * from t1 where b >= 1 order by b;
|
||||
--echo --con2 c=none
|
||||
connection con2;
|
||||
select * from t1 where b >= 1 order by b;
|
||||
|
||||
# this fails with "no such table" via con2 ???
|
||||
connection con1;
|
||||
drop table t1;
|
@ -1753,6 +1753,7 @@ set engine_condition_pushdown = 1;
|
||||
SELECT fname, lname FROM t1 WHERE (fname like 'Y%') or (lname like 'F%');
|
||||
|
||||
# bug#29390 (scan filter is too large, discarded)
|
||||
# bug#34107 (previous limit was too large for TUP)
|
||||
|
||||
drop table t1;
|
||||
|
||||
@ -1771,9 +1772,11 @@ select a,b,d from t1
|
||||
where b in (0,1,2,5)
|
||||
order by b;
|
||||
|
||||
--echo -- big filter just below limit
|
||||
--disable_query_log
|
||||
select a,b,d from t1
|
||||
where b in (
|
||||
0,1,2,5,0,1,2,5,0,1,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
@ -1904,745 +1907,15 @@ select a,b,d from t1
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2)
|
||||
order by b;
|
||||
--enable_query_log
|
||||
|
||||
--echo -- big filter just above limit
|
||||
--disable_query_log
|
||||
select a,b,d from t1
|
||||
where b in (
|
||||
0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,5,0,1,2,
|
||||
|
@ -346,6 +346,16 @@ UPDATE t1 SET c = '6' WHERE b = '7';
|
||||
SELECT * FROM t1 ORDER BY 1;
|
||||
UPDATE t1 SET c = '7' WHERE c = '6';
|
||||
SELECT * FROM t1 ORDER BY 1;
|
||||
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES (3,'1','1');
|
||||
BEGIN;
|
||||
UPDATE t1 SET b = b + 2 WHERE A = 3;
|
||||
DELETE FROM t1 WHERE A = 3;
|
||||
INSERT INTO t1 VALUES (3,'0','0');
|
||||
COMMIT;
|
||||
SELECT * from t1 ORDER BY 1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
########################
|
||||
@ -439,6 +449,21 @@ select f2 from test.t1 order by f2;
|
||||
select f1,f2 from test.t1 order by f1;
|
||||
drop table test.t1;
|
||||
|
||||
# bug#34118 hash index trigger and do not update any disk attr
|
||||
CREATE TABLE t1 (
|
||||
id int unsigned NOT NULL,
|
||||
c1 int unsigned NOT NULL,
|
||||
c2 int DEFAULT NULL,
|
||||
PRIMARY KEY using hash (id),
|
||||
UNIQUE KEY c1 using hash (c1))
|
||||
TABLESPACE ts1 STORAGE DISK ENGINE=ndbcluster;
|
||||
|
||||
insert into t1 values(1, 1, 3);
|
||||
insert into t1 values(2, 2, 3);
|
||||
--error ER_DUP_ENTRY
|
||||
update t1 set c1 = 1 where id = 2;
|
||||
drop table t1;
|
||||
|
||||
###################
|
||||
# Test Cleanup
|
||||
###################
|
||||
|
@ -38,6 +38,10 @@ insert into t1 values
|
||||
|
||||
select * from t1 order by b;
|
||||
|
||||
# BUG#33061: ORDER BY DESC becomes ASC in NDB partition pruning to one partition
|
||||
select max(b) from t1 where a = 1;
|
||||
select b from t1 where a = 1 order by b desc;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
|
@ -48,6 +48,11 @@ select * from t1 where a=21 order by a;
|
||||
select * from t1 where a in (1,6,10,21) order by a;
|
||||
select * from t1 where b=1 and a in (1,6,10,21) order by a;
|
||||
|
||||
# BUG#33061: ORDER BY DESC becomes ASC in NDB partition pruning to one partition
|
||||
INSERT into t1 values (1, 2, 2);
|
||||
select max(b) from t1 where a = 1;
|
||||
select b from t1 where a = 1 order by b desc;
|
||||
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
|
@ -246,16 +246,21 @@ select count(*)
|
||||
select * from t10_c order by a;
|
||||
# Bug #27775 cont'd
|
||||
# - auto inc info should be correct
|
||||
--replace_column 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 10 X 12 X 13 X 14 X 15 X 16 X 17 X 18 X
|
||||
show table status like 't1_c';
|
||||
--replace_column 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 10 X 12 X 13 X 14 X 15 X 16 X 17 X 18 X
|
||||
show table status like 't2_c';
|
||||
--replace_column 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 10 X 12 X 13 X 14 X 15 X 16 X 17 X 18 X
|
||||
show table status like 't4_c';
|
||||
--replace_column 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 10 X 12 X 13 X 14 X 15 X 16 X 17 X 18 X
|
||||
show table status like 't7_c';
|
||||
--replace_column 1 X 2 X 3 X 4 X 5 X 6 X 7 X 8 X 9 X 10 X 12 X 13 X 14 X 15 X 16 X 17 X 18 X
|
||||
show table status like 't10_c';
|
||||
select max(capgoaledatta) from t1_c;
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't1_c';
|
||||
select max(capgotod) from t2_c;
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't2_c';
|
||||
select max(capfa) from t4_c;
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't4_c';
|
||||
select max(dardtestard) from t7_c;
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't7_c';
|
||||
select max(a) from t10_c;
|
||||
select auto_increment from information_schema.tables
|
||||
where table_name = 't10_c';
|
||||
|
||||
#
|
||||
# Try Partitioned tables as well
|
||||
|
@ -440,23 +440,21 @@ f1 f2 f3 f4
|
||||
select * from t4 order by f1;
|
||||
f1 f2 f3 f4
|
||||
1 1 1 first
|
||||
select * from t31 order by f1;
|
||||
select * from t31 order by f3;
|
||||
f1 f2 f3 f4
|
||||
1 1 5 fifth
|
||||
1 1 3 third
|
||||
1 1 1 first
|
||||
1 1 6 sixth
|
||||
1 1 2 second
|
||||
1 1 3 third
|
||||
1 1 4 fourth
|
||||
1 1 5 fifth
|
||||
1 1 6 sixth
|
||||
|
||||
** Do updates master **
|
||||
|
||||
update t31 set f5=555555555555555 where f3=6;
|
||||
update t31 set f2=2 where f3=2;
|
||||
update t31 set f1=NULL where f3=1;
|
||||
update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
|
||||
Warnings:
|
||||
Warning 1048 Column 'f3' cannot be null
|
||||
update t31 set f3=0, f27=NULL, f35='f35 new value' where f3=3;
|
||||
|
||||
** Delete from Master **
|
||||
|
||||
@ -563,7 +561,7 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1534
|
||||
Last_Errno 1535
|
||||
Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos #
|
||||
@ -581,7 +579,7 @@ Seconds_Behind_Master #
|
||||
Master_SSL_Verify_Server_Cert No
|
||||
Last_IO_Errno #
|
||||
Last_IO_Error #
|
||||
Last_SQL_Errno 1534
|
||||
Last_SQL_Errno 1535
|
||||
Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
@ -638,7 +636,7 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1534
|
||||
Last_Errno 1535
|
||||
Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos #
|
||||
@ -656,7 +654,7 @@ Seconds_Behind_Master #
|
||||
Master_SSL_Verify_Server_Cert No
|
||||
Last_IO_Errno #
|
||||
Last_IO_Error #
|
||||
Last_SQL_Errno 1534
|
||||
Last_SQL_Errno 1535
|
||||
Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
@ -1581,23 +1579,21 @@ f1 f2 f3 f4
|
||||
select * from t4 order by f1;
|
||||
f1 f2 f3 f4
|
||||
1 1 1 first
|
||||
select * from t31 order by f1;
|
||||
select * from t31 order by f3;
|
||||
f1 f2 f3 f4
|
||||
1 1 5 fifth
|
||||
1 1 3 third
|
||||
1 1 1 first
|
||||
1 1 6 sixth
|
||||
1 1 2 second
|
||||
1 1 3 third
|
||||
1 1 4 fourth
|
||||
1 1 5 fifth
|
||||
1 1 6 sixth
|
||||
|
||||
** Do updates master **
|
||||
|
||||
update t31 set f5=555555555555555 where f3=6;
|
||||
update t31 set f2=2 where f3=2;
|
||||
update t31 set f1=NULL where f3=1;
|
||||
update t31 set f3=NULL, f27=NULL, f35='f35 new value' where f3=3;
|
||||
Warnings:
|
||||
Warning 1048 Column 'f3' cannot be null
|
||||
update t31 set f3=0, f27=NULL, f35='f35 new value' where f3=3;
|
||||
|
||||
** Delete from Master **
|
||||
|
||||
@ -1704,7 +1700,7 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1534
|
||||
Last_Errno 1535
|
||||
Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos #
|
||||
@ -1722,7 +1718,7 @@ Seconds_Behind_Master #
|
||||
Master_SSL_Verify_Server_Cert No
|
||||
Last_IO_Errno #
|
||||
Last_IO_Error #
|
||||
Last_SQL_Errno 1534
|
||||
Last_SQL_Errno 1535
|
||||
Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 5, test.t10 has type 254
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
||||
@ -1779,7 +1775,7 @@ Replicate_Do_Table
|
||||
Replicate_Ignore_Table
|
||||
Replicate_Wild_Do_Table
|
||||
Replicate_Wild_Ignore_Table
|
||||
Last_Errno 1534
|
||||
Last_Errno 1535
|
||||
Last_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
|
||||
Skip_Counter 0
|
||||
Exec_Master_Log_Pos #
|
||||
@ -1797,7 +1793,7 @@ Seconds_Behind_Master #
|
||||
Master_SSL_Verify_Server_Cert No
|
||||
Last_IO_Errno #
|
||||
Last_IO_Error #
|
||||
Last_SQL_Errno 1534
|
||||
Last_SQL_Errno 1535
|
||||
Last_SQL_Error Table definition on master and slave does not match: Column 2 type mismatch - received type 252, test.t11 has type 15
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=2;
|
||||
START SLAVE;
|
@ -20,13 +20,27 @@ from mysql.ndb_apply_status;
|
||||
@log_name:=log_name @start_pos:=start_pos @end_pos:=end_pos
|
||||
<log_name> <start_pos> <end_pos>
|
||||
|
||||
# Now check that that is in the apply_status table is consistant
|
||||
# with what is in the binlog
|
||||
|
||||
# since insert is done with transactional engine, expect a BEGIN
|
||||
# at <start_pos>
|
||||
|
||||
show binlog events from <start_pos> limit 1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 <start_pos> Query 1 # use `test`; insert into t1 values (1,2)
|
||||
master-bin.000001 <start_pos> Query 1 # use `test`; BEGIN
|
||||
|
||||
# Now the insert, one step after
|
||||
|
||||
show binlog events from <start_pos> limit 1,1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Xid 1 445 COMMIT /* XID */
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (1,2)
|
||||
|
||||
# and the COMMIT should be at <end_pos>
|
||||
|
||||
show binlog events from <start_pos> limit 2,1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Xid 1 <end_pos> COMMIT /* XID */
|
||||
|
||||
begin;
|
||||
insert into t1 values (2,3);
|
@ -15,3 +15,6 @@ ndb_autodiscover2 : BUG#18952 2006-02-16 jmiller Needs to be fixed w.r.t
|
||||
# the below testcase have been reworked to avoid the bug, test contains comment, keep bug open
|
||||
#ndb_autodiscover3 : bug#21806
|
||||
#ndb_autodiscover3 : Bug#20872 2007-07-15 ingo master*.err: miscellaneous error messages
|
||||
#rpl_ndb_extraColMaster : BUG#30854 : Tables name show as binary in slave err msg on vm-win2003-64-b and Solaris
|
||||
#rpl_ndb_mix_innodb : Bug #32720 Test rpl_ndb_mix_innodb fails on SPARC and PowerPC
|
||||
#rpl_ndb_dd_advance : Bug #30222 rpl_ndb_dd_advance.test fails
|
||||
|
@ -4,7 +4,14 @@ reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET storage_engine=ndb;
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=INNODB;
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--- Start test 1 Basic testing ---
|
||||
@ -27,7 +34,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Show table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -100,7 +107,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY ()
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -186,7 +193,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster) */
|
||||
--- Show table on slave --
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -200,7 +207,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (1946) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (1966) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (1986) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (2005) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (1946) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (1966) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (1986) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (2005) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -258,7 +265,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster) */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -274,7 +281,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (1946) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (1966) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (1986) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (2005) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = InnoDB, PARTITION p1 VALUES LESS THAN (1946) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (1966) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (1986) ENGINE = InnoDB, PARTITION p4 VALUES LESS THAN (2005) ENGINE = InnoDB, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -299,11 +306,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -342,7 +349,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster) */
|
||||
--- Show table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -356,7 +363,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = InnoDB, PARTITION p1 VALUES IN (42,142) ENGINE = InnoDB, PARTITION p2 VALUES IN (412) ENGINE = InnoDB)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = InnoDB, PARTITION p1 VALUES IN (42,142) ENGINE = InnoDB, PARTITION p2 VALUES IN (412) ENGINE = InnoDB) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -414,7 +421,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster) */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -430,7 +437,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = InnoDB, PARTITION p1 VALUES IN (42,142) ENGINE = InnoDB, PARTITION p2 VALUES IN (412) ENGINE = InnoDB)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = InnoDB, PARTITION p1 VALUES IN (42,142) ENGINE = InnoDB, PARTITION p2 VALUES IN (412) ENGINE = InnoDB) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -495,7 +502,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
@ -508,7 +515,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -533,11 +540,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -566,7 +573,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -582,7 +589,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -607,11 +614,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -648,7 +655,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Show that tables on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -663,7 +670,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -720,7 +727,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still right type ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -736,7 +743,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -793,7 +800,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -809,7 +816,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -853,3 +860,4 @@ DELETE FROM t1;
|
||||
--- End test 5 key partition testing ---
|
||||
--- Do Cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
@ -4,7 +4,14 @@ reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET storage_engine=ndb;
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=MYISAM;
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--- Start test 1 Basic testing ---
|
||||
@ -186,7 +193,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster) */
|
||||
--- Show table on slave --
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -200,7 +207,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -258,7 +265,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = ndbcluster, PARTITION p1 VALUES LESS THAN (1946) ENGINE = ndbcluster, PARTITION p2 VALUES LESS THAN (1966) ENGINE = ndbcluster, PARTITION p3 VALUES LESS THAN (1986) ENGINE = ndbcluster, PARTITION p4 VALUES LESS THAN (2005) ENGINE = ndbcluster, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = ndbcluster) */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -274,7 +281,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(t)) (PARTITION p0 VALUES LESS THAN (1901) ENGINE = MyISAM, PARTITION p1 VALUES LESS THAN (1946) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (1966) ENGINE = MyISAM, PARTITION p3 VALUES LESS THAN (1986) ENGINE = MyISAM, PARTITION p4 VALUES LESS THAN (2005) ENGINE = MyISAM, PARTITION p5 VALUES LESS THAN MAXVALUE ENGINE = MyISAM) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -299,11 +306,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -342,7 +349,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster) */
|
||||
--- Show table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -356,7 +363,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, PARTITION p2 VALUES IN (412) ENGINE = MyISAM)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, PARTITION p2 VALUES IN (412) ENGINE = MyISAM) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -414,7 +421,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = ndbcluster, PARTITION p1 VALUES IN (42,142) ENGINE = ndbcluster, PARTITION p2 VALUES IN (412) ENGINE = ndbcluster) */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -430,7 +437,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, PARTITION p2 VALUES IN (412) ENGINE = MyISAM)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY LIST (id) (PARTITION p0 VALUES IN (2,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (42,142) ENGINE = MyISAM, PARTITION p2 VALUES IN (412) ENGINE = MyISAM) */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -495,7 +502,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
@ -508,7 +515,7 @@ t1 CREATE TABLE `t1` (
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -533,11 +540,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -566,7 +573,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -582,7 +589,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date NOT NULL DEFAULT '0000-00-00',
|
||||
PRIMARY KEY (`t`,`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH ( YEAR(t)) PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -607,11 +614,11 @@ UPDATE t1 SET b1 = 0, t="2006-02-22" WHERE id = 412;
|
||||
--- Check the update on master ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT id,hex(b1),vc,bc,d,f,total,y,t FROM t1 WHERE id = 412;
|
||||
id hex(b1) vc bc d f total y t
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
412 0 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 42;
|
||||
--- Show current count on master for t1 ---
|
||||
@ -648,7 +655,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Show that tables on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
@ -663,7 +670,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -720,7 +727,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still right type ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -736,7 +743,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -793,7 +800,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
@ -809,7 +816,7 @@ t1 CREATE TABLE `t1` (
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PARTITION BY KEY () PARTITIONS 4
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY KEY () PARTITIONS 4 */
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
"--- Insert into t1 --" as "";
|
||||
@ -853,3 +860,4 @@ DELETE FROM t1;
|
||||
--- End test 5 key partition testing ---
|
||||
--- Do Cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
400
mysql-test/suite/rpl_ndb/r/rpl_ndb_2ndb.result
Normal file
400
mysql-test/suite/rpl_ndb/r/rpl_ndb_2ndb.result
Normal file
@ -0,0 +1,400 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET storage_engine=ndb;
|
||||
|
||||
=== NDB -> NDB ===
|
||||
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--- Create Table Section ---
|
||||
CREATE TABLE t1 (id MEDIUMINT NOT NULL,
|
||||
b1 INT,
|
||||
vc VARCHAR(255),
|
||||
bc CHAR(255),
|
||||
d DECIMAL(10,4) DEFAULT 0,
|
||||
f FLOAT DEFAULT 0,
|
||||
total BIGINT UNSIGNED,
|
||||
y YEAR,
|
||||
t DATE,
|
||||
PRIMARY KEY(id));
|
||||
--- Show table on master ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` varchar(255) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Show table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` varchar(255) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that simple Alter statements are replicated correctly --
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
ALTER TABLE t1 MODIFY vc char(32);
|
||||
--- Show the new improved table on the master ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` char(32) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` char(32) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that replication works when slave has more columns than master
|
||||
ALTER TABLE t1 ADD PRIMARY KEY(id,total);
|
||||
ALTER TABLE t1 MODIFY vc TEXT;
|
||||
INSERT INTO t1 VALUES(3,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1905-11-14");
|
||||
INSERT INTO t1 VALUES(20,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1965-11-14");
|
||||
INSERT INTO t1 VALUES(50,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1985-11-14");
|
||||
--- Add columns on slave ---
|
||||
ALTER TABLE t1 ADD (u int, v char(16) default 'default');
|
||||
UPDATE t1 SET u=7 WHERE id < 50;
|
||||
UPDATE t1 SET v='explicit' WHERE id >10;
|
||||
--- Show changed table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` text,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
`u` int(11) DEFAULT NULL,
|
||||
`v` char(16) DEFAULT 'default',
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
SELECT *
|
||||
FROM t1
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t u v
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 7 default
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 7 explicit
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL explicit
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t u v
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 NULL NULL
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 7 default
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL NULL
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 7 explicit
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 NULL NULL
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL explicit
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14 NULL NULL
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14 NULL NULL
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
3 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
20 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
50 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t u v
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL NULL
|
||||
3 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 7 default
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL NULL
|
||||
20 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 7 explicit
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL NULL
|
||||
50 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL explicit
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
7
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
7
|
||||
TRUNCATE TABLE t1;
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that replication works when master has more columns than slave
|
||||
--- Remove columns on slave ---
|
||||
ALTER TABLE t1 DROP COLUMN v;
|
||||
ALTER TABLE t1 DROP COLUMN u;
|
||||
ALTER TABLE t1 DROP COLUMN t;
|
||||
ALTER TABLE t1 DROP COLUMN y;
|
||||
--- Show changed table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` text,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
TRUNCATE TABLE t1;
|
||||
--- Do Cleanup --
|
||||
DROP TABLE IF EXISTS t1;
|
@ -8,6 +8,14 @@ SET storage_engine=ndb;
|
||||
|
||||
=== NDB -> MYISAM ===
|
||||
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=MYISAM;
|
||||
SET storage_engine=myisam;
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
@ -402,6 +410,7 @@ DROP TABLE IF EXISTS t1;
|
||||
|
||||
=== NDB -> INNODB ===
|
||||
|
||||
alter table mysql.ndb_apply_status engine=innodb;
|
||||
SET storage_engine=innodb;
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
@ -793,397 +802,4 @@ TRUNCATE TABLE t1;
|
||||
TRUNCATE TABLE t1;
|
||||
--- Do Cleanup --
|
||||
DROP TABLE IF EXISTS t1;
|
||||
|
||||
=== NDB -> NDB ===
|
||||
|
||||
SET storage_engine=ndb;
|
||||
--- Doing pre test cleanup ---
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--- Create Table Section ---
|
||||
CREATE TABLE t1 (id MEDIUMINT NOT NULL,
|
||||
b1 INT,
|
||||
vc VARCHAR(255),
|
||||
bc CHAR(255),
|
||||
d DECIMAL(10,4) DEFAULT 0,
|
||||
f FLOAT DEFAULT 0,
|
||||
total BIGINT UNSIGNED,
|
||||
y YEAR,
|
||||
t DATE,
|
||||
PRIMARY KEY(id));
|
||||
--- Show table on master ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` varchar(255) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Show table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` varchar(255) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that simple Alter statements are replicated correctly --
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
ALTER TABLE t1 MODIFY vc char(32);
|
||||
--- Show the new improved table on the master ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` char(32) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
|
||||
--- Make sure that our tables on slave are still same engine ---
|
||||
--- and that the alter statements replicated correctly ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` char(32) DEFAULT NULL,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned DEFAULT NULL,
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a coo Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a coo updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that replication works when slave has more columns than master
|
||||
ALTER TABLE t1 ADD PRIMARY KEY(id,total);
|
||||
ALTER TABLE t1 MODIFY vc TEXT;
|
||||
INSERT INTO t1 VALUES(3,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1905-11-14");
|
||||
INSERT INTO t1 VALUES(20,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1965-11-14");
|
||||
INSERT INTO t1 VALUES(50,1,'Testing MySQL databases is a cool ',
|
||||
'Must make it bug free for the customer',
|
||||
654321.4321,15.21,0,1965,"1985-11-14");
|
||||
--- Add columns on slave ---
|
||||
ALTER TABLE t1 ADD (u int, v char(16) default 'default');
|
||||
UPDATE t1 SET u=7 WHERE id < 50;
|
||||
UPDATE t1 SET v='explicit' WHERE id >10;
|
||||
--- Show changed table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` text,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
`y` year(4) DEFAULT NULL,
|
||||
`t` date DEFAULT NULL,
|
||||
`u` int(11) DEFAULT NULL,
|
||||
`v` char(16) DEFAULT 'default',
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
SELECT *
|
||||
FROM t1
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t u v
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 7 default
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 7 explicit
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL explicit
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t u v
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 NULL default
|
||||
3 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 7 default
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL default
|
||||
20 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14 7 explicit
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14 NULL default
|
||||
50 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14 NULL explicit
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14 NULL default
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14 NULL default
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
3 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
20 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
50 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t u v
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL default
|
||||
3 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 7 default
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL default
|
||||
20 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 7 explicit
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL default
|
||||
50 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22 NULL explicit
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
7
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
7
|
||||
TRUNCATE TABLE t1;
|
||||
TRUNCATE TABLE t1;
|
||||
--- Check that replication works when master has more columns than slave
|
||||
--- Remove columns on slave ---
|
||||
ALTER TABLE t1 DROP COLUMN v;
|
||||
ALTER TABLE t1 DROP COLUMN u;
|
||||
ALTER TABLE t1 DROP COLUMN t;
|
||||
ALTER TABLE t1 DROP COLUMN y;
|
||||
--- Show changed table on slave ---
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`id` mediumint(9) NOT NULL,
|
||||
`b1` int(11) DEFAULT NULL,
|
||||
`vc` text,
|
||||
`bc` char(255) DEFAULT NULL,
|
||||
`d` decimal(10,4) DEFAULT '0.0000',
|
||||
`f` float DEFAULT '0',
|
||||
`total` bigint(20) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`,`total`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
START SLAVE;
|
||||
--- Populate t1 with data ---
|
||||
--- Select from t1 on master ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total y t
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1965-11-14
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1985-11-14
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1905-11-14
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 1995-11-14
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0 1965 2005-11-14
|
||||
--- Select from t1 on slave ---
|
||||
select *
|
||||
from t1
|
||||
order by id;
|
||||
id b1 vc bc d f total
|
||||
2 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
4 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
42 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
142 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
412 1 Testing MySQL databases is a cool Must make it bug free for the customer 654321.4321 15.21 0
|
||||
--- Perform basic operation on master ---
|
||||
--- and ensure replicated correctly ---
|
||||
--- Update t1 on master --
|
||||
UPDATE t1 SET b1 = 0, bc='updated', t="2006-02-22"
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
--- Check the update on master ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total y t
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0 1965 2006-02-22
|
||||
--- Check Update on slave ---
|
||||
SELECT *
|
||||
FROM t1
|
||||
WHERE id < 100
|
||||
ORDER BY id;
|
||||
id b1 vc bc d f total
|
||||
2 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
4 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
42 0 Testing MySQL databases is a cool updated 654321.4321 15.21 0
|
||||
--- Remove a record from t1 on master ---
|
||||
DELETE FROM t1 WHERE id = 412;
|
||||
--- Show current count on master for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
--- Show current count on slave for t1 ---
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
TRUNCATE TABLE t1;
|
||||
TRUNCATE TABLE t1;
|
||||
--- Do Cleanup --
|
||||
DROP TABLE IF EXISTS t1;
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
20
mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result
Normal file
20
mysql-test/suite/rpl_ndb/r/rpl_ndb_apply_status.result
Normal file
@ -0,0 +1,20 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
*** on slave there should be zero rows ***
|
||||
select count(*) from mysql.ndb_apply_status;
|
||||
count(*)
|
||||
0
|
||||
create table t1 (a int key, b int) engine ndb;
|
||||
insert into t1 values (1,1);
|
||||
*** on master it should be empty ***
|
||||
select * from mysql.ndb_apply_status;
|
||||
server_id epoch log_name start_pos end_pos
|
||||
*** on slave there should be one row ***
|
||||
select count(*) from mysql.ndb_apply_status;
|
||||
count(*)
|
||||
1
|
||||
drop table t1;
|
@ -20,13 +20,27 @@ from mysql.ndb_apply_status;
|
||||
@log_name:=log_name @start_pos:=start_pos @end_pos:=end_pos
|
||||
<log_name> <start_pos> <end_pos>
|
||||
|
||||
# Now check that that is in the apply_status table is consistant
|
||||
# with what is in the binlog
|
||||
|
||||
# since insert is done with transactional engine, expect a BEGIN
|
||||
# at <start_pos>
|
||||
|
||||
show binlog events from <start_pos> limit 1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 <start_pos> Query 1 # use `test`; BEGIN
|
||||
|
||||
# Now the insert, one step after
|
||||
|
||||
show binlog events from <start_pos> limit 1,1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 486 use `test`; insert into t1 values (1,2)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (1,2)
|
||||
|
||||
# and the COMMIT should be at <end_pos>
|
||||
|
||||
show binlog events from <start_pos> limit 2,1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Xid 1 <end_pos> COMMIT /* XID */
|
||||
|
||||
begin;
|
||||
insert into t1 values (2,3);
|
||||
|
@ -11,17 +11,5 @@
|
||||
##############################################################################
|
||||
|
||||
|
||||
rpl_ndb_2innodb : Bug #32648 Test failure between NDB Cluster and other engines
|
||||
rpl_ndb_2myisam : Bug #32648 Test failure between NDB Cluster and other engines
|
||||
rpl_ndb_2other : Bug #32648 Test failure between NDB Cluster and other engines
|
||||
rpl_ndb_extraColMaster : BUG#30854 : Tables name show as binary in slave err msg on vm-win2003-64-b and Solaris
|
||||
rpl_ndb_mix_innodb : Bug #32720 Test rpl_ndb_mix_innodb fails on SPARC and PowerPC
|
||||
|
||||
# the below testcase have been reworked to avoid the bug, test contains comment, keep bug open
|
||||
|
||||
#rpl_ndb_dd_advance : Bug#25913 rpl_ndb_dd_advance fails randomly
|
||||
|
||||
|
||||
rpl_ndb_innodb_trans : Bug#34454: Some test cases from the 'rpl_ndb' suite fail
|
||||
rpl_ndb_charset : Bug#34454: Some test cases from the 'rpl_ndb' suite fail
|
||||
rpl_ndb_multi : Bug#34454: Some test cases from the 'rpl_ndb' suite fail
|
||||
|
@ -1 +1 @@
|
||||
--default-storage-engine=ndbcluster
|
||||
--new --default-storage-engine=ndbcluster
|
||||
|
@ -1 +1 @@
|
||||
--innodb --default-storage-engine=innodb
|
||||
--innodb --default-storage-engine=innodb --ndbcluster=0
|
||||
|
@ -8,9 +8,20 @@
|
||||
# test and to have control over the tests.
|
||||
##############################################################
|
||||
-- source include/have_ndb.inc
|
||||
-- source include/ndb_master-slave.inc
|
||||
connection slave;
|
||||
-- source include/master-slave.inc
|
||||
|
||||
-- connection slave
|
||||
-- source include/have_innodb.inc
|
||||
connection master;
|
||||
SET storage_engine=ndb;
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=INNODB;
|
||||
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_eng.test
|
||||
|
||||
--connection slave
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
@ -1 +1 @@
|
||||
--default-storage-engine=ndbcluster
|
||||
--new --default-storage-engine=ndbcluster
|
||||
|
@ -1 +1 @@
|
||||
--default-storage-engine=myisam
|
||||
--default-storage-engine=myisam --ndbcluster=0
|
||||
|
@ -8,6 +8,19 @@
|
||||
# test and to have control over the tests.
|
||||
##############################################################
|
||||
-- source include/have_ndb.inc
|
||||
-- source include/ndb_master-slave.inc
|
||||
SET storage_engine=ndb;
|
||||
-- source include/master-slave.inc
|
||||
|
||||
-- connection slave
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=MYISAM;
|
||||
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_eng.test
|
||||
|
||||
--connection slave
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
1
mysql-test/suite/rpl_ndb/t/rpl_ndb_2ndb-slave.opt
Normal file
1
mysql-test/suite/rpl_ndb/t/rpl_ndb_2ndb-slave.opt
Normal file
@ -0,0 +1 @@
|
||||
--default-storage-engine=ndbcluster --log-slave-updates=0
|
18
mysql-test/suite/rpl_ndb/t/rpl_ndb_2ndb.test
Normal file
18
mysql-test/suite/rpl_ndb/t/rpl_ndb_2ndb.test
Normal file
@ -0,0 +1,18 @@
|
||||
#############################################################
|
||||
# Author: Rafal Somla
|
||||
# Date: 2006-08-20
|
||||
# Purpose: Trying to test ability to replicate from cluster
|
||||
# to other engines (innodb, myisam), see also rpl_ndb_2other.test
|
||||
##############################################################
|
||||
--source include/have_binlog_format_mixed_or_row.inc
|
||||
--source include/ndb_master-slave.inc
|
||||
|
||||
# On master use NDB as storage engine.
|
||||
connection master;
|
||||
SET storage_engine=ndb;
|
||||
|
||||
--echo
|
||||
--echo === NDB -> NDB ===
|
||||
--echo
|
||||
connection slave;
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_basic.test
|
@ -1 +1 @@
|
||||
--innodb --log-slave-updates=0
|
||||
--innodb --ndbcluster=0 --log-slave-updates=0
|
||||
|
@ -7,7 +7,7 @@
|
||||
--source include/have_ndb.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_binlog_format_mixed_or_row.inc
|
||||
--source include/ndb_master-slave.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
# On master use NDB as storage engine.
|
||||
connection master;
|
||||
@ -17,6 +17,14 @@ SET storage_engine=ndb;
|
||||
--echo === NDB -> MYISAM ===
|
||||
--echo
|
||||
connection slave;
|
||||
set @@global.slave_exec_mode= 'IDEMPOTENT';
|
||||
CREATE TABLE mysql.ndb_apply_status
|
||||
( server_id INT UNSIGNED NOT NULL,
|
||||
epoch BIGINT UNSIGNED NOT NULL,
|
||||
log_name VARCHAR(255) BINARY NOT NULL,
|
||||
start_pos BIGINT UNSIGNED NOT NULL,
|
||||
end_pos BIGINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY USING HASH (server_id)) ENGINE=MYISAM;
|
||||
SET storage_engine=myisam;
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_basic.test
|
||||
|
||||
@ -24,12 +32,9 @@ SET storage_engine=myisam;
|
||||
--echo === NDB -> INNODB ===
|
||||
--echo
|
||||
connection slave;
|
||||
alter table mysql.ndb_apply_status engine=innodb;
|
||||
SET storage_engine=innodb;
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_basic.test
|
||||
|
||||
--echo
|
||||
--echo === NDB -> NDB ===
|
||||
--echo
|
||||
connection slave;
|
||||
SET storage_engine=ndb;
|
||||
--source extra/rpl_tests/rpl_ndb_2multi_basic.test
|
||||
drop table mysql.ndb_apply_status;
|
||||
|
@ -0,0 +1 @@
|
||||
--replicate_ignore_db=mysql
|
26
mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test
Normal file
26
mysql-test/suite/rpl_ndb/t/rpl_ndb_apply_status.test
Normal file
@ -0,0 +1,26 @@
|
||||
-- source include/have_ndb.inc
|
||||
-- source include/have_binlog_format_row.inc
|
||||
-- source include/ndb_master-slave.inc
|
||||
|
||||
#
|
||||
# Bug#28170 replicate-ignore-db=mysql should not ignore mysql.ndb_apply_status
|
||||
#
|
||||
# Slave is started with --replicate-ignore-db=mysql
|
||||
#
|
||||
sync_slave_with_master;
|
||||
echo *** on slave there should be zero rows ***;
|
||||
select count(*) from mysql.ndb_apply_status;
|
||||
|
||||
connection master;
|
||||
create table t1 (a int key, b int) engine ndb;
|
||||
insert into t1 values (1,1);
|
||||
echo *** on master it should be empty ***;
|
||||
select * from mysql.ndb_apply_status;
|
||||
|
||||
sync_slave_with_master;
|
||||
echo *** on slave there should be one row ***;
|
||||
select count(*) from mysql.ndb_apply_status;
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
sync_slave_with_master;
|
@ -56,15 +56,12 @@ DELETE FROM t1 WHERE c3 = 2;
|
||||
|
||||
SELECT * FROM t1 ORDER BY c3;
|
||||
|
||||
save_master_pos;
|
||||
|
||||
# insert another row, and check that we have it on the slave
|
||||
connection server2;
|
||||
INSERT INTO t1 VALUES ("row5","E",5);
|
||||
SELECT * FROM t1 ORDER BY c3;
|
||||
#sync_slave_with_master;
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
--sleep 2
|
||||
SELECT * FROM t1 ORDER BY c3;
|
||||
|
||||
STOP SLAVE;
|
||||
|
@ -10,6 +10,8 @@
|
||||
|
||||
# Storage engine to be used in CREATE TABLE
|
||||
--source include/have_ndb.inc
|
||||
connection default;
|
||||
|
||||
let $engine_type= NDB;
|
||||
|
||||
|
||||
|
@ -246,6 +246,12 @@ insert into t1 values (-1), (-2);
|
||||
select min(a) from t1 group by inet_ntoa(a);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#34289 - Incorrect NAME_CONST substitution in stored procedures breaks
|
||||
# replication
|
||||
#
|
||||
SELECT NAME_CONST('var', 'value') COLLATE latin1_general_cs;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
|
@ -495,3 +495,16 @@
|
||||
fun:_db_enter_
|
||||
fun:kill_server
|
||||
}
|
||||
|
||||
#
|
||||
# Warning caused by small memory leak in threaded dlopen
|
||||
#
|
||||
|
||||
{
|
||||
dlopen threaded memory leak
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
obj:*/libdl-*.so
|
||||
fun:dlopen*
|
||||
}
|
||||
|
||||
|
@ -316,6 +316,10 @@ int execute_no_commit_ie(ha_ndbcluster *h, NdbTransaction *trans,
|
||||
/*
|
||||
Place holder for ha_ndbcluster thread specific data
|
||||
*/
|
||||
typedef struct st_thd_ndb_share {
|
||||
const void *key;
|
||||
struct Ndb_local_table_statistics stat;
|
||||
} THD_NDB_SHARE;
|
||||
static
|
||||
uchar *thd_ndb_share_get_key(THD_NDB_SHARE *thd_ndb_share, size_t *length,
|
||||
my_bool not_used __attribute__((unused)))
|
||||
@ -372,41 +376,6 @@ Thd_ndb::init_open_tables()
|
||||
my_hash_reset(&open_tables);
|
||||
}
|
||||
|
||||
THD_NDB_SHARE *
|
||||
Thd_ndb::get_open_table(THD *thd, const void *key)
|
||||
{
|
||||
DBUG_ENTER("Thd_ndb::get_open_table");
|
||||
HASH_SEARCH_STATE state;
|
||||
THD_NDB_SHARE *thd_ndb_share=
|
||||
(THD_NDB_SHARE*)hash_first(&open_tables, (uchar *)&key, sizeof(key), &state);
|
||||
while (thd_ndb_share && thd_ndb_share->key != key)
|
||||
thd_ndb_share= (THD_NDB_SHARE*)hash_next(&open_tables, (uchar *)&key, sizeof(key), &state);
|
||||
if (thd_ndb_share == 0)
|
||||
{
|
||||
thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
|
||||
sizeof(THD_NDB_SHARE));
|
||||
if (!thd_ndb_share)
|
||||
{
|
||||
mem_alloc_error(sizeof(THD_NDB_SHARE));
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
thd_ndb_share->key= key;
|
||||
thd_ndb_share->stat.last_count= count;
|
||||
thd_ndb_share->stat.no_uncommitted_rows_count= 0;
|
||||
thd_ndb_share->stat.records= ~(ha_rows)0;
|
||||
my_hash_insert(&open_tables, (uchar *)thd_ndb_share);
|
||||
}
|
||||
else if (thd_ndb_share->stat.last_count != count)
|
||||
{
|
||||
thd_ndb_share->stat.last_count= count;
|
||||
thd_ndb_share->stat.no_uncommitted_rows_count= 0;
|
||||
thd_ndb_share->stat.records= ~(ha_rows)0;
|
||||
}
|
||||
DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx key: 0x%lx",
|
||||
(long) thd_ndb_share, (long) key));
|
||||
DBUG_RETURN(thd_ndb_share);
|
||||
}
|
||||
|
||||
inline
|
||||
Ndb *ha_ndbcluster::get_ndb()
|
||||
{
|
||||
@ -2742,10 +2711,13 @@ ha_ndbcluster::set_auto_inc(Field *field)
|
||||
("Trying to set next auto increment value to %s",
|
||||
llstr(next_val, buff)));
|
||||
#endif
|
||||
Ndb_tuple_id_range_guard g(m_share);
|
||||
if (ndb->setAutoIncrementValue(m_table, g.range, next_val, TRUE)
|
||||
== -1)
|
||||
ERR_RETURN(ndb->getNdbError());
|
||||
if (ndb->checkUpdateAutoIncrementValue(m_share->tuple_id_range, next_val))
|
||||
{
|
||||
Ndb_tuple_id_range_guard g(m_share);
|
||||
if (ndb->setAutoIncrementValue(m_table, g.range, next_val, TRUE)
|
||||
== -1)
|
||||
ERR_RETURN(ndb->getNdbError());
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -4554,12 +4526,48 @@ int ha_ndbcluster::init_handler_for_statement(THD *thd, Thd_ndb *thd_ndb)
|
||||
thd_ndb->trans_options|= TNTO_INJECTED_APPLY_STATUS;
|
||||
}
|
||||
#endif
|
||||
// TODO remove double pointers...
|
||||
if (!(m_thd_ndb_share= thd_ndb->get_open_table(thd, m_table)))
|
||||
|
||||
if (thd->options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
const void *key= m_table;
|
||||
HASH_SEARCH_STATE state;
|
||||
THD_NDB_SHARE *thd_ndb_share=
|
||||
(THD_NDB_SHARE*)hash_first(&thd_ndb->open_tables, (uchar *)&key, sizeof(key), &state);
|
||||
while (thd_ndb_share && thd_ndb_share->key != key)
|
||||
thd_ndb_share= (THD_NDB_SHARE*)hash_next(&thd_ndb->open_tables, (uchar *)&key, sizeof(key), &state);
|
||||
if (thd_ndb_share == 0)
|
||||
{
|
||||
thd_ndb_share= (THD_NDB_SHARE *) alloc_root(&thd->transaction.mem_root,
|
||||
sizeof(THD_NDB_SHARE));
|
||||
if (!thd_ndb_share)
|
||||
{
|
||||
mem_alloc_error(sizeof(THD_NDB_SHARE));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
thd_ndb_share->key= key;
|
||||
thd_ndb_share->stat.last_count= thd_ndb->count;
|
||||
thd_ndb_share->stat.no_uncommitted_rows_count= 0;
|
||||
thd_ndb_share->stat.records= ~(ha_rows)0;
|
||||
my_hash_insert(&thd_ndb->open_tables, (uchar *)thd_ndb_share);
|
||||
}
|
||||
else if (thd_ndb_share->stat.last_count != thd_ndb->count)
|
||||
{
|
||||
thd_ndb_share->stat.last_count= thd_ndb->count;
|
||||
thd_ndb_share->stat.no_uncommitted_rows_count= 0;
|
||||
thd_ndb_share->stat.records= ~(ha_rows)0;
|
||||
}
|
||||
DBUG_PRINT("exit", ("thd_ndb_share: 0x%lx key: 0x%lx",
|
||||
(long) thd_ndb_share, (long) key));
|
||||
m_table_info= &thd_ndb_share->stat;
|
||||
}
|
||||
else
|
||||
{
|
||||
struct Ndb_local_table_statistics &stat= m_table_info_instance;
|
||||
stat.last_count= thd_ndb->count;
|
||||
stat.no_uncommitted_rows_count= 0;
|
||||
stat.records= ~(ha_rows)0;
|
||||
m_table_info= &stat;
|
||||
}
|
||||
m_table_info= &m_thd_ndb_share->stat;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -195,11 +195,6 @@ struct Ndb_local_table_statistics {
|
||||
ha_rows records;
|
||||
};
|
||||
|
||||
typedef struct st_thd_ndb_share {
|
||||
const void *key;
|
||||
struct Ndb_local_table_statistics stat;
|
||||
} THD_NDB_SHARE;
|
||||
|
||||
class Thd_ndb
|
||||
{
|
||||
public:
|
||||
@ -207,7 +202,6 @@ class Thd_ndb
|
||||
~Thd_ndb();
|
||||
|
||||
void init_open_tables();
|
||||
THD_NDB_SHARE *get_open_table(THD *thd, const void *key);
|
||||
|
||||
Ndb *ndb;
|
||||
ulong count;
|
||||
@ -514,6 +508,7 @@ private:
|
||||
NdbScanOperation *m_active_cursor;
|
||||
const NdbDictionary::Table *m_table;
|
||||
struct Ndb_local_table_statistics *m_table_info;
|
||||
struct Ndb_local_table_statistics m_table_info_instance;
|
||||
char m_dbname[FN_HEADLEN];
|
||||
//char m_schemaname[FN_HEADLEN];
|
||||
char m_tabname[FN_HEADLEN];
|
||||
@ -522,7 +517,6 @@ private:
|
||||
bool m_lock_tuple;
|
||||
NDB_SHARE *m_share;
|
||||
NDB_INDEX_DATA m_index[MAX_KEY];
|
||||
THD_NDB_SHARE *m_thd_ndb_share;
|
||||
// NdbRecAttr has no reference to blob
|
||||
NdbValue m_value[NDB_MAX_ATTRIBUTES_IN_TABLE];
|
||||
uchar m_ref[NDB_HIDDEN_PRIMARY_KEY_LENGTH];
|
||||
|
@ -683,6 +683,18 @@ static void ndbcluster_reset_slave(THD *thd)
|
||||
/*
|
||||
Initialize the binlog part of the ndb handlerton
|
||||
*/
|
||||
|
||||
/**
|
||||
Upon the sql command flush logs, we need to ensure that all outstanding
|
||||
ndb data to be logged has made it to the binary log to get a deterministic
|
||||
behavior on the rotation of the log.
|
||||
*/
|
||||
static bool ndbcluster_flush_logs(handlerton *hton)
|
||||
{
|
||||
ndbcluster_binlog_wait(current_thd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int ndbcluster_binlog_func(handlerton *hton, THD *thd,
|
||||
enum_binlog_func fn,
|
||||
void *arg)
|
||||
@ -711,6 +723,7 @@ static int ndbcluster_binlog_func(handlerton *hton, THD *thd,
|
||||
void ndbcluster_binlog_init_handlerton()
|
||||
{
|
||||
handlerton *h= ndbcluster_hton;
|
||||
h->flush_logs= ndbcluster_flush_logs;
|
||||
h->binlog_func= ndbcluster_binlog_func;
|
||||
h->binlog_log_query= ndbcluster_binlog_log_query;
|
||||
}
|
||||
|
@ -4034,6 +4034,8 @@ int handler::ha_reset()
|
||||
DBUG_ASSERT(inited == NONE);
|
||||
/* Free cache used by filesort */
|
||||
free_io_cache(table);
|
||||
/* reset the bitmaps to point to defaults */
|
||||
table->default_column_bitmaps();
|
||||
DBUG_RETURN(reset());
|
||||
}
|
||||
|
||||
|
@ -1269,6 +1269,7 @@ bool Item_name_const::fix_fields(THD *thd, Item **ref)
|
||||
return TRUE;
|
||||
}
|
||||
set_name(item_name->ptr(), (uint) item_name->length(), system_charset_info);
|
||||
collation.set(value_item->collation.collation, DERIVATION_IMPLICIT);
|
||||
max_length= value_item->max_length;
|
||||
decimals= value_item->decimals;
|
||||
fixed= 1;
|
||||
|
@ -8104,7 +8104,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
{
|
||||
DBUG_PRINT("info",("ha_index_init returns error %d",error));
|
||||
table->file->print_error(error, MYF(0));
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Fill key data for the row */
|
||||
@ -8137,7 +8137,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
DBUG_PRINT("info",("no record matching the key found in the table"));
|
||||
table->file->print_error(error, MYF(0));
|
||||
table->file->ha_index_end();
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -8165,7 +8165,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
if (table->key_info->flags & HA_NOSAME)
|
||||
{
|
||||
table->file->ha_index_end();
|
||||
DBUG_RETURN(0);
|
||||
goto ok;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -8197,7 +8197,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
DBUG_PRINT("info",("no record matching the given row found"));
|
||||
table->file->print_error(error, MYF(0));
|
||||
table->file->ha_index_end();
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
@ -8218,7 +8218,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
DBUG_PRINT("info",("error initializing table scan"
|
||||
" (ha_rnd_init returns %d)",error));
|
||||
table->file->print_error(error, MYF(0));
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Continue until we find the right record or have made a full loop */
|
||||
@ -8242,7 +8242,7 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
" (rnd_next returns %d)",error));
|
||||
table->file->print_error(error, MYF(0));
|
||||
table->file->ha_rnd_end();
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
while (restart_count < 2 && record_compare(table));
|
||||
@ -8262,10 +8262,14 @@ int Rows_log_event::find_row(const Relay_log_info *rli)
|
||||
table->file->ha_rnd_end();
|
||||
|
||||
DBUG_ASSERT(error == HA_ERR_END_OF_FILE || error == HA_ERR_RECORD_DELETED || error == 0);
|
||||
DBUG_RETURN(error);
|
||||
goto err;
|
||||
}
|
||||
|
||||
ok:
|
||||
table->default_column_bitmaps();
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
table->default_column_bitmaps();
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -2088,35 +2088,35 @@ err:
|
||||
|
||||
|
||||
static void update_func_bool(THD *thd, struct st_mysql_sys_var *var,
|
||||
void *tgt, void *save)
|
||||
void *tgt, const void *save)
|
||||
{
|
||||
*(my_bool *) tgt= *(int *) save ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
static void update_func_int(THD *thd, struct st_mysql_sys_var *var,
|
||||
void *tgt, void *save)
|
||||
void *tgt, const void *save)
|
||||
{
|
||||
*(int *)tgt= *(int *) save;
|
||||
}
|
||||
|
||||
|
||||
static void update_func_long(THD *thd, struct st_mysql_sys_var *var,
|
||||
void *tgt, void *save)
|
||||
void *tgt, const void *save)
|
||||
{
|
||||
*(long *)tgt= *(long *) save;
|
||||
}
|
||||
|
||||
|
||||
static void update_func_longlong(THD *thd, struct st_mysql_sys_var *var,
|
||||
void *tgt, void *save)
|
||||
void *tgt, const void *save)
|
||||
{
|
||||
*(longlong *)tgt= *(ulonglong *) save;
|
||||
}
|
||||
|
||||
|
||||
static void update_func_str(THD *thd, struct st_mysql_sys_var *var,
|
||||
void *tgt, void *save)
|
||||
void *tgt, const void *save)
|
||||
{
|
||||
char *old= *(char **) tgt;
|
||||
*(char **)tgt= *(char **) save;
|
||||
@ -2673,7 +2673,8 @@ bool sys_var_pluginvar::check(THD *thd, set_var *var)
|
||||
|
||||
void sys_var_pluginvar::set_default(THD *thd, enum_var_type type)
|
||||
{
|
||||
void *tgt, *src;
|
||||
const void *src;
|
||||
void *tgt;
|
||||
|
||||
DBUG_ASSERT(is_readonly() || plugin_var->update);
|
||||
|
||||
@ -2686,9 +2687,34 @@ void sys_var_pluginvar::set_default(THD *thd, enum_var_type type)
|
||||
|
||||
if (plugin_var->flags & PLUGIN_VAR_THDLOCAL)
|
||||
{
|
||||
src= ((int*) (plugin_var + 1) + 1);
|
||||
if (type != OPT_GLOBAL)
|
||||
src= real_value_ptr(thd, OPT_GLOBAL);
|
||||
else
|
||||
switch (plugin_var->flags & PLUGIN_VAR_TYPEMASK) {
|
||||
case PLUGIN_VAR_INT:
|
||||
src= &((thdvar_uint_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_LONG:
|
||||
src= &((thdvar_ulong_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_LONGLONG:
|
||||
src= &((thdvar_ulonglong_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_ENUM:
|
||||
src= &((thdvar_enum_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_SET:
|
||||
src= &((thdvar_set_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_BOOL:
|
||||
src= &((thdvar_bool_t*) plugin_var)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_STR:
|
||||
src= &((thdvar_str_t*) plugin_var)->def_val;
|
||||
break;
|
||||
default:
|
||||
DBUG_ASSERT(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* thd must equal current_thd if PLUGIN_VAR_THDLOCAL flag is set */
|
||||
@ -2776,25 +2802,25 @@ static void plugin_opt_set_limits(struct my_option *options,
|
||||
case PLUGIN_VAR_ENUM:
|
||||
options->var_type= GET_ENUM;
|
||||
options->typelib= ((sysvar_enum_t*) opt)->typelib;
|
||||
options->def_value= *(ulong*) ((int*) (opt + 1) + 1);
|
||||
options->def_value= ((sysvar_enum_t*) opt)->def_val;
|
||||
options->min_value= options->block_size= 0;
|
||||
options->max_value= options->typelib->count - 1;
|
||||
break;
|
||||
case PLUGIN_VAR_SET:
|
||||
options->var_type= GET_SET;
|
||||
options->typelib= ((sysvar_set_t*) opt)->typelib;
|
||||
options->def_value= *(ulonglong*) ((int*) (opt + 1) + 1);
|
||||
options->def_value= ((sysvar_set_t*) opt)->def_val;
|
||||
options->min_value= options->block_size= 0;
|
||||
options->max_value= (ULL(1) << options->typelib->count) - 1;
|
||||
break;
|
||||
case PLUGIN_VAR_BOOL:
|
||||
options->var_type= GET_BOOL;
|
||||
options->def_value= *(my_bool*) ((void**)(opt + 1) + 1);
|
||||
options->def_value= ((sysvar_bool_t*) opt)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_STR:
|
||||
options->var_type= ((opt->flags & PLUGIN_VAR_MEMALLOC) ?
|
||||
GET_STR_ALLOC : GET_STR);
|
||||
options->def_value= (ulonglong)(intptr) *((char**) ((void**) (opt + 1) + 1));
|
||||
options->def_value= (intptr) ((sysvar_str_t*) opt)->def_val;
|
||||
break;
|
||||
/* threadlocal variables */
|
||||
case PLUGIN_VAR_INT | PLUGIN_VAR_THDLOCAL:
|
||||
@ -2818,25 +2844,25 @@ static void plugin_opt_set_limits(struct my_option *options,
|
||||
case PLUGIN_VAR_ENUM | PLUGIN_VAR_THDLOCAL:
|
||||
options->var_type= GET_ENUM;
|
||||
options->typelib= ((thdvar_enum_t*) opt)->typelib;
|
||||
options->def_value= *(ulong*) ((int*) (opt + 1) + 1);
|
||||
options->def_value= ((thdvar_enum_t*) opt)->def_val;
|
||||
options->min_value= options->block_size= 0;
|
||||
options->max_value= options->typelib->count - 1;
|
||||
break;
|
||||
case PLUGIN_VAR_SET | PLUGIN_VAR_THDLOCAL:
|
||||
options->var_type= GET_SET;
|
||||
options->typelib= ((thdvar_set_t*) opt)->typelib;
|
||||
options->def_value= *(ulonglong*) ((int*) (opt + 1) + 1);
|
||||
options->def_value= ((thdvar_set_t*) opt)->def_val;
|
||||
options->min_value= options->block_size= 0;
|
||||
options->max_value= (ULL(1) << options->typelib->count) - 1;
|
||||
break;
|
||||
case PLUGIN_VAR_BOOL | PLUGIN_VAR_THDLOCAL:
|
||||
options->var_type= GET_BOOL;
|
||||
options->def_value= *(my_bool*) ((int*) (opt + 1) + 1);
|
||||
options->def_value= ((thdvar_bool_t*) opt)->def_val;
|
||||
break;
|
||||
case PLUGIN_VAR_STR | PLUGIN_VAR_THDLOCAL:
|
||||
options->var_type= ((opt->flags & PLUGIN_VAR_MEMALLOC) ?
|
||||
GET_STR_ALLOC : GET_STR);
|
||||
options->def_value= (intptr) *((char**) ((void**) (opt + 1) + 1));
|
||||
options->def_value= (intptr) ((thdvar_str_t*) opt)->def_val;
|
||||
break;
|
||||
default:
|
||||
DBUG_ASSERT(0);
|
||||
|
@ -28,6 +28,17 @@
|
||||
#define MAX_NODES 64
|
||||
#define UNDEF_NODEGROUP 0xFFFF
|
||||
|
||||
/**************************************************************************
|
||||
* IT SHOULD BE (MAX_NDB_NODES - 1).
|
||||
* WHEN MAX_NDB_NODE IS CHANGED, IT SHOULD BE CHANGED ALSO
|
||||
**************************************************************************/
|
||||
#define MAX_DATA_NODE_ID 48
|
||||
/**************************************************************************
|
||||
* IT SHOULD BE (MAX_NODES - 1).
|
||||
* WHEN MAX_NODES IS CHANGED, IT SHOULD BE CHANGED ALSO
|
||||
**************************************************************************/
|
||||
#define MAX_NODES_ID 63
|
||||
|
||||
/**
|
||||
* MAX_API_NODES = MAX_NODES - No of NDB Nodes in use
|
||||
*/
|
||||
|
@ -163,7 +163,8 @@ struct CreateFileImplRef {
|
||||
InvalidFileMetadata = 1510,
|
||||
OutOfMemory = 1511,
|
||||
FileReadError = 1512,
|
||||
FilegroupNotOnline = 1513
|
||||
FilegroupNotOnline = 1513,
|
||||
FileSizeTooLarge = 1515
|
||||
};
|
||||
|
||||
Uint32 senderData;
|
||||
|
@ -553,7 +553,13 @@ extern "C" {
|
||||
/** Log event specific data for for corresponding NDB_LE_ log event */
|
||||
struct {
|
||||
int gth;
|
||||
unsigned page_size_kb;
|
||||
/* union is for compatibility backward.
|
||||
* page_size_kb member variable should be removed in the future
|
||||
*/
|
||||
union {
|
||||
unsigned page_size_kb;
|
||||
unsigned page_size_bytes;
|
||||
};
|
||||
unsigned pages_used;
|
||||
unsigned pages_total;
|
||||
unsigned block;
|
||||
|
@ -1515,37 +1515,40 @@ public:
|
||||
TupleIdRange() {}
|
||||
Uint64 m_first_tuple_id;
|
||||
Uint64 m_last_tuple_id;
|
||||
Uint64 m_highest_seen;
|
||||
void reset() {
|
||||
m_first_tuple_id = ~(Uint64)0;
|
||||
m_last_tuple_id = ~(Uint64)0;
|
||||
m_highest_seen = 0;
|
||||
};
|
||||
};
|
||||
|
||||
int initAutoIncrement();
|
||||
|
||||
int getAutoIncrementValue(const char* aTableName,
|
||||
Uint64 & tupleId, Uint32 cacheSize,
|
||||
Uint64 & autoValue, Uint32 cacheSize,
|
||||
Uint64 step = 1, Uint64 start = 1);
|
||||
int getAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 & tupleId, Uint32 cacheSize,
|
||||
Uint64 & autoValue, Uint32 cacheSize,
|
||||
Uint64 step = 1, Uint64 start = 1);
|
||||
int getAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
TupleIdRange & range, Uint64 & tupleId,
|
||||
TupleIdRange & range, Uint64 & autoValue,
|
||||
Uint32 cacheSize,
|
||||
Uint64 step = 1, Uint64 start = 1);
|
||||
int readAutoIncrementValue(const char* aTableName,
|
||||
Uint64 & tupleId);
|
||||
Uint64 & autoValue);
|
||||
int readAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 & tupleId);
|
||||
Uint64 & autoValue);
|
||||
int readAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
TupleIdRange & range, Uint64 & tupleId);
|
||||
TupleIdRange & range, Uint64 & autoValue);
|
||||
int setAutoIncrementValue(const char* aTableName,
|
||||
Uint64 tupleId, bool increase);
|
||||
Uint64 autoValue, bool modify);
|
||||
int setAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 tupleId, bool increase);
|
||||
Uint64 autoValue, bool modify);
|
||||
int setAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
TupleIdRange & range, Uint64 tupleId,
|
||||
bool increase);
|
||||
TupleIdRange & range, Uint64 autoValue,
|
||||
bool modify);
|
||||
bool checkUpdateAutoIncrementValue(TupleIdRange & range, Uint64 autoValue);
|
||||
private:
|
||||
int getTupleIdFromNdb(const NdbTableImpl* table,
|
||||
TupleIdRange & range, Uint64 & tupleId,
|
||||
@ -1553,7 +1556,9 @@ private:
|
||||
int readTupleIdFromNdb(const NdbTableImpl* table,
|
||||
TupleIdRange & range, Uint64 & tupleId);
|
||||
int setTupleIdInNdb(const NdbTableImpl* table,
|
||||
TupleIdRange & range, Uint64 tupleId, bool increase);
|
||||
TupleIdRange & range, Uint64 tupleId, bool modify);
|
||||
int checkTupleIdInNdb(TupleIdRange & range,
|
||||
Uint64 tupleId);
|
||||
int opTupleIdOnNdb(const NdbTableImpl* table,
|
||||
TupleIdRange & range, Uint64 & opValue, Uint32 op);
|
||||
public:
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define NDB_MAX_TUPLE_SIZE (NDB_MAX_TUPLE_SIZE_IN_WORDS*4)
|
||||
#define NDB_MAX_ACTIVE_EVENTS 100
|
||||
|
||||
#define NDB_MAX_SCANFILTER_SIZE_IN_WORDS 50000
|
||||
/* TUP ZATTR_BUFFER_SIZE 16384 (minus 1) minus place for getValue()s */
|
||||
#define NDB_MAX_SCANFILTER_SIZE_IN_WORDS (16384 - 1 - 1024)
|
||||
|
||||
#endif
|
||||
|
@ -139,6 +139,7 @@ public:
|
||||
|
||||
/**
|
||||
* setField - Set bitfield at given position and length (max 32 bits)
|
||||
* Note : length == 0 not supported.
|
||||
*/
|
||||
static void setField(unsigned size, Uint32 data[],
|
||||
unsigned pos, unsigned len, Uint32 val);
|
||||
@ -146,6 +147,7 @@ public:
|
||||
|
||||
/**
|
||||
* getField - Get bitfield at given position and length
|
||||
* Note : length == 0 not supported.
|
||||
*/
|
||||
static void getField(unsigned size, const Uint32 data[],
|
||||
unsigned pos, unsigned len, Uint32 dst[]);
|
||||
@ -918,7 +920,10 @@ BitmaskImpl::getField(unsigned size, const Uint32 src[],
|
||||
unsigned pos, unsigned len, Uint32 dst[])
|
||||
{
|
||||
assert(pos + len <= (size << 5));
|
||||
|
||||
assert (len != 0);
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
src += (pos >> 5);
|
||||
Uint32 offset = pos & 31;
|
||||
* dst = (* src >> offset) & (len >= 32 ? ~0 : (1 << len) - 1);
|
||||
@ -937,6 +942,9 @@ BitmaskImpl::setField(unsigned size, Uint32 dst[],
|
||||
unsigned pos, unsigned len, const Uint32 src[])
|
||||
{
|
||||
assert(pos + len <= (size << 5));
|
||||
assert(len != 0);
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
dst += (pos >> 5);
|
||||
Uint32 offset = pos & 31;
|
||||
|
@ -129,7 +129,7 @@ SignalLoggerManager::log(LogMode logMode, const char * params)
|
||||
const int count = getParameter(blocks, "BLOCK=", params);
|
||||
|
||||
int cnt = 0;
|
||||
if((count == 1 && blocks[0] == "ALL") ||
|
||||
if((count == 1 && !strcmp(blocks[0], "ALL")) ||
|
||||
count == 0){
|
||||
|
||||
for (int number = 0; number < NO_OF_BLOCKS; ++number){
|
||||
|
@ -70,7 +70,7 @@ printSCANTABCONF(FILE * output, const Uint32 * theData, Uint32 len, Uint16 recei
|
||||
sig->transId1, sig->transId2);
|
||||
|
||||
fprintf(output, " requestInfo: Eod: %d OpCount: %d\n",
|
||||
(requestInfo & ScanTabConf::EndOfData == ScanTabConf::EndOfData),
|
||||
(requestInfo & ScanTabConf::EndOfData) == ScanTabConf::EndOfData,
|
||||
(requestInfo & (~ScanTabConf::EndOfData)));
|
||||
size_t op_count= requestInfo & (~ScanTabConf::EndOfData);
|
||||
if(op_count){
|
||||
|
@ -317,22 +317,32 @@ TCP_Transporter::doSend() {
|
||||
|
||||
// Empty the SendBuffers
|
||||
|
||||
const char * const sendPtr = m_sendBuffer.sendPtr;
|
||||
const Uint32 sizeToSend = m_sendBuffer.sendDataSize;
|
||||
if (sizeToSend > 0){
|
||||
bool sent_any = true;
|
||||
while (m_sendBuffer.dataSize > 0)
|
||||
{
|
||||
const char * const sendPtr = m_sendBuffer.sendPtr;
|
||||
const Uint32 sizeToSend = m_sendBuffer.sendDataSize;
|
||||
const int nBytesSent = send(theSocket, sendPtr, sizeToSend, 0);
|
||||
|
||||
if (nBytesSent > 0) {
|
||||
if (nBytesSent > 0)
|
||||
{
|
||||
sent_any = true;
|
||||
m_sendBuffer.bytesSent(nBytesSent);
|
||||
|
||||
sendCount ++;
|
||||
sendSize += nBytesSent;
|
||||
if(sendCount == reportFreq){
|
||||
if(sendCount == reportFreq)
|
||||
{
|
||||
reportSendLen(get_callback_obj(), remoteNodeId, sendCount, sendSize);
|
||||
sendCount = 0;
|
||||
sendSize = 0;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nBytesSent < 0 && InetErrno == EAGAIN && sent_any)
|
||||
break;
|
||||
|
||||
// Send failed
|
||||
#if defined DEBUG_TRANSPORTER
|
||||
g_eventLogger.error("Send Failure(disconnect==%d) to node = %d nBytesSent = %d "
|
||||
|
@ -20,28 +20,59 @@ void
|
||||
BitmaskImpl::getFieldImpl(const Uint32 src[],
|
||||
unsigned shiftL, unsigned len, Uint32 dst[])
|
||||
{
|
||||
/* Copy whole words of src to dst, shifting src left
|
||||
* by shiftL. Undefined bits of the last written dst word
|
||||
* should be zeroed.
|
||||
*/
|
||||
assert(shiftL < 32);
|
||||
|
||||
unsigned shiftR = 32 - shiftL;
|
||||
unsigned undefined = shiftL ? ~0 : 0;
|
||||
|
||||
/* Merge first word with previously set bits if there's a shift */
|
||||
* dst = shiftL ? * dst : 0;
|
||||
|
||||
while(len >= 32)
|
||||
|
||||
/* Treat the zero-shift case separately to avoid
|
||||
* trampling or reading past the end of src
|
||||
*/
|
||||
if (shiftL == 0)
|
||||
{
|
||||
* dst++ |= (* src) << shiftL;
|
||||
* dst = ((* src++) >> shiftR) & undefined;
|
||||
len -= 32;
|
||||
while(len >= 32)
|
||||
{
|
||||
* dst++ = * src++;
|
||||
len -=32;
|
||||
}
|
||||
|
||||
if (len != 0)
|
||||
{
|
||||
/* Last word has some bits set */
|
||||
Uint32 mask= ((1 << len) -1); // 0000111
|
||||
* dst = (* src) & mask;
|
||||
}
|
||||
}
|
||||
|
||||
if(len < shiftR)
|
||||
else // shiftL !=0, need to build each word from two words shifted
|
||||
{
|
||||
* dst |= ((* src) & ((1 << len) - 1)) << shiftL;
|
||||
}
|
||||
else
|
||||
{
|
||||
* dst++ |= ((* src) << shiftL);
|
||||
* dst = ((* src) >> shiftR) & ((1 << (len - shiftR)) - 1) & undefined;
|
||||
while(len >= 32)
|
||||
{
|
||||
* dst++ |= (* src) << shiftL;
|
||||
* dst = ((* src++) >> shiftR) & undefined;
|
||||
len -= 32;
|
||||
}
|
||||
|
||||
/* Have space for shiftR more bits in the current dst word
|
||||
* is that enough?
|
||||
*/
|
||||
if(len <= shiftR)
|
||||
{
|
||||
/* Fit the remaining bits in the current dst word */
|
||||
* dst |= ((* src) & ((1 << len) - 1)) << shiftL;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Need to write to two dst words */
|
||||
* dst++ |= ((* src) << shiftL);
|
||||
* dst = ((* src) >> shiftR) & ((1 << (len - shiftR)) - 1) & undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -64,370 +95,23 @@ BitmaskImpl::setFieldImpl(Uint32 dst[],
|
||||
len -= 32;
|
||||
}
|
||||
|
||||
/* Copy last bits */
|
||||
Uint32 mask = ((1 << len) -1);
|
||||
* dst = (* dst & ~mask);
|
||||
if(len < shiftR)
|
||||
if(len <= shiftR)
|
||||
{
|
||||
/* Remaining bits fit in current word */
|
||||
* dst |= ((* src++) >> shiftL) & mask;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Remaining bits update 2 words */
|
||||
* dst |= ((* src++) >> shiftL);
|
||||
* dst |= ((* src) & ((1 << (len - shiftR)) - 1)) << shiftR ;
|
||||
}
|
||||
}
|
||||
#ifdef __TEST_BITMASK__
|
||||
|
||||
static
|
||||
void print(const Uint32 src[], Uint32 len, Uint32 pos = 0)
|
||||
{
|
||||
printf("b'");
|
||||
for(unsigned i = 0; i<len; i++)
|
||||
{
|
||||
if(BitmaskImpl::get((pos + len + 31) >> 5, src, i+pos))
|
||||
printf("1");
|
||||
else
|
||||
printf("0");
|
||||
if((i & 31) == 31)
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define DEBUG 0
|
||||
#include <Vector.hpp>
|
||||
static void do_test(int bitmask_size);
|
||||
|
||||
int
|
||||
main(int argc, char** argv)
|
||||
{
|
||||
int loops = argc > 1 ? atoi(argv[1]) : 1000;
|
||||
int max_size = argc > 2 ? atoi(argv[2]) : 1000;
|
||||
|
||||
|
||||
for(int i = 0; i<loops; i++)
|
||||
do_test(1 + (rand() % max_size));
|
||||
}
|
||||
|
||||
struct Alloc
|
||||
{
|
||||
Uint32 pos;
|
||||
Uint32 size;
|
||||
Vector<Uint32> data;
|
||||
};
|
||||
|
||||
static void require(bool b)
|
||||
{
|
||||
if(!b) abort();
|
||||
}
|
||||
|
||||
static
|
||||
bool cmp(const Uint32 b1[], const Uint32 b2[], Uint32 len)
|
||||
{
|
||||
Uint32 sz32 = (len + 31) >> 5;
|
||||
for(int i = 0; i<len; i++)
|
||||
{
|
||||
if(BitmaskImpl::get(sz32, b1, i) ^ BitmaskImpl::get(sz32, b2, i))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static int val_pos = 0;
|
||||
static int val[] = { 384, 241, 32,
|
||||
1,1,1,1, 0,0,0,0, 1,1,1,1, 0,0,0,0,
|
||||
241 };
|
||||
|
||||
static int lrand()
|
||||
{
|
||||
#if 0
|
||||
return val[val_pos++];
|
||||
#else
|
||||
return rand();
|
||||
#endif
|
||||
}
|
||||
|
||||
static
|
||||
void rand(Uint32 dst[], Uint32 len)
|
||||
{
|
||||
for(int i = 0; i<len; i++)
|
||||
BitmaskImpl::set((len + 31) >> 5, dst, i, (lrand() % 1000) > 500);
|
||||
}
|
||||
|
||||
static
|
||||
void simple(int pos, int size)
|
||||
{
|
||||
ndbout_c("simple pos: %d size: %d", pos, size);
|
||||
Vector<Uint32> _mask;
|
||||
Vector<Uint32> _src;
|
||||
Vector<Uint32> _dst;
|
||||
Uint32 sz32 = (size + pos + 32) >> 5;
|
||||
const Uint32 sz = 4 * sz32;
|
||||
|
||||
Uint32 zero = 0;
|
||||
_mask.fill(sz32+1, zero);
|
||||
_src.fill(sz32+1, zero);
|
||||
_dst.fill(sz32+1, zero);
|
||||
|
||||
Uint32 * src = _src.getBase();
|
||||
Uint32 * dst = _dst.getBase();
|
||||
Uint32 * mask = _mask.getBase();
|
||||
|
||||
memset(src, 0x0, sz);
|
||||
memset(dst, 0x0, sz);
|
||||
memset(mask, 0xFF, sz);
|
||||
rand(src, size);
|
||||
BitmaskImpl::setField(sz32, mask, pos, size, src);
|
||||
BitmaskImpl::getField(sz32, mask, pos, size, dst);
|
||||
printf("src: "); print(src, size+31); printf("\n");
|
||||
printf("msk: "); print(mask, (sz32 << 5) + 31); printf("\n");
|
||||
printf("dst: "); print(dst, size+31); printf("\n");
|
||||
require(cmp(src, dst, size+31));
|
||||
};
|
||||
|
||||
static
|
||||
void simple2(int size, int loops)
|
||||
{
|
||||
ndbout_c("simple2 %d - ", size);
|
||||
Vector<Uint32> _mask;
|
||||
Vector<Uint32> _src;
|
||||
Vector<Uint32> _dst;
|
||||
|
||||
Uint32 sz32 = (size + 32) >> 5;
|
||||
Uint32 sz = sz32 << 2;
|
||||
|
||||
Uint32 zero = 0;
|
||||
_mask.fill(sz32+1, zero);
|
||||
_src.fill(sz32+1, zero);
|
||||
_dst.fill(sz32+1, zero);
|
||||
|
||||
Uint32 * src = _src.getBase();
|
||||
Uint32 * dst = _dst.getBase();
|
||||
Uint32 * mask = _mask.getBase();
|
||||
|
||||
Vector<Uint32> save;
|
||||
for(int i = 0; i<loops; i++)
|
||||
{
|
||||
memset(mask, 0xFF, sz);
|
||||
memset(dst, 0xFF, sz);
|
||||
int len;
|
||||
int pos = 0;
|
||||
while(pos+1 < size)
|
||||
{
|
||||
memset(src, 0xFF, sz);
|
||||
while(!(len = rand() % (size - pos)));
|
||||
BitmaskImpl::setField(sz32, mask, pos, len, src);
|
||||
if(memcmp(dst, mask, sz))
|
||||
{
|
||||
ndbout_c("pos: %d len: %d", pos, len);
|
||||
print(mask, size);
|
||||
abort();
|
||||
}
|
||||
printf("[ %d %d ]", pos, len);
|
||||
save.push_back(pos);
|
||||
save.push_back(len);
|
||||
pos += len;
|
||||
}
|
||||
|
||||
for(int j = 0; j<save.size(); )
|
||||
{
|
||||
pos = save[j++];
|
||||
len = save[j++];
|
||||
memset(src, 0xFF, sz);
|
||||
BitmaskImpl::getField(sz32, mask, pos, len, src);
|
||||
if(memcmp(dst, src, sz))
|
||||
{
|
||||
ndbout_c("pos: %d len: %d", pos, len);
|
||||
printf("src: "); print(src, size); printf("\n");
|
||||
printf("dst: "); print(dst, size); printf("\n");
|
||||
printf("msk: "); print(mask, size); printf("\n");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
ndbout_c("");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
do_test(int bitmask_size)
|
||||
{
|
||||
#if 1
|
||||
simple(rand() % 33, (rand() % 63)+1);
|
||||
//#else
|
||||
Vector<Alloc> alloc_list;
|
||||
bitmask_size = (bitmask_size + 31) & ~31;
|
||||
Uint32 sz32 = (bitmask_size >> 5);
|
||||
Vector<Uint32> alloc_mask;
|
||||
Vector<Uint32> test_mask;
|
||||
|
||||
ndbout_c("Testing bitmask of size %d", bitmask_size);
|
||||
Uint32 zero = 0;
|
||||
alloc_mask.fill(sz32, zero);
|
||||
test_mask.fill(sz32, zero);
|
||||
|
||||
for(int i = 0; i<5000; i++)
|
||||
{
|
||||
Vector<Uint32> tmp;
|
||||
tmp.fill(sz32, zero);
|
||||
|
||||
int pos = lrand() % (bitmask_size - 1);
|
||||
int free = 0;
|
||||
if(BitmaskImpl::get(sz32, alloc_mask.getBase(), pos))
|
||||
{
|
||||
// Bit was allocated
|
||||
// 1) Look up allocation
|
||||
// 2) Check data
|
||||
// 3) free it
|
||||
size_t j;
|
||||
int min, max;
|
||||
for(j = 0; j<alloc_list.size(); j++)
|
||||
{
|
||||
min = alloc_list[j].pos;
|
||||
max = min + alloc_list[j].size;
|
||||
if(pos >= min && pos < max)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
require(pos >= min && pos < max);
|
||||
BitmaskImpl::getField(sz32, test_mask.getBase(), min, max-min,
|
||||
tmp.getBase());
|
||||
if(DEBUG)
|
||||
{
|
||||
printf("freeing [ %d %d ]", min, max);
|
||||
printf("- mask: ");
|
||||
print(tmp.getBase(), max - min);
|
||||
|
||||
printf(" save: ");
|
||||
size_t k;
|
||||
Alloc& a = alloc_list[j];
|
||||
for(k = 0; k<a.data.size(); k++)
|
||||
printf("%.8x ", a.data[k]);
|
||||
printf("\n");
|
||||
}
|
||||
int bytes = (max - min + 7) >> 3;
|
||||
if(!cmp(tmp.getBase(), alloc_list[j].data.getBase(), max - min))
|
||||
{
|
||||
abort();
|
||||
}
|
||||
while(min < max)
|
||||
BitmaskImpl::clear(sz32, alloc_mask.getBase(), min++);
|
||||
alloc_list.erase(j);
|
||||
}
|
||||
else
|
||||
{
|
||||
Vector<Uint32> tmp;
|
||||
tmp.fill(sz32, zero);
|
||||
|
||||
// Bit was free
|
||||
// 1) Check how much space is avaiable
|
||||
// 2) Create new allocation of lrandom size
|
||||
// 3) Fill data with lrandom data
|
||||
// 4) Update alloc mask
|
||||
while(pos+free < bitmask_size &&
|
||||
!BitmaskImpl::get(sz32, alloc_mask.getBase(), pos+free))
|
||||
free++;
|
||||
|
||||
Uint32 sz =
|
||||
(free <= 64 && ((lrand() % 100) > 80)) ? free : (lrand() % free);
|
||||
sz = sz ? sz : 1;
|
||||
sz = pos + sz == bitmask_size ? sz - 1 : sz;
|
||||
Alloc a;
|
||||
a.pos = pos;
|
||||
a.size = sz;
|
||||
a.data.fill(((sz+31)>> 5)-1, zero);
|
||||
if(DEBUG)
|
||||
printf("pos %d -> alloc [ %d %d ]", pos, pos, pos+sz);
|
||||
for(size_t j = 0; j<sz; j++)
|
||||
{
|
||||
BitmaskImpl::set(sz32, alloc_mask.getBase(), pos+j);
|
||||
if((lrand() % 1000) > 500)
|
||||
BitmaskImpl::set((sz + 31) >> 5, a.data.getBase(), j);
|
||||
}
|
||||
if(DEBUG)
|
||||
{
|
||||
printf("- mask: ");
|
||||
print(a.data.getBase(), sz);
|
||||
printf("\n");
|
||||
}
|
||||
BitmaskImpl::setField(sz32, test_mask.getBase(), pos, sz,
|
||||
a.data.getBase());
|
||||
alloc_list.push_back(a);
|
||||
}
|
||||
}
|
||||
|
||||
for(Uint32 i = 0; i<1000; i++)
|
||||
{
|
||||
Uint32 sz32 = 10+rand() % 100;
|
||||
Uint32 zero = 0;
|
||||
Vector<Uint32> map;
|
||||
map.fill(sz32, zero);
|
||||
|
||||
Uint32 sz = 32 * sz32;
|
||||
Uint32 start = (rand() % sz);
|
||||
Uint32 stop = start + ((rand() % (sz - start)) & 0xFFFFFFFF);
|
||||
|
||||
Vector<Uint32> check;
|
||||
check.fill(sz32, zero);
|
||||
|
||||
for(Uint32 j = 0; j<sz; j++)
|
||||
{
|
||||
bool expect = (j >= start && j<stop);
|
||||
if(expect)
|
||||
BitmaskImpl::set(sz32, check.getBase(), j);
|
||||
}
|
||||
|
||||
BitmaskImpl::set(sz32, map.getBase(), start, stop);
|
||||
if (!BitmaskImpl::equal(sz32, map.getBase(), check.getBase()))
|
||||
{
|
||||
ndbout_c(" FAIL sz: %d [ %d %d ]", sz, start, stop);
|
||||
printf("check: ");
|
||||
for(Uint32 j = 0; j<sz32; j++)
|
||||
printf("%.8x ", check[j]);
|
||||
printf("\n");
|
||||
|
||||
printf("map : ");
|
||||
for(Uint32 j = 0; j<sz32; j++)
|
||||
printf("%.8x ", map[j]);
|
||||
printf("\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
map.clear();
|
||||
check.clear();
|
||||
|
||||
Uint32 one = ~(Uint32)0;
|
||||
map.fill(sz32, one);
|
||||
check.fill(sz32, one);
|
||||
|
||||
for(Uint32 j = 0; j<sz; j++)
|
||||
{
|
||||
bool expect = (j >= start && j<stop);
|
||||
if(expect)
|
||||
BitmaskImpl::clear(sz32, check.getBase(), j);
|
||||
}
|
||||
|
||||
BitmaskImpl::clear(sz32, map.getBase(), start, stop);
|
||||
if (!BitmaskImpl::equal(sz32, map.getBase(), check.getBase()))
|
||||
{
|
||||
ndbout_c(" FAIL sz: %d [ %d %d ]", sz, start, stop);
|
||||
printf("check: ");
|
||||
for(Uint32 j = 0; j<sz32; j++)
|
||||
printf("%.8x ", check[j]);
|
||||
printf("\n");
|
||||
|
||||
printf("map : ");
|
||||
for(Uint32 j = 0; j<sz32; j++)
|
||||
printf("%.8x ", map[j]);
|
||||
printf("\n");
|
||||
abort();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
template class Vector<Alloc>;
|
||||
template class Vector<Uint32>;
|
||||
|
||||
#endif
|
||||
/* Bitmask testcase code moved from here to
|
||||
* storage/ndb/test/ndbapi/testBitfield.cpp
|
||||
* to get coverage from automated testing
|
||||
*/
|
||||
|
@ -29,7 +29,7 @@ static const char * fms[] = {
|
||||
"%d", "0x%08x", // Int32
|
||||
"%u", "0x%08x", // Uint32
|
||||
"%lld", "0x%016llx", // Int64
|
||||
"%llu", "0x%016llx" // Uint64
|
||||
"%llu", "0x%016llx", // Uint64
|
||||
"%llu", "0x%016llx" // UintPtr
|
||||
};
|
||||
|
||||
|
@ -62,7 +62,7 @@ SocketOutputStream::print(const char * fmt, ...){
|
||||
|
||||
if(ret >= 0)
|
||||
m_timeout_remain-=time;
|
||||
if(errno==ETIMEDOUT || m_timeout_remain<=0)
|
||||
if((ret < 0 && errno==ETIMEDOUT) || m_timeout_remain<=0)
|
||||
{
|
||||
m_timedout= true;
|
||||
ret= -1;
|
||||
@ -84,7 +84,7 @@ SocketOutputStream::println(const char * fmt, ...){
|
||||
|
||||
if(ret >= 0)
|
||||
m_timeout_remain-=time;
|
||||
if (errno==ETIMEDOUT || m_timeout_remain<=0)
|
||||
if ((ret < 0 && errno==ETIMEDOUT) || m_timeout_remain<=0)
|
||||
{
|
||||
m_timedout= true;
|
||||
ret= -1;
|
||||
|
@ -3,15 +3,18 @@ Next NDBCNTR 1002
|
||||
Next NDBFS 2000
|
||||
Next DBACC 3002
|
||||
Next DBTUP 4029
|
||||
Next DBLQH 5047
|
||||
Next DBLQH 5050
|
||||
Next DBDICT 6008
|
||||
Next DBDIH 7195
|
||||
Next DBTC 8054
|
||||
Next DBTC 8058
|
||||
Next CMVMI 9000
|
||||
Next BACKUP 10038
|
||||
Next DBUTIL 11002
|
||||
Next DBTUX 12008
|
||||
Next SUMA 13034
|
||||
Next SUMA 13036
|
||||
Next LGMAN 15001
|
||||
Next TSMAN 16001
|
||||
|
||||
TESTING NODE FAILURE, ARBITRATION
|
||||
---------------------------------
|
||||
@ -260,6 +263,9 @@ Delay execution of ABORTCONF signal 2 seconds to generate time-out.
|
||||
|
||||
8053: Crash in timeOutFoundLab, state CS_WAIT_COMMIT_CONF
|
||||
|
||||
5048: Crash in execCOMMIT
|
||||
5049: SET_ERROR_INSERT_VALUE(5048)
|
||||
|
||||
ERROR CODES FOR TESTING TIME-OUT HANDLING IN DBTC
|
||||
-------------------------------------------------
|
||||
|
||||
@ -316,6 +322,8 @@ ABORT OF TCKEYREQ
|
||||
|
||||
8038 : Simulate API disconnect just after SCAN_TAB_REQ
|
||||
|
||||
8057 : Send only 1 COMMIT per timeslice
|
||||
|
||||
8052 : Simulate failure of TransactionBufferMemory allocation for OI lookup
|
||||
|
||||
8051 : Simulate failure of allocation for saveINDXKEYINFO
|
||||
@ -547,3 +555,11 @@ NDBCNTR:
|
||||
|
||||
1000: Crash insertion on SystemError::CopyFragRef
|
||||
1001: Delay sending NODE_FAILREP (to own node), until error is cleared
|
||||
|
||||
LGMAN:
|
||||
-----
|
||||
15000: Fail to create log file
|
||||
|
||||
TSMAN:
|
||||
-----
|
||||
16000: Fail to create data file
|
||||
|
@ -326,16 +326,18 @@ Backup::execCONTINUEB(Signal* signal)
|
||||
ptr.p->files.getPtr(filePtr, ptr.p->ctlFilePtr);
|
||||
FsBuffer & buf = filePtr.p->operation.dataBuffer;
|
||||
|
||||
if(buf.getFreeSize() + buf.getMinRead() < buf.getUsableSize()) {
|
||||
if(buf.getFreeSize() < buf.getMaxWrite()) {
|
||||
jam();
|
||||
TablePtr tabPtr LINT_SET_PTR;
|
||||
c_tablePool.getPtr(tabPtr, Tdata2);
|
||||
|
||||
DEBUG_OUT("Backup - Buffer full - " << buf.getFreeSize()
|
||||
<< " + " << buf.getMinRead()
|
||||
<< " < " << buf.getUsableSize()
|
||||
<< " - tableId = " << tabPtr.p->tableId);
|
||||
|
||||
DEBUG_OUT("Backup - Buffer full - "
|
||||
<< buf.getFreeSize()
|
||||
<< " < " << buf.getMaxWrite()
|
||||
<< " (sz: " << buf.getUsableSize()
|
||||
<< " getMinRead: " << buf.getMinRead()
|
||||
<< ") - tableId = " << tabPtr.p->tableId);
|
||||
|
||||
signal->theData[0] = BackupContinueB::BUFFER_FULL_META;
|
||||
signal->theData[1] = Tdata1;
|
||||
signal->theData[2] = Tdata2;
|
||||
@ -967,6 +969,7 @@ Backup::checkNodeFail(Signal* signal,
|
||||
ref->backupPtr = ptr.i;
|
||||
ref->backupId = ptr.p->backupId;
|
||||
ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail;
|
||||
ref->nodeId = getOwnNodeId();
|
||||
gsn= GSN_STOP_BACKUP_REF;
|
||||
len= StopBackupRef::SignalLength;
|
||||
pos= &ref->nodeId - signal->getDataPtr();
|
||||
@ -2081,6 +2084,15 @@ Backup::sendDropTrig(Signal* signal, BackupRecordPtr ptr)
|
||||
/**
|
||||
* Insert footers
|
||||
*/
|
||||
//if backup error, we needn't insert footers
|
||||
if(ptr.p->checkError())
|
||||
{
|
||||
jam();
|
||||
closeFiles(signal, ptr);
|
||||
ptr.p->errorCode = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
BackupFilePtr filePtr LINT_SET_PTR;
|
||||
ptr.p->files.getPtr(filePtr, ptr.p->logFilePtr);
|
||||
@ -4187,6 +4199,37 @@ Backup::checkFile(Signal* signal, BackupFilePtr filePtr)
|
||||
#if 0
|
||||
ndbout << "Ptr to data = " << hex << tmp << endl;
|
||||
#endif
|
||||
BackupRecordPtr ptr LINT_SET_PTR;
|
||||
c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
|
||||
|
||||
if (ERROR_INSERTED(10036))
|
||||
{
|
||||
jam();
|
||||
filePtr.p->m_flags &= ~(Uint32)BackupFile::BF_FILE_THREAD;
|
||||
filePtr.p->errorCode = 2810;
|
||||
ptr.p->setErrorCode(2810);
|
||||
|
||||
if(ptr.p->m_gsn == GSN_STOP_BACKUP_REQ)
|
||||
{
|
||||
jam();
|
||||
closeFile(signal, ptr, filePtr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(filePtr.p->errorCode != 0)
|
||||
{
|
||||
jam();
|
||||
ptr.p->setErrorCode(filePtr.p->errorCode);
|
||||
|
||||
if(ptr.p->m_gsn == GSN_STOP_BACKUP_REQ)
|
||||
{
|
||||
jam();
|
||||
closeFile(signal, ptr, filePtr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ready_to_write(ready, sz, eof, filePtr.p))
|
||||
{
|
||||
jam();
|
||||
@ -4218,8 +4261,6 @@ Backup::checkFile(Signal* signal, BackupFilePtr filePtr)
|
||||
ndbrequire(flags & BackupFile::BF_OPEN);
|
||||
ndbrequire(flags & BackupFile::BF_FILE_THREAD);
|
||||
|
||||
BackupRecordPtr ptr LINT_SET_PTR;
|
||||
c_backupPool.getPtr(ptr, filePtr.p->backupPtr);
|
||||
closeFile(signal, ptr, filePtr);
|
||||
}
|
||||
|
||||
@ -4582,6 +4623,22 @@ Backup::closeFilesDone(Signal* signal, BackupRecordPtr ptr)
|
||||
|
||||
jam();
|
||||
|
||||
//error when do insert footer or close file
|
||||
if(ptr.p->checkError())
|
||||
{
|
||||
StopBackupRef * ref = (StopBackupRef*)signal->getDataPtr();
|
||||
ref->backupPtr = ptr.i;
|
||||
ref->backupId = ptr.p->backupId;
|
||||
ref->errorCode = ptr.p->errorCode;
|
||||
ref->nodeId = getOwnNodeId();
|
||||
sendSignal(ptr.p->masterRef, GSN_STOP_BACKUP_REF, signal,
|
||||
StopBackupConf::SignalLength, JBB);
|
||||
|
||||
ptr.p->m_gsn = GSN_STOP_BACKUP_REF;
|
||||
ptr.p->slaveState.setState(CLEANING);
|
||||
return;
|
||||
}
|
||||
|
||||
StopBackupConf* conf = (StopBackupConf*)signal->getDataPtrSend();
|
||||
conf->backupId = ptr.p->backupId;
|
||||
conf->backupPtr = ptr.i;
|
||||
|
@ -557,8 +557,8 @@ public:
|
||||
NDB_TICKS m_reset_disk_speed_time;
|
||||
static const int DISK_SPEED_CHECK_DELAY = 100;
|
||||
|
||||
STATIC_CONST(NO_OF_PAGES_META_FILE =
|
||||
(MAX_WORDS_META_FILE + BACKUP_WORDS_PER_PAGE - 1) /
|
||||
STATIC_CONST(NO_OF_PAGES_META_FILE =
|
||||
(2*MAX_WORDS_META_FILE + BACKUP_WORDS_PER_PAGE - 1) /
|
||||
BACKUP_WORDS_PER_PAGE);
|
||||
|
||||
/**
|
||||
|
@ -3210,7 +3210,6 @@ Dbacc::readTablePk(Uint32 localkey1, Uint32 eh, Ptr<Operationrec> opPtr)
|
||||
{
|
||||
dump_lock_queue(opPtr);
|
||||
ndbrequire(opPtr.p->nextParallelQue == RNIL);
|
||||
ndbrequire(opPtr.p->nextSerialQue == RNIL);
|
||||
ndbrequire(opPtr.p->m_op_bits & Operationrec::OP_ELEMENT_DISAPPEARED);
|
||||
ndbrequire(opPtr.p->m_op_bits & Operationrec::OP_COMMIT_DELETE_CHECK);
|
||||
ndbrequire((opPtr.p->m_op_bits & Operationrec::OP_STATE_MASK) == Operationrec::OP_STATE_RUNNING);
|
||||
|
@ -4086,9 +4086,7 @@ Dbdict::execALTER_TABLE_REQ(Signal* signal)
|
||||
bool ok = false;
|
||||
switch(tabState){
|
||||
case TableRecord::NOT_DEFINED:
|
||||
case TableRecord::REORG_TABLE_PREPARED:
|
||||
case TableRecord::DEFINING:
|
||||
case TableRecord::CHECKED:
|
||||
jam();
|
||||
alterTableRef(signal, req, AlterTableRef::NoSuchTable);
|
||||
return;
|
||||
@ -4339,9 +4337,7 @@ Dbdict::execALTER_TAB_REQ(Signal * signal)
|
||||
bool ok = false;
|
||||
switch(tabState){
|
||||
case TableRecord::NOT_DEFINED:
|
||||
case TableRecord::REORG_TABLE_PREPARED:
|
||||
case TableRecord::DEFINING:
|
||||
case TableRecord::CHECKED:
|
||||
jam();
|
||||
alterTabRef(signal, req, AlterTableRef::NoSuchTable);
|
||||
return;
|
||||
@ -6690,9 +6686,7 @@ Dbdict::execDROP_TABLE_REQ(Signal* signal){
|
||||
bool ok = false;
|
||||
switch(tabState){
|
||||
case TableRecord::NOT_DEFINED:
|
||||
case TableRecord::REORG_TABLE_PREPARED:
|
||||
case TableRecord::DEFINING:
|
||||
case TableRecord::CHECKED:
|
||||
jam();
|
||||
dropTableRef(signal, req, DropTableRef::NoSuchTable);
|
||||
return;
|
||||
@ -7718,7 +7712,6 @@ Dbdict::execLIST_TABLES_REQ(Signal* signal)
|
||||
if(DictTabInfo::isTable(type)){
|
||||
switch (tablePtr.p->tabState) {
|
||||
case TableRecord::DEFINING:
|
||||
case TableRecord::CHECKED:
|
||||
conf->setTableState(pos, DictTabInfo::StateBuilding);
|
||||
break;
|
||||
case TableRecord::PREPARE_DROPPING:
|
||||
|
@ -320,9 +320,7 @@ public:
|
||||
|
||||
enum TabState {
|
||||
NOT_DEFINED = 0,
|
||||
REORG_TABLE_PREPARED = 1,
|
||||
DEFINING = 2,
|
||||
CHECKED = 3,
|
||||
DEFINED = 4,
|
||||
PREPARE_DROPPING = 5,
|
||||
DROPPING = 6,
|
||||
|
@ -8464,6 +8464,12 @@ void Dbdih::execDIHNDBTAMPER(Signal* signal)
|
||||
} else if (tuserpointer < 15000) {
|
||||
jam();
|
||||
tuserblockref = DBDICT_REF;
|
||||
} else if (tuserpointer < 16000) {
|
||||
jam();
|
||||
tuserblockref = LGMAN_REF;
|
||||
} else if (tuserpointer < 17000) {
|
||||
jam();
|
||||
tuserblockref = TSMAN_REF;
|
||||
} else if (tuserpointer < 30000) {
|
||||
/*--------------------------------------------------------------------*/
|
||||
// Ignore errors in the 20000-range.
|
||||
|
@ -5959,6 +5959,12 @@ void Dblqh::execCOMMIT(Signal* signal)
|
||||
|
||||
TcConnectionrec * const regTcPtr = tcConnectptr.p;
|
||||
TRACE_OP(regTcPtr, "COMMIT");
|
||||
|
||||
CRASH_INSERTION(5048);
|
||||
if (ERROR_INSERTED(5049))
|
||||
{
|
||||
SET_ERROR_INSERT_VALUE(5048);
|
||||
}
|
||||
|
||||
commitReqLab(signal, gci);
|
||||
return;
|
||||
|
@ -4495,7 +4495,7 @@ void Dbtc::commit020Lab(Signal* signal)
|
||||
|
||||
if (localTcConnectptr.i != RNIL) {
|
||||
Tcount = Tcount + 1;
|
||||
if (Tcount < 16) {
|
||||
if (Tcount < 16 && !ERROR_INSERTED(8057)) {
|
||||
ptrCheckGuard(localTcConnectptr,
|
||||
TtcConnectFilesize, localTcConnectRecord);
|
||||
jam();
|
||||
@ -4514,6 +4514,9 @@ void Dbtc::commit020Lab(Signal* signal)
|
||||
}//if
|
||||
} else {
|
||||
jam();
|
||||
if (ERROR_INSERTED(8057))
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
|
||||
regApiPtr->apiConnectstate = CS_COMMIT_SENT;
|
||||
return;
|
||||
}//if
|
||||
|
@ -251,6 +251,7 @@ inline const Uint32* ALIGN_WORD(const void* ptr)
|
||||
#define ZUNSUPPORTED_BRANCH 892
|
||||
|
||||
#define ZSTORED_SEIZE_ATTRINBUFREC_ERROR 873 // Part of Scan
|
||||
#define ZSTORED_TOO_MUCH_ATTRINFO_ERROR 874
|
||||
|
||||
#define ZREAD_ONLY_CONSTRAINT_VIOLATION 893
|
||||
#define ZVAR_SIZED_NOT_SUPPORTED 894
|
||||
@ -1330,6 +1331,11 @@ typedef Ptr<HostBuffer> HostBufferPtr;
|
||||
struct Tuple_header
|
||||
{
|
||||
union {
|
||||
/**
|
||||
* List of prepared operations for this tuple.
|
||||
* Points to most recent/last operation, ie. to walk the list must follow
|
||||
* regOperPtr->prevActiveOp links.
|
||||
*/
|
||||
Uint32 m_operation_ptr_i; // OperationPtrI
|
||||
Uint32 m_base_record_ref; // For disk tuple, ref to MM tuple
|
||||
};
|
||||
@ -1558,7 +1564,7 @@ public:
|
||||
/*
|
||||
* TUX checks if tuple is visible to scan.
|
||||
*/
|
||||
bool tuxQueryTh(Uint32 fragPtrI, Uint32 tupAddr, Uint32 tupVersion, Uint32 transId1, Uint32 transId2, Uint32 savePointId);
|
||||
bool tuxQueryTh(Uint32 fragPtrI, Uint32 pageId, Uint32 pageIndex, Uint32 tupVersion, Uint32 transId1, Uint32 transId2, bool dirty, Uint32 savepointId);
|
||||
|
||||
int load_diskpage(Signal*, Uint32 opRec, Uint32 fragPtrI,
|
||||
Uint32 local_key, Uint32 flags);
|
||||
@ -2202,17 +2208,20 @@ private:
|
||||
void
|
||||
checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Tablerec* tablePtr);
|
||||
Tablerec* tablePtr,
|
||||
bool disk);
|
||||
|
||||
void
|
||||
checkImmediateTriggersAfterUpdate(KeyReqStruct *req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Tablerec* tablePtr);
|
||||
Tablerec* tablePtr,
|
||||
bool disk);
|
||||
|
||||
void
|
||||
checkImmediateTriggersAfterDelete(KeyReqStruct *req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Tablerec* tablePtr);
|
||||
Tablerec* tablePtr,
|
||||
bool disk);
|
||||
|
||||
#if 0
|
||||
void checkDeferredTriggers(Signal* signal,
|
||||
@ -2226,7 +2235,8 @@ private:
|
||||
|
||||
void fireImmediateTriggers(KeyReqStruct *req_struct,
|
||||
DLList<TupTriggerData>& triggerList,
|
||||
Operationrec* regOperPtr);
|
||||
Operationrec* regOperPtr,
|
||||
bool disk);
|
||||
|
||||
void fireDeferredTriggers(KeyReqStruct *req_struct,
|
||||
DLList<TupTriggerData>& triggerList,
|
||||
@ -2239,12 +2249,13 @@ private:
|
||||
|
||||
void executeTriggers(KeyReqStruct *req_struct,
|
||||
DLList<TupTriggerData>& triggerList,
|
||||
Operationrec* regOperPtr);
|
||||
Operationrec* regOperPtr,
|
||||
bool disk);
|
||||
|
||||
void executeTrigger(KeyReqStruct *req_struct,
|
||||
TupTriggerData* trigPtr,
|
||||
Operationrec* regOperPtr,
|
||||
bool disk = true);
|
||||
bool disk);
|
||||
|
||||
bool readTriggerInfo(TupTriggerData* trigPtr,
|
||||
Operationrec* regOperPtr,
|
||||
@ -2421,6 +2432,7 @@ private:
|
||||
|
||||
void setNullBits(Uint32*, Tablerec* regTabPtr);
|
||||
bool checkNullAttributes(KeyReqStruct * const, Tablerec* const);
|
||||
bool find_savepoint(OperationrecPtr& loopOpPtr, Uint32 savepointId);
|
||||
bool setup_read(KeyReqStruct* req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Fragrecord* regFragPtr,
|
||||
@ -2533,7 +2545,8 @@ private:
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 lenAttrInfo);
|
||||
void storedSeizeAttrinbufrecErrorLab(Signal* signal,
|
||||
Operationrec* regOperPtr);
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 errorCode);
|
||||
bool storedProcedureAttrInfo(Signal* signal,
|
||||
Operationrec* regOperPtr,
|
||||
const Uint32* data,
|
||||
@ -2874,7 +2887,7 @@ private:
|
||||
void verify_page_lists(Disk_alloc_info&) {}
|
||||
#endif
|
||||
|
||||
void fix_commit_order(OperationrecPtr);
|
||||
void findFirstOp(OperationrecPtr&);
|
||||
void commit_operation(Signal*, Uint32, Tuple_header*, PagePtr,
|
||||
Operationrec*, Fragrecord*, Tablerec*);
|
||||
|
||||
@ -3036,4 +3049,21 @@ Dbtup::get_dd_ptr(PagePtr* pagePtr,
|
||||
NdbOut&
|
||||
operator<<(NdbOut&, const Dbtup::Tablerec&);
|
||||
|
||||
inline
|
||||
bool Dbtup::find_savepoint(OperationrecPtr& loopOpPtr, Uint32 savepointId)
|
||||
{
|
||||
while (true) {
|
||||
if (savepointId > loopOpPtr.p->savepointId) {
|
||||
jam();
|
||||
return true;
|
||||
}
|
||||
loopOpPtr.i = loopOpPtr.p->prevActiveOp;
|
||||
if (loopOpPtr.i == RNIL) {
|
||||
break;
|
||||
}
|
||||
c_operation_pool.getPtr(loopOpPtr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -385,3 +385,38 @@ void Dbtup::send_TUPKEYREF(Signal* signal,
|
||||
TupKeyRef::SignalLength, JBB);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink one operation from the m_operation_ptr_i list in the tuple.
|
||||
*/
|
||||
void Dbtup::removeActiveOpList(Operationrec* const regOperPtr,
|
||||
Tuple_header *tuple_ptr)
|
||||
{
|
||||
OperationrecPtr raoOperPtr;
|
||||
|
||||
if(!regOperPtr->m_copy_tuple_location.isNull())
|
||||
{
|
||||
jam();
|
||||
c_undo_buffer.free_copy_tuple(®OperPtr->m_copy_tuple_location);
|
||||
}
|
||||
|
||||
if (regOperPtr->op_struct.in_active_list) {
|
||||
regOperPtr->op_struct.in_active_list= false;
|
||||
if (regOperPtr->nextActiveOp != RNIL) {
|
||||
jam();
|
||||
raoOperPtr.i= regOperPtr->nextActiveOp;
|
||||
c_operation_pool.getPtr(raoOperPtr);
|
||||
raoOperPtr.p->prevActiveOp= regOperPtr->prevActiveOp;
|
||||
} else {
|
||||
jam();
|
||||
tuple_ptr->m_operation_ptr_i = regOperPtr->prevActiveOp;
|
||||
}
|
||||
if (regOperPtr->prevActiveOp != RNIL) {
|
||||
jam();
|
||||
raoOperPtr.i= regOperPtr->prevActiveOp;
|
||||
c_operation_pool.getPtr(raoOperPtr);
|
||||
raoOperPtr.p->nextActiveOp= regOperPtr->nextActiveOp;
|
||||
}
|
||||
regOperPtr->prevActiveOp= RNIL;
|
||||
regOperPtr->nextActiveOp= RNIL;
|
||||
}
|
||||
}
|
||||
|
@ -97,39 +97,6 @@ void Dbtup::execTUP_WRITELOG_REQ(Signal* signal)
|
||||
} while (true);
|
||||
}
|
||||
|
||||
void Dbtup::removeActiveOpList(Operationrec* const regOperPtr,
|
||||
Tuple_header *tuple_ptr)
|
||||
{
|
||||
OperationrecPtr raoOperPtr;
|
||||
|
||||
/**
|
||||
* Release copy tuple
|
||||
*/
|
||||
if(!regOperPtr->m_copy_tuple_location.isNull())
|
||||
c_undo_buffer.free_copy_tuple(®OperPtr->m_copy_tuple_location);
|
||||
|
||||
if (regOperPtr->op_struct.in_active_list) {
|
||||
regOperPtr->op_struct.in_active_list= false;
|
||||
if (regOperPtr->nextActiveOp != RNIL) {
|
||||
jam();
|
||||
raoOperPtr.i= regOperPtr->nextActiveOp;
|
||||
c_operation_pool.getPtr(raoOperPtr);
|
||||
raoOperPtr.p->prevActiveOp= regOperPtr->prevActiveOp;
|
||||
} else {
|
||||
jam();
|
||||
tuple_ptr->m_operation_ptr_i = regOperPtr->prevActiveOp;
|
||||
}
|
||||
if (regOperPtr->prevActiveOp != RNIL) {
|
||||
jam();
|
||||
raoOperPtr.i= regOperPtr->prevActiveOp;
|
||||
c_operation_pool.getPtr(raoOperPtr);
|
||||
raoOperPtr.p->nextActiveOp= regOperPtr->nextActiveOp;
|
||||
}
|
||||
regOperPtr->prevActiveOp= RNIL;
|
||||
regOperPtr->nextActiveOp= RNIL;
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
/* INITIALIZATION OF ONE CONNECTION RECORD TO PREPARE FOR NEXT OP. */
|
||||
/* ---------------------------------------------------------------- */
|
||||
@ -142,6 +109,7 @@ void Dbtup::initOpConnection(Operationrec* regOperPtr)
|
||||
regOperPtr->op_struct.m_disk_preallocated= 0;
|
||||
regOperPtr->op_struct.m_load_diskpage_on_commit= 0;
|
||||
regOperPtr->op_struct.m_wait_log_buffer= 0;
|
||||
regOperPtr->op_struct.in_active_list = false;
|
||||
regOperPtr->m_undo_buffer_space= 0;
|
||||
}
|
||||
|
||||
@ -170,6 +138,7 @@ Dbtup::dealloc_tuple(Signal* signal,
|
||||
Uint32 extra_bits = Tuple_header::FREED;
|
||||
if (bits & Tuple_header::DISK_PART)
|
||||
{
|
||||
jam();
|
||||
Local_key disk;
|
||||
memcpy(&disk, ptr->get_disk_ref_ptr(regTabPtr), sizeof(disk));
|
||||
PagePtr tmpptr;
|
||||
@ -182,6 +151,7 @@ Dbtup::dealloc_tuple(Signal* signal,
|
||||
if (! (bits & (Tuple_header::LCP_SKIP | Tuple_header::ALLOC)) &&
|
||||
lcpScan_ptr_i != RNIL)
|
||||
{
|
||||
jam();
|
||||
ScanOpPtr scanOp;
|
||||
c_scanOpPool.getPtr(scanOp, lcpScan_ptr_i);
|
||||
Local_key rowid = regOperPtr->m_tuple_location;
|
||||
@ -189,6 +159,7 @@ Dbtup::dealloc_tuple(Signal* signal,
|
||||
rowid.m_page_no = page->frag_page_id;
|
||||
if (rowid > scanpos)
|
||||
{
|
||||
jam();
|
||||
extra_bits = Tuple_header::LCP_KEEP; // Note REMOVE FREE
|
||||
ptr->m_operation_ptr_i = lcp_keep_list;
|
||||
regFragPtr->m_lcp_keep_list = rowid.ref();
|
||||
@ -229,11 +200,13 @@ Dbtup::commit_operation(Signal* signal,
|
||||
Uint32 mm_vars= regTabPtr->m_attributes[MM].m_no_of_varsize;
|
||||
if(mm_vars == 0)
|
||||
{
|
||||
jam();
|
||||
memcpy(tuple_ptr, copy, 4*fixsize);
|
||||
disk_ptr= (Tuple_header*)(((Uint32*)copy)+fixsize);
|
||||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
/**
|
||||
* Var_part_ref is only stored in *allocated* tuple
|
||||
* so memcpy from copy, will over write it...
|
||||
@ -258,6 +231,7 @@ Dbtup::commit_operation(Signal* signal,
|
||||
|
||||
if(copy_bits & Tuple_header::MM_SHRINK)
|
||||
{
|
||||
jam();
|
||||
vpagePtrP->shrink_entry(tmp.m_page_idx, (sz + 3) >> 2);
|
||||
update_free_page_list(regFragPtr, vpagePtr);
|
||||
}
|
||||
@ -268,6 +242,7 @@ Dbtup::commit_operation(Signal* signal,
|
||||
if (regTabPtr->m_no_of_disk_attributes &&
|
||||
(copy_bits & Tuple_header::DISK_INLINE))
|
||||
{
|
||||
jam();
|
||||
Local_key key;
|
||||
memcpy(&key, copy->get_disk_ref_ptr(regTabPtr), sizeof(Local_key));
|
||||
Uint32 logfile_group_id= regFragPtr->m_logfile_group_id;
|
||||
@ -278,22 +253,26 @@ Dbtup::commit_operation(Signal* signal,
|
||||
Uint32 sz, *dst;
|
||||
if(copy_bits & Tuple_header::DISK_ALLOC)
|
||||
{
|
||||
jam();
|
||||
disk_page_alloc(signal, regTabPtr, regFragPtr, &key, diskPagePtr, gci);
|
||||
}
|
||||
|
||||
if(regTabPtr->m_attributes[DD].m_no_of_varsize == 0)
|
||||
{
|
||||
jam();
|
||||
sz= regTabPtr->m_offsets[DD].m_fix_header_size;
|
||||
dst= ((Fix_page*)diskPagePtr.p)->get_ptr(key.m_page_idx, sz);
|
||||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
dst= ((Var_page*)diskPagePtr.p)->get_ptr(key.m_page_idx);
|
||||
sz= ((Var_page*)diskPagePtr.p)->get_entry_len(key.m_page_idx);
|
||||
}
|
||||
|
||||
if(! (copy_bits & Tuple_header::DISK_ALLOC))
|
||||
{
|
||||
jam();
|
||||
disk_page_undo_update(diskPagePtr.p,
|
||||
&key, dst, sz, gci, logfile_group_id);
|
||||
}
|
||||
@ -307,6 +286,7 @@ Dbtup::commit_operation(Signal* signal,
|
||||
|
||||
if(lcpScan_ptr_i != RNIL && (bits & Tuple_header::ALLOC))
|
||||
{
|
||||
jam();
|
||||
ScanOpPtr scanOp;
|
||||
c_scanOpPool.getPtr(scanOp, lcpScan_ptr_i);
|
||||
Local_key rowid = regOperPtr->m_tuple_location;
|
||||
@ -314,6 +294,7 @@ Dbtup::commit_operation(Signal* signal,
|
||||
rowid.m_page_no = pagePtr.p->frag_page_id;
|
||||
if(rowid > scanpos)
|
||||
{
|
||||
jam();
|
||||
copy_bits |= Tuple_header::LCP_SKIP;
|
||||
}
|
||||
}
|
||||
@ -372,7 +353,10 @@ Dbtup::disk_page_commit_callback(Signal* signal,
|
||||
|
||||
execTUP_COMMITREQ(signal);
|
||||
if(signal->theData[0] == 0)
|
||||
{
|
||||
jam();
|
||||
c_lqh->tupcommit_conf_callback(signal, regOperPtr.p->userpointer);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -407,35 +391,21 @@ Dbtup::disk_page_log_buffer_callback(Signal* signal,
|
||||
c_lqh->tupcommit_conf_callback(signal, regOperPtr.p->userpointer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to the first operation performed on this tuple
|
||||
*/
|
||||
void
|
||||
Dbtup::fix_commit_order(OperationrecPtr opPtr)
|
||||
Dbtup::findFirstOp(OperationrecPtr & firstPtr)
|
||||
{
|
||||
ndbassert(!opPtr.p->is_first_operation());
|
||||
OperationrecPtr firstPtr = opPtr;
|
||||
jam();
|
||||
printf("Detect out-of-order commit(%u) -> ", firstPtr.i);
|
||||
ndbassert(!firstPtr.p->is_first_operation());
|
||||
while(firstPtr.p->prevActiveOp != RNIL)
|
||||
{
|
||||
firstPtr.i = firstPtr.p->prevActiveOp;
|
||||
c_operation_pool.getPtr(firstPtr);
|
||||
}
|
||||
|
||||
ndbout_c("fix_commit_order (swapping %d and %d)",
|
||||
opPtr.i, firstPtr.i);
|
||||
|
||||
/**
|
||||
* Swap data between first and curr
|
||||
*/
|
||||
Uint32 prev= opPtr.p->prevActiveOp;
|
||||
Uint32 next= opPtr.p->nextActiveOp;
|
||||
Uint32 seco= firstPtr.p->nextActiveOp;
|
||||
|
||||
Operationrec tmp = *opPtr.p;
|
||||
* opPtr.p = * firstPtr.p;
|
||||
* firstPtr.p = tmp;
|
||||
|
||||
c_operation_pool.getPtr(seco)->prevActiveOp = opPtr.i;
|
||||
c_operation_pool.getPtr(prev)->nextActiveOp = firstPtr.i;
|
||||
if(next != RNIL)
|
||||
c_operation_pool.getPtr(next)->prevActiveOp = firstPtr.i;
|
||||
ndbout_c("%u", firstPtr.i);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------- */
|
||||
@ -448,22 +418,17 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
TablerecPtr regTabPtr;
|
||||
KeyReqStruct req_struct;
|
||||
TransState trans_state;
|
||||
Uint32 no_of_fragrec, no_of_tablerec, hash_value, gci;
|
||||
Uint32 no_of_fragrec, no_of_tablerec;
|
||||
|
||||
TupCommitReq * const tupCommitReq= (TupCommitReq *)signal->getDataPtr();
|
||||
|
||||
regOperPtr.i= tupCommitReq->opPtr;
|
||||
Uint32 hash_value= tupCommitReq->hashValue;
|
||||
Uint32 gci = tupCommitReq->gci;
|
||||
|
||||
jamEntry();
|
||||
|
||||
c_operation_pool.getPtr(regOperPtr);
|
||||
if(!regOperPtr.p->is_first_operation())
|
||||
{
|
||||
/**
|
||||
* Out of order commit XXX check effect on triggers
|
||||
*/
|
||||
fix_commit_order(regOperPtr);
|
||||
}
|
||||
ndbassert(regOperPtr.p->is_first_operation());
|
||||
|
||||
regFragPtr.i= regOperPtr.p->fragmentPtr;
|
||||
trans_state= get_trans_state(regOperPtr.p);
|
||||
@ -486,8 +451,10 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
#ifdef VM_TRACE
|
||||
if (tupCommitReq->diskpage == RNIL)
|
||||
{
|
||||
m_pgman.m_ptr.setNull();
|
||||
req_struct.m_disk_page_ptr.setNull();
|
||||
m_pgman.m_ptr.i = RNIL;
|
||||
m_pgman.m_ptr.p = 0;
|
||||
req_struct.m_disk_page_ptr.i = RNIL;
|
||||
req_struct.m_disk_page_ptr.p = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -496,19 +463,63 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
PagePtr page;
|
||||
Tuple_header* tuple_ptr= (Tuple_header*)
|
||||
get_ptr(&page, ®OperPtr.p->m_tuple_location, regTabPtr.p);
|
||||
|
||||
/**
|
||||
* NOTE: This has to be run before potential time-slice when
|
||||
* waiting for disk, as otherwise the "other-ops" in a multi-op
|
||||
* commit might run while we're waiting for disk
|
||||
*
|
||||
*/
|
||||
if (!regTabPtr.p->tuxCustomTriggers.isEmpty())
|
||||
{
|
||||
if(get_tuple_state(regOperPtr.p) == TUPLE_PREPARED)
|
||||
{
|
||||
jam();
|
||||
|
||||
OperationrecPtr loopPtr = regOperPtr;
|
||||
if (unlikely(!regOperPtr.p->is_first_operation()))
|
||||
{
|
||||
findFirstOp(loopPtr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute all tux triggers at first commit
|
||||
* since previous tuple is otherwise removed...
|
||||
*/
|
||||
jam();
|
||||
goto first;
|
||||
while(loopPtr.i != RNIL)
|
||||
{
|
||||
c_operation_pool.getPtr(loopPtr);
|
||||
first:
|
||||
executeTuxCommitTriggers(signal,
|
||||
loopPtr.p,
|
||||
regFragPtr.p,
|
||||
regTabPtr.p);
|
||||
set_tuple_state(loopPtr.p, TUPLE_TO_BE_COMMITTED);
|
||||
loopPtr.i = loopPtr.p->nextActiveOp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool get_page = false;
|
||||
if(regOperPtr.p->op_struct.m_load_diskpage_on_commit)
|
||||
{
|
||||
jam();
|
||||
Page_cache_client::Request req;
|
||||
ndbassert(regOperPtr.p->is_first_operation() &&
|
||||
regOperPtr.p->is_last_operation());
|
||||
|
||||
/**
|
||||
* Only last op on tuple needs "real" commit,
|
||||
* hence only this one should have m_load_diskpage_on_commit
|
||||
*/
|
||||
ndbassert(tuple_ptr->m_operation_ptr_i == regOperPtr.i);
|
||||
|
||||
/**
|
||||
* Check for page
|
||||
*/
|
||||
if(!regOperPtr.p->m_copy_tuple_location.isNull())
|
||||
{
|
||||
jam();
|
||||
Tuple_header* tmp= (Tuple_header*)
|
||||
c_undo_buffer.get_ptr(®OperPtr.p->m_copy_tuple_location);
|
||||
|
||||
@ -518,23 +529,26 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
if (unlikely(regOperPtr.p->op_struct.op_type == ZDELETE &&
|
||||
tmp->m_header_bits & Tuple_header::DISK_ALLOC))
|
||||
{
|
||||
jam();
|
||||
jam();
|
||||
/**
|
||||
* Insert+Delete
|
||||
*/
|
||||
regOperPtr.p->op_struct.m_load_diskpage_on_commit = 0;
|
||||
regOperPtr.p->op_struct.m_wait_log_buffer = 0;
|
||||
disk_page_abort_prealloc(signal, regFragPtr.p,
|
||||
regOperPtr.p->op_struct.m_load_diskpage_on_commit = 0;
|
||||
regOperPtr.p->op_struct.m_wait_log_buffer = 0;
|
||||
disk_page_abort_prealloc(signal, regFragPtr.p,
|
||||
&req.m_page, req.m_page.m_page_idx);
|
||||
|
||||
c_lgman->free_log_space(regFragPtr.p->m_logfile_group_id,
|
||||
|
||||
c_lgman->free_log_space(regFragPtr.p->m_logfile_group_id,
|
||||
regOperPtr.p->m_undo_buffer_space);
|
||||
if (0) ndbout_c("insert+delete");
|
||||
goto skip_disk;
|
||||
if (0) ndbout_c("insert+delete");
|
||||
jamEntry();
|
||||
goto skip_disk;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
// initial delete
|
||||
ndbassert(regOperPtr.p->op_struct.op_type == ZDELETE);
|
||||
memcpy(&req.m_page,
|
||||
@ -558,11 +572,14 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
/**
|
||||
* Timeslice
|
||||
*/
|
||||
jam();
|
||||
signal->theData[0] = 1;
|
||||
return;
|
||||
case -1:
|
||||
ndbrequire("NOT YET IMPLEMENTED" == 0);
|
||||
break;
|
||||
default:
|
||||
jam();
|
||||
}
|
||||
get_page = true;
|
||||
|
||||
@ -579,8 +596,12 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
|
||||
if(regOperPtr.p->op_struct.m_wait_log_buffer)
|
||||
{
|
||||
ndbassert(regOperPtr.p->is_first_operation() &&
|
||||
regOperPtr.p->is_last_operation());
|
||||
jam();
|
||||
/**
|
||||
* Only last op on tuple needs "real" commit,
|
||||
* hence only this one should have m_wait_log_buffer
|
||||
*/
|
||||
ndbassert(tuple_ptr->m_operation_ptr_i == regOperPtr.i);
|
||||
|
||||
Callback cb;
|
||||
cb.m_callbackData= regOperPtr.i;
|
||||
@ -590,51 +611,39 @@ void Dbtup::execTUP_COMMITREQ(Signal* signal)
|
||||
|
||||
Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
|
||||
int res= lgman.get_log_buffer(signal, sz, &cb);
|
||||
jamEntry();
|
||||
switch(res){
|
||||
case 0:
|
||||
jam();
|
||||
signal->theData[0] = 1;
|
||||
return;
|
||||
case -1:
|
||||
ndbrequire("NOT YET IMPLEMENTED" == 0);
|
||||
break;
|
||||
default:
|
||||
jam();
|
||||
}
|
||||
}
|
||||
|
||||
if(!tuple_ptr)
|
||||
{
|
||||
tuple_ptr = (Tuple_header*)
|
||||
get_ptr(&page, ®OperPtr.p->m_tuple_location,regTabPtr.p);
|
||||
}
|
||||
assert(tuple_ptr);
|
||||
skip_disk:
|
||||
req_struct.m_tuple_ptr = tuple_ptr;
|
||||
|
||||
if(get_tuple_state(regOperPtr.p) == TUPLE_PREPARED)
|
||||
{
|
||||
/**
|
||||
* Execute all tux triggers at first commit
|
||||
* since previous tuple is otherwise removed...
|
||||
* btw...is this a "good" solution??
|
||||
*
|
||||
* why can't we instead remove "own version" (when approriate ofcourse)
|
||||
*/
|
||||
if (!regTabPtr.p->tuxCustomTriggers.isEmpty()) {
|
||||
jam();
|
||||
OperationrecPtr loopPtr= regOperPtr;
|
||||
while(loopPtr.i != RNIL)
|
||||
{
|
||||
c_operation_pool.getPtr(loopPtr);
|
||||
executeTuxCommitTriggers(signal,
|
||||
loopPtr.p,
|
||||
regFragPtr.p,
|
||||
regTabPtr.p);
|
||||
set_tuple_state(loopPtr.p, TUPLE_TO_BE_COMMITTED);
|
||||
loopPtr.i = loopPtr.p->nextActiveOp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(regOperPtr.p->is_last_operation())
|
||||
Uint32 nextOp = regOperPtr.p->nextActiveOp;
|
||||
Uint32 prevOp = regOperPtr.p->prevActiveOp;
|
||||
/**
|
||||
* The trigger code (which is shared between detached/imediate)
|
||||
* check op-list to check were to read before values from
|
||||
* detached triggers should always read from original tuple value
|
||||
* from before transaction start, not from any intermediate update
|
||||
*
|
||||
* Setting the op-list has this effect
|
||||
*/
|
||||
regOperPtr.p->nextActiveOp = RNIL;
|
||||
regOperPtr.p->prevActiveOp = RNIL;
|
||||
if(tuple_ptr->m_operation_ptr_i == regOperPtr.i)
|
||||
{
|
||||
jam();
|
||||
/**
|
||||
* Perform "real" commit
|
||||
*/
|
||||
@ -643,24 +652,38 @@ skip_disk:
|
||||
checkDetachedTriggers(&req_struct, regOperPtr.p, regTabPtr.p,
|
||||
disk != RNIL);
|
||||
|
||||
tuple_ptr->m_operation_ptr_i = RNIL;
|
||||
|
||||
if(regOperPtr.p->op_struct.op_type != ZDELETE)
|
||||
{
|
||||
jam();
|
||||
commit_operation(signal, gci, tuple_ptr, page,
|
||||
regOperPtr.p, regFragPtr.p, regTabPtr.p);
|
||||
removeActiveOpList(regOperPtr.p, tuple_ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
removeActiveOpList(regOperPtr.p, tuple_ptr);
|
||||
jam();
|
||||
if (get_page)
|
||||
ndbassert(tuple_ptr->m_header_bits & Tuple_header::DISK_PART);
|
||||
dealloc_tuple(signal, gci, page.p, tuple_ptr,
|
||||
regOperPtr.p, regFragPtr.p, regTabPtr.p);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
if (nextOp != RNIL)
|
||||
{
|
||||
removeActiveOpList(regOperPtr.p, tuple_ptr);
|
||||
c_operation_pool.getPtr(nextOp)->prevActiveOp = prevOp;
|
||||
}
|
||||
|
||||
if (prevOp != RNIL)
|
||||
{
|
||||
c_operation_pool.getPtr(prevOp)->nextActiveOp = nextOp;
|
||||
}
|
||||
|
||||
if(!regOperPtr.p->m_copy_tuple_location.isNull())
|
||||
{
|
||||
jam();
|
||||
c_undo_buffer.free_copy_tuple(®OperPtr.p->m_copy_tuple_location);
|
||||
}
|
||||
|
||||
initOpConnection(regOperPtr.p);
|
||||
|
@ -282,6 +282,7 @@ Dbtup::update_extent_pos(Disk_alloc_info& alloc,
|
||||
void
|
||||
Dbtup::restart_setup_page(Disk_alloc_info& alloc, PagePtr pagePtr)
|
||||
{
|
||||
jam();
|
||||
/**
|
||||
* Link to extent, clear uncommitted_used_space
|
||||
*/
|
||||
@ -302,6 +303,7 @@ Dbtup::restart_setup_page(Disk_alloc_info& alloc, PagePtr pagePtr)
|
||||
ddassert(real_free >= estimated);
|
||||
if (real_free != estimated)
|
||||
{
|
||||
jam();
|
||||
extentPtr.p->m_free_space += (real_free - estimated);
|
||||
update_extent_pos(alloc, extentPtr);
|
||||
}
|
||||
@ -374,6 +376,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
key->m_file_no= tmp.p->m_file_no;
|
||||
if (DBG_DISK)
|
||||
ndbout << " found dirty page " << *key << endl;
|
||||
jam();
|
||||
return 0; // Page in memory
|
||||
}
|
||||
}
|
||||
@ -395,6 +398,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
* key = req.p->m_key;
|
||||
if (DBG_DISK)
|
||||
ndbout << " found transit page " << *key << endl;
|
||||
jam();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -404,6 +408,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
*/
|
||||
if (!c_page_request_pool.seize(req))
|
||||
{
|
||||
jam();
|
||||
err= 1;
|
||||
//XXX set error code
|
||||
ndbout_c("no free request");
|
||||
@ -468,6 +473,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
|
||||
err = c_lgman->alloc_log_space(logfile_group_id,
|
||||
sizeof(Disk_undo::AllocExtent)>>2);
|
||||
jamEntry();
|
||||
if(unlikely(err))
|
||||
{
|
||||
return -err;
|
||||
@ -568,6 +574,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
Uint32 newPageBits= alloc.calc_page_free_bits(new_size);
|
||||
if (newPageBits != (Uint32)pageBits)
|
||||
{
|
||||
jam();
|
||||
ddassert(ext.p->m_free_page_count[pageBits] > 0);
|
||||
ext.p->m_free_page_count[pageBits]--;
|
||||
ext.p->m_free_page_count[newPageBits]++;
|
||||
@ -595,6 +602,7 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
int flags= Page_cache_client::ALLOC_REQ;
|
||||
if (pageBits == 0)
|
||||
{
|
||||
jam();
|
||||
//XXX empty page -> fast to map
|
||||
flags |= Page_cache_client::EMPTY_PAGE;
|
||||
preq.m_callback.m_callbackFunction =
|
||||
@ -606,11 +614,13 @@ Dbtup::disk_page_prealloc(Signal* signal,
|
||||
switch(res)
|
||||
{
|
||||
case 0:
|
||||
jam();
|
||||
break;
|
||||
case -1:
|
||||
ndbassert(false);
|
||||
break;
|
||||
default:
|
||||
jam();
|
||||
execute(signal, preq.m_callback, res); // run callback
|
||||
}
|
||||
|
||||
@ -622,6 +632,7 @@ Dbtup::disk_page_prealloc_dirty_page(Disk_alloc_info & alloc,
|
||||
PagePtr pagePtr,
|
||||
Uint32 old_idx, Uint32 sz)
|
||||
{
|
||||
jam();
|
||||
ddassert(pagePtr.p->list_index == old_idx);
|
||||
|
||||
Uint32 free= pagePtr.p->free_space;
|
||||
@ -637,6 +648,7 @@ Dbtup::disk_page_prealloc_dirty_page(Disk_alloc_info & alloc,
|
||||
|
||||
if (old_idx != new_idx)
|
||||
{
|
||||
jam();
|
||||
LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
|
||||
LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
|
||||
old_list.remove(pagePtr);
|
||||
@ -660,6 +672,7 @@ Dbtup::disk_page_prealloc_transit_page(Disk_alloc_info& alloc,
|
||||
Ptr<Page_request> req,
|
||||
Uint32 old_idx, Uint32 sz)
|
||||
{
|
||||
jam();
|
||||
ddassert(req.p->m_list_index == old_idx);
|
||||
|
||||
Uint32 free= req.p->m_estimated_free_space;
|
||||
@ -674,6 +687,7 @@ Dbtup::disk_page_prealloc_transit_page(Disk_alloc_info& alloc,
|
||||
|
||||
if (old_idx != new_idx)
|
||||
{
|
||||
jam();
|
||||
Page_request_list::Head *lists = alloc.m_page_requests;
|
||||
Local_page_request_list old_list(c_page_request_pool, lists[old_idx]);
|
||||
Local_page_request_list new_list(c_page_request_pool, lists[new_idx]);
|
||||
@ -698,6 +712,7 @@ void
|
||||
Dbtup::disk_page_prealloc_callback(Signal* signal,
|
||||
Uint32 page_request, Uint32 page_id)
|
||||
{
|
||||
jamEntry();
|
||||
//ndbout_c("disk_alloc_page_callback id: %d", page_id);
|
||||
|
||||
Ptr<Page_request> req;
|
||||
@ -727,6 +742,7 @@ Dbtup::disk_page_prealloc_initial_callback(Signal*signal,
|
||||
Uint32 page_request,
|
||||
Uint32 page_id)
|
||||
{
|
||||
jamEntry();
|
||||
//ndbout_c("disk_alloc_page_callback_initial id: %d", page_id);
|
||||
/**
|
||||
* 1) lookup page request
|
||||
@ -818,6 +834,7 @@ Dbtup::disk_page_prealloc_callback_common(Signal* signal,
|
||||
|
||||
if (old_idx != new_idx || free != real_free)
|
||||
{
|
||||
jam();
|
||||
Ptr<Extent_info> extentPtr;
|
||||
c_extent_pool.getPtr(extentPtr, ext);
|
||||
|
||||
@ -825,6 +842,7 @@ Dbtup::disk_page_prealloc_callback_common(Signal* signal,
|
||||
|
||||
if (old_idx != new_idx)
|
||||
{
|
||||
jam();
|
||||
ddassert(extentPtr.p->m_free_page_count[old_idx]);
|
||||
extentPtr.p->m_free_page_count[old_idx]--;
|
||||
extentPtr.p->m_free_page_count[new_idx]++;
|
||||
@ -843,9 +861,11 @@ Dbtup::disk_page_prealloc_callback_common(Signal* signal,
|
||||
void
|
||||
Dbtup::disk_page_set_dirty(PagePtr pagePtr)
|
||||
{
|
||||
jam();
|
||||
Uint32 idx = pagePtr.p->list_index;
|
||||
if ((idx & 0x8000) == 0)
|
||||
{
|
||||
jam();
|
||||
/**
|
||||
* Already in dirty list
|
||||
*/
|
||||
@ -874,7 +894,6 @@ Dbtup::disk_page_set_dirty(PagePtr pagePtr)
|
||||
Uint32 used = pagePtr.p->uncommitted_used_space;
|
||||
if (unlikely(pagePtr.p->m_restart_seq != globalData.m_restart_seq))
|
||||
{
|
||||
jam();
|
||||
restart_setup_page(alloc, pagePtr);
|
||||
idx = alloc.calc_page_free_bits(free);
|
||||
used = 0;
|
||||
@ -918,6 +937,7 @@ Dbtup::disk_page_unmap_callback(Uint32 when,
|
||||
type != File_formats::PT_Tup_varsize_page) ||
|
||||
f_undo_done == false))
|
||||
{
|
||||
jam();
|
||||
return ;
|
||||
}
|
||||
|
||||
@ -1014,6 +1034,7 @@ Dbtup::disk_page_unmap_callback(Uint32 when,
|
||||
<< endl;
|
||||
}
|
||||
tsman.update_page_free_bits(&key, alloc.calc_page_free_bits(real_free));
|
||||
jamEntry();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1022,6 +1043,7 @@ Dbtup::disk_page_alloc(Signal* signal,
|
||||
Tablerec* tabPtrP, Fragrecord* fragPtrP,
|
||||
Local_key* key, PagePtr pagePtr, Uint32 gci)
|
||||
{
|
||||
jam();
|
||||
Uint32 logfile_group_id= fragPtrP->m_logfile_group_id;
|
||||
Disk_alloc_info& alloc= fragPtrP->m_disk_alloc_info;
|
||||
|
||||
@ -1050,6 +1072,7 @@ Dbtup::disk_page_free(Signal *signal,
|
||||
Tablerec *tabPtrP, Fragrecord * fragPtrP,
|
||||
Local_key* key, PagePtr pagePtr, Uint32 gci)
|
||||
{
|
||||
jam();
|
||||
if (DBG_DISK)
|
||||
ndbout << " disk_page_free " << *key << endl;
|
||||
|
||||
@ -1100,6 +1123,7 @@ Dbtup::disk_page_free(Signal *signal,
|
||||
|
||||
if (old_idx != new_idx)
|
||||
{
|
||||
jam();
|
||||
ddassert(extentPtr.p->m_free_page_count[old_idx]);
|
||||
extentPtr.p->m_free_page_count[old_idx]--;
|
||||
extentPtr.p->m_free_page_count[new_idx]++;
|
||||
@ -1126,6 +1150,7 @@ void
|
||||
Dbtup::disk_page_abort_prealloc(Signal *signal, Fragrecord* fragPtrP,
|
||||
Local_key* key, Uint32 sz)
|
||||
{
|
||||
jam();
|
||||
Page_cache_client::Request req;
|
||||
req.m_callback.m_callbackData= sz;
|
||||
req.m_callback.m_callbackFunction =
|
||||
@ -1139,9 +1164,13 @@ Dbtup::disk_page_abort_prealloc(Signal *signal, Fragrecord* fragPtrP,
|
||||
switch(res)
|
||||
{
|
||||
case 0:
|
||||
jam();
|
||||
break;
|
||||
case -1:
|
||||
ndbrequire(false);
|
||||
break;
|
||||
default:
|
||||
jam();
|
||||
Ptr<GlobalPage> gpage;
|
||||
m_global_page_pool.getPtr(gpage, (Uint32)res);
|
||||
PagePtr pagePtr;
|
||||
@ -1157,7 +1186,7 @@ Dbtup::disk_page_abort_prealloc_callback(Signal* signal,
|
||||
Uint32 sz, Uint32 page_id)
|
||||
{
|
||||
//ndbout_c("disk_alloc_page_callback id: %d", page_id);
|
||||
|
||||
jamEntry();
|
||||
Ptr<GlobalPage> gpage;
|
||||
m_global_page_pool.getPtr(gpage, page_id);
|
||||
|
||||
@ -1200,12 +1229,14 @@ Dbtup::disk_page_abort_prealloc_callback_1(Signal* signal,
|
||||
c_extent_pool.getPtr(extentPtr, ext);
|
||||
if (old_idx != new_idx)
|
||||
{
|
||||
jam();
|
||||
ddassert(extentPtr.p->m_free_page_count[old_idx]);
|
||||
extentPtr.p->m_free_page_count[old_idx]--;
|
||||
extentPtr.p->m_free_page_count[new_idx]++;
|
||||
|
||||
if (old_idx == page_idx)
|
||||
{
|
||||
jam();
|
||||
ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
|
||||
LocalDLList<Page> old_list(*pool, alloc.m_dirty_pages[old_idx]);
|
||||
LocalDLList<Page> new_list(*pool, alloc.m_dirty_pages[new_idx]);
|
||||
@ -1215,6 +1246,7 @@ Dbtup::disk_page_abort_prealloc_callback_1(Signal* signal,
|
||||
}
|
||||
else
|
||||
{
|
||||
jam();
|
||||
pagePtr.p->list_index = new_idx | 0x8000;
|
||||
}
|
||||
}
|
||||
@ -1272,6 +1304,7 @@ Uint64
|
||||
Dbtup::disk_page_undo_alloc(Page* page, const Local_key* key,
|
||||
Uint32 sz, Uint32 gci, Uint32 logfile_group_id)
|
||||
{
|
||||
jam();
|
||||
Logfile_client lgman(this, c_lgman, logfile_group_id);
|
||||
|
||||
Disk_undo::Alloc alloc;
|
||||
@ -1293,6 +1326,7 @@ Dbtup::disk_page_undo_update(Page* page, const Local_key* key,
|
||||
const Uint32* src, Uint32 sz,
|
||||
Uint32 gci, Uint32 logfile_group_id)
|
||||
{
|
||||
jam();
|
||||
Logfile_client lgman(this, c_lgman, logfile_group_id);
|
||||
|
||||
Disk_undo::Update update;
|
||||
@ -1323,6 +1357,7 @@ Dbtup::disk_page_undo_free(Page* page, const Local_key* key,
|
||||
const Uint32* src, Uint32 sz,
|
||||
Uint32 gci, Uint32 logfile_group_id)
|
||||
{
|
||||
jam();
|
||||
Logfile_client lgman(this, c_lgman, logfile_group_id);
|
||||
|
||||
Disk_undo::Free free;
|
||||
|
@ -75,9 +75,17 @@ void Dbtup::copyAttrinfo(Operationrec * regOperPtr,
|
||||
jam();
|
||||
ndbrequire(copyAttrBufPtr.i < RnoOfAttrBufrec);
|
||||
ptrAss(copyAttrBufPtr, attrbufrec);
|
||||
RbufLen= copyAttrBufPtr.p->attrbuf[ZBUF_DATA_LEN];
|
||||
Rnext= copyAttrBufPtr.p->attrbuf[ZBUF_NEXT];
|
||||
Rfirst= cfirstfreeAttrbufrec;
|
||||
RbufLen = copyAttrBufPtr.p->attrbuf[ZBUF_DATA_LEN];
|
||||
Rnext = copyAttrBufPtr.p->attrbuf[ZBUF_NEXT];
|
||||
Rfirst = cfirstfreeAttrbufrec;
|
||||
/*
|
||||
* ATTRINFO comes from 2 mutually exclusive places:
|
||||
* 1) TUPKEYREQ (also interpreted part)
|
||||
* 2) STORED_PROCREQ before scan start
|
||||
* Assert here that both have a check for overflow.
|
||||
* The "<" instead of "<=" is intentional.
|
||||
*/
|
||||
ndbrequire(RinBufIndex + RbufLen < ZATTR_BUFFER_SIZE);
|
||||
MEMCOPY_NO_WORDS(&inBuffer[RinBufIndex],
|
||||
©AttrBufPtr.p->attrbuf[0],
|
||||
RbufLen);
|
||||
@ -221,7 +229,7 @@ Dbtup::calculateChecksum(Tuple_header* tuple_ptr,
|
||||
// includes tupVersion
|
||||
//printf("%p - ", tuple_ptr);
|
||||
|
||||
for (i= 0; i < rec_size-2; i++) {
|
||||
for (i= 0; i < rec_size-Tuple_header::HeaderSize; i++) {
|
||||
checksum ^= tuple_header[i];
|
||||
//printf("%.8x ", tuple_header[i]);
|
||||
}
|
||||
@ -358,21 +366,7 @@ Dbtup::setup_read(KeyReqStruct *req_struct,
|
||||
dirty= false;
|
||||
}
|
||||
|
||||
OperationrecPtr prevOpPtr = currOpPtr;
|
||||
bool found= false;
|
||||
while(true)
|
||||
{
|
||||
if (savepointId > currOpPtr.p->savepointId) {
|
||||
found= true;
|
||||
break;
|
||||
}
|
||||
if (currOpPtr.p->is_first_operation()){
|
||||
break;
|
||||
}
|
||||
prevOpPtr= currOpPtr;
|
||||
currOpPtr.i = currOpPtr.p->prevActiveOp;
|
||||
c_operation_pool.getPtr(currOpPtr);
|
||||
}
|
||||
bool found= find_savepoint(currOpPtr, savepointId);
|
||||
|
||||
Uint32 currOp= currOpPtr.p->op_struct.op_type;
|
||||
|
||||
@ -763,7 +757,8 @@ void Dbtup::execTUPKEYREQ(Signal* signal)
|
||||
}
|
||||
checkImmediateTriggersAfterInsert(&req_struct,
|
||||
regOperPtr,
|
||||
regTabPtr);
|
||||
regTabPtr,
|
||||
disk_page != RNIL);
|
||||
set_change_mask_state(regOperPtr, SET_ALL_MASK);
|
||||
sendTUPKEYCONF(signal, &req_struct, regOperPtr);
|
||||
return;
|
||||
@ -796,7 +791,8 @@ void Dbtup::execTUPKEYREQ(Signal* signal)
|
||||
}
|
||||
checkImmediateTriggersAfterUpdate(&req_struct,
|
||||
regOperPtr,
|
||||
regTabPtr);
|
||||
regTabPtr,
|
||||
disk_page != RNIL);
|
||||
// XXX use terrorCode for now since all methods are void
|
||||
if (terrorCode != 0)
|
||||
{
|
||||
@ -827,7 +823,8 @@ void Dbtup::execTUPKEYREQ(Signal* signal)
|
||||
*/
|
||||
checkImmediateTriggersAfterDelete(&req_struct,
|
||||
regOperPtr,
|
||||
regTabPtr);
|
||||
regTabPtr,
|
||||
disk_page != RNIL);
|
||||
set_change_mask_state(regOperPtr, DELETE_CHANGES);
|
||||
sendTUPKEYCONF(signal, &req_struct, regOperPtr);
|
||||
return;
|
||||
@ -1506,32 +1503,22 @@ int Dbtup::handleDeleteReq(Signal* signal,
|
||||
else
|
||||
{
|
||||
regOperPtr->tupVersion= req_struct->m_tuple_ptr->get_tuple_version();
|
||||
if(regTabPtr->m_no_of_disk_attributes)
|
||||
}
|
||||
|
||||
if(disk && regOperPtr->m_undo_buffer_space == 0)
|
||||
{
|
||||
regOperPtr->op_struct.m_wait_log_buffer = 1;
|
||||
regOperPtr->op_struct.m_load_diskpage_on_commit = 1;
|
||||
Uint32 sz= regOperPtr->m_undo_buffer_space=
|
||||
(sizeof(Dbtup::Disk_undo::Free) >> 2) +
|
||||
regTabPtr->m_offsets[DD].m_fix_header_size - 1;
|
||||
|
||||
terrorCode= c_lgman->alloc_log_space(regFragPtr->m_logfile_group_id,
|
||||
sz);
|
||||
if(unlikely(terrorCode))
|
||||
{
|
||||
Uint32 sz;
|
||||
if(regTabPtr->m_attributes[DD].m_no_of_varsize)
|
||||
{
|
||||
/**
|
||||
* Need to have page in memory to read size
|
||||
* to alloc undo space
|
||||
*/
|
||||
abort();
|
||||
}
|
||||
else
|
||||
sz= (sizeof(Dbtup::Disk_undo::Free) >> 2) +
|
||||
regTabPtr->m_offsets[DD].m_fix_header_size - 1;
|
||||
|
||||
regOperPtr->m_undo_buffer_space= sz;
|
||||
|
||||
int res;
|
||||
if((res= c_lgman->alloc_log_space(regFragPtr->m_logfile_group_id,
|
||||
sz)))
|
||||
{
|
||||
terrorCode= res;
|
||||
regOperPtr->m_undo_buffer_space= 0;
|
||||
goto error;
|
||||
}
|
||||
|
||||
regOperPtr->m_undo_buffer_space= 0;
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
if (req_struct->attrinfo_len == 0)
|
||||
@ -1540,7 +1527,9 @@ int Dbtup::handleDeleteReq(Signal* signal,
|
||||
}
|
||||
|
||||
if (regTabPtr->need_expand(disk))
|
||||
{
|
||||
prepare_read(req_struct, regTabPtr, disk);
|
||||
}
|
||||
|
||||
{
|
||||
Uint32 RlogSize;
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#define DBTUP_C
|
||||
#define DBTUP_INDEX_CPP
|
||||
#include <Dblqh.hpp>
|
||||
#include "Dbtup.hpp"
|
||||
#include <RefConvert.hpp>
|
||||
#include <ndb_limits.h>
|
||||
@ -319,13 +320,25 @@ Dbtup::accReadPk(Uint32 tableId, Uint32 fragId, Uint32 fragPageId, Uint32 pageIn
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* TUX index contains all tuple versions. A scan in TUX has scanned
|
||||
* one of them and asks if it can be returned as scan result. This
|
||||
* depends on trans id, dirty read flag, and savepoint within trans.
|
||||
*
|
||||
* Previously this faked a ZREAD operation and used getPage().
|
||||
* In TUP getPage() is run after ACC locking, but TUX comes here
|
||||
* before ACC access. Instead of modifying getPage() it is more
|
||||
* clear to do the full check here.
|
||||
*/
|
||||
bool
|
||||
Dbtup::tuxQueryTh(Uint32 fragPtrI,
|
||||
Uint32 tupAddr,
|
||||
Uint32 pageId,
|
||||
Uint32 pageIndex,
|
||||
Uint32 tupVersion,
|
||||
Uint32 transId1,
|
||||
Uint32 transId2,
|
||||
Uint32 savePointId)
|
||||
bool dirty,
|
||||
Uint32 savepointId)
|
||||
{
|
||||
jamEntry();
|
||||
FragrecordPtr fragPtr;
|
||||
@ -334,35 +347,83 @@ Dbtup::tuxQueryTh(Uint32 fragPtrI,
|
||||
TablerecPtr tablePtr;
|
||||
tablePtr.i= fragPtr.p->fragTableId;
|
||||
ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec);
|
||||
// get page
|
||||
Uint32 fragPageId= tupAddr >> MAX_TUPLES_BITS;
|
||||
Uint32 pageIndex= tupAddr & ((1 << MAX_TUPLES_BITS ) - 1);
|
||||
// use temp op rec
|
||||
Operationrec tempOp;
|
||||
PagePtr pagePtr;
|
||||
pagePtr.i = pageId;
|
||||
c_page_pool.getPtr(pagePtr);
|
||||
|
||||
KeyReqStruct req_struct;
|
||||
tempOp.m_tuple_location.m_page_no= getRealpid(fragPtr.p, fragPageId);
|
||||
tempOp.m_tuple_location.m_page_idx= pageIndex;
|
||||
tempOp.savepointId= savePointId;
|
||||
tempOp.op_struct.op_type= ZREAD;
|
||||
req_struct.frag_page_id= fragPageId;
|
||||
req_struct.trans_id1= transId1;
|
||||
req_struct.trans_id2= transId2;
|
||||
req_struct.dirty_op= 1;
|
||||
|
||||
setup_fixed_part(&req_struct, &tempOp, tablePtr.p);
|
||||
if (setup_read(&req_struct, &tempOp, fragPtr.p, tablePtr.p, false)) {
|
||||
/*
|
||||
* We use the normal getPage which will return the tuple to be used
|
||||
* for this transaction and savepoint id. If its tuple version
|
||||
* equals the requested then we have a visible tuple otherwise not.
|
||||
*/
|
||||
|
||||
{
|
||||
Operationrec tmpOp;
|
||||
tmpOp.m_tuple_location.m_page_no = pageId;
|
||||
tmpOp.m_tuple_location.m_page_idx = pageIndex;
|
||||
setup_fixed_part(&req_struct, &tmpOp, tablePtr.p);
|
||||
}
|
||||
|
||||
Tuple_header* tuple_ptr = req_struct.m_tuple_ptr;
|
||||
|
||||
OperationrecPtr currOpPtr;
|
||||
currOpPtr.i = tuple_ptr->m_operation_ptr_i;
|
||||
if (currOpPtr.i == RNIL) {
|
||||
jam();
|
||||
if (req_struct.m_tuple_ptr->get_tuple_version() == tupVersion) {
|
||||
// tuple has no operation, any scan can see it
|
||||
return true;
|
||||
}
|
||||
c_operation_pool.getPtr(currOpPtr);
|
||||
|
||||
const bool sameTrans =
|
||||
c_lqh->is_same_trans(currOpPtr.p->userpointer, transId1, transId2);
|
||||
|
||||
bool res = false;
|
||||
OperationrecPtr loopOpPtr = currOpPtr;
|
||||
|
||||
if (!sameTrans) {
|
||||
jam();
|
||||
if (!dirty) {
|
||||
jam();
|
||||
return true;
|
||||
if (currOpPtr.p->nextActiveOp == RNIL) {
|
||||
jam();
|
||||
// last op - TUX makes ACC lock request in same timeslice
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// loop to first op (returns false)
|
||||
find_savepoint(loopOpPtr, 0);
|
||||
const Uint32 op_type = loopOpPtr.p->op_struct.op_type;
|
||||
|
||||
if (op_type != ZINSERT) {
|
||||
jam();
|
||||
// read committed version
|
||||
const Uint32 origVersion = tuple_ptr->get_tuple_version();
|
||||
if (origVersion == tupVersion) {
|
||||
jam();
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
else {
|
||||
jam();
|
||||
// for own trans, ignore dirty flag
|
||||
|
||||
if (find_savepoint(loopOpPtr, savepointId)) {
|
||||
jam();
|
||||
const Uint32 op_type = loopOpPtr.p->op_struct.op_type;
|
||||
|
||||
if (op_type != ZDELETE) {
|
||||
jam();
|
||||
// check if this op has produced the scanned version
|
||||
Uint32 loopVersion = loopOpPtr.p->tupVersion;
|
||||
if (loopVersion == tupVersion) {
|
||||
jam();
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// ordered index build
|
||||
|
@ -54,7 +54,14 @@ Dbtup::execACC_SCANREQ(Signal* signal)
|
||||
// flags
|
||||
Uint32 bits = 0;
|
||||
|
||||
if (!AccScanReq::getLcpScanFlag(req->requestInfo))
|
||||
|
||||
if (AccScanReq::getLcpScanFlag(req->requestInfo))
|
||||
{
|
||||
jam();
|
||||
bits |= ScanOp::SCAN_LCP;
|
||||
c_scanOpPool.getPtr(scanPtr, c_lcp_scan_op);
|
||||
}
|
||||
else
|
||||
{
|
||||
// seize from pool and link to per-fragment list
|
||||
LocalDLList<ScanOp> list(c_scanOpPool, frag.m_scanList);
|
||||
@ -62,37 +69,26 @@ Dbtup::execACC_SCANREQ(Signal* signal)
|
||||
jam();
|
||||
break;
|
||||
}
|
||||
|
||||
if (!AccScanReq::getNoDiskScanFlag(req->requestInfo)
|
||||
&& tablePtr.p->m_no_of_disk_attributes)
|
||||
{
|
||||
bits |= ScanOp::SCAN_DD;
|
||||
}
|
||||
}
|
||||
|
||||
if (!AccScanReq::getNoDiskScanFlag(req->requestInfo)
|
||||
&& tablePtr.p->m_no_of_disk_attributes)
|
||||
{
|
||||
bits |= ScanOp::SCAN_DD;
|
||||
}
|
||||
|
||||
bool mm = (bits & ScanOp::SCAN_DD);
|
||||
if (tablePtr.p->m_attributes[mm].m_no_of_varsize > 0) {
|
||||
bits |= ScanOp::SCAN_VS;
|
||||
|
||||
bool mm = (bits & ScanOp::SCAN_DD);
|
||||
if (tablePtr.p->m_attributes[mm].m_no_of_varsize > 0) {
|
||||
bits |= ScanOp::SCAN_VS;
|
||||
|
||||
// disk pages have fixed page format
|
||||
ndbrequire(! (bits & ScanOp::SCAN_DD));
|
||||
}
|
||||
if (! AccScanReq::getReadCommittedFlag(req->requestInfo)) {
|
||||
if (AccScanReq::getLockMode(req->requestInfo) == 0)
|
||||
bits |= ScanOp::SCAN_LOCK_SH;
|
||||
else
|
||||
bits |= ScanOp::SCAN_LOCK_EX;
|
||||
}
|
||||
} else {
|
||||
jam();
|
||||
// LCP scan and disk
|
||||
|
||||
ndbrequire(frag.m_lcp_scan_op == c_lcp_scan_op);
|
||||
c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op);
|
||||
ndbrequire(scanPtr.p->m_fragPtrI == fragPtr.i);
|
||||
bits |= ScanOp::SCAN_LCP;
|
||||
if (tablePtr.p->m_attributes[MM].m_no_of_varsize > 0) {
|
||||
bits |= ScanOp::SCAN_VS;
|
||||
}
|
||||
// disk pages have fixed page format
|
||||
ndbrequire(! (bits & ScanOp::SCAN_DD));
|
||||
}
|
||||
if (! AccScanReq::getReadCommittedFlag(req->requestInfo)) {
|
||||
if (AccScanReq::getLockMode(req->requestInfo) == 0)
|
||||
bits |= ScanOp::SCAN_LOCK_SH;
|
||||
else
|
||||
bits |= ScanOp::SCAN_LOCK_EX;
|
||||
}
|
||||
|
||||
if (AccScanReq::getNRScanFlag(req->requestInfo))
|
||||
@ -112,6 +108,13 @@ Dbtup::execACC_SCANREQ(Signal* signal)
|
||||
jam();
|
||||
scanPtr.p->m_endPage = RNIL;
|
||||
}
|
||||
|
||||
if (AccScanReq::getLcpScanFlag(req->requestInfo))
|
||||
{
|
||||
jam();
|
||||
ndbrequire((bits & ScanOp::SCAN_DD) == 0);
|
||||
ndbrequire((bits & ScanOp::SCAN_LOCK) == 0);
|
||||
}
|
||||
|
||||
// set up scan op
|
||||
new (scanPtr.p) ScanOp();
|
||||
@ -618,6 +621,24 @@ Dbtup::scanNext(Signal* signal, ScanOpPtr scanPtr)
|
||||
|
||||
if (lcp && lcp_list != RNIL)
|
||||
goto found_lcp_keep;
|
||||
|
||||
switch(pos.m_get){
|
||||
case ScanPos::Get_next_tuple:
|
||||
case ScanPos::Get_next_tuple_fs:
|
||||
jam();
|
||||
key.m_page_idx += size;
|
||||
// fall through
|
||||
case ScanPos::Get_tuple:
|
||||
case ScanPos::Get_tuple_fs:
|
||||
jam();
|
||||
/**
|
||||
* We need to refetch page after timeslice
|
||||
*/
|
||||
pos.m_get = ScanPos::Get_page;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
switch (pos.m_get) {
|
||||
@ -1141,16 +1162,17 @@ Dbtup::releaseScanOp(ScanOpPtr& scanPtr)
|
||||
fragPtr.i = scanPtr.p->m_fragPtrI;
|
||||
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
|
||||
|
||||
if(! (scanPtr.p->m_bits & ScanOp::SCAN_LCP))
|
||||
if(scanPtr.p->m_bits & ScanOp::SCAN_LCP)
|
||||
{
|
||||
LocalDLList<ScanOp> list(c_scanOpPool, fragPtr.p->m_scanList);
|
||||
list.release(scanPtr);
|
||||
jam();
|
||||
fragPtr.p->m_lcp_scan_op = RNIL;
|
||||
scanPtr.p->m_fragPtrI = RNIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ndbrequire(fragPtr.p->m_lcp_scan_op == scanPtr.i);
|
||||
fragPtr.p->m_lcp_scan_op = RNIL;
|
||||
scanPtr.p->m_fragPtrI = RNIL;
|
||||
jam();
|
||||
LocalDLList<ScanOp> list(c_scanOpPool, fragPtr.p->m_scanList);
|
||||
list.release(scanPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1163,21 +1185,24 @@ Dbtup::execLCP_FRAG_ORD(Signal* signal)
|
||||
tablePtr.i = req->tableId;
|
||||
ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec);
|
||||
|
||||
jam();
|
||||
FragrecordPtr fragPtr;
|
||||
Uint32 fragId = req->fragmentId;
|
||||
fragPtr.i = RNIL;
|
||||
getFragmentrec(fragPtr, fragId, tablePtr.p);
|
||||
ndbrequire(fragPtr.i != RNIL);
|
||||
Fragrecord& frag = *fragPtr.p;
|
||||
|
||||
ndbrequire(frag.m_lcp_scan_op == RNIL && c_lcp_scan_op != RNIL);
|
||||
frag.m_lcp_scan_op = c_lcp_scan_op;
|
||||
ScanOpPtr scanPtr;
|
||||
c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op);
|
||||
ndbrequire(scanPtr.p->m_fragPtrI == RNIL);
|
||||
scanPtr.p->m_fragPtrI = fragPtr.i;
|
||||
|
||||
scanFirst(signal, scanPtr);
|
||||
scanPtr.p->m_state = ScanOp::First;
|
||||
if (tablePtr.p->m_no_of_disk_attributes)
|
||||
{
|
||||
jam();
|
||||
FragrecordPtr fragPtr;
|
||||
Uint32 fragId = req->fragmentId;
|
||||
fragPtr.i = RNIL;
|
||||
getFragmentrec(fragPtr, fragId, tablePtr.p);
|
||||
ndbrequire(fragPtr.i != RNIL);
|
||||
Fragrecord& frag = *fragPtr.p;
|
||||
|
||||
ndbrequire(frag.m_lcp_scan_op == RNIL && c_lcp_scan_op != RNIL);
|
||||
frag.m_lcp_scan_op = c_lcp_scan_op;
|
||||
ScanOpPtr scanPtr;
|
||||
c_scanOpPool.getPtr(scanPtr, frag.m_lcp_scan_op);
|
||||
ndbrequire(scanPtr.p->m_fragPtrI == RNIL);
|
||||
scanPtr.p->m_fragPtrI = fragPtr.i;
|
||||
|
||||
scanFirst(signal, scanPtr);
|
||||
scanPtr.p->m_state = ScanOp::First;
|
||||
}
|
||||
}
|
||||
|
@ -106,6 +106,11 @@ void Dbtup::scanProcedure(Signal* signal,
|
||||
regOperPtr->attrinbufLen = lenAttrInfo;
|
||||
regOperPtr->currentAttrinbufLen = 0;
|
||||
regOperPtr->storedProcPtr = storedPtr.i;
|
||||
if (lenAttrInfo >= ZATTR_BUFFER_SIZE) { // yes ">="
|
||||
jam();
|
||||
// send REF and change state to ignore the ATTRINFO to come
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr, ZSTORED_TOO_MUCH_ATTRINFO_ERROR);
|
||||
}
|
||||
}//Dbtup::scanProcedure()
|
||||
|
||||
void Dbtup::copyProcedure(Signal* signal,
|
||||
@ -146,7 +151,7 @@ bool Dbtup::storedProcedureAttrInfo(Signal* signal,
|
||||
Uint32 RnoFree = cnoFreeAttrbufrec;
|
||||
if (ERROR_INSERTED(4004) && !copyProcedure) {
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr, ZSTORED_SEIZE_ATTRINBUFREC_ERROR);
|
||||
return false;
|
||||
}//if
|
||||
regOperPtr->currentAttrinbufLen += length;
|
||||
@ -162,7 +167,7 @@ bool Dbtup::storedProcedureAttrInfo(Signal* signal,
|
||||
regAttrPtr.p->attrbuf[ZBUF_NEXT] = RNIL;
|
||||
} else {
|
||||
jam();
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr, ZSTORED_SEIZE_ATTRINBUFREC_ERROR);
|
||||
return false;
|
||||
}//if
|
||||
if (regOperPtr->firstAttrinbufrec == RNIL) {
|
||||
@ -190,7 +195,7 @@ bool Dbtup::storedProcedureAttrInfo(Signal* signal,
|
||||
}//if
|
||||
if (ERROR_INSERTED(4005) && !copyProcedure) {
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
|
||||
storedSeizeAttrinbufrecErrorLab(signal, regOperPtr, ZSTORED_SEIZE_ATTRINBUFREC_ERROR);
|
||||
return false;
|
||||
}//if
|
||||
|
||||
@ -212,7 +217,8 @@ bool Dbtup::storedProcedureAttrInfo(Signal* signal,
|
||||
}//Dbtup::storedProcedureAttrInfo()
|
||||
|
||||
void Dbtup::storedSeizeAttrinbufrecErrorLab(Signal* signal,
|
||||
Operationrec* regOperPtr)
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 errorCode)
|
||||
{
|
||||
StoredProcPtr storedPtr;
|
||||
c_storedProcPool.getPtr(storedPtr, regOperPtr->storedProcPtr);
|
||||
@ -224,7 +230,7 @@ void Dbtup::storedSeizeAttrinbufrecErrorLab(Signal* signal,
|
||||
regOperPtr->m_any_value = 0;
|
||||
set_trans_state(regOperPtr, TRANS_ERROR_WAIT_STORED_PROCREQ);
|
||||
signal->theData[0] = regOperPtr->userpointer;
|
||||
signal->theData[1] = ZSTORED_SEIZE_ATTRINBUFREC_ERROR;
|
||||
signal->theData[1] = errorCode;
|
||||
signal->theData[2] = regOperPtr->storedProcPtr;
|
||||
sendSignal(DBLQH_REF, GSN_STORED_PROCREF, signal, 3, JBB);
|
||||
}//Dbtup::storedSeizeAttrinbufrecErrorLab()
|
||||
|
@ -369,7 +369,8 @@ Dbtup::dropTrigger(Tablerec* table, const DropTrigReq* req, BlockNumber sender)
|
||||
void
|
||||
Dbtup::checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct,
|
||||
Operationrec *regOperPtr,
|
||||
Tablerec *regTablePtr)
|
||||
Tablerec *regTablePtr,
|
||||
bool disk)
|
||||
{
|
||||
if(refToBlock(req_struct->TC_ref) != DBTC) {
|
||||
return;
|
||||
@ -380,14 +381,16 @@ Dbtup::checkImmediateTriggersAfterInsert(KeyReqStruct *req_struct,
|
||||
jam();
|
||||
fireImmediateTriggers(req_struct,
|
||||
regTablePtr->afterInsertTriggers,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Dbtup::checkImmediateTriggersAfterUpdate(KeyReqStruct *req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Tablerec* regTablePtr)
|
||||
Tablerec* regTablePtr,
|
||||
bool disk)
|
||||
{
|
||||
if(refToBlock(req_struct->TC_ref) != DBTC) {
|
||||
return;
|
||||
@ -398,21 +401,24 @@ Dbtup::checkImmediateTriggersAfterUpdate(KeyReqStruct *req_struct,
|
||||
jam();
|
||||
fireImmediateTriggers(req_struct,
|
||||
regTablePtr->afterUpdateTriggers,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
}
|
||||
if ((regOperPtr->op_struct.primary_replica) &&
|
||||
(!(regTablePtr->constraintUpdateTriggers.isEmpty()))) {
|
||||
jam();
|
||||
fireImmediateTriggers(req_struct,
|
||||
regTablePtr->constraintUpdateTriggers,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Dbtup::checkImmediateTriggersAfterDelete(KeyReqStruct *req_struct,
|
||||
Operationrec* regOperPtr,
|
||||
Tablerec* regTablePtr)
|
||||
Tablerec* regTablePtr,
|
||||
bool disk)
|
||||
{
|
||||
if(refToBlock(req_struct->TC_ref) != DBTC) {
|
||||
return;
|
||||
@ -423,7 +429,8 @@ Dbtup::checkImmediateTriggersAfterDelete(KeyReqStruct *req_struct,
|
||||
jam();
|
||||
executeTriggers(req_struct,
|
||||
regTablePtr->afterDeleteTriggers,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
}
|
||||
}
|
||||
|
||||
@ -547,7 +554,8 @@ end:
|
||||
void
|
||||
Dbtup::fireImmediateTriggers(KeyReqStruct *req_struct,
|
||||
DLList<TupTriggerData>& triggerList,
|
||||
Operationrec* const regOperPtr)
|
||||
Operationrec* const regOperPtr,
|
||||
bool disk)
|
||||
{
|
||||
TriggerPtr trigPtr;
|
||||
triggerList.first(trigPtr);
|
||||
@ -558,7 +566,8 @@ Dbtup::fireImmediateTriggers(KeyReqStruct *req_struct,
|
||||
jam();
|
||||
executeTrigger(req_struct,
|
||||
trigPtr.p,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
}//if
|
||||
triggerList.next(trigPtr);
|
||||
}//while
|
||||
@ -621,7 +630,8 @@ Dbtup::fireDetachedTriggers(KeyReqStruct *req_struct,
|
||||
|
||||
void Dbtup::executeTriggers(KeyReqStruct *req_struct,
|
||||
DLList<TupTriggerData>& triggerList,
|
||||
Operationrec* regOperPtr)
|
||||
Operationrec* regOperPtr,
|
||||
bool disk)
|
||||
{
|
||||
TriggerPtr trigPtr;
|
||||
triggerList.first(trigPtr);
|
||||
@ -629,7 +639,8 @@ void Dbtup::executeTriggers(KeyReqStruct *req_struct,
|
||||
jam();
|
||||
executeTrigger(req_struct,
|
||||
trigPtr.p,
|
||||
regOperPtr);
|
||||
regOperPtr,
|
||||
disk);
|
||||
triggerList.next(trigPtr);
|
||||
|
||||
}
|
||||
|
@ -986,7 +986,8 @@ Dbtux::scanVisible(ScanOpPtr scanPtr, TreeEnt ent)
|
||||
const ScanOp& scan = *scanPtr.p;
|
||||
const Frag& frag = *c_fragPool.getPtr(scan.m_fragPtrI);
|
||||
Uint32 tableFragPtrI = frag.m_tupTableFragPtrI;
|
||||
Uint32 tupAddr = getTupAddr(frag, ent);
|
||||
Uint32 pageId = ent.m_tupLoc.getPageId();
|
||||
Uint32 pageOffset = ent.m_tupLoc.getPageOffset();
|
||||
Uint32 tupVersion = ent.m_tupVersion;
|
||||
// check for same tuple twice in row
|
||||
if (scan.m_scanEnt.m_tupLoc == ent.m_tupLoc)
|
||||
@ -996,8 +997,9 @@ Dbtux::scanVisible(ScanOpPtr scanPtr, TreeEnt ent)
|
||||
}
|
||||
Uint32 transId1 = scan.m_transId1;
|
||||
Uint32 transId2 = scan.m_transId2;
|
||||
bool dirty = scan.m_readCommitted;
|
||||
Uint32 savePointId = scan.m_savePointId;
|
||||
bool ret = c_tup->tuxQueryTh(tableFragPtrI, tupAddr, tupVersion, transId1, transId2, savePointId);
|
||||
bool ret = c_tup->tuxQueryTh(tableFragPtrI, pageId, pageOffset, tupVersion, transId1, transId2, dirty, savePointId);
|
||||
jamEntry();
|
||||
return ret;
|
||||
}
|
||||
|
@ -547,6 +547,22 @@ Lgman::execCREATE_FILE_REQ(Signal* signal)
|
||||
break;
|
||||
}
|
||||
|
||||
if(ERROR_INSERTED(15000) ||
|
||||
(sizeof(void*) == 4 && req->file_size_hi & 0xFFFFFFFF))
|
||||
{
|
||||
jam();
|
||||
if(signal->getNoOfSections())
|
||||
releaseSections(signal);
|
||||
|
||||
CreateFileImplRef* ref= (CreateFileImplRef*)signal->getDataPtr();
|
||||
ref->senderData = senderData;
|
||||
ref->senderRef = reference();
|
||||
ref->errorCode = CreateFileImplRef::FileSizeTooLarge;
|
||||
sendSignal(senderRef, GSN_CREATE_FILE_REF, signal,
|
||||
CreateFileImplRef::SignalLength, JBB);
|
||||
return;
|
||||
}
|
||||
|
||||
new (file_ptr.p) Undofile(req, ptr.i);
|
||||
|
||||
Local_undofile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
||||
@ -902,7 +918,7 @@ Lgman::alloc_logbuffer_memory(Ptr<Logfile_group> ptr, Uint32 bytes)
|
||||
{
|
||||
Uint32 ptrI;
|
||||
Uint32 cnt = pages > 64 ? 64 : pages;
|
||||
m_ctx.m_mm.alloc(&ptrI, &cnt, 1);
|
||||
m_ctx.m_mm.alloc_pages(RG_DISK_OPERATIONS, &ptrI, &cnt, 1);
|
||||
if (cnt)
|
||||
{
|
||||
Buffer_idx range;
|
||||
@ -1021,7 +1037,7 @@ Lgman::free_logbuffer_memory(Ptr<Logfile_group> ptr)
|
||||
ndbrequire(map.next(it));
|
||||
tmp[1] = *it.data;
|
||||
|
||||
m_ctx.m_mm.release(range.m_ptr_i, range.m_idx);
|
||||
m_ctx.m_mm.release_pages(RG_DISK_OPERATIONS, range.m_ptr_i, range.m_idx);
|
||||
map.next(it);
|
||||
}
|
||||
map.release();
|
||||
|
@ -4908,6 +4908,21 @@ Suma::release_gci(Signal* signal, Uint32 buck, Uint32 gci)
|
||||
if(gci >= head.m_max_gci)
|
||||
{
|
||||
jam();
|
||||
if (ERROR_INSERTED(13034))
|
||||
{
|
||||
jam();
|
||||
SET_ERROR_INSERT_VALUE(13035);
|
||||
return;
|
||||
}
|
||||
if (ERROR_INSERTED(13035))
|
||||
{
|
||||
CLEAR_ERROR_INSERT_VALUE;
|
||||
NodeReceiverGroup rg(CMVMI, c_nodes_in_nodegroup_mask);
|
||||
rg.m_nodes.clear(getOwnNodeId());
|
||||
signal->theData[0] = 9999;
|
||||
sendSignal(rg, GSN_NDB_TAMPER, signal, 1, JBA);
|
||||
return;
|
||||
}
|
||||
head.m_page_pos = 0;
|
||||
head.m_max_gci = gci;
|
||||
head.m_last_gci = 0;
|
||||
@ -4979,7 +4994,6 @@ Suma::start_resend(Signal* signal, Uint32 buck)
|
||||
|
||||
if(min > max)
|
||||
{
|
||||
ndbrequire(pos.m_page_pos <= 2);
|
||||
ndbrequire(pos.m_page_id == bucket->m_buffer_tail);
|
||||
m_active_buckets.set(buck);
|
||||
m_gcp_complete_rep_count ++;
|
||||
|
@ -27,6 +27,8 @@ Suma::Suma(Block_context& ctx) :
|
||||
Restart(*this),
|
||||
c_gcp_list(c_gcp_pool)
|
||||
{
|
||||
BLOCK_CONSTRUCTOR(Suma);
|
||||
|
||||
// Add received signals
|
||||
addRecSignal(GSN_READ_CONFIG_REQ, &Suma::execREAD_CONFIG_REQ);
|
||||
addRecSignal(GSN_STTOR, &Suma::execSTTOR);
|
||||
|
@ -537,6 +537,22 @@ Tsman::execCREATE_FILE_REQ(Signal* signal){
|
||||
break;
|
||||
}
|
||||
|
||||
if(ERROR_INSERTED(16000) ||
|
||||
(sizeof(void*) == 4 && req->file_size_hi & 0xFFFFFFFF))
|
||||
{
|
||||
jam();
|
||||
if(signal->getNoOfSections())
|
||||
releaseSections(signal);
|
||||
|
||||
CreateFileImplRef* ref= (CreateFileImplRef*)signal->getDataPtr();
|
||||
ref->senderData = senderData;
|
||||
ref->senderRef = reference();
|
||||
ref->errorCode = CreateFileImplRef::FileSizeTooLarge;
|
||||
sendSignal(senderRef, GSN_CREATE_FILE_REF, signal,
|
||||
CreateFileImplRef::SignalLength, JBB);
|
||||
return;
|
||||
}
|
||||
|
||||
new (file_ptr.p) Datafile(req);
|
||||
Local_datafile_list tmp(m_file_pool, ptr.p->m_meta_files);
|
||||
tmp.add(file_ptr);
|
||||
|
@ -46,8 +46,8 @@ public:
|
||||
/**
|
||||
* Seize element from pool - return i
|
||||
*
|
||||
* Note must be either added using <b>add</b> or released
|
||||
* using <b>release</b>
|
||||
* Note *must* be added using <b>add</b> (even before hash.release)
|
||||
* or be released using pool
|
||||
*/
|
||||
bool seize(Ptr<T> &);
|
||||
|
||||
@ -360,7 +360,14 @@ DLHashTableImpl<P, T, U>::remove(Ptr<T> & ptr)
|
||||
else
|
||||
{
|
||||
const Uint32 hv = ptr.p->hashValue() & mask;
|
||||
hashValues[hv] = next;
|
||||
if (hashValues[hv] == ptr.i)
|
||||
{
|
||||
hashValues[hv] = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Will add assert in 5.1
|
||||
}
|
||||
}
|
||||
|
||||
if(next != RNIL)
|
||||
@ -386,7 +393,14 @@ DLHashTableImpl<P, T, U>::release(Ptr<T> & ptr)
|
||||
else
|
||||
{
|
||||
const Uint32 hv = ptr.p->hashValue() & mask;
|
||||
hashValues[hv] = next;
|
||||
if (hashValues[hv] == ptr.i)
|
||||
{
|
||||
hashValues[hv] = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Will add assert in 5.1
|
||||
}
|
||||
}
|
||||
|
||||
if(next != RNIL)
|
||||
|
@ -42,8 +42,8 @@ public:
|
||||
/**
|
||||
* Seize element from pool - return i
|
||||
*
|
||||
* Note must be either added using <b>add</b> or released
|
||||
* using <b>release</b>
|
||||
* Note *must* be added using <b>add</b> (even before hash.release)
|
||||
* or be released using pool
|
||||
*/
|
||||
bool seize(Ptr<T> &);
|
||||
|
||||
@ -374,7 +374,14 @@ DLHashTable2<T, U>::remove(Ptr<T> & ptr){
|
||||
prevP->nextHash = next;
|
||||
} else {
|
||||
const Uint32 hv = ptr.p->hashValue() & mask;
|
||||
hashValues[hv] = next;
|
||||
if (hashValues[hv] == ptr.i)
|
||||
{
|
||||
hashValues[hv] = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Will add assert in 5.1
|
||||
}
|
||||
}
|
||||
|
||||
if(next != RNIL){
|
||||
@ -395,7 +402,14 @@ DLHashTable2<T, U>::release(Ptr<T> & ptr){
|
||||
prevP->nextHash = next;
|
||||
} else {
|
||||
const Uint32 hv = ptr.p->hashValue() & mask;
|
||||
hashValues[hv] = next;
|
||||
if (hashValues[hv] == ptr.i)
|
||||
{
|
||||
hashValues[hv] = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Will add assert in 5.1
|
||||
}
|
||||
}
|
||||
|
||||
if(next != RNIL){
|
||||
|
@ -48,7 +48,7 @@ NdbdSuperPool::NdbdSuperPool(class Ndbd_mem_manager & mm,
|
||||
{
|
||||
m_memRoot = m_mm.get_memroot();
|
||||
|
||||
m_shift = Ndbd_mem_manager::log2((1 << (BMW_2LOG + 2)) / pageSize) - 1;
|
||||
m_shift = Ndbd_mem_manager::ndb_log2((1 << (BMW_2LOG + 2)) / pageSize) - 1;
|
||||
m_add = (1 << m_shift) - 1;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,8 @@
|
||||
void*
|
||||
Pool_context::alloc_page(Uint32 type_id, Uint32 *i)
|
||||
{
|
||||
return m_block->m_ctx.m_mm.alloc_page(type_id, i);
|
||||
return m_block->m_ctx.m_mm.alloc_page(type_id, i,
|
||||
Ndbd_mem_manager::NDB_ZONE_LO);
|
||||
}
|
||||
|
||||
void
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user