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 sqlite3_db_config db DEFENSIVE 0 65} 66 67setup_simple_db 68do_execsql_test 2.1 { 69 SELECT rtreecheck('r1') 70} {ok} 71 72do_execsql_test 2.2 { 73 UPDATE r1_node SET data = swap_int32(data, 3, 9); 74 UPDATE r1_node SET data = swap_int32(data, 23, 29); 75} 76 77do_execsql_test 2.3 { 78 SELECT rtreecheck('r1') 79} {{Dimension 0 of cell 0 on node 1 is corrupt 80Dimension 1 of cell 3 on node 1 is corrupt}} 81 82setup_simple_db 83do_execsql_test 2.4 { 84 DELETE FROM r1_rowid WHERE rowid = 3; 85 SELECT rtreecheck('r1') 86} {{Mapping (3 -> 1) missing from %_rowid table 87Wrong number of entries in %_rowid table - expected 5, actual 4}} 88 89setup_simple_db 90do_execsql_test 2.5 { 91 UPDATE r1_rowid SET nodeno=2 WHERE rowid=3; 92 SELECT rtreecheck('r1') 93} {{Found (3 -> 2) in %_rowid table, expected (3 -> 1)}} 94 95reset_db 96do_execsql_test 3.0 { 97 CREATE VIRTUAL TABLE r1 USING rtree_i32(id, x1, x2); 98 INSERT INTO r1 VALUES(1, 0x7FFFFFFF*-1, 0x7FFFFFFF); 99 INSERT INTO r1 VALUES(2, 0x7FFFFFFF*-1, 5); 100 INSERT INTO r1 VALUES(3, -5, 5); 101 INSERT INTO r1 VALUES(4, 5, 0x11111111); 102 INSERT INTO r1 VALUES(5, 5, 0x00800000); 103 INSERT INTO r1 VALUES(6, 5, 0x00008000); 104 INSERT INTO r1 VALUES(7, 5, 0x00000080); 105 INSERT INTO r1 VALUES(8, 5, 0x40490fdb); 106 INSERT INTO r1 VALUES(9, 0x7f800000, 0x7f900000); 107 SELECT rtreecheck('r1') 108} {ok} 109 110do_execsql_test 3.1 { 111 CREATE VIRTUAL TABLE r2 USING rtree_i32(id, x1, x2); 112 INSERT INTO r2 VALUES(2, -1*(1<<31), -1*(1<<31)+5); 113 SELECT rtreecheck('r2') 114} {ok} 115 116sqlite3_db_config db DEFENSIVE 0 117do_execsql_test 3.2 { 118 BEGIN; 119 UPDATE r2_node SET data = X'123456'; 120 SELECT rtreecheck('r2')!='ok'; 121} {1} 122 123do_execsql_test 3.3 { 124 ROLLBACK; 125 UPDATE r2_node SET data = X'00001234'; 126 SELECT rtreecheck('r2')!='ok'; 127} {1} 128 129do_execsql_test 4.0 { 130 CREATE TABLE notanrtree(i); 131 SELECT rtreecheck('notanrtree'); 132} {{Schema corrupt or not an rtree}} 133 134#------------------------------------------------------------------------- 135# 136reset_db 137db func set_int32 set_int32 138do_execsql_test 5.0 { 139 CREATE VIRTUAL TABLE r3 USING rtree_i32(id, x1, x2, y1, y2); 140 WITH x(i) AS ( 141 SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000 142 ) 143 INSERT INTO r3 SELECT i, i, i, i, i FROM x; 144} 145sqlite3_db_config db DEFENSIVE 0 146do_execsql_test 5.1 { 147 BEGIN; 148 UPDATE r3_node SET data = set_int32(data, 3, 5000); 149 UPDATE r3_node SET data = set_int32(data, 4, 5000); 150 SELECT rtreecheck('r3')=='ok' 151} 0 152do_execsql_test 5.2 { 153 ROLLBACK; 154 BEGIN; 155 UPDATE r3_node SET data = set_int32(data, 3, 0); 156 UPDATE r3_node SET data = set_int32(data, 4, 0); 157 SELECT rtreecheck('r3')=='ok' 158} 0 159 160finish_test 161