xref: /sqlite-3.40.0/ext/rtree/rtreecheck.test (revision 8c53b4e7)
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