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