Merge kboortz@bk-internal.mysql.com:/home/bk/mysql-5.0-build
into mysql.com:/home/kent/bk/build/mysql-5.0-build configure.in: Auto merged
This commit is contained in:
commit
9ff12978cc
@ -32,7 +32,8 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
|
||||
ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c)
|
||||
TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c ../mysys/my_copy.c)
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c
|
||||
../mysys/my_copy.c ../mysys/my_mkdir.c)
|
||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
|
||||
|
@ -34,7 +34,8 @@ mysqladmin_SOURCES = mysqladmin.cc
|
||||
mysql_LDADD = @readline_link@ @TERMCAP_LIB@ $(LDADD) $(CXXLDFLAGS)
|
||||
mysqltest_SOURCES= mysqltest.c \
|
||||
$(top_srcdir)/mysys/my_getsystime.c \
|
||||
$(top_srcdir)/mysys/my_copy.c
|
||||
$(top_srcdir)/mysys/my_copy.c \
|
||||
$(top_srcdir)/mysys/my_mkdir.c
|
||||
|
||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
|
||||
mysqlbinlog_SOURCES = mysqlbinlog.cc \
|
||||
|
@ -465,6 +465,31 @@ Create_file event for file_id: %u\n",ae->file_id);
|
||||
Load_log_processor load_processor;
|
||||
|
||||
|
||||
/**
|
||||
Replace windows-style backslashes by forward slashes so it can be
|
||||
consumed by the mysql client, which requires Unix path.
|
||||
|
||||
@todo This is only useful under windows, so may be ifdef'ed out on
|
||||
other systems. /Sven
|
||||
|
||||
@todo If a Create_file_log_event contains a filename with a
|
||||
backslash (valid under unix), then we have problems under windows.
|
||||
/Sven
|
||||
|
||||
@param[in,out] fname Filename to modify. The filename is modified
|
||||
in-place.
|
||||
*/
|
||||
static void convert_path_to_forward_slashes(char *fname)
|
||||
{
|
||||
while (*fname)
|
||||
{
|
||||
if (*fname == '\\')
|
||||
*fname= '/';
|
||||
fname++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static bool check_database(const char *log_dbname)
|
||||
{
|
||||
return one_database &&
|
||||
@ -582,6 +607,11 @@ int process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
|
||||
*/
|
||||
if (ce)
|
||||
{
|
||||
/*
|
||||
We must not convert earlier, since the file is used by
|
||||
my_open() in Load_log_processor::append().
|
||||
*/
|
||||
convert_path_to_forward_slashes((char*) ce->fname);
|
||||
ce->print(result_file, print_event_info, TRUE);
|
||||
my_free((char*)ce->fname,MYF(MY_WME));
|
||||
delete ce;
|
||||
@ -622,13 +652,7 @@ Create_file event for file_id: %u\n",exv->file_id);
|
||||
|
||||
if (fname)
|
||||
{
|
||||
/*
|
||||
Fix the path so it can be consumed by mysql client (requires Unix path).
|
||||
*/
|
||||
int stop= strlen(fname);
|
||||
for (int i= 0; i < stop; i++)
|
||||
if (fname[i] == '\\')
|
||||
fname[i]= '/';
|
||||
convert_path_to_forward_slashes(fname);
|
||||
exlq->print(result_file, print_event_info, fname);
|
||||
my_free(fname, MYF(MY_WME));
|
||||
}
|
||||
|
@ -51,6 +51,10 @@
|
||||
#ifdef HAVE_SYS_WAIT_H
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
#ifdef __WIN__
|
||||
#include <direct.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WEXITSTATUS
|
||||
# ifdef __WIN__
|
||||
@ -277,7 +281,7 @@ enum enum_commands {
|
||||
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
||||
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP,
|
||||
Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES,
|
||||
Q_SEND_QUIT,
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
@ -366,6 +370,10 @@ const char *command_names[]=
|
||||
"cat_file",
|
||||
"diff_files",
|
||||
"send_quit",
|
||||
"change_user",
|
||||
"mkdir",
|
||||
"rmdir",
|
||||
|
||||
0
|
||||
};
|
||||
|
||||
@ -2741,6 +2749,67 @@ void do_file_exist(struct st_command *command)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_mkdir
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
mkdir <dir_name>
|
||||
Create the directory <dir_name>
|
||||
*/
|
||||
|
||||
void do_mkdir(struct st_command *command)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
const struct command_arg mkdir_args[] = {
|
||||
"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to create"
|
||||
};
|
||||
DBUG_ENTER("do_mkdir");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
mkdir_args, sizeof(mkdir_args)/sizeof(struct command_arg),
|
||||
' ');
|
||||
|
||||
DBUG_PRINT("info", ("creating directory: %s", ds_dirname.str));
|
||||
error= my_mkdir(ds_dirname.str, 0777, MYF(0)) != 0;
|
||||
handle_command_error(command, error);
|
||||
dynstr_free(&ds_dirname);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_rmdir
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
rmdir <dir_name>
|
||||
Remove the empty directory <dir_name>
|
||||
*/
|
||||
|
||||
void do_rmdir(struct st_command *command)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
const struct command_arg rmdir_args[] = {
|
||||
"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to remove"
|
||||
};
|
||||
DBUG_ENTER("do_rmdir");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
rmdir_args, sizeof(rmdir_args)/sizeof(struct command_arg),
|
||||
' ');
|
||||
|
||||
DBUG_PRINT("info", ("removing directory: %s", ds_dirname.str));
|
||||
error= rmdir(ds_dirname.str) != 0;
|
||||
handle_command_error(command, error);
|
||||
dynstr_free(&ds_dirname);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read characters from line buffer or file. This is needed to allow
|
||||
my_ungetc() to buffer MAX_DELIMITER_LENGTH characters for a file
|
||||
@ -3046,6 +3115,69 @@ void do_send_quit(struct st_command *command)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_change_user
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
change_user [<user>], [<passwd>], [<db>]
|
||||
<user> - user to change to
|
||||
<passwd> - user password
|
||||
<db> - default database
|
||||
|
||||
Changes the user and causes the database specified by db to become
|
||||
the default (current) database for the the current connection.
|
||||
|
||||
*/
|
||||
|
||||
void do_change_user(struct st_command *command)
|
||||
{
|
||||
MYSQL *mysql = &cur_con->mysql;
|
||||
/* static keyword to make the NetWare compiler happy. */
|
||||
static DYNAMIC_STRING ds_user, ds_passwd, ds_db;
|
||||
const struct command_arg change_user_args[] = {
|
||||
{ "user", ARG_STRING, FALSE, &ds_user, "User to connect as" },
|
||||
{ "password", ARG_STRING, FALSE, &ds_passwd, "Password used when connecting" },
|
||||
{ "database", ARG_STRING, FALSE, &ds_db, "Database to select after connect" },
|
||||
};
|
||||
|
||||
DBUG_ENTER("do_change_user");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
change_user_args,
|
||||
sizeof(change_user_args)/sizeof(struct command_arg),
|
||||
',');
|
||||
|
||||
if (cur_con->stmt)
|
||||
{
|
||||
mysql_stmt_close(cur_con->stmt);
|
||||
cur_con->stmt= NULL;
|
||||
}
|
||||
|
||||
if (!ds_user.length)
|
||||
dynstr_set(&ds_user, mysql->user);
|
||||
|
||||
if (!ds_passwd.length)
|
||||
dynstr_set(&ds_passwd, mysql->passwd);
|
||||
|
||||
if (!ds_db.length)
|
||||
dynstr_set(&ds_db, mysql->db);
|
||||
|
||||
DBUG_PRINT("info",("connection: '%s' user: '%s' password: '%s' database: '%s'",
|
||||
cur_con->name, ds_user.str, ds_passwd.str, ds_db.str));
|
||||
|
||||
if (mysql_change_user(mysql, ds_user.str, ds_passwd.str, ds_db.str))
|
||||
die("change user failed: %s", mysql_error(mysql));
|
||||
|
||||
dynstr_free(&ds_user);
|
||||
dynstr_free(&ds_passwd);
|
||||
dynstr_free(&ds_db);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_perl
|
||||
@ -6847,11 +6979,14 @@ int main(int argc, char **argv)
|
||||
case Q_ECHO: do_echo(command); command_executed++; break;
|
||||
case Q_SYSTEM: do_system(command); break;
|
||||
case Q_REMOVE_FILE: do_remove_file(command); break;
|
||||
case Q_MKDIR: do_mkdir(command); break;
|
||||
case Q_RMDIR: do_rmdir(command); break;
|
||||
case Q_FILE_EXIST: do_file_exist(command); break;
|
||||
case Q_WRITE_FILE: do_write_file(command); break;
|
||||
case Q_APPEND_FILE: do_append_file(command); break;
|
||||
case Q_DIFF_FILES: do_diff_files(command); break;
|
||||
case Q_SEND_QUIT: do_send_quit(command); break;
|
||||
case Q_CHANGE_USER: do_change_user(command); break;
|
||||
case Q_CAT_FILE: do_cat_file(command); break;
|
||||
case Q_COPY_FILE: do_copy_file(command); break;
|
||||
case Q_CHMOD_FILE: do_chmod_file(command); break;
|
||||
|
@ -118,13 +118,21 @@ int main(int argc, char **argv)
|
||||
|
||||
while (argc--)
|
||||
{
|
||||
#ifndef WIN32
|
||||
struct in_addr addr;
|
||||
#endif
|
||||
ip = *argv++;
|
||||
|
||||
/* Not compatible with IPv6! Probably should use getnameinfo(). */
|
||||
#ifdef WIN32
|
||||
taddr = inet_addr(ip);
|
||||
if(taddr != INADDR_NONE)
|
||||
{
|
||||
#else
|
||||
if (inet_aton(ip, &addr) != 0)
|
||||
{
|
||||
taddr= addr.s_addr;
|
||||
#endif
|
||||
if (taddr == htonl(INADDR_BROADCAST))
|
||||
{
|
||||
puts("Broadcast");
|
||||
|
26
mysql-test/include/ndb_wait_connected.inc
Normal file
26
mysql-test/include/ndb_wait_connected.inc
Normal file
@ -0,0 +1,26 @@
|
||||
# Check that mysqld has reconnected to ndbd after
|
||||
# restart of ndbd
|
||||
#
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
let $mysql_errno= 1;
|
||||
let $counter= 600;
|
||||
while ($mysql_errno)
|
||||
{
|
||||
--error 0,157
|
||||
CREATE TABLE ndb_wait_connected (a int primary key);
|
||||
if ($mysql_errno)
|
||||
{
|
||||
if (!$counter)
|
||||
{
|
||||
die Failed waiting for mysqld to reconnect to ndbd;
|
||||
}
|
||||
dec $counter;
|
||||
--sleep 0.1
|
||||
}
|
||||
}
|
||||
DROP TABLE ndb_wait_connected;
|
||||
--enable_query_log
|
||||
--enable_result_log
|
||||
|
||||
|
@ -567,4 +567,19 @@ master-bin.000001 36585 Rotate 1 36629 master-bin.000002;pos=4
|
||||
drop table t1;
|
||||
set global binlog_cache_size=@bcs;
|
||||
set session autocommit = @ac;
|
||||
drop table if exists t1;
|
||||
reset master;
|
||||
create table t1 (a bigint unsigned, b bigint(20) unsigned);
|
||||
prepare stmt from "insert into t1 values (?,?)";
|
||||
set @a= 9999999999999999;
|
||||
set @b= 14632475938453979136;
|
||||
execute stmt using @a, @b;
|
||||
deallocate prepare stmt;
|
||||
drop table t1;
|
||||
show binlog events from 0;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 98 Server version, Binlog ver: 4
|
||||
master-bin.000001 98 Query 1 219 use `test`; create table t1 (a bigint unsigned, b bigint(20) unsigned)
|
||||
master-bin.000001 219 Query 1 343 use `test`; insert into t1 values (9999999999999999,14632475938453979136)
|
||||
master-bin.000001 343 Query 1 419 use `test`; drop table t1
|
||||
End of 5.0 tests
|
||||
|
@ -722,4 +722,7 @@ a int(11) YES NULL
|
||||
b varchar(255) YES NULL
|
||||
c datetime YES NULL
|
||||
drop table t1;
|
||||
mysqltest: At line 1: change user failed: Unknown database 'inexistent'
|
||||
mysqltest: At line 1: change user failed: Access denied for user 'inexistent'@'localhost' (using password: NO)
|
||||
mysqltest: At line 1: change user failed: Access denied for user 'root'@'localhost' (using password: YES)
|
||||
End of tests
|
||||
|
@ -40,3 +40,22 @@ a b c
|
||||
select * from t1;
|
||||
a b c
|
||||
drop table t1;
|
||||
DROP TABLE IF EXISTS truncate_test;
|
||||
CREATE TABLE truncate_test (
|
||||
i INT PRIMARY KEY,
|
||||
a INT,
|
||||
b VARCHAR(11),
|
||||
UNIQUE KEY (a)
|
||||
) ENGINE = NDB;
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
TRUNCATE truncate_test;
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
SELECT * FROM truncate_test;
|
||||
i a b
|
||||
1 1 test
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
SELECT * FROM truncate_test;
|
||||
i a b
|
||||
1 1 new
|
||||
DROP TABLE truncate_test;
|
||||
|
@ -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;
|
||||
|
98
mysql-test/r/ndb_bug31477.result
Normal file
98
mysql-test/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
|
||||
|
@ -266,21 +266,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
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9, t10;
|
||||
drop table if exists t1_c,t2_c,t3_c,t4_c,t5_c,t6_c,t7_c,t8_c,t9_c, t10_c;
|
||||
520093696,<the_backup_id>
|
||||
|
@ -1693,4 +1693,20 @@ t1 CREATE TABLE `t1` (
|
||||
`?` decimal(2,1) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
drop table if exists t1;
|
||||
create table t1 (a bigint unsigned, b bigint(20) unsigned);
|
||||
prepare stmt from "insert into t1 values (?,?)";
|
||||
set @a= 9999999999999999;
|
||||
set @b= 14632475938453979136;
|
||||
insert into t1 values (@a, @b);
|
||||
select * from t1 where a = @a and b = @b;
|
||||
a b
|
||||
9999999999999999 14632475938453979136
|
||||
execute stmt using @a, @b;
|
||||
select * from t1 where a = @a and b = @b;
|
||||
a b
|
||||
9999999999999999 14632475938453979136
|
||||
9999999999999999 14632475938453979136
|
||||
deallocate prepare stmt;
|
||||
drop table t1;
|
||||
End of 5.0 tests.
|
||||
|
@ -106,4 +106,21 @@ drop table t1;
|
||||
set global binlog_cache_size=@bcs;
|
||||
set session autocommit = @ac;
|
||||
|
||||
#
|
||||
# Bug#33798: prepared statements improperly handle large unsigned ints
|
||||
#
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
reset master;
|
||||
create table t1 (a bigint unsigned, b bigint(20) unsigned);
|
||||
prepare stmt from "insert into t1 values (?,?)";
|
||||
set @a= 9999999999999999;
|
||||
set @b= 14632475938453979136;
|
||||
execute stmt using @a, @b;
|
||||
deallocate prepare stmt;
|
||||
drop table t1;
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/
|
||||
show binlog events from 0;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -2083,5 +2083,46 @@ eval $show_statement;
|
||||
|
||||
drop table t1;
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Test change_user command
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
--error 1
|
||||
--exec echo "--change_user root,,inexistent" | $MYSQL_TEST 2>&1
|
||||
|
||||
--error 1
|
||||
--exec echo "--change_user inexistent,,test" | $MYSQL_TEST 2>&1
|
||||
|
||||
--error 1
|
||||
--exec echo "--change_user root,inexistent,test" | $MYSQL_TEST 2>&1
|
||||
|
||||
--change_user
|
||||
--change_user root
|
||||
--change_user root,,
|
||||
--change_user root,,test
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Test mkdir and rmdir command
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
mkdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
rmdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
|
||||
# Directory already exist
|
||||
mkdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
--error 1
|
||||
mkdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
|
||||
# Remove dir with file inside
|
||||
write_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
|
||||
hello
|
||||
EOF
|
||||
--error 1
|
||||
rmdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
|
||||
remove_file $MYSQLTEST_VARDIR/tmp/testdir/file1.txt;
|
||||
rmdir $MYSQLTEST_VARDIR/tmp/testdir;
|
||||
|
||||
|
||||
--echo End of tests
|
||||
|
||||
|
@ -81,3 +81,34 @@ select * from t1;
|
||||
select * from t1;
|
||||
|
||||
drop table t1;
|
||||
|
||||
#For BUG#29851 TRUNCATE causes error 4350 from cluster in INSERT... ON DUPLICATE KEY UPDATE
|
||||
|
||||
connection con1;
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS truncate_test;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE truncate_test (
|
||||
i INT PRIMARY KEY,
|
||||
a INT,
|
||||
b VARCHAR(11),
|
||||
UNIQUE KEY (a)
|
||||
) ENGINE = NDB;
|
||||
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
|
||||
connection con2;
|
||||
TRUNCATE truncate_test;
|
||||
|
||||
connection con1;
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
SELECT * FROM truncate_test;
|
||||
|
||||
connection con2;
|
||||
INSERT INTO truncate_test VALUES (1, 1, 'test') ON DUPLICATE KEY UPDATE b = 'new';
|
||||
SELECT * FROM truncate_test;
|
||||
|
||||
DROP TABLE truncate_test;
|
||||
|
@ -491,6 +491,7 @@ select * from t1;
|
||||
select * from t1;
|
||||
--exec $NDB_MGM --no-defaults -e "all start" > /dev/null
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults > /dev/null
|
||||
--source include/ndb_wait_connected.inc
|
||||
use test;
|
||||
drop database test_only_ndb_tables;
|
||||
|
||||
|
@ -25,6 +25,13 @@ insert into t1 values (1);
|
||||
--exec $NDB_MGM --no-defaults -e "all restart" >> $NDB_TOOLS_OUTPUT
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults -c $connect_str >> $NDB_TOOLS_OUTPUT
|
||||
|
||||
# Create separate connection and use that for detecting
|
||||
# when mysqld has reconnected to ndbd
|
||||
connect (ndb_wait_con,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
--source include/ndb_wait_connected.inc
|
||||
disconnect ndb_wait_con;
|
||||
connection server1;
|
||||
|
||||
--error 1297
|
||||
insert into t1 values (2);
|
||||
--error 1296
|
||||
@ -44,6 +51,7 @@ select * from t2 order by a limit 3;
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults -c $connect_str >> $NDB_TOOLS_OUTPUT
|
||||
|
||||
--connection server2
|
||||
--source include/ndb_wait_connected.inc
|
||||
create table t2 (a int key) engine=ndbcluster;
|
||||
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||||
select * from t2 order by a limit 3;
|
||||
@ -58,6 +66,7 @@ select * from t2 order by a limit 3;
|
||||
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults -c $connect_str >> $NDB_TOOLS_OUTPUT
|
||||
|
||||
--connection server1
|
||||
--source include/ndb_wait_connected.inc
|
||||
show tables;
|
||||
create table t2 (a int key) engine=ndbcluster;
|
||||
insert into t2 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||||
|
109
mysql-test/t/ndb_bug31477.test
Normal file
109
mysql-test/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;
|
@ -1719,6 +1719,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;
|
||||
|
||||
@ -1737,9 +1738,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,
|
||||
@ -1870,745 +1873,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,
|
||||
|
@ -231,16 +231,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';
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9, t10;
|
||||
|
@ -1807,4 +1807,21 @@ execute stmt using @a;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#33798: prepared statements improperly handle large unsigned ints
|
||||
#
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1 (a bigint unsigned, b bigint(20) unsigned);
|
||||
prepare stmt from "insert into t1 values (?,?)";
|
||||
set @a= 9999999999999999;
|
||||
set @b= 14632475938453979136;
|
||||
insert into t1 values (@a, @b);
|
||||
select * from t1 where a = @a and b = @b;
|
||||
execute stmt using @a, @b;
|
||||
select * from t1 where a = @a and b = @b;
|
||||
deallocate prepare stmt;
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
@ -27,6 +27,17 @@
|
||||
#define MAX_NDB_NODES 49
|
||||
#define MAX_NODES 64
|
||||
|
||||
/**************************************************************************
|
||||
* 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
|
||||
*/
|
||||
|
@ -551,7 +551,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;
|
||||
|
@ -1386,22 +1386,22 @@ public:
|
||||
*
|
||||
* @param cacheSize number of values to cache in this Ndb object
|
||||
*
|
||||
* @return 0 or -1 on error, and tupleId in out parameter
|
||||
* @return 0 or -1 on error, and autoValue in out parameter
|
||||
*/
|
||||
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 readAutoIncrementValue(const char* aTableName,
|
||||
Uint64 & tupleId);
|
||||
Uint64 & autoValue);
|
||||
int readAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 & tupleId);
|
||||
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);
|
||||
private:
|
||||
int getTupleIdFromNdb(Ndb_local_table_info* info,
|
||||
Uint64 & tupleId, Uint32 cacheSize,
|
||||
@ -1409,7 +1409,9 @@ private:
|
||||
int readTupleIdFromNdb(Ndb_local_table_info* info,
|
||||
Uint64 & tupleId);
|
||||
int setTupleIdInNdb(Ndb_local_table_info* info,
|
||||
Uint64 tupleId, bool increase);
|
||||
Uint64 tupleId, bool modify);
|
||||
int checkTupleIdInNdb(Ndb_local_table_info* info,
|
||||
Uint64 tupleId);
|
||||
int opTupleIdOnNdb(Ndb_local_table_info* info, 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
|
||||
|
@ -126,6 +126,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);
|
||||
@ -133,6 +134,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[]);
|
||||
@ -814,7 +816,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);
|
||||
@ -833,6 +838,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){
|
||||
|
@ -69,7 +69,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){
|
||||
|
@ -337,22 +337,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 = inet_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
|
||||
ndbout_c("Send Failure(disconnect==%d) to node = %d nBytesSent = %d "
|
||||
|
@ -16,34 +16,63 @@
|
||||
#include <Bitmask.hpp>
|
||||
#include <NdbOut.hpp>
|
||||
|
||||
#ifndef __TEST_BITMASK__
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -66,301 +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 ;
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
#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
|
||||
};
|
||||
|
||||
|
@ -374,16 +374,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;
|
||||
|
@ -518,7 +518,7 @@ public:
|
||||
Uint32 m_diskless;
|
||||
|
||||
STATIC_CONST(NO_OF_PAGES_META_FILE =
|
||||
(MAX_WORDS_META_FILE + BACKUP_WORDS_PER_PAGE - 1) /
|
||||
(2*MAX_WORDS_META_FILE + BACKUP_WORDS_PER_PAGE - 1) /
|
||||
BACKUP_WORDS_PER_PAGE);
|
||||
|
||||
/**
|
||||
|
@ -198,6 +198,7 @@
|
||||
#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
|
||||
@ -1085,7 +1086,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 pageOffset, Uint32 tupVersion, Uint32 transId1, Uint32 transId2, bool dirty, Uint32 savePointId);
|
||||
|
||||
private:
|
||||
BLOCK_DEFINES(Dbtup);
|
||||
@ -1942,6 +1943,8 @@ private:
|
||||
bool getPageThroughSavePoint(Operationrec* const regOperPtr,
|
||||
Operationrec* const leaderOpPtr);
|
||||
|
||||
bool find_savepoint(OperationrecPtr& loopOpPtr, Uint32 savepointId);
|
||||
|
||||
Uint32 calculateChecksum(Page* const pagePtr, Uint32 tupHeadOffset, Uint32 tupHeadSize);
|
||||
void setChecksum(Page* const pagePtr, Uint32 tupHeadOffset, Uint32 tupHeadSize);
|
||||
|
||||
@ -2171,7 +2174,8 @@ private:
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 lenAttrInfo);
|
||||
void storedSeizeAttrinbufrecErrorLab(Signal* signal,
|
||||
Operationrec* regOperPtr);
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 errorCode);
|
||||
bool storedProcedureAttrInfo(Signal* signal,
|
||||
Operationrec* regOperPtr,
|
||||
Uint32 length,
|
||||
@ -2467,4 +2471,22 @@ bool Dbtup::isPageUndoLogged(Fragrecord* const regFragPtr,
|
||||
return false;
|
||||
}//Dbtup::isUndoLoggingNeeded()
|
||||
|
||||
inline
|
||||
bool Dbtup::find_savepoint(OperationrecPtr& loopOpPtr, Uint32 savepointId)
|
||||
{
|
||||
while (true) {
|
||||
if (savepointId > loopOpPtr.p->savePointId) {
|
||||
jam();
|
||||
return true;
|
||||
}
|
||||
// note 5.0 has reversed next/prev pointers
|
||||
loopOpPtr.i = loopOpPtr.p->nextActiveOp;
|
||||
if (loopOpPtr.i == RNIL) {
|
||||
break;
|
||||
}
|
||||
ptrCheckGuard(loopOpPtr, cnoOfOprec, operationrec);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -77,6 +77,14 @@ void Dbtup::copyAttrinfo(Signal* signal,
|
||||
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);
|
||||
|
@ -246,8 +246,18 @@ 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 tupVersion, Uint32 transId1, Uint32 transId2, Uint32 savePointId)
|
||||
Dbtup::tuxQueryTh(Uint32 fragPtrI, Uint32 pageId, Uint32 pageOffset, Uint32 tupVersion, Uint32 transId1, Uint32 transId2, bool dirty, Uint32 savePointId)
|
||||
{
|
||||
ljamEntry();
|
||||
FragrecordPtr fragPtr;
|
||||
@ -256,33 +266,73 @@ Dbtup::tuxQueryTh(Uint32 fragPtrI, Uint32 tupAddr, Uint32 tupVersion, Uint32 tra
|
||||
TablerecPtr tablePtr;
|
||||
tablePtr.i = fragPtr.p->fragTableId;
|
||||
ptrCheckGuard(tablePtr, cnoOfTablerec, tablerec);
|
||||
// get page
|
||||
PagePtr pagePtr;
|
||||
Uint32 fragPageId = tupAddr >> MAX_TUPLES_BITS;
|
||||
Uint32 pageIndex = tupAddr & ((1 << MAX_TUPLES_BITS ) - 1);
|
||||
// use temp op rec
|
||||
Operationrec tempOp;
|
||||
tempOp.fragPageId = fragPageId;
|
||||
tempOp.pageIndex = pageIndex;
|
||||
tempOp.transid1 = transId1;
|
||||
tempOp.transid2 = transId2;
|
||||
tempOp.savePointId = savePointId;
|
||||
tempOp.optype = ZREAD;
|
||||
tempOp.dirtyOp = 1;
|
||||
if (getPage(pagePtr, &tempOp, fragPtr.p, tablePtr.p)) {
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
pagePtr.i = pageId;
|
||||
ptrCheckGuard(pagePtr, cnoOfPage, page);
|
||||
|
||||
OperationrecPtr currOpPtr;
|
||||
currOpPtr.i = pagePtr.p->pageWord[pageOffset];
|
||||
if (currOpPtr.i == RNIL) {
|
||||
ljam();
|
||||
Uint32 read_tupVersion = pagePtr.p->pageWord[tempOp.pageOffset + 1];
|
||||
if (read_tupVersion == tupVersion) {
|
||||
// tuple has no operation, any scan can see it
|
||||
return true;
|
||||
}
|
||||
ptrCheckGuard(currOpPtr, cnoOfOprec, operationrec);
|
||||
|
||||
const bool sameTrans =
|
||||
transId1 == currOpPtr.p->transid1 &&
|
||||
transId2 == currOpPtr.p->transid2;
|
||||
|
||||
bool res = false;
|
||||
OperationrecPtr loopOpPtr = currOpPtr;
|
||||
|
||||
if (!sameTrans) {
|
||||
ljam();
|
||||
if (!dirty) {
|
||||
ljam();
|
||||
return true;
|
||||
if (currOpPtr.p->prevActiveOp == RNIL) {
|
||||
ljam();
|
||||
// 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->optype;
|
||||
|
||||
if (op_type != ZINSERT) {
|
||||
ljam();
|
||||
// read committed version from the page
|
||||
const Uint32 origVersion = pagePtr.p->pageWord[pageOffset + 1];
|
||||
if (origVersion == tupVersion) {
|
||||
ljam();
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
else {
|
||||
ljam();
|
||||
// for own trans, ignore dirty flag
|
||||
|
||||
if (find_savepoint(loopOpPtr, savePointId)) {
|
||||
ljam();
|
||||
const Uint32 op_type = loopOpPtr.p->optype;
|
||||
|
||||
if (op_type != ZDELETE) {
|
||||
ljam();
|
||||
// check if this op has produced the scanned version
|
||||
Uint32 loopVersion = loopOpPtr.p->tupVersion;
|
||||
if (loopVersion == tupVersion) {
|
||||
ljam();
|
||||
res = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
// ordered index build
|
||||
|
@ -108,6 +108,11 @@ void Dbtup::scanProcedure(Signal* signal,
|
||||
regOperPtr->attrinbufLen = lenAttrInfo;
|
||||
regOperPtr->currentAttrinbufLen = 0;
|
||||
regOperPtr->pageOffset = 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 {
|
||||
ljam();
|
||||
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
|
||||
|
||||
@ -211,7 +216,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, (Uint32)regOperPtr->pageOffset);
|
||||
@ -222,7 +228,7 @@ void Dbtup::storedSeizeAttrinbufrecErrorLab(Signal* signal,
|
||||
regOperPtr->lastAttrinbufrec = RNIL;
|
||||
regOperPtr->transstate = ERROR_WAIT_STORED_PROCREQ;
|
||||
signal->theData[0] = regOperPtr->userpointer;
|
||||
signal->theData[1] = ZSTORED_SEIZE_ATTRINBUFREC_ERROR;
|
||||
signal->theData[1] = errorCode;
|
||||
signal->theData[2] = regOperPtr->pageOffset;
|
||||
sendSignal(regOperPtr->userblockref, GSN_STORED_PROCREF, signal, 3, JBB);
|
||||
}//Dbtup::storedSeizeAttrinbufrecErrorLab()
|
||||
|
@ -985,7 +985,8 @@ Dbtux::scanVisible(ScanOpPtr scanPtr, TreeEnt ent)
|
||||
const Frag& frag = *c_fragPool.getPtr(scan.m_fragPtrI);
|
||||
Uint32 fragBit = ent.m_fragBit;
|
||||
Uint32 tableFragPtrI = frag.m_tupTableFragPtrI[fragBit];
|
||||
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 &&
|
||||
@ -995,8 +996,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;
|
||||
}
|
||||
|
@ -45,8 +45,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 @@ DLHashTable<T>::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 @@ DLHashTable<T>::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){
|
||||
|
@ -43,8 +43,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> &);
|
||||
|
||||
@ -375,7 +375,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){
|
||||
@ -396,7 +403,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){
|
||||
|
@ -49,7 +49,7 @@
|
||||
theEmulatedJamBlockNumber = number(); \
|
||||
Uint32 tEmulatedJamIndex = theEmulatedJamIndex; \
|
||||
*(Uint32*)(theEmulatedJam + tEmulatedJamIndex) = \
|
||||
((theEmulatedJamBlockNumber << 20) | line); \
|
||||
((theEmulatedJamBlockNumber << 20) | (line)); \
|
||||
theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
|
||||
|
||||
#else
|
||||
@ -72,7 +72,7 @@
|
||||
theEmulatedJamBlockNumber = number(); \
|
||||
Uint32 tEmulatedJamIndex = theEmulatedJamIndex; \
|
||||
*(Uint32*)((UintPtr)theEmulatedJam + (Uint32)tEmulatedJamIndex) = \
|
||||
((theEmulatedJamBlockNumber << 20) | line); \
|
||||
((theEmulatedJamBlockNumber << 20) | (line)); \
|
||||
theEmulatedJamIndex = (tEmulatedJamIndex + 4) & JAM_MASK; }
|
||||
|
||||
#endif
|
||||
@ -232,7 +232,7 @@
|
||||
#define MEMCOPY_PAGE(to, from, page_size_in_bytes) \
|
||||
memcpy((void*)(to), (void*)(from), (size_t)(page_size_in_bytes));
|
||||
#define MEMCOPY_NO_WORDS(to, from, no_of_words) \
|
||||
memcpy((to), (void*)(from), (size_t)(no_of_words << 2));
|
||||
memcpy((to), (void*)(from), (size_t)((no_of_words) << 2));
|
||||
|
||||
template <class T>
|
||||
struct Ptr {
|
||||
|
@ -256,7 +256,7 @@ struct Ndb_logevent_body_row ndb_logevent_body[]= {
|
||||
ROW( ReceiveBytesStatistic, "mean_received_bytes", 2, mean_received_bytes),
|
||||
|
||||
ROW( MemoryUsage, "gth", 1, gth),
|
||||
ROW( MemoryUsage, "page_size_kb", 2, page_size_kb),
|
||||
ROW( MemoryUsage, "page_size_bytes", 2, page_size_bytes),
|
||||
ROW( MemoryUsage, "pages_used", 3, pages_used),
|
||||
ROW( MemoryUsage, "pages_total", 4, pages_total),
|
||||
ROW( MemoryUsage, "block", 5, block),
|
||||
|
@ -921,10 +921,14 @@ event_thread_run(void* p)
|
||||
{
|
||||
do_event_thread= 1;
|
||||
do {
|
||||
if (ndb_logevent_get_next(log_handle, &log_event, 2000) <= 0)
|
||||
continue;
|
||||
Guard g(printmutex);
|
||||
printLogEvent(&log_event);
|
||||
int res= ndb_logevent_get_next(log_handle, &log_event, 2000);
|
||||
if (res > 0)
|
||||
{
|
||||
Guard g(printmutex);
|
||||
printLogEvent(&log_event);
|
||||
}
|
||||
else if (res < 0)
|
||||
break;
|
||||
} while(do_event_thread);
|
||||
ndb_mgm_destroy_logevent_handle(&log_handle);
|
||||
}
|
||||
@ -2722,8 +2726,9 @@ CommandInterpreter::executeStartBackup(char* parameters, bool interactive)
|
||||
{
|
||||
int count = 0;
|
||||
int retry = 0;
|
||||
int res;
|
||||
do {
|
||||
if (ndb_logevent_get_next(log_handle, &log_event, 60000) > 0)
|
||||
if ((res= ndb_logevent_get_next(log_handle, &log_event, 60000)) > 0)
|
||||
{
|
||||
int print = 0;
|
||||
switch (log_event.type) {
|
||||
@ -2753,7 +2758,7 @@ CommandInterpreter::executeStartBackup(char* parameters, bool interactive)
|
||||
{
|
||||
retry++;
|
||||
}
|
||||
} while(count < 2 && retry < 3);
|
||||
} while(res >= 0 && count < 2 && retry < 3);
|
||||
|
||||
if (retry >= 3)
|
||||
ndbout << "get backup event failed for " << retry << " times" << endl;
|
||||
|
@ -398,7 +398,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_DATA_NODE_ID) },
|
||||
|
||||
{
|
||||
CFG_NODE_ID,
|
||||
@ -410,7 +410,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_DATA_NODE_ID) },
|
||||
|
||||
{
|
||||
KEY_INTERNAL,
|
||||
@ -1261,7 +1261,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_NODES_ID) },
|
||||
|
||||
{
|
||||
CFG_NODE_ID,
|
||||
@ -1273,7 +1273,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_NODES_ID) },
|
||||
|
||||
{
|
||||
KEY_INTERNAL,
|
||||
@ -1404,7 +1404,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_NODES_ID) },
|
||||
|
||||
{
|
||||
CFG_NODE_ID,
|
||||
@ -1416,7 +1416,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
STR_VALUE(MAX_NODES_ID) },
|
||||
|
||||
{
|
||||
CFG_LOG_DESTINATION,
|
||||
|
@ -46,6 +46,7 @@ Ndb_local_table_info::Ndb_local_table_info(NdbTableImpl *table_impl)
|
||||
m_table_impl= table_impl;
|
||||
m_first_tuple_id = ~(Uint64)0;
|
||||
m_last_tuple_id = ~(Uint64)0;
|
||||
m_highest_seen = 0;
|
||||
}
|
||||
|
||||
Ndb_local_table_info::~Ndb_local_table_info()
|
||||
|
@ -36,6 +36,7 @@ public:
|
||||
// range of cached tuple ids per thread
|
||||
Uint64 m_first_tuple_id;
|
||||
Uint64 m_last_tuple_id;
|
||||
Uint64 m_highest_seen;
|
||||
|
||||
Uint64 m_local_data[1]; // Must be last member. Used to access extra space.
|
||||
private:
|
||||
|
@ -767,8 +767,8 @@ Ndb::getNodeId()
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Uint64 getAutoIncrementValue( const char* aTableName,
|
||||
Uint64 & tupleId,
|
||||
int getAutoIncrementValue( const char* aTableName,
|
||||
Uint64 & autoValue,
|
||||
Uint32 cacheSize,
|
||||
Uint64 step,
|
||||
Uint64 start);
|
||||
@ -779,6 +779,7 @@ Parameters: aTableName (IN) : The table name.
|
||||
step (IN) : Specifies the step between the
|
||||
autoincrement values.
|
||||
start (IN) : Start value for first value
|
||||
Returns: 0 if succesful, -1 if error encountered
|
||||
Remark: Returns a new autoincrement value to the application.
|
||||
The autoincrement values can be increased by steps
|
||||
(default 1) and a number of values can be prefetched
|
||||
@ -892,9 +893,18 @@ Ndb::getTupleIdFromNdb(Ndb_local_table_info* info,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
int readAutoIncrementValue( const char* aTableName,
|
||||
Uint64 & autoValue);
|
||||
|
||||
Parameters: aTableName (IN) : The table name.
|
||||
autoValue (OUT) : The current autoincrement value
|
||||
Returns: 0 if succesful, -1 if error encountered
|
||||
Remark: Returns the current autoincrement value to the application.
|
||||
****************************************************************************/
|
||||
int
|
||||
Ndb::readAutoIncrementValue(const char* aTableName,
|
||||
Uint64 & tupleId)
|
||||
Uint64 & autoValue)
|
||||
{
|
||||
DBUG_ENTER("Ndb::readAutoIncrementValue");
|
||||
BaseString internal_tabname(internalize_table_name(aTableName));
|
||||
@ -905,15 +915,15 @@ Ndb::readAutoIncrementValue(const char* aTableName,
|
||||
theError.code = theDictionary->getNdbError().code;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (readTupleIdFromNdb(info, tupleId) == -1)
|
||||
if (readTupleIdFromNdb(info, autoValue) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
DBUG_PRINT("info", ("value %lu", (ulong)tupleId));
|
||||
DBUG_PRINT("info", ("value %lu", (ulong)autoValue));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int
|
||||
Ndb::readAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 & tupleId)
|
||||
Uint64 & autoValue)
|
||||
{
|
||||
DBUG_ENTER("Ndb::readAutoIncrementValue");
|
||||
assert(aTable != 0);
|
||||
@ -926,9 +936,9 @@ Ndb::readAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
theError.code = theDictionary->getNdbError().code;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (readTupleIdFromNdb(info, tupleId) == -1)
|
||||
if (readTupleIdFromNdb(info, autoValue) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
DBUG_PRINT("info", ("value %lu", (ulong)tupleId));
|
||||
DBUG_PRINT("info", ("value %lu", (ulong)autoValue));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -956,9 +966,20 @@ Ndb::readTupleIdFromNdb(Ndb_local_table_info* info,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
int setAutoIncrementValue( const char* aTableName,
|
||||
Uint64 autoValue,
|
||||
bool modify);
|
||||
|
||||
Parameters: aTableName (IN) : The table name.
|
||||
autoValue (IN) : The new autoincrement value
|
||||
modify (IN) : Modify existing value (not initialization)
|
||||
Returns: 0 if succesful, -1 if error encountered
|
||||
Remark: Sets a new autoincrement value for the application.
|
||||
****************************************************************************/
|
||||
int
|
||||
Ndb::setAutoIncrementValue(const char* aTableName,
|
||||
Uint64 tupleId, bool increase)
|
||||
Uint64 autoValue, bool modify)
|
||||
{
|
||||
DBUG_ENTER("Ndb::setAutoIncrementValue");
|
||||
BaseString internal_tabname(internalize_table_name(aTableName));
|
||||
@ -969,14 +990,14 @@ Ndb::setAutoIncrementValue(const char* aTableName,
|
||||
theError.code = theDictionary->getNdbError().code;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (setTupleIdInNdb(info, tupleId, increase) == -1)
|
||||
if (setTupleIdInNdb(info, autoValue, modify) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int
|
||||
Ndb::setAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
Uint64 tupleId, bool increase)
|
||||
Uint64 autoValue, bool modify)
|
||||
{
|
||||
DBUG_ENTER("Ndb::setAutoIncrementValue");
|
||||
assert(aTable != 0);
|
||||
@ -989,38 +1010,42 @@ Ndb::setAutoIncrementValue(const NdbDictionary::Table * aTable,
|
||||
theError.code = theDictionary->getNdbError().code;
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (setTupleIdInNdb(info, tupleId, increase) == -1)
|
||||
if (setTupleIdInNdb(info, autoValue, modify) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int
|
||||
Ndb::setTupleIdInNdb(Ndb_local_table_info* info,
|
||||
Uint64 tupleId, bool increase)
|
||||
Uint64 tupleId, bool modify)
|
||||
{
|
||||
DBUG_ENTER("Ndb::setTupleIdInNdb");
|
||||
if (increase)
|
||||
if (modify)
|
||||
{
|
||||
if (info->m_first_tuple_id != info->m_last_tuple_id)
|
||||
if (checkTupleIdInNdb(info, tupleId))
|
||||
{
|
||||
assert(info->m_first_tuple_id < info->m_last_tuple_id);
|
||||
if (tupleId <= info->m_first_tuple_id + 1)
|
||||
DBUG_RETURN(0);
|
||||
if (tupleId <= info->m_last_tuple_id)
|
||||
if (info->m_first_tuple_id != info->m_last_tuple_id)
|
||||
{
|
||||
info->m_first_tuple_id = tupleId - 1;
|
||||
DBUG_PRINT("info",
|
||||
("Setting next auto increment cached value to %lu",
|
||||
(ulong)tupleId));
|
||||
DBUG_RETURN(0);
|
||||
assert(info->m_first_tuple_id < info->m_last_tuple_id);
|
||||
if (tupleId <= info->m_first_tuple_id + 1)
|
||||
DBUG_RETURN(0);
|
||||
if (tupleId <= info->m_last_tuple_id)
|
||||
{
|
||||
info->m_first_tuple_id = tupleId - 1;
|
||||
DBUG_PRINT("info",
|
||||
("Setting next auto increment cached value to %lu",
|
||||
(ulong)tupleId));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* if tupleId <= NEXTID, do nothing. otherwise update NEXTID to
|
||||
* tupleId and set cached range to first = last = tupleId - 1.
|
||||
*/
|
||||
Uint64 opValue = tupleId;
|
||||
if (opTupleIdOnNdb(info, opValue, 2) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
/*
|
||||
* if tupleId <= NEXTID, do nothing. otherwise update NEXTID to
|
||||
* tupleId and set cached range to first = last = tupleId - 1.
|
||||
*/
|
||||
if (opTupleIdOnNdb(info, tupleId, 2) == -1)
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1033,6 +1058,32 @@ Ndb::setTupleIdInNdb(Ndb_local_table_info* info,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int
|
||||
Ndb::checkTupleIdInNdb(Ndb_local_table_info* info, Uint64 tupleId)
|
||||
{
|
||||
DBUG_ENTER("Ndb::checkTupleIdIndNdb");
|
||||
if ((info->m_first_tuple_id != ~(Uint64)0) &&
|
||||
(info->m_first_tuple_id > tupleId))
|
||||
{
|
||||
/*
|
||||
* If we have ever cached a value in this object and this cached
|
||||
* value is larger than the value we're trying to set then we
|
||||
* need not check with the real value in the SYSTAB_0 table.
|
||||
*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
if (info->m_highest_seen > tupleId)
|
||||
{
|
||||
/*
|
||||
* Although we've never cached any higher value we have read
|
||||
* a higher value and again it isn't necessary to change the
|
||||
* auto increment value.
|
||||
*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
int
|
||||
Ndb::opTupleIdOnNdb(Ndb_local_table_info* info, Uint64 & opValue, Uint32 op)
|
||||
{
|
||||
@ -1094,6 +1145,7 @@ Ndb::opTupleIdOnNdb(Ndb_local_table_info* info, Uint64 & opValue, Uint32 op)
|
||||
|
||||
info->m_first_tuple_id = ~(Uint64)0;
|
||||
info->m_last_tuple_id = ~(Uint64)0;
|
||||
info->m_highest_seen = 0;
|
||||
break;
|
||||
case 2:
|
||||
tOperation->interpretedUpdateTuple();
|
||||
@ -1103,19 +1155,18 @@ Ndb::opTupleIdOnNdb(Ndb_local_table_info* info, Uint64 & opValue, Uint32 op)
|
||||
// compare NEXTID >= opValue
|
||||
tOperation->branch_le(2, 1, 0);
|
||||
tOperation->write_attr("NEXTID", 1);
|
||||
tOperation->interpret_exit_ok();
|
||||
tOperation->def_label(0);
|
||||
tOperation->interpret_exit_nok(9999);
|
||||
|
||||
tOperation->interpret_exit_ok();
|
||||
tRecAttrResult = tOperation->getValue("NEXTID");
|
||||
if (tConnection->execute( Commit ) == -1)
|
||||
{
|
||||
if (tConnection->theError.code != 9999)
|
||||
goto error_handler;
|
||||
goto error_handler;
|
||||
}
|
||||
else
|
||||
{
|
||||
info->m_highest_seen = tRecAttrResult->u_64_value();
|
||||
DBUG_PRINT("info",
|
||||
("Setting next auto increment value (db) to %lu",
|
||||
("Setting auto increment value (db) to %lu",
|
||||
(ulong)opValue));
|
||||
info->m_first_tuple_id = info->m_last_tuple_id = opValue - 1;
|
||||
}
|
||||
@ -1126,7 +1177,7 @@ Ndb::opTupleIdOnNdb(Ndb_local_table_info* info, Uint64 & opValue, Uint32 op)
|
||||
tRecAttrResult = tOperation->getValue("NEXTID");
|
||||
if (tConnection->execute( Commit ) == -1 )
|
||||
goto error_handler;
|
||||
opValue = tRecAttrResult->u_64_value(); // out
|
||||
info->m_highest_seen = opValue = tRecAttrResult->u_64_value(); // out
|
||||
break;
|
||||
default:
|
||||
goto error_handler;
|
||||
@ -1415,11 +1466,7 @@ Ndb::printState(const char* fmt, ...)
|
||||
NdbMutex_Lock(ndb_print_state_mutex);
|
||||
bool dups = false;
|
||||
unsigned i;
|
||||
ndbout << buf << " ndb=" << hex << this << dec;
|
||||
#ifndef NDB_WIN32
|
||||
ndbout << " thread=" << (int)pthread_self();
|
||||
#endif
|
||||
ndbout << endl;
|
||||
ndbout << buf << " ndb=" << hex << (void*)this << endl;
|
||||
for (unsigned n = 0; n < MAX_NDB_NODES; n++) {
|
||||
NdbTransaction* con = theConnectionArray[n];
|
||||
if (con != 0) {
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "NdbBlobImpl.hpp"
|
||||
#include <AttributeHeader.hpp>
|
||||
#include <my_sys.h>
|
||||
#include <NdbSleep.h>
|
||||
|
||||
#define DEBUG_PRINT 0
|
||||
#define INCOMPATIBLE_VERSION -2
|
||||
@ -886,7 +887,23 @@ NdbDictInterface::dictSignal(NdbApiSignal* signal,
|
||||
{
|
||||
DBUG_ENTER("NdbDictInterface::dictSignal");
|
||||
DBUG_PRINT("enter", ("useMasterNodeId: %d", useMasterNodeId));
|
||||
for(Uint32 i = 0; i<RETRIES; i++){
|
||||
|
||||
int sleep = 50;
|
||||
int mod = 5;
|
||||
|
||||
for(Uint32 i = 0; i<RETRIES; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
NdbSleep_MilliSleep(sleep + 10 * (rand() % mod));
|
||||
if (i == RETRIES / 2)
|
||||
{
|
||||
mod = 10;
|
||||
}
|
||||
if (i == 3*RETRIES/4)
|
||||
{
|
||||
sleep = 100;
|
||||
}
|
||||
|
||||
//if (useMasterNodeId == 0)
|
||||
m_buffer.clear();
|
||||
|
||||
|
@ -291,6 +291,7 @@ ErrorBundle ErrorCodes[] = {
|
||||
{ 242, AE, "Zero concurrency in scan"},
|
||||
{ 244, AE, "Too high concurrency in scan"},
|
||||
{ 269, AE, "No condition and attributes to read in scan"},
|
||||
{ 874, AE, "Too much attrinfo (e.g. scan filter) for scan in tuple manager" },
|
||||
{ 4600, AE, "Transaction is already started"},
|
||||
{ 4601, AE, "Transaction is not started"},
|
||||
{ 4602, AE, "You must call getNdbOperation before executeScan" },
|
||||
|
@ -4,6 +4,8 @@
|
||||
#include <NDBT.hpp>
|
||||
#include <NdbApi.hpp>
|
||||
#include <HugoTransactions.hpp>
|
||||
#include <Bitmask.hpp>
|
||||
#include <Vector.hpp>
|
||||
|
||||
static const char* _dbname = "TEST_DB";
|
||||
static int g_loops = 7;
|
||||
@ -37,6 +39,7 @@ static int unique_indexes(Ndb*, const NdbDictionary::Table* tab);
|
||||
static int ordered_indexes(Ndb*, const NdbDictionary::Table* tab);
|
||||
static int node_restart(Ndb*, const NdbDictionary::Table* tab);
|
||||
static int system_restart(Ndb*, const NdbDictionary::Table* tab);
|
||||
static int testBitmask();
|
||||
|
||||
int
|
||||
main(int argc, char** argv){
|
||||
@ -49,6 +52,15 @@ main(int argc, char** argv){
|
||||
ndb_std_get_one_option)))
|
||||
return NDBT_ProgramExit(NDBT_WRONGARGS);
|
||||
|
||||
int res = NDBT_FAILED;
|
||||
|
||||
/* Run cluster-independent tests */
|
||||
for (int i=0; i<(10*g_loops); i++)
|
||||
{
|
||||
if (NDBT_OK != (res= testBitmask()))
|
||||
return NDBT_ProgramExit(res);
|
||||
}
|
||||
|
||||
Ndb_cluster_connection con(opt_connect_str);
|
||||
if(con.connect(12, 5, 1))
|
||||
{
|
||||
@ -60,7 +72,6 @@ main(int argc, char** argv){
|
||||
pNdb = new Ndb(&con, _dbname);
|
||||
pNdb->init();
|
||||
while (pNdb->waitUntilReady() != 0);
|
||||
int res = NDBT_FAILED;
|
||||
|
||||
NdbDictionary::Dictionary * dict = pNdb->getDictionary();
|
||||
|
||||
@ -121,14 +132,12 @@ create_random_table(Ndb* pNdb)
|
||||
do {
|
||||
NdbDictionary::Table tab;
|
||||
Uint32 cols = 1 + (rand() % (NDB_MAX_ATTRIBUTES_IN_TABLE - 1));
|
||||
Uint32 keys = NDB_MAX_NO_OF_ATTRIBUTES_IN_KEY;
|
||||
Uint32 length = 4090;
|
||||
Uint32 key_size = NDB_MAX_KEYSIZE_IN_WORDS;
|
||||
|
||||
BaseString name;
|
||||
name.assfmt("TAB_%d", rand() & 65535);
|
||||
tab.setName(name.c_str());
|
||||
for(int i = 0; i<cols && length > 2; i++)
|
||||
for(Uint32 i = 0; i<cols && length > 2; i++)
|
||||
{
|
||||
NdbDictionary::Column col;
|
||||
name.assfmt("COL_%d", i);
|
||||
@ -206,3 +215,393 @@ system_restart(Ndb* pNdb, const NdbDictionary::Table* tab)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Note : folowing classes test functionality of storage/ndb/src/common/util/Bitmask.cpp
|
||||
* and were originally defined there.
|
||||
* Set BITMASK_DEBUG to 1 to get more test debugging info.
|
||||
*/
|
||||
#define BITMASK_DEBUG 0
|
||||
|
||||
static
|
||||
bool cmp(const Uint32 b1[], const Uint32 b2[], Uint32 len)
|
||||
{
|
||||
Uint32 sz32 = (len + 31) >> 5;
|
||||
for(Uint32 i = 0; i<len; i++)
|
||||
{
|
||||
if(BitmaskImpl::get(sz32, b1, i) ^ BitmaskImpl::get(sz32, b2, i))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
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(" ");
|
||||
}
|
||||
}
|
||||
|
||||
static int lrand()
|
||||
{
|
||||
return rand();
|
||||
}
|
||||
|
||||
static
|
||||
void rand(Uint32 dst[], Uint32 len)
|
||||
{
|
||||
for(Uint32 i = 0; i<len; i++)
|
||||
BitmaskImpl::set((len + 31) >> 5, dst, i, (lrand() % 1000) > 500);
|
||||
}
|
||||
|
||||
static
|
||||
int checkNoTramplingGetSetField(const Uint32 totalTests)
|
||||
{
|
||||
const Uint32 numWords= 67;
|
||||
const Uint32 maxBitsToCopy= (numWords * 32);
|
||||
Uint32 sourceBuf[numWords];
|
||||
Uint32 targetBuf[numWords];
|
||||
|
||||
ndbout << "Testing : Bitmask NoTrampling\n";
|
||||
|
||||
memset(sourceBuf, 0x00, (numWords*4));
|
||||
|
||||
for (Uint32 test=0; test<totalTests; test++)
|
||||
{
|
||||
/* Always copy at least 1 bit */
|
||||
Uint32 srcStart= rand() % (maxBitsToCopy -1);
|
||||
Uint32 length= (rand() % ((maxBitsToCopy -1) - srcStart)) + 1;
|
||||
|
||||
if (BITMASK_DEBUG)
|
||||
ndbout << "Testing start %u, length %u \n"
|
||||
<< srcStart
|
||||
<< length;
|
||||
// Set target to all ones.
|
||||
memset(targetBuf, 0xff, (numWords*4));
|
||||
|
||||
BitmaskImpl::getField(numWords, sourceBuf, srcStart, length, targetBuf);
|
||||
|
||||
// Check that there is no trampling
|
||||
Uint32 firstUntrampledWord= (length + 31)/32;
|
||||
|
||||
for (Uint32 word=0; word< numWords; word++)
|
||||
{
|
||||
Uint32 targetWord= targetBuf[word];
|
||||
if (BITMASK_DEBUG)
|
||||
ndbout << "word=%d, targetWord=%u, firstUntrampledWord..=%u"
|
||||
<< word << targetWord << firstUntrampledWord;
|
||||
|
||||
if (! (word < firstUntrampledWord) ?
|
||||
(targetWord == 0) :
|
||||
(targetWord == 0xffffffff))
|
||||
{
|
||||
ndbout << "Notrampling getField failed for srcStart "
|
||||
<< srcStart
|
||||
<< " length " << length
|
||||
<< " at word " << word << "\n";
|
||||
ndbout << "word=%d, targetWord=%u, firstUntrampledWord..=%u"
|
||||
<< word << targetWord << firstUntrampledWord;
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Set target back to all ones. */
|
||||
memset(targetBuf, 0xff, (numWords*4));
|
||||
|
||||
BitmaskImpl::setField(numWords, targetBuf, srcStart, length, sourceBuf);
|
||||
|
||||
/* Check we've got all ones, with zeros only where expected */
|
||||
for (Uint32 word=0; word< numWords; word++)
|
||||
{
|
||||
Uint32 targetWord= targetBuf[word];
|
||||
|
||||
for (Uint32 bit=0; bit< 32; bit++)
|
||||
{
|
||||
Uint32 bitNum= (word << 5) + bit;
|
||||
bool expectedValue= !((bitNum >= srcStart) &&
|
||||
(bitNum < (srcStart + length)));
|
||||
bool actualValue= (((targetWord >> bit) & 1) == 1);
|
||||
if (BITMASK_DEBUG)
|
||||
ndbout << "bitNum=%u expectedValue=%u, actual value=%u"
|
||||
<< bitNum << expectedValue << actualValue;
|
||||
|
||||
if (actualValue != expectedValue)
|
||||
{
|
||||
ndbout << "Notrampling setField failed for srcStart "
|
||||
<< srcStart
|
||||
<< " length " << length
|
||||
<< " at word " << word << " bit " << bit << "\n";
|
||||
ndbout << "bitNum=%u expectedValue=%u, actual value=%u"
|
||||
<< bitNum << expectedValue << actualValue;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
int simple(int pos, int size)
|
||||
{
|
||||
ndbout << "Testing : Bitmask simple pos: " << pos << " size: " << size << "\n";
|
||||
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);
|
||||
if (BITMASK_DEBUG)
|
||||
{
|
||||
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");
|
||||
}
|
||||
return (cmp(src, dst, size+31)?0 : -1);
|
||||
};
|
||||
|
||||
struct Alloc
|
||||
{
|
||||
Uint32 pos;
|
||||
Uint32 size;
|
||||
Vector<Uint32> data;
|
||||
};
|
||||
|
||||
static
|
||||
int
|
||||
testRanges(Uint32 bitmask_size)
|
||||
{
|
||||
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 ranges for bitmask of size %d", bitmask_size);
|
||||
Uint32 zero = 0;
|
||||
alloc_mask.fill(sz32, zero);
|
||||
test_mask.fill(sz32, zero);
|
||||
|
||||
/* Loop a number of times, setting and clearing bits in the mask
|
||||
* and tracking the modifications in a separate structure.
|
||||
* Check that both structures remain in sync
|
||||
*/
|
||||
for(int i = 0; i<5000; i++)
|
||||
{
|
||||
Vector<Uint32> tmp;
|
||||
tmp.fill(sz32, zero);
|
||||
|
||||
Uint32 pos = lrand() % (bitmask_size - 1);
|
||||
Uint32 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;
|
||||
Uint32 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;
|
||||
}
|
||||
}
|
||||
if (! ((pos >= min) && (pos < max)))
|
||||
{
|
||||
printf("Failed with pos %u, min %u, max %u\n",
|
||||
pos, min, max);
|
||||
return -1;
|
||||
}
|
||||
BitmaskImpl::getField(sz32, test_mask.getBase(), min, max-min,
|
||||
tmp.getBase());
|
||||
if(BITMASK_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");
|
||||
}
|
||||
if(!cmp(tmp.getBase(), alloc_list[j].data.getBase(), max - min))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
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(BITMASK_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(BITMASK_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);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NDB_BM_SUPPORT_RANGE
|
||||
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);
|
||||
|
||||
/* Verify range setting method works correctly */
|
||||
for(Uint32 j = 0; j<sz; j++)
|
||||
{
|
||||
bool expect = (j >= start && j<stop);
|
||||
if(expect)
|
||||
BitmaskImpl::set(sz32, check.getBase(), j);
|
||||
}
|
||||
|
||||
BitmaskImpl::set_range(sz32, map.getBase(), start, stop);
|
||||
if (!BitmaskImpl::equal(sz32, map.getBase(), check.getBase()))
|
||||
{
|
||||
ndbout_c(" FAIL 1 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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
map.clear();
|
||||
check.clear();
|
||||
|
||||
/* Verify range clearing method works correctly */
|
||||
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_range(sz32, map.getBase(), start, stop);
|
||||
if (!BitmaskImpl::equal(sz32, map.getBase(), check.getBase()))
|
||||
{
|
||||
ndbout_c(" FAIL 2 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");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
int
|
||||
testBitmask()
|
||||
{
|
||||
/* Some testcases from storage/ndb/src/common/util/Bitmask.cpp */
|
||||
int res= 0;
|
||||
|
||||
if ((res= checkNoTramplingGetSetField(100 /* totalTests */)) != 0)
|
||||
return res;
|
||||
|
||||
if ((res= simple(rand() % 33, // position
|
||||
(rand() % 63)+1) // size
|
||||
) != 0)
|
||||
return res;
|
||||
|
||||
if ((res= testRanges(1+(rand() % 1000) // bitmask size
|
||||
)) != 0)
|
||||
return res;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
template class Vector<Alloc>;
|
||||
template class Vector<Uint32>;
|
||||
|
@ -77,6 +77,11 @@ int runTestIncValue32(NDBT_Context* ctx, NDBT_Step* step){
|
||||
const NdbDictionary::Table * pTab = ctx->getTab();
|
||||
Ndb* pNdb = GETNDB(step);
|
||||
|
||||
if (strcmp(pTab->getName(), "T1") != 0) {
|
||||
g_err << "runTestBug19537: skip, table != T1" << endl;
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
|
||||
NdbConnection* pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
@ -258,6 +263,84 @@ int runTestBug19537(NDBT_Context* ctx, NDBT_Step* step){
|
||||
}
|
||||
|
||||
|
||||
int runTestBug34107(NDBT_Context* ctx, NDBT_Step* step){
|
||||
int result = NDBT_OK;
|
||||
const NdbDictionary::Table * pTab = ctx->getTab();
|
||||
Ndb* pNdb = GETNDB(step);
|
||||
|
||||
int i;
|
||||
for (i = 0; i <= 1; i++) {
|
||||
g_info << "bug34107:" << (i == 0 ? " small" : " too big") << endl;
|
||||
|
||||
NdbConnection* pTrans = pNdb->startTransaction();
|
||||
if (pTrans == NULL){
|
||||
ERR(pNdb->getNdbError());
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
NdbScanOperation* pOp = pTrans->getNdbScanOperation(pTab->getName());
|
||||
if (pOp == NULL) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (pOp->readTuples() == -1) {
|
||||
ERR(pOp->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
int n = i == 0 ? 10000 : 30000;
|
||||
int k;
|
||||
|
||||
for (k = 0; k < n; k++) {
|
||||
|
||||
// inserts 1 word ATTRINFO
|
||||
|
||||
if (pOp->interpret_exit_ok() == -1) {
|
||||
ERR(pOp->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
if (pTrans->execute(NoCommit) == -1) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
int ret;
|
||||
while ((ret = pOp->nextResult()) == 0)
|
||||
;
|
||||
g_info << "ret=" << ret << " err=" << pOp->getNdbError().code << endl;
|
||||
|
||||
if (i == 0 && ret != 1) {
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
if (i == 1 && ret != -1) {
|
||||
g_err << "unexpected big filter success" << endl;
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
if (i == 1 && pOp->getNdbError().code != 874) {
|
||||
g_err << "unexpected big filter error code, wanted 874" << endl;
|
||||
ERR(pTrans->getNdbError());
|
||||
pNdb->closeTransaction(pTrans);
|
||||
return NDBT_FAILED;
|
||||
}
|
||||
|
||||
pNdb->closeTransaction(pTrans);
|
||||
}
|
||||
|
||||
return NDBT_OK;
|
||||
}
|
||||
|
||||
|
||||
NDBT_TESTSUITE(testInterpreter);
|
||||
TESTCASE("IncValue32",
|
||||
"Test incValue for 32 bit integer\n"){
|
||||
@ -277,6 +360,12 @@ TESTCASE("Bug19537",
|
||||
INITIALIZER(runTestBug19537);
|
||||
FINALIZER(runClearTable);
|
||||
}
|
||||
TESTCASE("Bug34107",
|
||||
"Test too big scan filter (error 874)\n"){
|
||||
INITIALIZER(runLoadTable);
|
||||
INITIALIZER(runTestBug34107);
|
||||
FINALIZER(runClearTable);
|
||||
}
|
||||
#if 0
|
||||
TESTCASE("MaxTransactions",
|
||||
"Start transactions until no more can be created\n"){
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -649,10 +649,10 @@ max-time: 1000
|
||||
cmd: testNdbApi
|
||||
args: -n Bug28443
|
||||
|
||||
#max-time: 500
|
||||
#cmd: testInterpreter
|
||||
#args: T1
|
||||
#
|
||||
max-time: 500
|
||||
cmd: testInterpreter
|
||||
args: T1
|
||||
|
||||
max-time: 150000
|
||||
cmd: testOperations
|
||||
args:
|
||||
|
@ -107,6 +107,16 @@ libs="$libs @openssl_libs@ @STATIC_NSS_FLAGS@ "
|
||||
libs_r=" $ldflags -L$pkglibdir -lmysqlclient_r @ZLIB_DEPS@ @LIBS@ @openssl_libs@ "
|
||||
embedded_libs=" $ldflags -L$pkglibdir -lmysqld @ZLIB_DEPS@ @LIBS@ @WRAPLIBS@ @innodb_system_libs@ @openssl_libs@ "
|
||||
|
||||
if [ -r "$pkglibdir/libmygcc.a" ]; then
|
||||
# When linking against the static library with a different version of GCC
|
||||
# from what was used to compile the library, some symbols may not be defined
|
||||
# automatically. We package the libmygcc.a from the build host, to provide
|
||||
# definitions for those. Bugs 4921, 19561, 19817, 21158, etc.
|
||||
libs="$libs -lmygcc "
|
||||
libs_r="$libs_r -lmygcc "
|
||||
embedded_libs="$embedded_libs -lmygcc "
|
||||
fi
|
||||
|
||||
cflags="-I$pkgincludedir @CFLAGS@ " #note: end space!
|
||||
include="-I$pkgincludedir"
|
||||
|
||||
@ -116,6 +126,7 @@ include="-I$pkgincludedir"
|
||||
for remove in DDBUG_OFF DSAFEMALLOC USAFEMALLOC DSAFE_MUTEX \
|
||||
DPEDANTIC_SAFEMALLOC DUNIV_MUST_NOT_INLINE DFORCE_INIT_OF_VARS \
|
||||
DEXTRA_DEBUG DHAVE_purify O 'O[0-9]' 'xO[0-9]' 'W[-A-Za-z]*' \
|
||||
'mtune=[-A-Za-z0-9]*' 'mcpu=[-A-Za-z0-9]*' 'march=[-A-Za-z0-9]*' \
|
||||
Xa xstrconst "xc99=none" \
|
||||
unroll2 ip mp restrict
|
||||
do
|
||||
|
@ -39,7 +39,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome.
|
||||
|
||||
# Documentation continued at end of file
|
||||
|
||||
my $VERSION = "1.22";
|
||||
my $VERSION = "1.23";
|
||||
|
||||
my $opt_tmpdir = $ENV{TMPDIR} || "/tmp";
|
||||
|
||||
@ -132,7 +132,6 @@ GetOptions( \%opt,
|
||||
# 'target' - destination directory of the copy
|
||||
# 'tables' - array-ref to list of tables in the db
|
||||
# 'files' - array-ref to list of files to be copied
|
||||
# (RAID files look like 'nn/name.MYD')
|
||||
# 'index' - array-ref to list of indexes to be copied
|
||||
#
|
||||
|
||||
@ -263,7 +262,6 @@ my $hc_locks = "";
|
||||
my $hc_tables = "";
|
||||
my $num_tables = 0;
|
||||
my $num_files = 0;
|
||||
my $raid_dir_regex = '[A-Za-z0-9]{2}';
|
||||
|
||||
foreach my $rdb ( @db_desc ) {
|
||||
my $db = $rdb->{src};
|
||||
@ -292,20 +290,12 @@ foreach my $rdb ( @db_desc ) {
|
||||
or die "Cannot open dir '$db_dir': $!";
|
||||
|
||||
my %db_files;
|
||||
my @raid_dir = ();
|
||||
|
||||
while ( defined( my $name = readdir DBDIR ) ) {
|
||||
if ( $name =~ /^$raid_dir_regex$/ && -d "$db_dir/$name" ) {
|
||||
push @raid_dir, $name;
|
||||
}
|
||||
else {
|
||||
$db_files{$name} = $1 if ( $name =~ /(.+)\.\w+$/ );
|
||||
}
|
||||
$db_files{$name} = $1 if ( $name =~ /(.+)\.\w+$/ );
|
||||
}
|
||||
closedir( DBDIR );
|
||||
|
||||
scan_raid_dir( \%db_files, $db_dir, @raid_dir );
|
||||
|
||||
unless( keys %db_files ) {
|
||||
warn "'$db' is an empty database\n";
|
||||
}
|
||||
@ -336,8 +326,6 @@ foreach my $rdb ( @db_desc ) {
|
||||
my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
|
||||
$rdb->{tables} = [ @hc_tables ];
|
||||
|
||||
$rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ];
|
||||
|
||||
$hc_locks .= ", " if ( length $hc_locks && @hc_tables );
|
||||
$hc_locks .= join ", ", map { "$_ READ" } @hc_tables;
|
||||
$hc_tables .= ", " if ( length $hc_tables && @hc_tables );
|
||||
@ -411,27 +399,24 @@ if ($opt{method} =~ /^cp\b/)
|
||||
retire_directory( @existing ) if @existing && !$opt{addtodest};
|
||||
|
||||
foreach my $rdb ( @db_desc ) {
|
||||
foreach my $td ( '', @{$rdb->{raid_dirs}} ) {
|
||||
|
||||
my $tgt_dirpath = "$rdb->{target}/$td";
|
||||
# Remove trailing slashes (needed for Mac OS X)
|
||||
substr($tgt_dirpath, 1) =~ s|/+$||;
|
||||
if ( $opt{dryrun} ) {
|
||||
print "mkdir $tgt_dirpath, 0750\n";
|
||||
}
|
||||
elsif ($opt{method} =~ /^scp\b/) {
|
||||
## assume it's there?
|
||||
## ...
|
||||
}
|
||||
else {
|
||||
mkdir($tgt_dirpath, 0750) or die "Can't create '$tgt_dirpath': $!\n"
|
||||
unless -d $tgt_dirpath;
|
||||
if ($^O !~ m/^(NetWare)$/)
|
||||
{
|
||||
my @f_info= stat "$datadir/$rdb->{src}";
|
||||
chown $f_info[4], $f_info[5], $tgt_dirpath;
|
||||
}
|
||||
}
|
||||
my $tgt_dirpath = "$rdb->{target}";
|
||||
# Remove trailing slashes (needed for Mac OS X)
|
||||
substr($tgt_dirpath, 1) =~ s|/+$||;
|
||||
if ( $opt{dryrun} ) {
|
||||
print "mkdir $tgt_dirpath, 0750\n";
|
||||
}
|
||||
elsif ($opt{method} =~ /^scp\b/) {
|
||||
## assume it's there?
|
||||
## ...
|
||||
}
|
||||
else {
|
||||
mkdir($tgt_dirpath, 0750) or die "Can't create '$tgt_dirpath': $!\n"
|
||||
unless -d $tgt_dirpath;
|
||||
if ($^O !~ m/^(NetWare)$/)
|
||||
{
|
||||
my @f_info= stat "$datadir/$rdb->{src}";
|
||||
chown $f_info[4], $f_info[5], $tgt_dirpath;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -489,7 +474,7 @@ foreach my $rdb ( @db_desc )
|
||||
my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}};
|
||||
next unless @files;
|
||||
|
||||
eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); };
|
||||
eval { copy_files($opt{method}, \@files, $rdb->{target}); };
|
||||
push @failed, "$rdb->{src} -> $rdb->{target} failed: $@"
|
||||
if ( $@ );
|
||||
|
||||
@ -582,7 +567,7 @@ exit 0;
|
||||
# ---
|
||||
|
||||
sub copy_files {
|
||||
my ($method, $files, $target, $raid_dirs) = @_;
|
||||
my ($method, $files, $target) = @_;
|
||||
my @cmd;
|
||||
print "Copying ".@$files." files...\n" unless $opt{quiet};
|
||||
|
||||
@ -603,15 +588,8 @@ sub copy_files {
|
||||
# add recursive option for scp
|
||||
$cp.= " -r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/;
|
||||
|
||||
my @non_raid = map { "'$_'" } grep { ! m:/$raid_dir_regex/[^/]+$: } @$files;
|
||||
|
||||
# add files to copy and the destination directory
|
||||
safe_system( $cp, @non_raid, "'$target'" ) if (@non_raid);
|
||||
|
||||
foreach my $rd ( @$raid_dirs ) {
|
||||
my @raid = map { "'$_'" } grep { m:$rd/: } @$files;
|
||||
safe_system( $cp, @raid, "'$target'/$rd" ) if ( @raid );
|
||||
}
|
||||
# perform the actual copy
|
||||
safe_system( $cp, (map { "'$_'" } @$files), "'$target'" );
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -789,35 +767,6 @@ sub get_row_hash {
|
||||
return $sth->fetchrow_hashref();
|
||||
}
|
||||
|
||||
sub scan_raid_dir {
|
||||
my ( $r_db_files, $data_dir, @raid_dir ) = @_;
|
||||
|
||||
local(*RAID_DIR);
|
||||
|
||||
foreach my $rd ( @raid_dir ) {
|
||||
|
||||
opendir(RAID_DIR, "$data_dir/$rd" )
|
||||
or die "Cannot open dir '$data_dir/$rd': $!";
|
||||
|
||||
while ( defined( my $name = readdir RAID_DIR ) ) {
|
||||
$r_db_files->{"$rd/$name"} = $1 if ( $name =~ /(.+)\.\w+$/ );
|
||||
}
|
||||
closedir( RAID_DIR );
|
||||
}
|
||||
}
|
||||
|
||||
sub get_raid_dirs {
|
||||
my ( $r_files ) = @_;
|
||||
|
||||
my %dirs = ();
|
||||
foreach my $f ( @$r_files ) {
|
||||
if ( $f =~ m:^($raid_dir_regex)/: ) {
|
||||
$dirs{$1} = 1;
|
||||
}
|
||||
}
|
||||
return sort keys %dirs;
|
||||
}
|
||||
|
||||
sub get_list_of_tables {
|
||||
my ( $db ) = @_;
|
||||
|
||||
|
@ -48,7 +48,7 @@ ENDIF(DISABLE_GRANT_OPTIONS)
|
||||
|
||||
ADD_EXECUTABLE(mysqld${MYSQLD_EXE_SUFFIX}
|
||||
../sql-common/client.c derror.cc des_key_file.cc
|
||||
discover.cc ../libmysql/errmsg.c field.cc field_conv.cc
|
||||
discover.cc ../libmysql/errmsg.c field.cc stacktrace.c stacktrace.h field_conv.cc
|
||||
filesort.cc gstream.cc ha_blackhole.cc
|
||||
ha_archive.cc ha_heap.cc ha_myisam.cc ha_myisammrg.cc
|
||||
ha_innodb.cc ha_federated.cc ha_berkeley.cc
|
||||
|
@ -439,7 +439,8 @@ void ha_ndbcluster::no_uncommitted_rows_reset(THD *thd)
|
||||
|
||||
void ha_ndbcluster::invalidate_dictionary_cache(bool global)
|
||||
{
|
||||
NDBDICT *dict= get_ndb()->getDictionary();
|
||||
Ndb * ndb= get_ndb();
|
||||
NDBDICT *dict= ndb->getDictionary();
|
||||
DBUG_ENTER("invalidate_dictionary_cache");
|
||||
DBUG_PRINT("info", ("invalidating %s", m_tabname));
|
||||
|
||||
@ -459,6 +460,7 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
|
||||
}
|
||||
else
|
||||
dict->removeCachedTable(m_tabname);
|
||||
build_index_list(ndb, table, ILBP_OPEN);
|
||||
table->s->version=0L; /* Free when thread is ready */
|
||||
/* Invalidate indexes */
|
||||
for (uint i= 0; i < table->s->keys; i++)
|
||||
@ -470,17 +472,23 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
|
||||
switch (idx_type) {
|
||||
case PRIMARY_KEY_ORDERED_INDEX:
|
||||
case ORDERED_INDEX:
|
||||
if (!index)
|
||||
break;
|
||||
if (global)
|
||||
dict->invalidateIndex(index->getName(), m_tabname);
|
||||
else
|
||||
dict->removeCachedIndex(index->getName(), m_tabname);
|
||||
break;
|
||||
case UNIQUE_ORDERED_INDEX:
|
||||
if (!index)
|
||||
break;
|
||||
if (global)
|
||||
dict->invalidateIndex(index->getName(), m_tabname);
|
||||
else
|
||||
dict->removeCachedIndex(index->getName(), m_tabname);
|
||||
case UNIQUE_INDEX:
|
||||
if (!unique_index)
|
||||
break;
|
||||
if (global)
|
||||
dict->invalidateIndex(unique_index->getName(), m_tabname);
|
||||
else
|
||||
|
@ -2580,6 +2580,7 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry)
|
||||
if (entry && entry->value)
|
||||
{
|
||||
item_result_type= entry->type;
|
||||
unsigned_flag= entry->unsigned_flag;
|
||||
if (strict_type && required_result_type != item_result_type)
|
||||
DBUG_RETURN(1);
|
||||
switch (item_result_type) {
|
||||
@ -2875,7 +2876,10 @@ const String *Item_param::query_val_str(String* str) const
|
||||
{
|
||||
switch (state) {
|
||||
case INT_VALUE:
|
||||
str->set(value.integer, &my_charset_bin);
|
||||
if (unsigned_flag)
|
||||
str->set((ulonglong) value.integer, &my_charset_bin);
|
||||
else
|
||||
str->set(value.integer, &my_charset_bin);
|
||||
break;
|
||||
case REAL_VALUE:
|
||||
str->set(value.real, NOT_FIXED_DEC, &my_charset_bin);
|
||||
|
225
sql/mysqld.cc
225
sql/mysqld.cc
@ -138,6 +138,13 @@ extern "C" { // Because of SCO 3.2V4.2
|
||||
#include <sys/mman.h>
|
||||
#endif
|
||||
|
||||
#ifdef __WIN__
|
||||
#include <crtdbg.h>
|
||||
#define SIGNAL_FMT "exception 0x%x"
|
||||
#else
|
||||
#define SIGNAL_FMT "signal %d"
|
||||
#endif
|
||||
|
||||
#ifdef __NETWARE__
|
||||
#define zVOLSTATE_ACTIVE 6
|
||||
#define zVOLSTATE_DEACTIVE 2
|
||||
@ -227,6 +234,7 @@ inline void set_proper_floating_point_mode()
|
||||
extern "C" int gethostname(char *name, int namelen);
|
||||
#endif
|
||||
|
||||
extern "C" sig_handler handle_segfault(int sig);
|
||||
|
||||
/* Constants */
|
||||
|
||||
@ -1031,9 +1039,6 @@ static void __cdecl kill_server(int sig_ptr)
|
||||
#endif
|
||||
close_connections();
|
||||
if (sig != MYSQL_KILL_SIGNAL &&
|
||||
#ifdef __WIN__
|
||||
sig != SIGINT && /* Bug#18235 */
|
||||
#endif
|
||||
sig != 0)
|
||||
unireg_abort(1); /* purecov: inspected */
|
||||
else
|
||||
@ -1592,8 +1597,7 @@ static void network_init(void)
|
||||
FORMAT_MESSAGE_FROM_SYSTEM,
|
||||
NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
||||
(LPTSTR) &lpMsgBuf, 0, NULL );
|
||||
MessageBox(NULL, (LPTSTR) lpMsgBuf, "Error from CreateNamedPipe",
|
||||
MB_OK|MB_ICONINFORMATION);
|
||||
sql_perror((char *)lpMsgBuf);
|
||||
LocalFree(lpMsgBuf);
|
||||
unireg_abort(1);
|
||||
}
|
||||
@ -1796,17 +1800,163 @@ extern "C" sig_handler abort_thread(int sig __attribute__((unused)))
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#if defined(__WIN__) || defined(OS2)
|
||||
#if defined(__WIN__)
|
||||
|
||||
|
||||
/*
|
||||
On Windows, we use native SetConsoleCtrlHandler for handle events like Ctrl-C
|
||||
with graceful shutdown.
|
||||
Also, we do not use signal(), but SetUnhandledExceptionFilter instead - as it
|
||||
provides possibility to pass the exception to just-in-time debugger, collect
|
||||
dumps and potentially also the exception and thread context used to output
|
||||
callstack.
|
||||
*/
|
||||
|
||||
static BOOL WINAPI console_event_handler( DWORD type )
|
||||
{
|
||||
DBUG_ENTER("console_event_handler");
|
||||
if(type == CTRL_C_EVENT)
|
||||
{
|
||||
/*
|
||||
Do not shutdown before startup is finished and shutdown
|
||||
thread is initialized. Otherwise there is a race condition
|
||||
between main thread doing initialization and CTRL-C thread doing
|
||||
cleanup, which can result into crash.
|
||||
*/
|
||||
if(hEventShutdown)
|
||||
kill_mysql();
|
||||
else
|
||||
sql_print_warning("CTRL-C ignored during startup");
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
In Visual Studio 2005 and later, default SIGABRT handler will overwrite
|
||||
any unhandled exception filter set by the application and will try to
|
||||
call JIT debugger. This is not what we want, this we calling __debugbreak
|
||||
to stop in debugger, if process is being debugged or to generate
|
||||
EXCEPTION_BREAKPOINT and then handle_segfault will do its magic.
|
||||
*/
|
||||
|
||||
#if (_MSC_VER >= 1400)
|
||||
static void my_sigabrt_handler(int sig)
|
||||
{
|
||||
__debugbreak();
|
||||
}
|
||||
#endif /*_MSC_VER >=1400 */
|
||||
|
||||
void win_install_sigabrt_handler(void)
|
||||
{
|
||||
#if (_MSC_VER >=1400)
|
||||
/*abort() should not override our exception filter*/
|
||||
_set_abort_behavior(0,_CALL_REPORTFAULT);
|
||||
signal(SIGABRT,my_sigabrt_handler);
|
||||
#endif /* _MSC_VER >=1400 */
|
||||
}
|
||||
|
||||
#ifdef DEBUG_UNHANDLED_EXCEPTION_FILTER
|
||||
#define DEBUGGER_ATTACH_TIMEOUT 120
|
||||
/*
|
||||
Wait for debugger to attach and break into debugger. If debugger is not attached,
|
||||
resume after timeout.
|
||||
*/
|
||||
static void wait_for_debugger(int timeout_sec)
|
||||
{
|
||||
if(!IsDebuggerPresent())
|
||||
{
|
||||
int i;
|
||||
printf("Waiting for debugger to attach, pid=%u\n",GetCurrentProcessId());
|
||||
fflush(stdout);
|
||||
for(i= 0; i < timeout_sec; i++)
|
||||
{
|
||||
Sleep(1000);
|
||||
if(IsDebuggerPresent())
|
||||
{
|
||||
/* Break into debugger */
|
||||
__debugbreak();
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("pid=%u, debugger not attached after %d seconds, resuming\n",GetCurrentProcessId(),
|
||||
timeout_sec);
|
||||
fflush(stdout);
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG_UNHANDLED_EXCEPTION_FILTER */
|
||||
|
||||
LONG WINAPI my_unhandler_exception_filter(EXCEPTION_POINTERS *ex_pointers)
|
||||
{
|
||||
static BOOL first_time= TRUE;
|
||||
if(!first_time)
|
||||
{
|
||||
/*
|
||||
This routine can be called twice, typically
|
||||
when detaching in JIT debugger.
|
||||
Return EXCEPTION_EXECUTE_HANDLER to terminate process.
|
||||
*/
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
first_time= FALSE;
|
||||
#ifdef DEBUG_UNHANDLED_EXCEPTION_FILTER
|
||||
/*
|
||||
Unfortunately there is no clean way to debug unhandled exception filters,
|
||||
as debugger does not stop there(also documented in MSDN)
|
||||
To overcome, one could put a MessageBox, but this will not work in service.
|
||||
Better solution is to print error message and sleep some minutes
|
||||
until debugger is attached
|
||||
*/
|
||||
wait_for_debugger(DEBUGGER_ATTACH_TIMEOUT);
|
||||
#endif /* DEBUG_UNHANDLED_EXCEPTION_FILTER */
|
||||
__try
|
||||
{
|
||||
set_exception_pointers(ex_pointers);
|
||||
handle_segfault(ex_pointers->ExceptionRecord->ExceptionCode);
|
||||
}
|
||||
__except(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
DWORD written;
|
||||
const char msg[] = "Got exception in exception handler!\n";
|
||||
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),msg, sizeof(msg)-1,
|
||||
&written,NULL);
|
||||
}
|
||||
/*
|
||||
Return EXCEPTION_CONTINUE_SEARCH to give JIT debugger
|
||||
(drwtsn32 or vsjitdebugger) possibility to attach,
|
||||
if JIT debugger is configured.
|
||||
Windows Error reporting might generate a dump here.
|
||||
*/
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
|
||||
static void init_signals(void)
|
||||
{
|
||||
int signals[] = {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGABRT } ;
|
||||
for (uint i=0 ; i < sizeof(signals)/sizeof(int) ; i++)
|
||||
signal(signals[i], kill_server) ;
|
||||
#if defined(__WIN__)
|
||||
signal(SIGBREAK,SIG_IGN); //ignore SIGBREAK for NT
|
||||
#else
|
||||
signal(SIGBREAK, kill_server);
|
||||
#endif
|
||||
win_install_sigabrt_handler();
|
||||
if(opt_console)
|
||||
SetConsoleCtrlHandler(console_event_handler,TRUE);
|
||||
else
|
||||
{
|
||||
/* Avoid MessageBox()es*/
|
||||
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
|
||||
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
|
||||
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
|
||||
|
||||
/*
|
||||
Do not use SEM_NOGPFAULTERRORBOX in the following SetErrorMode (),
|
||||
because it would prevent JIT debugger and Windows error reporting
|
||||
from working. We need WER or JIT-debugging, since our own unhandled
|
||||
exception filter is not guaranteed to work in all situation
|
||||
(like heap corruption or stack overflow)
|
||||
*/
|
||||
SetErrorMode(SetErrorMode(0)|SEM_FAILCRITICALERRORS|SEM_NOOPENFILEERRORBOX);
|
||||
}
|
||||
SetUnhandledExceptionFilter(my_unhandler_exception_filter);
|
||||
}
|
||||
|
||||
static void start_signal_handler(void)
|
||||
@ -2094,8 +2244,8 @@ static void start_signal_handler(void)
|
||||
|
||||
static void check_data_home(const char *path)
|
||||
{}
|
||||
#endif /*__WIN__ || __NETWARE || __EMX__*/
|
||||
|
||||
#else /* if ! __WIN__ && ! __EMX__ */
|
||||
|
||||
#ifdef HAVE_LINUXTHREADS
|
||||
#define UNSAFE_DEFAULT_LINUX_THREADS 200
|
||||
@ -2115,7 +2265,7 @@ extern "C" sig_handler handle_segfault(int sig)
|
||||
*/
|
||||
if (segfaulted)
|
||||
{
|
||||
fprintf(stderr, "Fatal signal %d while backtracing\n", sig);
|
||||
fprintf(stderr, "Fatal " SIGNAL_FMT " while backtracing\n", sig);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@ -2125,7 +2275,7 @@ extern "C" sig_handler handle_segfault(int sig)
|
||||
localtime_r(&curr_time, &tm);
|
||||
|
||||
fprintf(stderr,"\
|
||||
%02d%02d%02d %2d:%02d:%02d - mysqld got signal %d;\n\
|
||||
%02d%02d%02d %2d:%02d:%02d - mysqld got " SIGNAL_FMT " ;\n\
|
||||
This could be because you hit a bug. It is also possible that this binary\n\
|
||||
or one of the libraries it was linked against is corrupt, improperly built,\n\
|
||||
or misconfigured. This error can also be caused by malfunctioning hardware.\n",
|
||||
@ -2166,6 +2316,10 @@ the thread stack. Please read http://dev.mysql.com/doc/mysql/en/linux.html\n\n",
|
||||
if (!(test_flags & TEST_NO_STACKTRACE))
|
||||
{
|
||||
fprintf(stderr,"thd=%p\n",thd);
|
||||
fprintf(stderr,"\
|
||||
Attempting backtrace. You can use the following information to find out\n\
|
||||
where mysqld died. If you see no messages after this, something went\n\
|
||||
terribly wrong...\n");
|
||||
print_stacktrace(thd ? (gptr) thd->thread_stack : (gptr) 0,
|
||||
thread_stack);
|
||||
}
|
||||
@ -2214,15 +2368,22 @@ of those buggy OS calls. You should consider whether you really need the\n\
|
||||
bugs.\n");
|
||||
}
|
||||
|
||||
#ifdef HAVE_WRITE_CORE
|
||||
if (test_flags & TEST_CORE_ON_SIGNAL)
|
||||
{
|
||||
fprintf(stderr, "Writing a core file\n");
|
||||
fflush(stderr);
|
||||
write_core(sig);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef __WIN__
|
||||
/* On Windows, do not terminate, but pass control to exception filter */
|
||||
exit(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(__WIN__) && !defined(__NETWARE__) && !defined(__EMX__)
|
||||
#ifndef SA_RESETHAND
|
||||
#define SA_RESETHAND 0
|
||||
#endif
|
||||
@ -2567,19 +2728,6 @@ static void my_str_free_mysqld(void *ptr)
|
||||
|
||||
|
||||
#ifdef __WIN__
|
||||
|
||||
struct utsname
|
||||
{
|
||||
char nodename[FN_REFLEN];
|
||||
};
|
||||
|
||||
|
||||
int uname(struct utsname *a)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
pthread_handler_t handle_shutdown(void *arg)
|
||||
{
|
||||
MSG msg;
|
||||
@ -2593,18 +2741,6 @@ pthread_handler_t handle_shutdown(void *arg)
|
||||
kill_server(MYSQL_KILL_SIGNAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int STDCALL handle_kill(ulong ctrl_type)
|
||||
{
|
||||
if (ctrl_type == CTRL_CLOSE_EVENT ||
|
||||
ctrl_type == CTRL_SHUTDOWN_EVENT)
|
||||
{
|
||||
kill_server(MYSQL_KILL_SIGNAL);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -3633,11 +3769,6 @@ we force server id to 2, but this MySQL server will not act as a slave.");
|
||||
freopen(log_error_file,"a+",stderr);
|
||||
FreeConsole(); // Remove window
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Don't show error dialog box when on foreground: it stops the server */
|
||||
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
11
sql/slave.cc
11
sql/slave.cc
@ -2447,14 +2447,15 @@ bool show_master_info(THD* thd, MASTER_INFO* mi)
|
||||
protocol->prepare_for_resend();
|
||||
|
||||
/*
|
||||
TODO: we read slave_running without run_lock, whereas these variables
|
||||
are updated under run_lock and not data_lock. In 5.0 we should lock
|
||||
run_lock on top of data_lock (with good order).
|
||||
slave_running can be accessed without run_lock but not other
|
||||
non-volotile members like mi->io_thd, which is guarded by the mutex.
|
||||
*/
|
||||
pthread_mutex_lock(&mi->run_lock);
|
||||
protocol->store(mi->io_thd ? mi->io_thd->proc_info : "", &my_charset_bin);
|
||||
pthread_mutex_unlock(&mi->run_lock);
|
||||
|
||||
pthread_mutex_lock(&mi->data_lock);
|
||||
pthread_mutex_lock(&mi->rli.data_lock);
|
||||
|
||||
protocol->store(mi->io_thd ? mi->io_thd->proc_info : "", &my_charset_bin);
|
||||
protocol->store(mi->host, &my_charset_bin);
|
||||
protocol->store(mi->user, &my_charset_bin);
|
||||
protocol->store((uint32) mi->port);
|
||||
|
@ -65,8 +65,8 @@
|
||||
mi->rli does not either.
|
||||
|
||||
In MASTER_INFO: run_lock, data_lock
|
||||
run_lock protects all information about the run state: slave_running, and the
|
||||
existence of the I/O thread (to stop/start it, you need this mutex).
|
||||
run_lock protects all information about the run state: slave_running, thd
|
||||
and the existence of the I/O thread to stop/start it, you need this mutex).
|
||||
data_lock protects some moving members of the struct: counters (log name,
|
||||
position) and relay log (MYSQL_LOG object).
|
||||
|
||||
|
@ -98,22 +98,7 @@ static bool do_command(THD *thd);
|
||||
#endif // EMBEDDED_LIBRARY
|
||||
|
||||
#ifdef __WIN__
|
||||
static void test_signal(int sig_ptr)
|
||||
{
|
||||
#if !defined( DBUG_OFF)
|
||||
MessageBox(NULL,"Test signal","DBUG",MB_OK);
|
||||
#endif
|
||||
#if defined(OS2)
|
||||
fprintf(stderr, "Test signal %d\n", sig_ptr);
|
||||
fflush(stderr);
|
||||
#endif
|
||||
}
|
||||
static void init_signals(void)
|
||||
{
|
||||
int signals[7] = {SIGINT,SIGILL,SIGFPE,SIGSEGV,SIGTERM,SIGBREAK,SIGABRT } ;
|
||||
for (int i=0 ; i < 7 ; i++)
|
||||
signal( signals[i], test_signal) ;
|
||||
}
|
||||
extern void win_install_sigabrt_handler(void);
|
||||
#endif
|
||||
|
||||
static void unlock_locked_tables(THD *thd)
|
||||
@ -1124,7 +1109,7 @@ pthread_handler_t handle_one_connection(void *arg)
|
||||
/* now that we've called my_thread_init(), it is safe to call DBUG_* */
|
||||
|
||||
#if defined(__WIN__)
|
||||
init_signals();
|
||||
win_install_sigabrt_handler();
|
||||
#elif !defined(OS2) && !defined(__NETWARE__)
|
||||
sigset_t set;
|
||||
VOID(sigemptyset(&set)); // Get mask in use
|
||||
|
275
sql/stacktrace.c
275
sql/stacktrace.c
@ -13,11 +13,15 @@
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
/* Workaround for Bug#32082: VOID redefinition on Win results in compile errors*/
|
||||
#define DONT_DEFINE_VOID 1
|
||||
|
||||
#include <my_global.h>
|
||||
#include "stacktrace.h"
|
||||
|
||||
#ifndef __WIN__
|
||||
#include <signal.h>
|
||||
#include <my_pthread.h>
|
||||
|
||||
#ifdef HAVE_STACKTRACE
|
||||
#include <unistd.h>
|
||||
#include <strings.h>
|
||||
@ -118,10 +122,7 @@ void print_stacktrace(gptr stack_bottom, ulong thread_stack)
|
||||
#endif
|
||||
LINT_INIT(fp);
|
||||
|
||||
fprintf(stderr,"\
|
||||
Attempting backtrace. You can use the following information to find out\n\
|
||||
where mysqld died. If you see no messages after this, something went\n\
|
||||
terribly wrong...\n");
|
||||
|
||||
#ifdef __i386__
|
||||
__asm __volatile__ ("movl %%ebp,%0"
|
||||
:"=r"(fp)
|
||||
@ -257,3 +258,267 @@ void write_core(int sig)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#else /* __WIN__*/
|
||||
|
||||
#include <dbghelp.h>
|
||||
|
||||
/*
|
||||
Stack tracing on Windows is implemented using Debug Helper library(dbghelp.dll)
|
||||
We do not redistribute dbghelp and the one comes with older OS (up to Windows 2000)
|
||||
is missing some important functions like functions StackWalk64 or MinidumpWriteDump.
|
||||
Hence, we have to load functions at runtime using LoadLibrary/GetProcAddress.
|
||||
*/
|
||||
|
||||
typedef DWORD (WINAPI *SymSetOptions_FctType)(DWORD dwOptions);
|
||||
typedef BOOL (WINAPI *SymGetModuleInfo64_FctType)
|
||||
(HANDLE,DWORD64,PIMAGEHLP_MODULE64) ;
|
||||
typedef BOOL (WINAPI *SymGetSymFromAddr64_FctType)
|
||||
(HANDLE,DWORD64,PDWORD64,PIMAGEHLP_SYMBOL64) ;
|
||||
typedef BOOL (WINAPI *SymGetLineFromAddr64_FctType)
|
||||
(HANDLE,DWORD64,PDWORD,PIMAGEHLP_LINE64);
|
||||
typedef BOOL (WINAPI *SymInitialize_FctType)
|
||||
(HANDLE,PSTR,BOOL);
|
||||
typedef BOOL (WINAPI *StackWalk64_FctType)
|
||||
(DWORD,HANDLE,HANDLE,LPSTACKFRAME64,PVOID,PREAD_PROCESS_MEMORY_ROUTINE64,
|
||||
PFUNCTION_TABLE_ACCESS_ROUTINE64,PGET_MODULE_BASE_ROUTINE64 ,
|
||||
PTRANSLATE_ADDRESS_ROUTINE64);
|
||||
typedef BOOL (WINAPI *MiniDumpWriteDump_FctType)(
|
||||
IN HANDLE hProcess,
|
||||
IN DWORD ProcessId,
|
||||
IN HANDLE hFile,
|
||||
IN MINIDUMP_TYPE DumpType,
|
||||
IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL
|
||||
IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL
|
||||
IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
|
||||
);
|
||||
|
||||
static SymSetOptions_FctType pSymSetOptions;
|
||||
static SymGetModuleInfo64_FctType pSymGetModuleInfo64;
|
||||
static SymGetSymFromAddr64_FctType pSymGetSymFromAddr64;
|
||||
static SymInitialize_FctType pSymInitialize;
|
||||
static StackWalk64_FctType pStackWalk64;
|
||||
static SymGetLineFromAddr64_FctType pSymGetLineFromAddr64;
|
||||
static MiniDumpWriteDump_FctType pMiniDumpWriteDump;
|
||||
|
||||
static EXCEPTION_POINTERS *exception_ptrs;
|
||||
|
||||
#define MODULE64_SIZE_WINXP 576
|
||||
#define STACKWALK_MAX_FRAMES 64
|
||||
|
||||
/*
|
||||
Dynamically load dbghelp functions
|
||||
*/
|
||||
BOOL init_dbghelp_functions()
|
||||
{
|
||||
static BOOL first_time= TRUE;
|
||||
static BOOL rc;
|
||||
HMODULE hDbghlp;
|
||||
|
||||
if(first_time)
|
||||
{
|
||||
first_time= FALSE;
|
||||
hDbghlp= LoadLibrary("dbghelp");
|
||||
if(!hDbghlp)
|
||||
{
|
||||
rc= FALSE;
|
||||
return rc;
|
||||
}
|
||||
pSymSetOptions= (SymSetOptions_FctType)
|
||||
GetProcAddress(hDbghlp,"SymSetOptions");
|
||||
pSymInitialize= (SymInitialize_FctType)
|
||||
GetProcAddress(hDbghlp,"SymInitialize");
|
||||
pSymGetModuleInfo64= (SymGetModuleInfo64_FctType)
|
||||
GetProcAddress(hDbghlp,"SymGetModuleInfo64");
|
||||
pSymGetLineFromAddr64= (SymGetLineFromAddr64_FctType)
|
||||
GetProcAddress(hDbghlp,"SymGetLineFromAddr64");
|
||||
pSymGetSymFromAddr64=(SymGetSymFromAddr64_FctType)
|
||||
GetProcAddress(hDbghlp,"SymGetSymFromAddr64");
|
||||
pStackWalk64= (StackWalk64_FctType)
|
||||
GetProcAddress(hDbghlp,"StackWalk64");
|
||||
pMiniDumpWriteDump = (MiniDumpWriteDump_FctType)
|
||||
GetProcAddress(hDbghlp,"MiniDumpWriteDump");
|
||||
|
||||
rc = (BOOL)(pSymSetOptions && pSymInitialize && pSymGetModuleInfo64
|
||||
&& pSymGetLineFromAddr64 && pSymGetSymFromAddr64 && pStackWalk64);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
void set_exception_pointers(EXCEPTION_POINTERS *ep)
|
||||
{
|
||||
exception_ptrs = ep;
|
||||
}
|
||||
|
||||
/* Platform SDK in VS2003 does not have definition for SYMOPT_NO_PROMPTS*/
|
||||
#ifndef SYMOPT_NO_PROMPTS
|
||||
#define SYMOPT_NO_PROMPTS 0
|
||||
#endif
|
||||
|
||||
void print_stacktrace(gptr unused1, ulong unused2)
|
||||
{
|
||||
HANDLE hProcess= GetCurrentProcess();
|
||||
HANDLE hThread= GetCurrentThread();
|
||||
static IMAGEHLP_MODULE64 module= {sizeof(module)};
|
||||
static IMAGEHLP_SYMBOL64_PACKAGE package;
|
||||
DWORD64 addr;
|
||||
DWORD machine;
|
||||
int i;
|
||||
CONTEXT context;
|
||||
STACKFRAME64 frame={0};
|
||||
|
||||
if(!exception_ptrs || !init_dbghelp_functions())
|
||||
return;
|
||||
|
||||
/* Copy context, as stackwalking on original will unwind the stack */
|
||||
context = *(exception_ptrs->ContextRecord);
|
||||
/*Initialize symbols.*/
|
||||
pSymSetOptions(SYMOPT_LOAD_LINES|SYMOPT_NO_PROMPTS|SYMOPT_DEFERRED_LOADS|SYMOPT_DEBUG);
|
||||
pSymInitialize(hProcess,NULL,TRUE);
|
||||
|
||||
/*Prepare stackframe for the first StackWalk64 call*/
|
||||
frame.AddrFrame.Mode= frame.AddrPC.Mode= frame.AddrStack.Mode= AddrModeFlat;
|
||||
#if (defined _M_IX86)
|
||||
machine= IMAGE_FILE_MACHINE_I386;
|
||||
frame.AddrFrame.Offset= context.Ebp;
|
||||
frame.AddrPC.Offset= context.Eip;
|
||||
frame.AddrStack.Offset= context.Esp;
|
||||
#elif (defined _M_X64)
|
||||
machine = IMAGE_FILE_MACHINE_AMD64;
|
||||
frame.AddrFrame.Offset= context.Rbp;
|
||||
frame.AddrPC.Offset= context.Rip;
|
||||
frame.AddrStack.Offset= context.Rsp;
|
||||
#else
|
||||
/*There is currently no need to support IA64*/
|
||||
#pragma error ("unsupported architecture")
|
||||
#endif
|
||||
|
||||
package.sym.SizeOfStruct= sizeof(package.sym);
|
||||
package.sym.MaxNameLength= sizeof(package.name);
|
||||
|
||||
/*Walk the stack, output useful information*/
|
||||
for(i= 0; i< STACKWALK_MAX_FRAMES;i++)
|
||||
{
|
||||
DWORD64 function_offset= 0;
|
||||
DWORD line_offset= 0;
|
||||
IMAGEHLP_LINE64 line= {sizeof(line)};
|
||||
BOOL have_module= FALSE;
|
||||
BOOL have_symbol= FALSE;
|
||||
BOOL have_source= FALSE;
|
||||
|
||||
if(!pStackWalk64(machine, hProcess, hThread, &frame, &context, 0, 0, 0 ,0))
|
||||
break;
|
||||
addr= frame.AddrPC.Offset;
|
||||
|
||||
have_module= pSymGetModuleInfo64(hProcess,addr,&module);
|
||||
#ifdef _M_IX86
|
||||
if(!have_module)
|
||||
{
|
||||
/*
|
||||
ModuleInfo structure has been "compatibly" extended in releases after XP,
|
||||
and its size was increased. To make XP dbghelp.dll function
|
||||
happy, pretend passing the old structure.
|
||||
*/
|
||||
module.SizeOfStruct= MODULE64_SIZE_WINXP;
|
||||
have_module= pSymGetModuleInfo64(hProcess, addr, &module);
|
||||
}
|
||||
#endif
|
||||
|
||||
have_symbol= pSymGetSymFromAddr64(hProcess, addr, &function_offset,
|
||||
&(package.sym));
|
||||
have_source= pSymGetLineFromAddr64(hProcess, addr, &line_offset, &line);
|
||||
|
||||
fprintf(stderr, "%p ", addr);
|
||||
if(have_module)
|
||||
{
|
||||
char *base_image_name= strrchr(module.ImageName, '\\');
|
||||
if(base_image_name)
|
||||
base_image_name++;
|
||||
else
|
||||
base_image_name= module.ImageName;
|
||||
fprintf(stderr, "%s!", base_image_name);
|
||||
}
|
||||
if(have_symbol)
|
||||
fprintf(stderr, "%s()", package.sym.Name);
|
||||
else if(have_module)
|
||||
fprintf(stderr, "???");
|
||||
|
||||
if(have_source)
|
||||
{
|
||||
char *base_file_name= strrchr(line.FileName, '\\');
|
||||
if(base_file_name)
|
||||
base_file_name++;
|
||||
else
|
||||
base_file_name= line.FileName;
|
||||
fprintf(stderr,"[%s:%u]", base_file_name, line.LineNumber);
|
||||
}
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Write dump. The dump is created in current directory,
|
||||
file name is constructed from executable name plus
|
||||
".dmp" extension
|
||||
*/
|
||||
void write_core(int unused)
|
||||
{
|
||||
char path[MAX_PATH];
|
||||
char dump_fname[MAX_PATH]= "core.dmp";
|
||||
MINIDUMP_EXCEPTION_INFORMATION info;
|
||||
HANDLE hFile;
|
||||
|
||||
if(!exception_ptrs || !init_dbghelp_functions() || !pMiniDumpWriteDump)
|
||||
return;
|
||||
|
||||
info.ExceptionPointers= exception_ptrs;
|
||||
info.ClientPointers= FALSE;
|
||||
info.ThreadId= GetCurrentThreadId();
|
||||
|
||||
if(GetModuleFileName(NULL, path, sizeof(path)))
|
||||
{
|
||||
_splitpath(path, NULL, NULL,dump_fname,NULL);
|
||||
strncat(dump_fname, ".dmp", sizeof(dump_fname));
|
||||
}
|
||||
|
||||
hFile= CreateFile(dump_fname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,
|
||||
FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if(hFile)
|
||||
{
|
||||
/* Create minidump */
|
||||
if(pMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
|
||||
hFile, MiniDumpNormal, &info, 0, 0))
|
||||
{
|
||||
fprintf(stderr, "Minidump written to %s\n",
|
||||
_fullpath(path, dump_fname, sizeof(path)) ? path : dump_fname);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"MiniDumpWriteDump() failed, last error %u\n",
|
||||
GetLastError());
|
||||
}
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "CreateFile(%s) failed, last error %u\n", dump_fname,
|
||||
GetLastError());
|
||||
}
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
|
||||
void safe_print_str(const char *name, const char *val, int len)
|
||||
{
|
||||
fprintf(stderr,"%s at %p", name, val);
|
||||
__try
|
||||
{
|
||||
fprintf(stderr,"=%.*s\n", len, val);
|
||||
}
|
||||
__except(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
fprintf(stderr,"is an invalid string pointer\n");
|
||||
}
|
||||
}
|
||||
#endif /*__WIN__*/
|
||||
|
@ -29,20 +29,33 @@ extern char* heap_start;
|
||||
heap_start = (char*) &__bss_start; \
|
||||
check_thread_lib(); \
|
||||
} while(0);
|
||||
void check_thread_lib(void);
|
||||
#endif /* defined (__i386__) || (defined(__alpha__) && defined(__GNUC__))) */
|
||||
#elif defined (__WIN__)
|
||||
#define HAVE_STACKTRACE
|
||||
extern void set_exception_pointers(EXCEPTION_POINTERS *ep);
|
||||
#define init_stacktrace() {}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STACKTRACE
|
||||
void print_stacktrace(gptr stack_bottom, ulong thread_stack);
|
||||
void safe_print_str(const char* name, const char* val, int max_len);
|
||||
void check_thread_lib(void);
|
||||
#endif /* (defined (__i386__) || (defined(__alpha__) && defined(__GNUC__))) */
|
||||
#endif /* TARGET_OS_LINUX */
|
||||
|
||||
#else
|
||||
/* Define empty prototypes for functions that are not implemented */
|
||||
#ifndef HAVE_STACKTRACE
|
||||
#define init_stacktrace() {}
|
||||
#define print_stacktrace(A,B) {}
|
||||
#define safe_print_str(A,B,C) {}
|
||||
#endif /* HAVE_STACKTRACE */
|
||||
|
||||
|
||||
#if !defined(__NETWARE__)
|
||||
#define HAVE_WRITE_CORE
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WRITE_CORE
|
||||
void write_core(int sig);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
# MA 02110-1301 USA.
|
||||
|
||||
%define mysql_version @VERSION@
|
||||
%define mysql_vendor MySQL AB
|
||||
|
||||
# use "rpmbuild --with static" or "rpm --define '_with_static 1'" (for RPM 3.x)
|
||||
# to enable static linking (off by default)
|
||||
@ -69,7 +70,7 @@ License: %{license}
|
||||
Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz
|
||||
URL: http://www.mysql.com/
|
||||
Packager: MySQL Production Engineering Team <build@mysql.com>
|
||||
Vendor: MySQL AB
|
||||
Vendor: %{mysql_vendor}
|
||||
Provides: msqlormysql MySQL-server mysql
|
||||
BuildRequires: ncurses-devel
|
||||
Obsoletes: mysql
|
||||
@ -420,6 +421,72 @@ touch $RBR%{_sysconfdir}/my.cnf
|
||||
touch $RBR%{_sysconfdir}/mysqlmanager.passwd
|
||||
|
||||
%pre server
|
||||
# Check if we can safely upgrade. An upgrade is only safe if it's from one
|
||||
# of our RPMs in the same version family.
|
||||
|
||||
installed=`rpm -q --whatprovides mysql-server 2> /dev/null`
|
||||
if [ $? -eq 0 -a -n "$installed" ]; then
|
||||
vendor=`rpm -q --queryformat='%{VENDOR}' "$installed" 2>&1`
|
||||
version=`rpm -q --queryformat='%{VERSION}' "$installed" 2>&1`
|
||||
myvendor='%{mysql_vendor}'
|
||||
myversion='%{mysql_version}'
|
||||
|
||||
old_family=`echo $version | sed -n -e 's,^\([1-9][0-9]*\.[0-9][0-9]*\)\..*$,\1,p'`
|
||||
new_family=`echo $myversion | sed -n -e 's,^\([1-9][0-9]*\.[0-9][0-9]*\)\..*$,\1,p'`
|
||||
|
||||
[ -z "$vendor" ] && vendor='<unknown>'
|
||||
[ -z "$old_family" ] && old_family="<unrecognized version $version>"
|
||||
[ -z "$new_family" ] && new_family="<bad package specification: version $myversion>"
|
||||
|
||||
error_text=
|
||||
if [ "$vendor" != "$myvendor" ]; then
|
||||
error_text="$error_text
|
||||
The current MySQL server package is provided by a different
|
||||
vendor ($vendor) than $myvendor. Some files may be installed
|
||||
to different locations, including log files and the service
|
||||
startup script in %{_sysconfdir}/init.d/.
|
||||
"
|
||||
fi
|
||||
|
||||
if [ "$old_family" != "$new_family" ]; then
|
||||
error_text="$error_text
|
||||
Upgrading directly from MySQL $old_family to MySQL $new_family may not
|
||||
be safe in all cases. A manual dump and restore using mysqldump is
|
||||
recommended. It is important to review the MySQL manual's Upgrading
|
||||
section for version-specific incompatibilities.
|
||||
"
|
||||
fi
|
||||
|
||||
if [ -n "$error_text" ]; then
|
||||
cat <<HERE >&2
|
||||
|
||||
******************************************************************
|
||||
A MySQL server package ($installed) is installed.
|
||||
$error_text
|
||||
A manual upgrade is required.
|
||||
|
||||
- Ensure that you have a complete, working backup of your data and my.cnf
|
||||
files
|
||||
- Shut down the MySQL server cleanly
|
||||
- Remove the existing MySQL packages. Usually this command will
|
||||
list the packages you should remove:
|
||||
rpm -qa | grep -i '^mysql-'
|
||||
|
||||
You may choose to use 'rpm --nodeps -ev <package-name>' to remove
|
||||
the package which contains the mysqlclient shared library. The
|
||||
library will be reinstalled by the MySQL-shared-compat package.
|
||||
- Install the new MySQL packages supplied by $myvendor
|
||||
- Ensure that the MySQL server is started
|
||||
- Run the 'mysql_upgrade' program
|
||||
|
||||
This is a brief description of the upgrade process. Important details
|
||||
can be found in the MySQL manual, in the Upgrading section.
|
||||
******************************************************************
|
||||
HERE
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Shut down a previously installed server first
|
||||
if test -x %{_sysconfdir}/init.d/mysql
|
||||
then
|
||||
@ -715,6 +782,11 @@ fi
|
||||
# itself - note that they must be ordered by date (important when
|
||||
# merging BK trees)
|
||||
%changelog
|
||||
* Mon Feb 18 2008 Timothy Smith <tim@mysql.com>
|
||||
|
||||
- Require a manual upgrade if the alread-installed mysql-server is
|
||||
from another vendor, or is of a different major version.
|
||||
|
||||
* Fri Nov 16 2007 Joerg Bruehe <joerg@mysql.com>
|
||||
|
||||
- When testing the debug server, use "make test-bt-debug".
|
||||
|
Loading…
x
Reference in New Issue
Block a user