1# 2017 August 17 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# 12# 13 14 15if {![info exists testdir]} { 16 set testdir [file join [file dirname [info script]] .. .. test] 17} 18source $testdir/tester.tcl 19set testprefix rtreecheck 20 21ifcapable !rtree { 22 finish_test 23 return 24} 25 26proc swap_int32 {blob i0 i1} { 27 binary scan $blob I* L 28 29 set a [lindex $L $i0] 30 set b [lindex $L $i1] 31 32 lset L $i0 $b 33 lset L $i1 $a 34 35 binary format I* $L 36} 37 38proc set_int32 {blob idx val} { 39 binary scan $blob I* L 40 lset L $idx $val 41 binary format I* $L 42} 43 44do_catchsql_test 1.0 { 45 SELECT rtreecheck(); 46} {1 {wrong number of arguments to function rtreecheck()}} 47 48do_catchsql_test 1.1 { 49 SELECT rtreecheck(0,0,0); 50} {1 {wrong number of arguments to function rtreecheck()}} 51 52 53proc setup_simple_db {{module rtree}} { 54 reset_db 55 db func swap_int32 swap_int32 56 execsql " 57 CREATE VIRTUAL TABLE r1 USING $module (id, x1, x2, y1, y2); 58 INSERT INTO r1 VALUES(1, 5, 5, 5, 5); -- 3 59 INSERT INTO r1 VALUES(2, 6, 6, 6, 6); -- 9 60 INSERT INTO r1 VALUES(3, 7, 7, 7, 7); -- 15 61 INSERT INTO r1 VALUES(4, 8, 8, 8, 8); -- 21 62 INSERT INTO r1 VALUES(5, 9, 9, 9, 9); -- 27 63 " 64} 65 66setup_simple_db 67do_execsql_test 2.1 { 68 SELECT rtreecheck('r1') 69} {ok} 70 71do_execsql_test 2.2 { 72 UPDATE r1_node SET data = swap_int32(data, 3, 9); 73 UPDATE r1_node SET data = swap_int32(data, 23, 29); 74} 75 76do_execsql_test 2.3 { 77 SELECT rtreecheck('r1') 78} {{Dimension 0 of cell 0 on node 1 is corrupt 79Dimension 1 of cell 3 on node 1 is corrupt}} 80 81setup_simple_db 82do_execsql_test 2.4 { 83 DELETE FROM r1_rowid WHERE rowid = 3; 84 SELECT rtreecheck('r1') 85} {{Mapping (3 -> 1) missing from %_rowid table 86Wrong number of entries in %_rowid table - expected 5, actual 4}} 87 88setup_simple_db 89do_execsql_test 2.5 { 90 UPDATE r1_rowid SET nodeno=2 WHERE rowid=3; 91 SELECT rtreecheck('r1') 92} {{Found (3 -> 2) in %_rowid table, expected (3 -> 1)}} 93 94reset_db 95do_execsql_test 3.0 { 96 CREATE VIRTUAL TABLE r1 USING rtree_i32(id, x1, x2); 97 INSERT INTO r1 VALUES(1, 0x7FFFFFFF*-1, 0x7FFFFFFF); 98 INSERT INTO r1 VALUES(2, 0x7FFFFFFF*-1, 5); 99 INSERT INTO r1 VALUES(3, -5, 5); 100 INSERT INTO r1 VALUES(4, 5, 0x11111111); 101 INSERT INTO r1 VALUES(5, 5, 0x00800000); 102 INSERT INTO r1 VALUES(6, 5, 0x00008000); 103 INSERT INTO r1 VALUES(7, 5, 0x00000080); 104 INSERT INTO r1 VALUES(8, 5, 0x40490fdb); 105 INSERT INTO r1 VALUES(9, 0x7f800000, 0x7f900000); 106 SELECT rtreecheck('r1') 107} {ok} 108 109do_execsql_test 3.1 { 110 CREATE VIRTUAL TABLE r2 USING rtree_i32(id, x1, x2); 111 INSERT INTO r2 VALUES(2, -1*(1<<31), -1*(1<<31)+5); 112 SELECT rtreecheck('r2') 113} {ok} 114 115do_execsql_test 3.2 { 116 BEGIN; 117 UPDATE r2_node SET data = X'123456'; 118 SELECT rtreecheck('r2')!="ok"; 119} {1} 120 121do_execsql_test 3.3 { 122 ROLLBACK; 123 UPDATE r2_node SET data = X'00001234'; 124 SELECT rtreecheck('r2')!="ok"; 125} {1} 126 127do_execsql_test 4.0 { 128 CREATE TABLE notanrtree(i); 129 SELECT rtreecheck('notanrtree'); 130} {{Schema corrupt or not an rtree}} 131 132#------------------------------------------------------------------------- 133# 134reset_db 135db func set_int32 set_int32 136do_execsql_test 5.0 { 137 CREATE VIRTUAL TABLE r3 USING rtree_i32(id, x1, x2, y1, y2); 138 WITH x(i) AS ( 139 SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 140 ) 141 INSERT INTO r3 SELECT i, i, i, i, i FROM x; 142} 143do_execsql_test 5.1 { 144 BEGIN; 145 UPDATE r3_node SET data = set_int32(data, 3, 5000); 146 UPDATE r3_node SET data = set_int32(data, 4, 5000); 147 SELECT rtreecheck('r3')=='ok' 148} 0 149do_execsql_test 5.2 { 150 ROLLBACK; 151 BEGIN; 152 UPDATE r3_node SET data = set_int32(data, 3, 0); 153 UPDATE r3_node SET data = set_int32(data, 4, 0); 154 SELECT rtreecheck('r3')=='ok' 155} 0 156 157finish_test 158 159