0f0d3ddf71
turning DEFENSIVE off in order to dodgy things to the database for testing purposes. No all of those cases are yet handled, so "make test" does not run to completion. FossilOrigin-Name: a1d6c6712c3304fd736077432c8c180692cf7d79be7f3a073510b6dab0eb951f
161 lines
4.0 KiB
Plaintext
161 lines
4.0 KiB
Plaintext
# 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
|