sqlite/ext/rtree/rtreecheck.test
drh 0f0d3ddf71 Enable DEFENSIVE mode by default for tests. This requires lots of case of
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
2018-11-06 19:26:04 +00:00

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