Commit d5f63f25 authored by tomas@whalegate.ndb.mysql.com's avatar tomas@whalegate.ndb.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1-new-ndb

into  whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-single-user
parents 21e90727 ac0da397
Branches unavailable
Tags unavailable
No related merge requests found
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults $ndb_restore_opts -b $the_backup_id -n 1 $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id $ndb_restore_filter > $MYSQLTEST_VARDIR/tmp/tmp.dat
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults $ndb_restore_opts -b $the_backup_id -n 2 $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id $ndb_restore_filter >> $MYSQLTEST_VARDIR/tmp/tmp.dat
--exec sort $MYSQLTEST_VARDIR/tmp/tmp.dat
--exec rm -f $MYSQLTEST_VARDIR/tmp/tmp.dat
--let ndb_restore_opts=
--let ndb_restore_filter=
...@@ -57,6 +57,7 @@ Number of primary keys: 3 ...@@ -57,6 +57,7 @@ Number of primary keys: 3
Length of frm data: # Length of frm data: #
Row Checksum: 1 Row Checksum: 1
Row GCI: 1 Row GCI: 1
SingleUserMode: 0
TableStatus: Retrieved TableStatus: Retrieved
-- Attributes -- -- Attributes --
a Int PRIMARY KEY AT=FIXED ST=MEMORY a Int PRIMARY KEY AT=FIXED ST=MEMORY
......
...@@ -45,8 +45,8 @@ SYSTEM_VALUES_ID VALUE ...@@ -45,8 +45,8 @@ SYSTEM_VALUES_ID VALUE
0 2039 0 2039
1 3 1 3
SELECT * FROM mysql.ndb_apply_status WHERE server_id=0; SELECT * FROM mysql.ndb_apply_status WHERE server_id=0;
server_id epoch server_id epoch log_name start_pos end_pos
0 151 0 151 0 0
TRUNCATE GL; TRUNCATE GL;
TRUNCATE ACCOUNT; TRUNCATE ACCOUNT;
TRUNCATE TRANSACTION; TRUNCATE TRANSACTION;
...@@ -99,6 +99,6 @@ SYSTEM_VALUES_ID VALUE ...@@ -99,6 +99,6 @@ SYSTEM_VALUES_ID VALUE
0 2297 0 2297
1 5 1 5
SELECT * FROM mysql.ndb_apply_status WHERE server_id=0; SELECT * FROM mysql.ndb_apply_status WHERE server_id=0;
server_id epoch server_id epoch log_name start_pos end_pos
0 331 0 331 0 0
DROP DATABASE BANK; DROP DATABASE BANK;
use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
create table t1
(pk int key
,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64)
,b1 TINYINT, b2 TINYINT UNSIGNED
,c1 SMALLINT, c2 SMALLINT UNSIGNED
,d1 INT, d2 INT UNSIGNED
,e1 BIGINT, e2 BIGINT UNSIGNED
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255)
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
) engine myisam;
insert into t1 values
(1
,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001
,127, 255
,32767, 65535
,2147483647, 4294967295
,9223372036854775807, 18446744073709551615
,'1','12345678901234567890123456789012','123456789'
,'1','12345678901234567890123456789012','123456789'
,0x12,0x123456789abcdef0, 0x012345
,0x12,0x123456789abcdef0, 0x00123450
);
insert into t1 values
(2
,0, 0, 0, 0, 0
,-128, 0
,-32768, 0
,-2147483648, 0
,-9223372036854775808, 0
,'','',''
,'','',''
,0x0,0x0,0x0
,0x0,0x0,0x0
);
insert into t1 values
(3
,NULL,NULL,NULL,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
);
select pk
,hex(a1), hex(a2), hex(a3), hex(a4), hex(a5)
,b1, b2
,c1 , c2
,d1 , d2
,e1 , e2
,f1 , f2, f3
,g1 , g2, g3
,hex(h1), hex(h2), hex(h3)
,hex(i1), hex(i2), hex(i3)
from t1 order by pk;
pk 1
hex(a1) 1
hex(a2) 17
hex(a3) 789A
hex(a4) 789ABCDE
hex(a5) FEDC0001
b1 127
b2 255
c1 32767
c2 65535
d1 2147483647
d2 4294967295
e1 9223372036854775807
e2 18446744073709551615
f1 1
f2 12345678901234567890123456789012
f3 123456789
g1 1
g2 12345678901234567890123456789012
g3 123456789
hex(h1) 12
hex(h2) 123456789ABCDEF0
hex(h3) 012345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
hex(i1) 12
hex(i2) 123456789ABCDEF0
hex(i3) 00123450
pk 2
hex(a1) 0
hex(a2) 0
hex(a3) 0
hex(a4) 0
hex(a5) 0
b1 -128
b2 0
c1 -32768
c2 0
d1 -2147483648
d2 0
e1 -9223372036854775808
e2 0
f1
f2
f3
g1
g2
g3
hex(h1) 00
hex(h2) 0000000000000000
hex(h3) 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
hex(i1) 00
hex(i2) 00
hex(i3) 00
pk 3
hex(a1) NULL
hex(a2) NULL
hex(a3) NULL
hex(a4) NULL
hex(a5) NULL
b1 NULL
b2 NULL
c1 NULL
c2 NULL
d1 NULL
d2 NULL
e1 NULL
e2 NULL
f1 NULL
f2 NULL
f3 NULL
g1 NULL
g2 NULL
g3 NULL
hex(h1) NULL
hex(h2) NULL
hex(h3) NULL
hex(i1) NULL
hex(i2) NULL
hex(i3) NULL
alter table t1 engine ndb;
select pk
,hex(a1), hex(a2), hex(a3), hex(a4), hex(a5)
,b1, b2
,c1 , c2
,d1 , d2
,e1 , e2
,f1 , f2, f3
,g1 , g2, g3
,hex(h1), hex(h2), hex(h3)
,hex(i1), hex(i2), hex(i3)
from t1 order by pk;
pk 1
hex(a1) 1
hex(a2) 17
hex(a3) 789A
hex(a4) 789ABCDE
hex(a5) FEDC0001
b1 127
b2 255
c1 32767
c2 65535
d1 2147483647
d2 4294967295
e1 9223372036854775807
e2 18446744073709551615
f1 1
f2 12345678901234567890123456789012
f3 123456789
g1 1
g2 12345678901234567890123456789012
g3 123456789
hex(h1) 12
hex(h2) 123456789ABCDEF0
hex(h3) 012345000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
hex(i1) 12
hex(i2) 123456789ABCDEF0
hex(i3) 00123450
pk 2
hex(a1) 0
hex(a2) 0
hex(a3) 0
hex(a4) 0
hex(a5) 0
b1 -128
b2 0
c1 -32768
c2 0
d1 -2147483648
d2 0
e1 -9223372036854775808
e2 0
f1
f2
f3
g1
g2
g3
hex(h1) 00
hex(h2) 0000000000000000
hex(h3) 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
hex(i1) 00
hex(i2) 00
hex(i3) 00
pk 3
hex(a1) NULL
hex(a2) NULL
hex(a3) NULL
hex(a4) NULL
hex(a5) NULL
b1 NULL
b2 NULL
c1 NULL
c2 NULL
d1 NULL
d2 NULL
e1 NULL
e2 NULL
f1 NULL
f2 NULL
f3 NULL
g1 NULL
g2 NULL
g3 NULL
hex(h1) NULL
hex(h2) NULL
hex(h3) NULL
hex(i1) NULL
hex(i2) NULL
hex(i3) NULL
CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
DELETE FROM test.backup_info;
LOAD DATA INFILE '../tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
SELECT @the_backup_id:=backup_id FROM test.backup_info;
@the_backup_id:=backup_id
<the_backup_id>
DROP TABLE test.backup_info;
1;0x1;0x17;0x789A;0x789ABCDE;0xFEDC0001;127;255;32767;65535;2147483647;4294967295;9223372036854775807;18446744073709551615;1;12345678901234567890123456789012;123456789;1;12345678901234567890123456789012;123456789;0x12;0x123456789ABCDEF0;0x012345;0x12;0x123456789ABCDEF0;0x00123450
2;0x0;0x0;0x0;0x0;0x0;-128;0;-32768;0;-2147483648;0;-9223372036854775808;0;;;;;;;0x0;0x0;0x0;0x0;0x0;0x0
3;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N;\N
1,0x1,0x17,0x789A,0x789ABCDE,0xFEDC0001,127,255,32767,65535,2147483647,4294967295,9223372036854775807,18446744073709551615,'1','12345678901234567890123456789012','123456789','1','12345678901234567890123456789012','123456789',0x12,0x123456789ABCDEF0,0x012345,0x12,0x123456789ABCDEF0,0x00123450
2,0x0,0x0,0x0,0x0,0x0,-128,0,-32768,0,-2147483648,0,-9223372036854775808,0,'','','','','','',0x0,0x0,0x0,0x0,0x0,0x0
3,,,,,,,,,,,,,,,,,,,,,,,,,
drop table t1;
create table t1
(pk int key
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
,h1 BINARY(1), h2 BINARY(9), h3 BINARY(255)
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
) engine ndb;
insert into t1 values
(1
,'1','12345678901234567890123456789012','123456789 '
,'1 ','12345678901234567890123456789012 ','123456789 '
,0x20,0x123456789abcdef020, 0x012345000020
,0x1200000020,0x123456789abcdef000000020, 0x00123450000020
);
create table t2 (pk int key, a int) engine ndb;
create table t3 (pk int key, a int) engine ndb;
create table t4 (pk int key, a int) engine ndb;
insert into t2 values (1,11),(2,12),(3,13),(4,14),(5,15);
insert into t3 values (1,21),(2,22),(3,23),(4,24),(5,25);
insert into t4 values (1,31),(2,32),(3,33),(4,34),(5,35);
CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
DELETE FROM test.backup_info;
LOAD DATA INFILE '../tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
SELECT @the_backup_id:=backup_id FROM test.backup_info;
@the_backup_id:=backup_id
<the_backup_id>
DROP TABLE test.backup_info;
'1' '1' '12345678901234567890123456789012' '123456789' '1' '12345678901234567890123456789012' '123456789' '0x20' '0x123456789ABCDEF020' '0x012345000020' '0x1200000020' '0x123456789ABCDEF000000020' '0x00123450000020'
t1
--
1 1 12345678901234567890123456789012 123456789 1 12345678901234567890123456789012 123456789 0x20 0x123456789ABCDEF020 0x012345000020 0x1200000020 0x123456789ABCDEF000000020 0x00123450000020
t2
--
1 11
2 12
3 13
4 14
5 15
t3
--
1 21
2 22
3 23
4 24
5 25
t4
--
1 31
2 32
3 33
4 34
5 35
drop table t1;
create table t1
(pk int key
,a1 MEDIUMINT, a2 MEDIUMINT UNSIGNED
) engine ndb;
insert into t1 values(1, 8388607, 16777215);
insert into t1 values(2, -8388608, 0);
insert into t1 values(3, -1, 1);
CREATE TEMPORARY TABLE IF NOT EXISTS test.backup_info (id INT, backup_id INT) ENGINE = HEAP;
DELETE FROM test.backup_info;
LOAD DATA INFILE '../tmp.dat' INTO TABLE test.backup_info FIELDS TERMINATED BY ',';
SELECT @the_backup_id:=backup_id FROM test.backup_info;
@the_backup_id:=backup_id
<the_backup_id>
DROP TABLE test.backup_info;
1;8388607;16777215
2;-8388608;0
3;-1;1
drop table t1;
drop table t2;
drop table t3;
drop table t4;
use test; use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
create table t1 (a int key, b int unique, c int) engine ndb; create table t1 (a int key, b int unique, c int) engine ndb;
ERROR HY000: Can't create table 'test.t1' (errno: 4007) ERROR HY000: Can't create table 'test.t1' (errno: 299)
create table t1 (a int key, b int unique, c int) engine ndb; create table t1 (a int key, b int unique, c int) engine ndb;
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
create table t2 as select * from t1; create table t2 as select * from t1;
...@@ -28,19 +28,29 @@ insert into t1 select * from t2; ...@@ -28,19 +28,29 @@ insert into t1 select * from t2;
drop table t1; drop table t1;
ERROR 42S02: Unknown table 't1' ERROR 42S02: Unknown table 't1'
create index new_index on t1 (c); create index new_index on t1 (c);
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
select * from t1 where a = 1; select * from t1 where a = 1;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
select * from t1 where b = 4; select * from t1 where b = 4;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
update t1 set b=102 where a = 2; update t1 set b=102 where a = 2;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
update t1 set b=103 where b = 3; update t1 set b=103 where b = 3;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
update t1 set b=b+100; update t1 set b=b+100;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
update t1 set b=b+100 where a > 7; update t1 set b=b+100 where a > 7;
ERROR 42S02: Table 'test.t1' doesn't exist ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
BEGIN;
update t1 set b=b+100 where a=1;
BEGIN;
update t1 set b=b+100 where a=2;
update t1 set b=b+100 where a=3;
COMMIT;
update t1 set b=b+100 where a=4;
ERROR HY000: Got error 299 'Operation not allowed or aborted due to single user mode' from NDBCLUSTER
COMMIT;
ERROR HY000: Got error 4350 'Transaction already aborted' from NDBCLUSTER
drop table t1; drop table t1;
...@@ -87,12 +87,12 @@ master-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F ...@@ -87,12 +87,12 @@ master-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
master-bin.000002 # Query 1 # COMMIT master-bin.000002 # Query 1 # COMMIT
show binary logs; show binary logs;
Log_name File_size Log_name File_size
master-bin.000001 1702 master-bin.000001 1740
master-bin.000002 593 master-bin.000002 612
start slave; start slave;
show binary logs; show binary logs;
Log_name File_size Log_name File_size
slave-bin.000001 1797 slave-bin.000001 1835
slave-bin.000002 198 slave-bin.000002 198
show binlog events in 'slave-bin.000001' from 4; show binlog events in 'slave-bin.000001' from 4;
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
...@@ -126,7 +126,7 @@ slave-bin.000002 # Write_rows 2 # table_id: # flags: STMT_END_F ...@@ -126,7 +126,7 @@ slave-bin.000002 # Write_rows 2 # table_id: # flags: STMT_END_F
slave-bin.000002 # Query 2 # COMMIT slave-bin.000002 # Query 2 # COMMIT
show slave status; show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 593 # # master-bin.000002 Yes Yes # 0 0 593 # None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000002 612 # # master-bin.000002 Yes Yes # 0 0 612 # None 0 No #
show binlog events in 'slave-bin.000005' from 4; show binlog events in 'slave-bin.000005' from 4;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
DROP TABLE t1; DROP TABLE t1;
......
...@@ -93,4 +93,4 @@ select * from mysql.ndb_binlog_index; ...@@ -93,4 +93,4 @@ select * from mysql.ndb_binlog_index;
Position File epoch inserts updates deletes schemaops Position File epoch inserts updates deletes schemaops
reset slave; reset slave;
select * from mysql.ndb_apply_status; select * from mysql.ndb_apply_status;
server_id epoch server_id epoch log_name start_pos end_pos
...@@ -33,12 +33,12 @@ master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4 ...@@ -33,12 +33,12 @@ master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4
master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB
master-bin.000001 219 Query 1 283 BEGIN master-bin.000001 219 Query 1 283 BEGIN
master-bin.000001 283 Table_map 1 40 table_id: # (test.t1) master-bin.000001 283 Table_map 1 40 table_id: # (test.t1)
master-bin.000001 323 Table_map 1 95 table_id: # (mysql.ndb_apply_status) master-bin.000001 323 Table_map 1 98 table_id: # (mysql.ndb_apply_status)
master-bin.000001 378 Write_rows 1 137 table_id: # master-bin.000001 381 Write_rows 1 156 table_id: #
master-bin.000001 420 Write_rows 1 184 table_id: # flags: STMT_END_F master-bin.000001 439 Write_rows 1 203 table_id: # flags: STMT_END_F
master-bin.000001 467 Query 1 532 COMMIT master-bin.000001 486 Query 1 551 COMMIT
master-bin.000001 532 Query 1 612 use `test`; TRUNCATE TABLE t1 master-bin.000001 551 Query 1 631 use `test`; TRUNCATE TABLE t1
master-bin.000001 612 Query 1 688 use `test`; DROP TABLE t1 master-bin.000001 631 Query 1 707 use `test`; DROP TABLE t1
**** On Master **** **** On Master ****
CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB;
INSERT INTO t1 VALUES (1,1), (2,2); INSERT INTO t1 VALUES (1,1), (2,2);
...@@ -69,23 +69,23 @@ master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4 ...@@ -69,23 +69,23 @@ master-bin.000001 4 Format_desc 1 102 Server ver: SERVER_VERSION, Binlog ver: 4
master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB master-bin.000001 102 Query 1 219 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB
master-bin.000001 219 Query 1 283 BEGIN master-bin.000001 219 Query 1 283 BEGIN
master-bin.000001 283 Table_map 1 40 table_id: # (test.t1) master-bin.000001 283 Table_map 1 40 table_id: # (test.t1)
master-bin.000001 323 Table_map 1 95 table_id: # (mysql.ndb_apply_status) master-bin.000001 323 Table_map 1 98 table_id: # (mysql.ndb_apply_status)
master-bin.000001 378 Write_rows 1 137 table_id: # master-bin.000001 381 Write_rows 1 156 table_id: #
master-bin.000001 420 Write_rows 1 184 table_id: # flags: STMT_END_F master-bin.000001 439 Write_rows 1 203 table_id: # flags: STMT_END_F
master-bin.000001 467 Query 1 532 COMMIT master-bin.000001 486 Query 1 551 COMMIT
master-bin.000001 532 Query 1 612 use `test`; TRUNCATE TABLE t1 master-bin.000001 551 Query 1 631 use `test`; TRUNCATE TABLE t1
master-bin.000001 612 Query 1 688 use `test`; DROP TABLE t1 master-bin.000001 631 Query 1 707 use `test`; DROP TABLE t1
master-bin.000001 688 Query 1 805 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB master-bin.000001 707 Query 1 824 use `test`; CREATE TABLE t1 (a INT PRIMARY KEY, b LONG) ENGINE=NDB
master-bin.000001 805 Query 1 869 BEGIN master-bin.000001 824 Query 1 888 BEGIN
master-bin.000001 869 Table_map 1 40 table_id: # (test.t1) master-bin.000001 888 Table_map 1 40 table_id: # (test.t1)
master-bin.000001 909 Table_map 1 95 table_id: # (mysql.ndb_apply_status) master-bin.000001 928 Table_map 1 98 table_id: # (mysql.ndb_apply_status)
master-bin.000001 964 Write_rows 1 137 table_id: # master-bin.000001 986 Write_rows 1 156 table_id: #
master-bin.000001 1006 Write_rows 1 184 table_id: # flags: STMT_END_F master-bin.000001 1044 Write_rows 1 203 table_id: # flags: STMT_END_F
master-bin.000001 1053 Query 1 1118 COMMIT master-bin.000001 1091 Query 1 1156 COMMIT
master-bin.000001 1118 Query 1 1182 BEGIN master-bin.000001 1156 Query 1 1220 BEGIN
master-bin.000001 1182 Table_map 1 40 table_id: # (test.t1) master-bin.000001 1220 Table_map 1 40 table_id: # (test.t1)
master-bin.000001 1222 Table_map 1 95 table_id: # (mysql.ndb_apply_status) master-bin.000001 1260 Table_map 1 98 table_id: # (mysql.ndb_apply_status)
master-bin.000001 1277 Write_rows 1 137 table_id: # master-bin.000001 1318 Write_rows 1 156 table_id: #
master-bin.000001 1319 Delete_rows 1 176 table_id: # flags: STMT_END_F master-bin.000001 1376 Delete_rows 1 195 table_id: # flags: STMT_END_F
master-bin.000001 1358 Query 1 1423 COMMIT master-bin.000001 1415 Query 1 1480 COMMIT
master-bin.000001 1423 Query 1 1499 use `test`; DROP TABLE t1 master-bin.000001 1480 Query 1 1556 use `test`; DROP TABLE t1
...@@ -35,4 +35,3 @@ synchronization : Bug#24529 Test 'synchronization' fails on Mac pushb ...@@ -35,4 +35,3 @@ synchronization : Bug#24529 Test 'synchronization' fails on Mac pushb
plugin : Bug#25659 memory leak via "plugins" test plugin : Bug#25659 memory leak via "plugins" test
rpl_ndb_dd_advance : Bug#25913 rpl_ndb_dd_advance fails randomly rpl_ndb_dd_advance : Bug#25913 rpl_ndb_dd_advance fails randomly
ndb_single_user : Bug#27021 Error codes in mysqld in single user mode varies
-- source include/have_ndb.inc
-- source include/ndb_default_cluster.inc
-- source include/not_embedded.inc
--disable_warnings
use test;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
--enable_warnings
# basic datatypes
create table t1
(pk int key
,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64)
,b1 TINYINT, b2 TINYINT UNSIGNED
,c1 SMALLINT, c2 SMALLINT UNSIGNED
,d1 INT, d2 INT UNSIGNED
,e1 BIGINT, e2 BIGINT UNSIGNED
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255)
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
) engine myisam;
# max values
insert into t1 values
(1
,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001
,127, 255
,32767, 65535
,2147483647, 4294967295
,9223372036854775807, 18446744073709551615
,'1','12345678901234567890123456789012','123456789'
,'1','12345678901234567890123456789012','123456789'
,0x12,0x123456789abcdef0, 0x012345
,0x12,0x123456789abcdef0, 0x00123450
);
# min values
insert into t1 values
(2
,0, 0, 0, 0, 0
,-128, 0
,-32768, 0
,-2147483648, 0
,-9223372036854775808, 0
,'','',''
,'','',''
,0x0,0x0,0x0
,0x0,0x0,0x0
);
# null values
insert into t1 values
(3
,NULL,NULL,NULL,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
,NULL,NULL,NULL
);
--vertical_results
select pk
,hex(a1), hex(a2), hex(a3), hex(a4), hex(a5)
,b1, b2
,c1 , c2
,d1 , d2
,e1 , e2
,f1 , f2, f3
,g1 , g2, g3
,hex(h1), hex(h2), hex(h3)
,hex(i1), hex(i2), hex(i3)
from t1 order by pk;
alter table t1 engine ndb;
select pk
,hex(a1), hex(a2), hex(a3), hex(a4), hex(a5)
,b1, b2
,c1 , c2
,d1 , d2
,e1 , e2
,f1 , f2, f3
,g1 , g2, g3
,hex(h1), hex(h2), hex(h3)
,hex(i1), hex(i2), hex(i3)
from t1 order by pk;
--horizontal_results
--source include/ndb_backup.inc
--let ndb_restore_filter=test t1
--let ndb_restore_opts=--verbose=0 --print_data --hex --fields-terminated-by=";"
--source include/ndb_backup_print.inc
--let ndb_restore_filter=test t1
--let ndb_restore_opts=--verbose=0 --print_data --hex --fields-terminated-by="," --fields-optionally-enclosed-by="'"
--source include/ndb_backup_print.inc
drop table t1;
# some binary char tests with trailing spaces
create table t1
(pk int key
,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY
,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY
,h1 BINARY(1), h2 BINARY(9), h3 BINARY(255)
,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000)
) engine ndb;
insert into t1 values
(1
,'1','12345678901234567890123456789012','123456789 '
,'1 ','12345678901234567890123456789012 ','123456789 '
,0x20,0x123456789abcdef020, 0x012345000020
,0x1200000020,0x123456789abcdef000000020, 0x00123450000020
);
create table t2 (pk int key, a int) engine ndb;
create table t3 (pk int key, a int) engine ndb;
create table t4 (pk int key, a int) engine ndb;
insert into t2 values (1,11),(2,12),(3,13),(4,14),(5,15);
insert into t3 values (1,21),(2,22),(3,23),(4,24),(5,25);
insert into t4 values (1,31),(2,32),(3,33),(4,34),(5,35);
--source include/ndb_backup.inc
--let ndb_restore_opts=--verbose=0 --print_data --hex --fields-enclosed-by="'" --fields-optionally-enclosed-by="X"
--let ndb_restore_filter=test t1
--source include/ndb_backup_print.inc
--exec rm -f $MYSQLTEST_VARDIR/tmp/t1.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t2.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t3.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t4.txt
--let ndb_restore_opts=--verbose=0 --print_data --hex --tab $MYSQLTEST_VARDIR/tmp --append
--let ndb_restore_filter=test
--source include/ndb_backup_print.inc
--let $message= t1
--source include/show_msg.inc
--exec sort $MYSQLTEST_VARDIR/tmp/t1.txt
--let $message= t2
--source include/show_msg.inc
--exec sort $MYSQLTEST_VARDIR/tmp/t2.txt
--let $message= t3
--source include/show_msg.inc
--exec sort $MYSQLTEST_VARDIR/tmp/t3.txt
--let $message= t4
--source include/show_msg.inc
--exec sort $MYSQLTEST_VARDIR/tmp/t4.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t1.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t2.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t3.txt
--exec rm -f $MYSQLTEST_VARDIR/tmp/t4.txt
# now test some other datatypes
drop table t1;
create table t1
(pk int key
,a1 MEDIUMINT, a2 MEDIUMINT UNSIGNED
) engine ndb;
# max values
insert into t1 values(1, 8388607, 16777215);
# min values
insert into t1 values(2, -8388608, 0);
# small values
insert into t1 values(3, -1, 1);
# backup and print
--source include/ndb_backup.inc
--let ndb_restore_filter=test t1
--let ndb_restore_opts=--verbose=0 --print_data --hex --fields-terminated-by=";"
--source include/ndb_backup_print.inc
# clean up
drop table t1;
drop table t2;
drop table t3;
drop table t4;
...@@ -51,34 +51,55 @@ insert into t1 select * from t2; ...@@ -51,34 +51,55 @@ insert into t1 select * from t2;
--connection server2 --connection server2
--error 1051 --error 1051
drop table t1; drop table t1;
--error 1146 --error 1296
#--error 1296
create index new_index on t1 (c); create index new_index on t1 (c);
--error 1146 --error 1296
#--error 1296
insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0); insert into t1 values (1,1,0),(2,2,0),(3,3,0),(4,4,0),(5,5,0),(6,6,0),(7,7,0),(8,8,0),(9,9,0),(10,10,0);
--error 1146 --error 1296
#--error 1296
select * from t1 where a = 1; select * from t1 where a = 1;
--error 1146 --error 1296
#--error 1296
select * from t1 where b = 4; select * from t1 where b = 4;
--error 1146 --error 1296
#--error 1296
update t1 set b=102 where a = 2; update t1 set b=102 where a = 2;
--error 1146 --error 1296
#--error 1296
update t1 set b=103 where b = 3; update t1 set b=103 where b = 3;
--error 1146 --error 1296
#--error 1296
update t1 set b=b+100; update t1 set b=b+100;
--error 1146 --error 1296
#--error 1296
update t1 set b=b+100 where a > 7; update t1 set b=b+100 where a > 7;
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT --exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT --exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT
#
# we should be able to run transaction while in single user mode
#
--connection server1
BEGIN;
update t1 set b=b+100 where a=1;
--connection server2
BEGIN;
update t1 set b=b+100 where a=2;
# enter single user mode
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "enter single user mode $node_id" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" --single-user >> $NDB_TOOLS_OUTPUT
--connection server1
update t1 set b=b+100 where a=3;
COMMIT;
# while on other mysqld it should be aborted
--connection server2
--error 1296
update t1 set b=b+100 where a=4;
--error 1296
COMMIT;
--exec $NDB_MGM --no-defaults --ndb-connectstring="localhost:$NDBCLUSTER_PORT" -e "exit single user mode" >> $NDB_TOOLS_OUTPUT
--exec $NDB_TOOLS_DIR/ndb_waiter --no-defaults >> $NDB_TOOLS_OUTPUT
# cleanup # cleanup
--connection server1 --connection server1
drop table t1; drop table t1;
...@@ -4742,6 +4742,7 @@ int ha_ndbcluster::create(const char *name, ...@@ -4742,6 +4742,7 @@ int ha_ndbcluster::create(const char *name,
bool create_from_engine= (create_info->table_options & HA_OPTION_CREATE_FROM_ENGINE); bool create_from_engine= (create_info->table_options & HA_OPTION_CREATE_FROM_ENGINE);
bool is_truncate= (thd->lex->sql_command == SQLCOM_TRUNCATE); bool is_truncate= (thd->lex->sql_command == SQLCOM_TRUNCATE);
char tablespace[FN_LEN]; char tablespace[FN_LEN];
NdbDictionary::Table::SingleUserMode single_user_mode= NdbDictionary::Table::SingleUserModeLocked;
DBUG_ENTER("ha_ndbcluster::create"); DBUG_ENTER("ha_ndbcluster::create");
DBUG_PRINT("enter", ("name: %s", name)); DBUG_PRINT("enter", ("name: %s", name));
...@@ -4793,19 +4794,23 @@ int ha_ndbcluster::create(const char *name, ...@@ -4793,19 +4794,23 @@ int ha_ndbcluster::create(const char *name,
schema distribution table is setup schema distribution table is setup
( unless it is a creation of the schema dist table itself ) ( unless it is a creation of the schema dist table itself )
*/ */
if (!ndb_schema_share && if (!ndb_schema_share)
!(strcmp(m_dbname, NDB_REP_DB) == 0 &&
strcmp(m_tabname, NDB_SCHEMA_TABLE) == 0))
{ {
DBUG_PRINT("info", ("Schema distribution table not setup")); if (!(strcmp(m_dbname, NDB_REP_DB) == 0 &&
DBUG_RETURN(HA_ERR_NO_CONNECTION); strcmp(m_tabname, NDB_SCHEMA_TABLE) == 0))
{
DBUG_PRINT("info", ("Schema distribution table not setup"));
DBUG_RETURN(HA_ERR_NO_CONNECTION);
}
single_user_mode = NdbDictionary::Table::SingleUserModeReadWrite;
} }
#endif /* HAVE_NDB_BINLOG */ #endif /* HAVE_NDB_BINLOG */
DBUG_PRINT("table", ("name: %s", m_tabname)); DBUG_PRINT("table", ("name: %s", m_tabname));
tab.setName(m_tabname); tab.setName(m_tabname);
tab.setLogging(!(create_info->options & HA_LEX_CREATE_TMP_TABLE)); tab.setLogging(!(create_info->options & HA_LEX_CREATE_TMP_TABLE));
tab.setSingleUserMode(single_user_mode);
// Save frm data for this table // Save frm data for this table
if (readfrm(name, &data, &length)) if (readfrm(name, &data, &length))
DBUG_RETURN(1); DBUG_RETURN(1);
...@@ -5569,6 +5574,7 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb, ...@@ -5569,6 +5574,7 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb,
{ {
ndb_table_id= h->m_table->getObjectId(); ndb_table_id= h->m_table->getObjectId();
ndb_table_version= h->m_table->getObjectVersion(); ndb_table_version= h->m_table->getObjectVersion();
DBUG_PRINT("info", ("success 1"));
} }
else else
{ {
...@@ -5582,6 +5588,7 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb, ...@@ -5582,6 +5588,7 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb,
break; break;
} }
res= ndb_to_mysql_error(&dict->getNdbError()); res= ndb_to_mysql_error(&dict->getNdbError());
DBUG_PRINT("info", ("error(1) %u", res));
} }
h->release_metadata(thd, ndb); h->release_metadata(thd, ndb);
} }
...@@ -5598,6 +5605,8 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb, ...@@ -5598,6 +5605,8 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb,
{ {
ndb_table_id= ndbtab_g.get_table()->getObjectId(); ndb_table_id= ndbtab_g.get_table()->getObjectId();
ndb_table_version= ndbtab_g.get_table()->getObjectVersion(); ndb_table_version= ndbtab_g.get_table()->getObjectVersion();
DBUG_PRINT("info", ("success 2"));
break;
} }
else else
{ {
...@@ -5617,8 +5626,8 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb, ...@@ -5617,8 +5626,8 @@ ha_ndbcluster::delete_table(ha_ndbcluster *h, Ndb *ndb,
} }
} }
} }
else res= ndb_to_mysql_error(&dict->getNdbError());
res= ndb_to_mysql_error(&dict->getNdbError()); DBUG_PRINT("info", ("error(2) %u", res));
break; break;
} }
} }
......
...@@ -729,6 +729,9 @@ static int ndbcluster_create_ndb_apply_status_table(THD *thd) ...@@ -729,6 +729,9 @@ static int ndbcluster_create_ndb_apply_status_table(THD *thd)
NDB_REP_DB "." NDB_APPLY_TABLE NDB_REP_DB "." NDB_APPLY_TABLE
" ( server_id INT UNSIGNED NOT NULL," " ( server_id INT UNSIGNED NOT NULL,"
" epoch BIGINT UNSIGNED NOT NULL, " " epoch BIGINT UNSIGNED NOT NULL, "
" log_name VARCHAR(255) BINARY NOT NULL, "
" start_pos BIGINT UNSIGNED NOT NULL, "
" end_pos BIGINT UNSIGNED NOT NULL, "
" PRIMARY KEY USING HASH (server_id) ) ENGINE=NDB"); " PRIMARY KEY USING HASH (server_id) ) ENGINE=NDB");
run_query(thd, buf, end, TRUE, TRUE); run_query(thd, buf, end, TRUE, TRUE);
...@@ -3898,6 +3901,9 @@ pthread_handler_t ndb_binlog_thread_func(void *arg) ...@@ -3898,6 +3901,9 @@ pthread_handler_t ndb_binlog_thread_func(void *arg)
bzero(table->record[0], table->s->null_bytes); bzero(table->record[0], table->s->null_bytes);
table->field[0]->store((longlong)::server_id); table->field[0]->store((longlong)::server_id);
table->field[1]->store((longlong)gci); table->field[1]->store((longlong)gci);
table->field[2]->store("", 0, &my_charset_bin);
table->field[3]->store((longlong)0);
table->field[4]->store((longlong)0);
trans.write_row(::server_id, trans.write_row(::server_id,
injector::transaction::table(table, TRUE), injector::transaction::table(table, TRUE),
&table->s->all_set, table->s->fields, &table->s->all_set, table->s->fields,
......
...@@ -140,6 +140,8 @@ public: ...@@ -140,6 +140,8 @@ public:
RowGCIFlag = 150, RowGCIFlag = 150,
RowChecksumFlag = 151, RowChecksumFlag = 151,
SingleUserMode = 152,
TableEnd = 999, TableEnd = 999,
AttributeName = 1000, // String, Mandatory AttributeName = 1000, // String, Mandatory
...@@ -344,6 +346,8 @@ public: ...@@ -344,6 +346,8 @@ public:
Uint32 RowGCIFlag; Uint32 RowGCIFlag;
Uint32 RowChecksumFlag; Uint32 RowChecksumFlag;
Uint32 SingleUserMode;
Table() {} Table() {}
void init(); void init();
......
...@@ -89,5 +89,12 @@ ...@@ -89,5 +89,12 @@
*/ */
#define NDB_TEMP_TAB_PERMANENT 0 #define NDB_TEMP_TAB_PERMANENT 0
#define NDB_TEMP_TAB_TEMPORARY 1 #define NDB_TEMP_TAB_TEMPORARY 1
/*
* Table single user mode
*/
#define NDB_SUM_LOCKED 0
#define NDB_SUM_READONLY 1
#define NDB_SUM_READ_WRITE 2
#endif #endif
...@@ -576,6 +576,15 @@ public: ...@@ -576,6 +576,15 @@ public:
*/ */
class Table : public Object { class Table : public Object {
public: public:
/*
* Single user mode specifies access rights to table during single user mode
*/
enum SingleUserMode {
SingleUserModeLocked = NDB_SUM_LOCKED,
SingleUserModeReadOnly = NDB_SUM_READONLY,
SingleUserModeReadWrite = NDB_SUM_READ_WRITE
};
/** /**
* @name General * @name General
* @{ * @{
...@@ -895,6 +904,13 @@ public: ...@@ -895,6 +904,13 @@ public:
void setMinRows(Uint64 minRows); void setMinRows(Uint64 minRows);
Uint64 getMinRows() const; Uint64 getMinRows() const;
/**
* Set/Get SingleUserMode
*/
void setSingleUserMode(enum SingleUserMode);
enum SingleUserMode getSingleUserMode() const;
/** @} *******************************************************************/ /** @} *******************************************************************/
/** /**
......
...@@ -129,6 +129,13 @@ public: ...@@ -129,6 +129,13 @@ public:
*/ */
Int32 int32_value() const; Int32 int32_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Medium value.
*/
Int32 medium_value() const;
/** /**
* Get value stored in NdbRecAttr object. * Get value stored in NdbRecAttr object.
* *
...@@ -157,6 +164,13 @@ public: ...@@ -157,6 +164,13 @@ public:
*/ */
Uint32 u_32_value() const; Uint32 u_32_value() const;
/**
* Get value stored in NdbRecAttr object.
*
* @return Unsigned medium value.
*/
Uint32 u_medium_value() const;
/** /**
* Get value stored in NdbRecAttr object. * Get value stored in NdbRecAttr object.
* *
...@@ -287,6 +301,16 @@ NdbRecAttr::int32_value() const ...@@ -287,6 +301,16 @@ NdbRecAttr::int32_value() const
return *(Int32*)theRef; return *(Int32*)theRef;
} }
inline
Int32
NdbRecAttr::medium_value() const
{
Uint32 tmp = *(Uint32*)theRef;
if (tmp & (0x1<<23))
tmp|= (0xFF<<24);
return (Int32)tmp;
}
inline inline
short short
NdbRecAttr::short_value() const NdbRecAttr::short_value() const
...@@ -308,6 +332,13 @@ NdbRecAttr::u_32_value() const ...@@ -308,6 +332,13 @@ NdbRecAttr::u_32_value() const
return *(Uint32*)theRef; return *(Uint32*)theRef;
} }
inline
Uint32
NdbRecAttr::u_medium_value() const
{
return *(Uint32*)theRef;
}
inline inline
Uint16 Uint16
NdbRecAttr::u_short_value() const NdbRecAttr::u_short_value() const
...@@ -409,6 +440,25 @@ NdbRecAttr::setUNDEFINED() ...@@ -409,6 +440,25 @@ NdbRecAttr::setUNDEFINED()
class NdbOut& operator <<(class NdbOut&, const NdbRecAttr &); class NdbOut& operator <<(class NdbOut&, const NdbRecAttr &);
class NdbRecordPrintFormat
{
public:
NdbRecordPrintFormat();
virtual ~NdbRecordPrintFormat();
const char *lines_terminated_by;
const char *fields_terminated_by;
const char *start_array_enclosure;
const char *end_array_enclosure;
const char *fields_enclosed_by;
const char *fields_optionally_enclosed_by;
const char *hex_prefix;
const char *null_string;
int hex_format;
};
NdbOut&
ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r,
const NdbRecordPrintFormat &f);
#endif // ifndef DOXYGEN_SHOULD_SKIP_INTERNAL #endif // ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
#endif #endif
......
...@@ -37,6 +37,7 @@ class FileOutputStream : public OutputStream { ...@@ -37,6 +37,7 @@ class FileOutputStream : public OutputStream {
public: public:
FileOutputStream(FILE * file = stdout); FileOutputStream(FILE * file = stdout);
virtual ~FileOutputStream() {} virtual ~FileOutputStream() {}
FILE *getFile() { return f; }
int print(const char * fmt, ...); int print(const char * fmt, ...);
int println(const char * fmt, ...); int println(const char * fmt, ...);
......
...@@ -66,6 +66,7 @@ DictTabInfo::TableMapping[] = { ...@@ -66,6 +66,7 @@ DictTabInfo::TableMapping[] = {
DTIMAP(Table, MaxRowsHigh, MaxRowsHigh), DTIMAP(Table, MaxRowsHigh, MaxRowsHigh),
DTIMAP(Table, MinRowsLow, MinRowsLow), DTIMAP(Table, MinRowsLow, MinRowsLow),
DTIMAP(Table, MinRowsHigh, MinRowsHigh), DTIMAP(Table, MinRowsHigh, MinRowsHigh),
DTIMAP(Table, SingleUserMode, SingleUserMode),
DTIBREAK(AttributeName) DTIBREAK(AttributeName)
}; };
...@@ -164,6 +165,8 @@ DictTabInfo::Table::init(){ ...@@ -164,6 +165,8 @@ DictTabInfo::Table::init(){
MaxRowsHigh = 0; MaxRowsHigh = 0;
MinRowsLow = 0; MinRowsLow = 0;
MinRowsHigh = 0; MinRowsHigh = 0;
SingleUserMode = 0;
} }
void void
......
...@@ -461,6 +461,7 @@ Dbdict::packTableIntoPages(SimpleProperties::Writer & w, ...@@ -461,6 +461,7 @@ Dbdict::packTableIntoPages(SimpleProperties::Writer & w,
w.add(DictTabInfo::FragmentCount, tablePtr.p->fragmentCount); w.add(DictTabInfo::FragmentCount, tablePtr.p->fragmentCount);
w.add(DictTabInfo::MinRowsLow, tablePtr.p->minRowsLow); w.add(DictTabInfo::MinRowsLow, tablePtr.p->minRowsLow);
w.add(DictTabInfo::MinRowsHigh, tablePtr.p->minRowsHigh); w.add(DictTabInfo::MinRowsHigh, tablePtr.p->minRowsHigh);
w.add(DictTabInfo::SingleUserMode, tablePtr.p->singleUserMode);
if(signal) if(signal)
{ {
...@@ -1871,6 +1872,7 @@ void Dbdict::initialiseTableRecord(TableRecordPtr tablePtr) ...@@ -1871,6 +1872,7 @@ void Dbdict::initialiseTableRecord(TableRecordPtr tablePtr)
tablePtr.p->m_bits = 0; tablePtr.p->m_bits = 0;
tablePtr.p->minRowsLow = 0; tablePtr.p->minRowsLow = 0;
tablePtr.p->minRowsHigh = 0; tablePtr.p->minRowsHigh = 0;
tablePtr.p->singleUserMode = 0;
tablePtr.p->tableType = DictTabInfo::UserTable; tablePtr.p->tableType = DictTabInfo::UserTable;
tablePtr.p->primaryTableId = RNIL; tablePtr.p->primaryTableId = RNIL;
// volatile elements // volatile elements
...@@ -5698,7 +5700,9 @@ Dbdict::execTAB_COMMITCONF(Signal* signal){ ...@@ -5698,7 +5700,9 @@ Dbdict::execTAB_COMMITCONF(Signal* signal){
signal->theData[4] = (Uint32)tabPtr.p->tableType; signal->theData[4] = (Uint32)tabPtr.p->tableType;
signal->theData[5] = createTabPtr.p->key; signal->theData[5] = createTabPtr.p->key;
signal->theData[6] = (Uint32)tabPtr.p->noOfPrimkey; signal->theData[6] = (Uint32)tabPtr.p->noOfPrimkey;
sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 7, JBB); signal->theData[7] = (Uint32)tabPtr.p->singleUserMode;
sendSignal(DBTC_REF, GSN_TC_SCHVERREQ, signal, 8, JBB);
return; return;
} }
...@@ -6128,6 +6132,7 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it, ...@@ -6128,6 +6132,7 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it,
tablePtr.p->minRowsHigh = c_tableDesc.MinRowsHigh; tablePtr.p->minRowsHigh = c_tableDesc.MinRowsHigh;
tablePtr.p->defaultNoPartFlag = c_tableDesc.DefaultNoPartFlag; tablePtr.p->defaultNoPartFlag = c_tableDesc.DefaultNoPartFlag;
tablePtr.p->linearHashFlag = c_tableDesc.LinearHashFlag; tablePtr.p->linearHashFlag = c_tableDesc.LinearHashFlag;
tablePtr.p->singleUserMode = c_tableDesc.SingleUserMode;
{ {
Rope frm(c_rope_pool, tablePtr.p->frmData); Rope frm(c_rope_pool, tablePtr.p->frmData);
......
...@@ -375,6 +375,11 @@ public: ...@@ -375,6 +375,11 @@ public:
Uint32 fragmentCount; Uint32 fragmentCount;
Uint32 m_tablespace_id; Uint32 m_tablespace_id;
/*
* Access rights to table during single user mode
*/
Uint8 singleUserMode;
}; };
typedef Ptr<TableRecord> TableRecordPtr; typedef Ptr<TableRecord> TableRecordPtr;
......
...@@ -710,6 +710,7 @@ public: ...@@ -710,6 +710,7 @@ public:
Uint8 tckeyrec; // ndrad frn R Uint8 tckeyrec; // ndrad frn R
Uint8 tcindxrec; Uint8 tcindxrec;
Uint8 apiFailState; // ndrad frn R Uint8 apiFailState; // ndrad frn R
Uint8 singleUserMode;
ReturnSignal returnsignal; ReturnSignal returnsignal;
Uint8 timeOutCounter; Uint8 timeOutCounter;
...@@ -961,10 +962,21 @@ public: ...@@ -961,10 +962,21 @@ public:
struct TableRecord { struct TableRecord {
TableRecord() {} TableRecord() {}
Uint32 currentSchemaVersion; Uint32 currentSchemaVersion;
Uint8 enabled; Uint16 m_flags;
Uint8 dropping;
Uint8 tableType; Uint8 tableType;
Uint8 storedTable; Uint8 singleUserMode;
enum {
TR_ENABLED = 1 << 0,
TR_DROPPING = 1 << 1,
TR_STORED_TABLE = 1 << 2
};
Uint8 get_enabled() const { return (m_flags & TR_ENABLED) != 0; }
Uint8 get_dropping() const { return (m_flags & TR_DROPPING) != 0; }
Uint8 get_storedTable() const { return (m_flags & TR_STORED_TABLE) != 0; }
void set_enabled(Uint8 f) { f ? m_flags |= (Uint16)TR_ENABLED : m_flags &= ~(Uint16)TR_ENABLED; }
void set_dropping(Uint8 f) { f ? m_flags |= (Uint16)TR_DROPPING : m_flags &= ~(Uint16)TR_DROPPING; }
void set_storedTable(Uint8 f) { f ? m_flags |= (Uint16)TR_STORED_TABLE : m_flags &= ~(Uint16)TR_STORED_TABLE; }
Uint8 noOfKeyAttr; Uint8 noOfKeyAttr;
Uint8 hasCharAttr; Uint8 hasCharAttr;
...@@ -972,7 +984,7 @@ public: ...@@ -972,7 +984,7 @@ public:
Uint8 hasVarKeys; Uint8 hasVarKeys;
bool checkTable(Uint32 schemaVersion) const { bool checkTable(Uint32 schemaVersion) const {
return enabled && !dropping && return get_enabled() && !get_dropping() &&
(table_version_major(schemaVersion) == table_version_major(currentSchemaVersion)); (table_version_major(schemaVersion) == table_version_major(currentSchemaVersion));
} }
...@@ -1840,9 +1852,14 @@ private: ...@@ -1840,9 +1852,14 @@ private:
Uint32 transid2); Uint32 transid2);
void removeMarkerForFailedAPI(Signal* signal, Uint32 nodeId, Uint32 bucket); void removeMarkerForFailedAPI(Signal* signal, Uint32 nodeId, Uint32 bucket);
bool getAllowStartTransaction() const { bool getAllowStartTransaction(Uint32 nodeId, Uint32 table_single_user_mode) const {
if(getNodeState().getSingleUserMode()) if (unlikely(getNodeState().getSingleUserMode()))
return true; {
if (getNodeState().getSingleUserApi() == nodeId || table_single_user_mode)
return true;
else
return false;
}
return getNodeState().startLevel < NodeState::SL_STOPPING_2; return getNodeState().startLevel < NodeState::SL_STOPPING_2;
} }
......
...@@ -1684,6 +1684,7 @@ void Ndbcntr::createSystableLab(Signal* signal, unsigned index) ...@@ -1684,6 +1684,7 @@ void Ndbcntr::createSystableLab(Signal* signal, unsigned index)
//w.add(DictTabInfo::NoOfVariable, (Uint32)0); //w.add(DictTabInfo::NoOfVariable, (Uint32)0);
//w.add(DictTabInfo::KeyLength, 1); //w.add(DictTabInfo::KeyLength, 1);
w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType); w.add(DictTabInfo::TableTypeVal, (Uint32)table.tableType);
w.add(DictTabInfo::SingleUserMode, (Uint32)NDB_SUM_READ_WRITE);
for (unsigned i = 0; i < table.columnCount; i++) { for (unsigned i = 0; i < table.columnCount; i++) {
const SysColumn& column = table.columnList[i]; const SysColumn& column = table.columnList[i];
......
...@@ -389,7 +389,7 @@ ClusterMgr::execAPI_REGCONF(const Uint32 * theData){ ...@@ -389,7 +389,7 @@ ClusterMgr::execAPI_REGCONF(const Uint32 * theData){
node.m_state = apiRegConf->nodeState; node.m_state = apiRegConf->nodeState;
if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED || if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED ||
node.m_state.startLevel == NodeState::SL_SINGLEUSER)){ node.m_state.getSingleUserMode())){
set_node_alive(node, true); set_node_alive(node, true);
} else { } else {
set_node_alive(node, false); set_node_alive(node, false);
......
...@@ -58,6 +58,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode) ...@@ -58,6 +58,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode)
// We have connections now to the desired node. Return // We have connections now to the desired node. Return
//**************************************************************************** //****************************************************************************
DBUG_RETURN(getConnectedNdbTransaction(tConNode)); DBUG_RETURN(getConnectedNdbTransaction(tConNode));
} else if (TretCode < 0) {
DBUG_RETURN(NULL);
} else if (TretCode != 0) { } else if (TretCode != 0) {
tAnyAlive = 1; tAnyAlive = 1;
}//if }//if
...@@ -81,6 +83,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode) ...@@ -81,6 +83,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode)
// We have connections now to the desired node. Return // We have connections now to the desired node. Return
//**************************************************************************** //****************************************************************************
DBUG_RETURN(getConnectedNdbTransaction(tNode)); DBUG_RETURN(getConnectedNdbTransaction(tNode));
} else if (TretCode < 0) {
DBUG_RETURN(NULL);
} else if (TretCode != 0) { } else if (TretCode != 0) {
tAnyAlive= 1; tAnyAlive= 1;
}//if }//if
...@@ -109,6 +113,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode) ...@@ -109,6 +113,8 @@ NdbTransaction* Ndb::doConnect(Uint32 tConNode)
// We have connections now to the desired node. Return // We have connections now to the desired node. Return
//**************************************************************************** //****************************************************************************
DBUG_RETURN(getConnectedNdbTransaction(tNode)); DBUG_RETURN(getConnectedNdbTransaction(tNode));
} else if (TretCode < 0) {
DBUG_RETURN(NULL);
} else if (TretCode != 0) { } else if (TretCode != 0) {
tAnyAlive= 1; tAnyAlive= 1;
}//if }//if
...@@ -195,6 +201,11 @@ Ndb::NDB_connect(Uint32 tNode) ...@@ -195,6 +201,11 @@ Ndb::NDB_connect(Uint32 tNode)
DBUG_PRINT("info", DBUG_PRINT("info",
("unsuccessful connect tReturnCode %d, tNdbCon->Status() %d", ("unsuccessful connect tReturnCode %d, tNdbCon->Status() %d",
tReturnCode, tNdbCon->Status())); tReturnCode, tNdbCon->Status()));
if (theError.code == 299)
{
// single user mode so no need to retry with other node
DBUG_RETURN(-1);
}
DBUG_RETURN(3); DBUG_RETURN(3);
}//if }//if
}//Ndb::NDB_connect() }//Ndb::NDB_connect()
......
...@@ -495,6 +495,18 @@ NdbDictionary::Table::getFrmLength() const { ...@@ -495,6 +495,18 @@ NdbDictionary::Table::getFrmLength() const {
return m_impl.getFrmLength(); return m_impl.getFrmLength();
} }
enum NdbDictionary::Table::SingleUserMode
NdbDictionary::Table::getSingleUserMode() const
{
return (enum SingleUserMode)m_impl.m_single_user_mode;
}
void
NdbDictionary::Table::setSingleUserMode(enum NdbDictionary::Table::SingleUserMode mode)
{
m_impl.m_single_user_mode = (Uint8)mode;
}
void void
NdbDictionary::Table::setTablespaceNames(const void *data, Uint32 len) NdbDictionary::Table::setTablespaceNames(const void *data, Uint32 len)
{ {
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
#define ERR_RETURN(a,b) \ #define ERR_RETURN(a,b) \
{\ {\
DBUG_PRINT("exit", ("error %d", (a).code));\ DBUG_PRINT("exit", ("error %d return %d", (a).code, b));\
DBUG_RETURN(b);\ DBUG_RETURN(b);\
} }
...@@ -470,6 +470,7 @@ NdbTableImpl::init(){ ...@@ -470,6 +470,7 @@ NdbTableImpl::init(){
m_tablespace_name.clear(); m_tablespace_name.clear();
m_tablespace_id = ~0; m_tablespace_id = ~0;
m_tablespace_version = ~0; m_tablespace_version = ~0;
m_single_user_mode = 0;
} }
bool bool
...@@ -663,6 +664,15 @@ NdbTableImpl::equal(const NdbTableImpl& obj) const ...@@ -663,6 +664,15 @@ NdbTableImpl::equal(const NdbTableImpl& obj) const
DBUG_RETURN(false); DBUG_RETURN(false);
} }
} }
if(m_single_user_mode != obj.m_single_user_mode)
{
DBUG_PRINT("info",("m_single_user_mode %d != %d",
(int32)m_single_user_mode,
(int32)obj.m_single_user_mode));
DBUG_RETURN(false);
}
DBUG_RETURN(true); DBUG_RETURN(true);
} }
...@@ -726,6 +736,8 @@ NdbTableImpl::assign(const NdbTableImpl& org) ...@@ -726,6 +736,8 @@ NdbTableImpl::assign(const NdbTableImpl& org)
m_keyLenInWords = org.m_keyLenInWords; m_keyLenInWords = org.m_keyLenInWords;
m_fragmentCount = org.m_fragmentCount; m_fragmentCount = org.m_fragmentCount;
m_single_user_mode = org.m_single_user_mode;
if (m_index != 0) if (m_index != 0)
delete m_index; delete m_index;
m_index = org.m_index; m_index = org.m_index;
...@@ -2103,6 +2115,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret, ...@@ -2103,6 +2115,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret,
impl->m_kvalue = tableDesc->TableKValue; impl->m_kvalue = tableDesc->TableKValue;
impl->m_minLoadFactor = tableDesc->MinLoadFactor; impl->m_minLoadFactor = tableDesc->MinLoadFactor;
impl->m_maxLoadFactor = tableDesc->MaxLoadFactor; impl->m_maxLoadFactor = tableDesc->MaxLoadFactor;
impl->m_single_user_mode = tableDesc->SingleUserMode;
impl->m_indexType = (NdbDictionary::Object::Type) impl->m_indexType = (NdbDictionary::Object::Type)
getApiConstant(tableDesc->TableType, getApiConstant(tableDesc->TableType,
...@@ -2564,6 +2577,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb, ...@@ -2564,6 +2577,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb,
tmpTab->MinRowsLow = (Uint32)(impl.m_min_rows & 0xFFFFFFFF); tmpTab->MinRowsLow = (Uint32)(impl.m_min_rows & 0xFFFFFFFF);
tmpTab->DefaultNoPartFlag = impl.m_default_no_part_flag; tmpTab->DefaultNoPartFlag = impl.m_default_no_part_flag;
tmpTab->LinearHashFlag = impl.m_linear_flag; tmpTab->LinearHashFlag = impl.m_linear_flag;
tmpTab->SingleUserMode = impl.m_single_user_mode;
if (impl.m_ts_name.length()) if (impl.m_ts_name.length())
{ {
......
...@@ -204,6 +204,7 @@ public: ...@@ -204,6 +204,7 @@ public:
int m_maxLoadFactor; int m_maxLoadFactor;
Uint16 m_keyLenInWords; Uint16 m_keyLenInWords;
Uint16 m_fragmentCount; Uint16 m_fragmentCount;
Uint8 m_single_user_mode;
NdbIndexImpl * m_index; NdbIndexImpl * m_index;
NdbColumnImpl * getColumn(unsigned attrId); NdbColumnImpl * getColumn(unsigned attrId);
......
...@@ -138,8 +138,24 @@ NdbRecAttr::receive_data(const Uint32 * data, Uint32 sz) ...@@ -138,8 +138,24 @@ NdbRecAttr::receive_data(const Uint32 * data, Uint32 sz)
return false; return false;
} }
NdbRecordPrintFormat::NdbRecordPrintFormat()
{
fields_terminated_by= ";";
start_array_enclosure= "[";
end_array_enclosure= "]";
fields_enclosed_by= "";
fields_optionally_enclosed_by= "\"";
lines_terminated_by= "\n";
hex_prefix= "H'";
null_string= "[NULL]";
hex_format= 0;
}
NdbRecordPrintFormat::~NdbRecordPrintFormat() {}
static const NdbRecordPrintFormat default_print_format;
static void static void
ndbrecattr_print_string(NdbOut& out, const char *type, ndbrecattr_print_string(NdbOut& out, const NdbRecordPrintFormat &f,
const char *type, bool is_binary,
const char *aref, unsigned sz) const char *aref, unsigned sz)
{ {
const unsigned char* ref = (const unsigned char*)aref; const unsigned char* ref = (const unsigned char*)aref;
...@@ -148,6 +164,25 @@ ndbrecattr_print_string(NdbOut& out, const char *type, ...@@ -148,6 +164,25 @@ ndbrecattr_print_string(NdbOut& out, const char *type,
for (i=sz-1; i >= 0; i--) for (i=sz-1; i >= 0; i--)
if (ref[i] == 0) sz--; if (ref[i] == 0) sz--;
else break; else break;
if (!is_binary)
{
// trailing spaces are not printed
for (i=sz-1; i >= 0; i--)
if (ref[i] == 32) sz--;
else break;
}
if (is_binary && f.hex_format)
{
if (sz == 0)
{
out.print("0x0");
return;
}
out.print("0x");
for (len = 0; len < (int)sz; len++)
out.print("%02X", (int)ref[len]);
return;
}
if (sz == 0) return; // empty if (sz == 0) return; // empty
for (len=0; len < (int)sz && ref[i] != 0; len++) for (len=0; len < (int)sz && ref[i] != 0; len++)
...@@ -168,37 +203,68 @@ ndbrecattr_print_string(NdbOut& out, const char *type, ...@@ -168,37 +203,68 @@ ndbrecattr_print_string(NdbOut& out, const char *type,
for (i= len+1; ref[i] != 0; i++) for (i= len+1; ref[i] != 0; i++)
out.print("%u]",len-i); out.print("%u]",len-i);
assert((int)sz > i); assert((int)sz > i);
ndbrecattr_print_string(out,type,aref+i,sz-i); ndbrecattr_print_string(out,f,type,is_binary,aref+i,sz-i);
} }
} }
NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) NdbOut&
ndbrecattr_print_formatted(NdbOut& out, const NdbRecAttr &r,
const NdbRecordPrintFormat &f)
{ {
if (r.isNULL()) if (r.isNULL())
{ {
out << "[NULL]"; out << f.null_string;
return out; return out;
} }
const NdbDictionary::Column* c = r.getColumn(); const NdbDictionary::Column* c = r.getColumn();
uint length = c->getLength(); uint length = c->getLength();
if (length > 1)
out << "[";
for (Uint32 j = 0; j < length; j++)
{ {
if (j > 0) const char *fields_optionally_enclosed_by;
out << " "; if (f.fields_enclosed_by[0] == '\0')
fields_optionally_enclosed_by=
f.fields_optionally_enclosed_by;
else
fields_optionally_enclosed_by= "";
out << f.fields_enclosed_by;
Uint32 j;
switch(r.getType()){ switch(r.getType()){
case NdbDictionary::Column::Bigunsigned: case NdbDictionary::Column::Bigunsigned:
out << r.u_64_value(); out << r.u_64_value();
break; break;
case NdbDictionary::Column::Bit: case NdbDictionary::Column::Bit:
out << hex << "H'" << r.u_32_value() << dec; out << f.hex_prefix << "0x";
if (length < 33)
{
out.print("%X", r.u_32_value());
}
else if (length < 65)
{
out.print("%llX", r.u_64_value());
}
else
{
const unsigned char *buf = (unsigned char *)r.aRef();
int k = 4*((length+31)/32);
while (k > 0 && (*(buf + --k) == 0));
do
{
out.print("%X", (Uint32)*(buf + k--));
}
while (k >= 0);
}
break; break;
case NdbDictionary::Column::Unsigned: case NdbDictionary::Column::Unsigned:
out << *((Uint32*)r.aRef() + j); if (length > 1)
out << f.start_array_enclosure;
out << *(Uint32*)r.aRef();
for (j = 1; j < length; j++)
out << " " << *((Uint32*)r.aRef() + j);
if (length > 1)
out << f.end_array_enclosure;
break;
case NdbDictionary::Column::Mediumunsigned:
out << r.u_medium_value();
break; break;
case NdbDictionary::Column::Smallunsigned: case NdbDictionary::Column::Smallunsigned:
out << r.u_short_value(); out << r.u_short_value();
...@@ -212,6 +278,9 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -212,6 +278,9 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
case NdbDictionary::Column::Int: case NdbDictionary::Column::Int:
out << r.int32_value(); out << r.int32_value();
break; break;
case NdbDictionary::Column::Mediumint:
out << r.medium_value();
break;
case NdbDictionary::Column::Smallint: case NdbDictionary::Column::Smallint:
out << r.short_value(); out << r.short_value();
break; break;
...@@ -219,25 +288,37 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -219,25 +288,37 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
out << (int) r.char_value(); out << (int) r.char_value();
break; break;
case NdbDictionary::Column::Binary: case NdbDictionary::Column::Binary:
if (!f.hex_format)
out << fields_optionally_enclosed_by;
j = r.get_size_in_bytes(); j = r.get_size_in_bytes();
ndbrecattr_print_string(out,"Binary", r.aRef(), j); ndbrecattr_print_string(out,f,"Binary", true, r.aRef(), j);
if (!f.hex_format)
out << fields_optionally_enclosed_by;
break; break;
case NdbDictionary::Column::Char: case NdbDictionary::Column::Char:
out << fields_optionally_enclosed_by;
j = r.get_size_in_bytes(); j = r.get_size_in_bytes();
ndbrecattr_print_string(out,"Char", r.aRef(), j); ndbrecattr_print_string(out,f,"Char", false, r.aRef(), j);
out << fields_optionally_enclosed_by;
break; break;
case NdbDictionary::Column::Varchar: case NdbDictionary::Column::Varchar:
{ {
out << fields_optionally_enclosed_by;
unsigned len = *(const unsigned char*)r.aRef(); unsigned len = *(const unsigned char*)r.aRef();
ndbrecattr_print_string(out,"Varchar", r.aRef()+1,len); ndbrecattr_print_string(out,f,"Varchar", false, r.aRef()+1,len);
j = length; j = length;
out << fields_optionally_enclosed_by;
} }
break; break;
case NdbDictionary::Column::Varbinary: case NdbDictionary::Column::Varbinary:
{ {
if (!f.hex_format)
out << fields_optionally_enclosed_by;
unsigned len = *(const unsigned char*)r.aRef(); unsigned len = *(const unsigned char*)r.aRef();
ndbrecattr_print_string(out,"Varbinary", r.aRef()+1,len); ndbrecattr_print_string(out,f,"Varbinary", true, r.aRef()+1,len);
j = length; j = length;
if (!f.hex_format)
out << fields_optionally_enclosed_by;
} }
break; break;
case NdbDictionary::Column::Float: case NdbDictionary::Column::Float:
...@@ -366,16 +447,26 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -366,16 +447,26 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
break; break;
case NdbDictionary::Column::Longvarchar: case NdbDictionary::Column::Longvarchar:
{ {
out << fields_optionally_enclosed_by;
unsigned len = uint2korr(r.aRef());
ndbrecattr_print_string(out,f,"Longvarchar", false, r.aRef()+2,len);
j = length;
out << fields_optionally_enclosed_by;
}
break;
case NdbDictionary::Column::Longvarbinary:
{
if (!f.hex_format)
out << fields_optionally_enclosed_by;
unsigned len = uint2korr(r.aRef()); unsigned len = uint2korr(r.aRef());
ndbrecattr_print_string(out,"Longvarchar", r.aRef()+2,len); ndbrecattr_print_string(out,f,"Longvarbinary", true, r.aRef()+2,len);
j = length; j = length;
if (!f.hex_format)
out << fields_optionally_enclosed_by;
} }
break; break;
case NdbDictionary::Column::Undefined: case NdbDictionary::Column::Undefined:
case NdbDictionary::Column::Mediumint:
case NdbDictionary::Column::Mediumunsigned:
case NdbDictionary::Column::Longvarbinary:
unknown: unknown:
//default: /* no print functions for the rest, just print type */ //default: /* no print functions for the rest, just print type */
out << (int) r.getType(); out << (int) r.getType();
...@@ -384,16 +475,17 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r) ...@@ -384,16 +475,17 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
out << " " << j << " times"; out << " " << j << " times";
break; break;
} }
} out << f.fields_enclosed_by;
if (length > 1)
{
out << "]";
} }
return out; return out;
} }
NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
{
return ndbrecattr_print_formatted(out, r, default_print_format);
}
Int64 Int64
NdbRecAttr::int64_value() const NdbRecAttr::int64_value() const
{ {
......
...@@ -365,7 +365,8 @@ inline ...@@ -365,7 +365,8 @@ inline
bool bool
TransporterFacade::get_node_stopping(NodeId n) const { TransporterFacade::get_node_stopping(NodeId n) const {
const ClusterMgr::Node & node = theClusterMgr->getNodeInfo(n); const ClusterMgr::Node & node = theClusterMgr->getNodeInfo(n);
return ((node.m_state.startLevel == NodeState::SL_STOPPING_1) || return (!node.m_state.getSingleUserMode() &&
(node.m_state.startLevel == NodeState::SL_STOPPING_1) ||
(node.m_state.startLevel == NodeState::SL_STOPPING_2)); (node.m_state.startLevel == NodeState::SL_STOPPING_2));
} }
...@@ -376,16 +377,9 @@ TransporterFacade::getIsNodeSendable(NodeId n) const { ...@@ -376,16 +377,9 @@ TransporterFacade::getIsNodeSendable(NodeId n) const {
const Uint32 startLevel = node.m_state.startLevel; const Uint32 startLevel = node.m_state.startLevel;
if (node.m_info.m_type == NodeInfo::DB) { if (node.m_info.m_type == NodeInfo::DB) {
if(node.m_state.singleUserMode && return node.compatible && (startLevel == NodeState::SL_STARTED ||
ownId() == node.m_state.singleUserApi) { startLevel == NodeState::SL_STOPPING_1 ||
return (node.compatible && node.m_state.getSingleUserMode());
(node.m_state.startLevel == NodeState::SL_STOPPING_1 ||
node.m_state.startLevel == NodeState::SL_STARTED ||
node.m_state.startLevel == NodeState::SL_SINGLEUSER));
}
else
return node.compatible && (startLevel == NodeState::SL_STARTED ||
startLevel == NodeState::SL_STOPPING_1);
} else { } else {
ndbout_c("TransporterFacade::getIsNodeSendable: Illegal node type: " ndbout_c("TransporterFacade::getIsNodeSendable: Illegal node type: "
"%d of node: %d", "%d of node: %d",
......
...@@ -33,7 +33,7 @@ operator <<(class NdbOut& ndbout, const NDBT_Table & tab) ...@@ -33,7 +33,7 @@ operator <<(class NdbOut& ndbout, const NDBT_Table & tab)
ndbout << "Length of frm data: " << tab.getFrmLength() << endl; ndbout << "Length of frm data: " << tab.getFrmLength() << endl;
ndbout << "Row Checksum: " << tab.getRowChecksumIndicator() << endl; ndbout << "Row Checksum: " << tab.getRowChecksumIndicator() << endl;
ndbout << "Row GCI: " << tab.getRowGCIIndicator() << endl; ndbout << "Row GCI: " << tab.getRowGCIIndicator() << endl;
ndbout << "SingleUserMode: " << tab.getSingleUserMode() << endl;
//<< ((tab.getTupleKey() == TupleId) ? " tupleid" : "") <<endl; //<< ((tab.getTupleKey() == TupleId) ? " tupleid" : "") <<endl;
ndbout << "TableStatus: "; ndbout << "TableStatus: ";
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <NdbAutoPtr.hpp> #include <NdbAutoPtr.hpp>
#include "../../../../sql/ha_ndbcluster_tables.h" #include "../../../../sql/ha_ndbcluster_tables.h"
extern NdbRecordPrintFormat g_ndbrecord_print_format;
Uint16 Twiddle16(Uint16 in); // Byte shift 16-bit data Uint16 Twiddle16(Uint16 in); // Byte shift 16-bit data
Uint32 Twiddle32(Uint32 in); // Byte shift 32-bit data Uint32 Twiddle32(Uint32 in); // Byte shift 32-bit data
...@@ -298,6 +299,7 @@ RestoreMetaData::markSysTables() ...@@ -298,6 +299,7 @@ RestoreMetaData::markSysTables()
Uint32 i; Uint32 i;
for (i = 0; i < getNoOfTables(); i++) { for (i = 0; i < getNoOfTables(); i++) {
TableS* table = allTables[i]; TableS* table = allTables[i];
table->m_local_id = i;
const char* tableName = table->getTableName(); const char* tableName = table->getTableName();
if ( // XXX should use type if ( // XXX should use type
strcmp(tableName, "SYSTAB_0") == 0 || strcmp(tableName, "SYSTAB_0") == 0 ||
...@@ -314,6 +316,7 @@ RestoreMetaData::markSysTables() ...@@ -314,6 +316,7 @@ RestoreMetaData::markSysTables()
strcmp(tableName, OLD_NDB_REP_DB "/def/" OLD_NDB_SCHEMA_TABLE) == 0 || strcmp(tableName, OLD_NDB_REP_DB "/def/" OLD_NDB_SCHEMA_TABLE) == 0 ||
strcmp(tableName, NDB_REP_DB "/def/" NDB_APPLY_TABLE) == 0 || strcmp(tableName, NDB_REP_DB "/def/" NDB_APPLY_TABLE) == 0 ||
strcmp(tableName, NDB_REP_DB "/def/" NDB_SCHEMA_TABLE)== 0 ) strcmp(tableName, NDB_REP_DB "/def/" NDB_SCHEMA_TABLE)== 0 )
table->isSysTable = true; table->isSysTable = true;
} }
for (i = 0; i < getNoOfTables(); i++) { for (i = 0; i < getNoOfTables(); i++) {
...@@ -331,6 +334,7 @@ RestoreMetaData::markSysTables() ...@@ -331,6 +334,7 @@ RestoreMetaData::markSysTables()
if (table->getTableId() == (Uint32) id1) { if (table->getTableId() == (Uint32) id1) {
if (table->isSysTable) if (table->isSysTable)
blobTable->isSysTable = true; blobTable->isSysTable = true;
blobTable->m_main_table = table;
break; break;
} }
} }
...@@ -428,6 +432,7 @@ TableS::TableS(Uint32 version, NdbTableImpl* tableImpl) ...@@ -428,6 +432,7 @@ TableS::TableS(Uint32 version, NdbTableImpl* tableImpl)
m_noOfRecords= 0; m_noOfRecords= 0;
backupVersion = version; backupVersion = version;
isSysTable = false; isSysTable = false;
m_main_table = NULL;
for (int i = 0; i < tableImpl->getNoOfColumns(); i++) for (int i = 0; i < tableImpl->getNoOfColumns(); i++)
createAttr(tableImpl->getColumn(i)); createAttr(tableImpl->getColumn(i));
...@@ -897,6 +902,7 @@ bool RestoreDataIterator::readFragmentHeader(int & ret, Uint32 *fragmentId) ...@@ -897,6 +902,7 @@ bool RestoreDataIterator::readFragmentHeader(int & ret, Uint32 *fragmentId)
return false; return false;
} }
info.setLevel(254);
info << "_____________________________________________________" << endl info << "_____________________________________________________" << endl
<< "Processing data in table: " << m_currentTable->getTableName() << "Processing data in table: " << m_currentTable->getTableName()
<< "(" << Header.TableId << ") fragment " << "(" << Header.TableId << ") fragment "
...@@ -1154,14 +1160,14 @@ operator<<(NdbOut& ndbout, const AttributeS& attr){ ...@@ -1154,14 +1160,14 @@ operator<<(NdbOut& ndbout, const AttributeS& attr){
if (data.null) if (data.null)
{ {
ndbout << "<NULL>"; ndbout << g_ndbrecord_print_format.null_string;
return ndbout; return ndbout;
} }
NdbRecAttr tmprec(0); NdbRecAttr tmprec(0);
tmprec.setup(desc.m_column, (char *)data.void_value); tmprec.setup(desc.m_column, 0);
tmprec.receive_data((Uint32*)data.void_value, data.size); tmprec.receive_data((Uint32*)data.void_value, data.size);
ndbout << tmprec; ndbrecattr_print_formatted(ndbout, tmprec, g_ndbrecord_print_format);
return ndbout; return ndbout;
} }
...@@ -1170,17 +1176,15 @@ operator<<(NdbOut& ndbout, const AttributeS& attr){ ...@@ -1170,17 +1176,15 @@ operator<<(NdbOut& ndbout, const AttributeS& attr){
NdbOut& NdbOut&
operator<<(NdbOut& ndbout, const TupleS& tuple) operator<<(NdbOut& ndbout, const TupleS& tuple)
{ {
ndbout << tuple.getTable()->getTableName() << "; ";
for (int i = 0; i < tuple.getNoOfAttributes(); i++) for (int i = 0; i < tuple.getNoOfAttributes(); i++)
{ {
if (i > 0)
ndbout << g_ndbrecord_print_format.fields_terminated_by;
AttributeData * attr_data = tuple.getData(i); AttributeData * attr_data = tuple.getData(i);
const AttributeDesc * attr_desc = tuple.getDesc(i); const AttributeDesc * attr_desc = tuple.getDesc(i);
const AttributeS attr = {attr_desc, *attr_data}; const AttributeS attr = {attr_desc, *attr_data};
debug << i << " " << attr_desc->m_column->getName(); debug << i << " " << attr_desc->m_column->getName();
ndbout << attr; ndbout << attr;
if (i != (tuple.getNoOfAttributes() - 1))
ndbout << delimiter << " ";
} // for } // for
return ndbout; return ndbout;
} }
......
...@@ -25,8 +25,6 @@ ...@@ -25,8 +25,6 @@
#include <ndb_version.h> #include <ndb_version.h>
#include <version.h> #include <version.h>
#define delimiter ";"
const int FileNameLenC = 256; const int FileNameLenC = 256;
const int TableNameLenC = 256; const int TableNameLenC = 256;
const int AttrNameLenC = 256; const int AttrNameLenC = 256;
...@@ -142,6 +140,8 @@ class TableS { ...@@ -142,6 +140,8 @@ class TableS {
Uint64 m_max_auto_val; Uint64 m_max_auto_val;
bool isSysTable; bool isSysTable;
TableS *m_main_table;
Uint32 m_local_id;
Uint64 m_noOfRecords; Uint64 m_noOfRecords;
Vector<FragmentInfo *> m_fragmentInfo; Vector<FragmentInfo *> m_fragmentInfo;
...@@ -156,6 +156,9 @@ public: ...@@ -156,6 +156,9 @@ public:
Uint32 getTableId() const { Uint32 getTableId() const {
return m_dictTable->getTableId(); return m_dictTable->getTableId();
} }
Uint32 getLocalId() const {
return m_local_id;
}
Uint32 getNoOfRecords() const { Uint32 getNoOfRecords() const {
return m_noOfRecords; return m_noOfRecords;
} }
...@@ -239,6 +242,10 @@ public: ...@@ -239,6 +242,10 @@ public:
return isSysTable; return isSysTable;
} }
const TableS *getMainTable() const {
return m_main_table;
}
TableS& operator=(TableS& org) ; TableS& operator=(TableS& org) ;
}; // TableS; }; // TableS;
......
...@@ -14,6 +14,9 @@ ...@@ -14,6 +14,9 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "consumer_printer.hpp" #include "consumer_printer.hpp"
extern FilteredNdbOut info;
extern NdbRecordPrintFormat g_ndbrecord_print_format;
extern const char *tab_path;
bool bool
BackupPrinter::table(const TableS & tab) BackupPrinter::table(const TableS & tab)
...@@ -21,7 +24,8 @@ BackupPrinter::table(const TableS & tab) ...@@ -21,7 +24,8 @@ BackupPrinter::table(const TableS & tab)
if (m_print || m_print_meta) if (m_print || m_print_meta)
{ {
m_ndbout << tab; m_ndbout << tab;
ndbout_c("Successfully printed table: %s", tab.m_dictTable->getName()); info.setLevel(254);
info << "Successfully printed table: ", tab.m_dictTable->getName();
} }
return true; return true;
} }
...@@ -31,7 +35,14 @@ BackupPrinter::tuple(const TupleS & tup, Uint32 fragId) ...@@ -31,7 +35,14 @@ BackupPrinter::tuple(const TupleS & tup, Uint32 fragId)
{ {
m_dataCount++; m_dataCount++;
if (m_print || m_print_data) if (m_print || m_print_data)
m_ndbout << tup << endl; {
if (m_ndbout.m_out == info.m_out)
{
info.setLevel(254);
info << tup.getTable()->getTableName() << "; ";
}
m_ndbout << tup << g_ndbrecord_print_format.lines_terminated_by;
}
} }
void void
...@@ -47,9 +58,10 @@ BackupPrinter::endOfLogEntrys() ...@@ -47,9 +58,10 @@ BackupPrinter::endOfLogEntrys()
{ {
if (m_print || m_print_log) if (m_print || m_print_log)
{ {
ndbout << "Printed " << m_dataCount << " tuples and " info.setLevel(254);
<< m_logCount << " log entries" info << "Printed " << m_dataCount << " tuples and "
<< " to stdout." << endl; << m_logCount << " log entries"
<< " to stdout." << endl;
} }
} }
bool bool
......
...@@ -619,6 +619,7 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData) ...@@ -619,6 +619,7 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData)
return true; return true;
bool result= false; bool result= false;
unsigned apply_table_format= 0;
m_ndb->setDatabaseName(NDB_REP_DB); m_ndb->setDatabaseName(NDB_REP_DB);
m_ndb->setSchemaName("def"); m_ndb->setSchemaName("def");
...@@ -631,8 +632,33 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData) ...@@ -631,8 +632,33 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData)
<< dict->getNdbError() << endl; << dict->getNdbError() << endl;
return false; return false;
} }
if
(ndbtab->getColumn(0)->getType() == NdbDictionary::Column::Unsigned &&
ndbtab->getColumn(1)->getType() == NdbDictionary::Column::Bigunsigned)
{
if (ndbtab->getNoOfColumns() == 2)
{
apply_table_format= 1;
}
else if
(ndbtab->getColumn(2)->getType() == NdbDictionary::Column::Varchar &&
ndbtab->getColumn(3)->getType() == NdbDictionary::Column::Bigunsigned &&
ndbtab->getColumn(4)->getType() == NdbDictionary::Column::Bigunsigned)
{
apply_table_format= 2;
}
}
if (apply_table_format == 0)
{
err << Ndb_apply_table << " has wrong format\n";
return false;
}
Uint32 server_id= 0; Uint32 server_id= 0;
Uint64 epoch= metaData.getStopGCP(); Uint64 epoch= metaData.getStopGCP();
Uint64 zero= 0;
char empty_string[1];
empty_string[0]= 0;
NdbTransaction * trans= m_ndb->startTransaction(); NdbTransaction * trans= m_ndb->startTransaction();
if (!trans) if (!trans)
{ {
...@@ -655,6 +681,15 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData) ...@@ -655,6 +681,15 @@ BackupRestore::update_apply_status(const RestoreMetaData &metaData)
<< op->getNdbError() << endl; << op->getNdbError() << endl;
goto err; goto err;
} }
if ((apply_table_format == 2) &&
(op->setValue(2u, (const char *)&empty_string, 1) ||
op->setValue(3u, (const char *)&zero, sizeof(zero)) ||
op->setValue(4u, (const char *)&zero, sizeof(zero))))
{
err << Ndb_apply_table << ": "
<< op->getNdbError() << endl;
goto err;
}
if (trans->execute(NdbTransaction::Commit)) if (trans->execute(NdbTransaction::Commit))
{ {
err << Ndb_apply_table << ": " err << Ndb_apply_table << ": "
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment