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