xref: /sqlite-3.40.0/ext/rtree/rtreecheck.test (revision 7d44b22d)
11917e92fSdan# 2017 August 17
21917e92fSdan#
31917e92fSdan# The author disclaims copyright to this source code.  In place of
41917e92fSdan# a legal notice, here is a blessing:
51917e92fSdan#
61917e92fSdan#    May you do good and not evil.
71917e92fSdan#    May you find forgiveness for yourself and forgive others.
81917e92fSdan#    May you share freely, never taking more than you give.
91917e92fSdan#
101917e92fSdan#***********************************************************************
111917e92fSdan#
121917e92fSdan#
131917e92fSdan
141917e92fSdan
151917e92fSdanif {![info exists testdir]} {
161917e92fSdan  set testdir [file join [file dirname [info script]] .. .. test]
171917e92fSdan}
181917e92fSdansource $testdir/tester.tcl
191917e92fSdanset testprefix rtreecheck
201917e92fSdan
211917e92fSdanifcapable !rtree {
221917e92fSdan  finish_test
231917e92fSdan  return
241917e92fSdan}
251917e92fSdan
261917e92fSdanproc swap_int32 {blob i0 i1} {
271917e92fSdan  binary scan $blob I* L
281917e92fSdan
291917e92fSdan  set a [lindex $L $i0]
301917e92fSdan  set b [lindex $L $i1]
311917e92fSdan
321917e92fSdan  lset L $i0 $b
331917e92fSdan  lset L $i1 $a
341917e92fSdan
351917e92fSdan  binary format I* $L
361917e92fSdan}
371917e92fSdan
387e2b38c5Sdanproc set_int32 {blob idx val} {
397e2b38c5Sdan  binary scan $blob I* L
407e2b38c5Sdan  lset L $idx $val
417e2b38c5Sdan  binary format I* $L
427e2b38c5Sdan}
437e2b38c5Sdan
441917e92fSdando_catchsql_test 1.0 {
451917e92fSdan  SELECT rtreecheck();
461917e92fSdan} {1 {wrong number of arguments to function rtreecheck()}}
471917e92fSdan
481917e92fSdando_catchsql_test 1.1 {
491917e92fSdan  SELECT rtreecheck(0,0,0);
501917e92fSdan} {1 {wrong number of arguments to function rtreecheck()}}
511917e92fSdan
521917e92fSdan
531917e92fSdanproc setup_simple_db {{module rtree}} {
541917e92fSdan  reset_db
551917e92fSdan  db func swap_int32 swap_int32
561917e92fSdan  execsql "
571917e92fSdan    CREATE VIRTUAL TABLE r1 USING $module (id, x1, x2, y1, y2);
581917e92fSdan    INSERT INTO r1 VALUES(1,  5, 5, 5, 5);  --  3
591917e92fSdan    INSERT INTO r1 VALUES(2,  6, 6, 6, 6);  --  9
601917e92fSdan    INSERT INTO r1 VALUES(3,  7, 7, 7, 7);  -- 15
611917e92fSdan    INSERT INTO r1 VALUES(4,  8, 8, 8, 8);  -- 21
621917e92fSdan    INSERT INTO r1 VALUES(5,  9, 9, 9, 9);  -- 27
631917e92fSdan  "
640f0d3ddfSdrh  sqlite3_db_config db DEFENSIVE 0
651917e92fSdan}
661917e92fSdan
671917e92fSdansetup_simple_db
681917e92fSdando_execsql_test 2.1 {
691917e92fSdan  SELECT rtreecheck('r1')
701917e92fSdan} {ok}
711917e92fSdan
721917e92fSdando_execsql_test 2.2 {
731917e92fSdan  UPDATE r1_node SET data = swap_int32(data, 3, 9);
741917e92fSdan  UPDATE r1_node SET data = swap_int32(data, 23, 29);
751917e92fSdan}
761917e92fSdan
771917e92fSdando_execsql_test 2.3 {
781917e92fSdan  SELECT rtreecheck('r1')
791917e92fSdan} {{Dimension 0 of cell 0 on node 1 is corrupt
801917e92fSdanDimension 1 of cell 3 on node 1 is corrupt}}
811917e92fSdan
821917e92fSdansetup_simple_db
831917e92fSdando_execsql_test 2.4 {
841917e92fSdan  DELETE FROM r1_rowid WHERE rowid = 3;
851917e92fSdan  SELECT rtreecheck('r1')
861917e92fSdan} {{Mapping (3 -> 1) missing from %_rowid table
871917e92fSdanWrong number of entries in %_rowid table - expected 5, actual 4}}
881917e92fSdan
891917e92fSdansetup_simple_db
901917e92fSdando_execsql_test 2.5 {
911917e92fSdan  UPDATE r1_rowid SET nodeno=2 WHERE rowid=3;
921917e92fSdan  SELECT rtreecheck('r1')
931917e92fSdan} {{Found (3 -> 2) in %_rowid table, expected (3 -> 1)}}
941917e92fSdan
951917e92fSdanreset_db
961917e92fSdando_execsql_test 3.0 {
971917e92fSdan  CREATE VIRTUAL TABLE r1 USING rtree_i32(id, x1, x2);
981917e92fSdan  INSERT INTO r1 VALUES(1, 0x7FFFFFFF*-1, 0x7FFFFFFF);
991917e92fSdan  INSERT INTO r1 VALUES(2, 0x7FFFFFFF*-1, 5);
1001917e92fSdan  INSERT INTO r1 VALUES(3, -5, 5);
1011917e92fSdan  INSERT INTO r1 VALUES(4, 5, 0x11111111);
1021917e92fSdan  INSERT INTO r1 VALUES(5, 5, 0x00800000);
1031917e92fSdan  INSERT INTO r1 VALUES(6, 5, 0x00008000);
1041917e92fSdan  INSERT INTO r1 VALUES(7, 5, 0x00000080);
1051917e92fSdan  INSERT INTO r1 VALUES(8, 5, 0x40490fdb);
1061917e92fSdan  INSERT INTO r1 VALUES(9, 0x7f800000, 0x7f900000);
1071917e92fSdan  SELECT rtreecheck('r1')
1081917e92fSdan} {ok}
1091917e92fSdan
1101917e92fSdando_execsql_test 3.1 {
1111917e92fSdan  CREATE VIRTUAL TABLE r2 USING rtree_i32(id, x1, x2);
1121917e92fSdan  INSERT INTO r2 VALUES(2, -1*(1<<31), -1*(1<<31)+5);
1131917e92fSdan  SELECT rtreecheck('r2')
1141917e92fSdan} {ok}
1151917e92fSdan
1160f0d3ddfSdrhsqlite3_db_config db DEFENSIVE 0
1177e2b38c5Sdando_execsql_test 3.2 {
1187e2b38c5Sdan  BEGIN;
1197e2b38c5Sdan    UPDATE r2_node SET data = X'123456';
120*7d44b22dSdrh    SELECT rtreecheck('r2')!='ok';
1217e2b38c5Sdan} {1}
1227e2b38c5Sdan
1237e2b38c5Sdando_execsql_test 3.3 {
1247e2b38c5Sdan  ROLLBACK;
1257e2b38c5Sdan  UPDATE r2_node SET data = X'00001234';
126*7d44b22dSdrh  SELECT rtreecheck('r2')!='ok';
1277e2b38c5Sdan} {1}
1287e2b38c5Sdan
1297e2b38c5Sdando_execsql_test 4.0 {
1307e2b38c5Sdan  CREATE TABLE notanrtree(i);
1317e2b38c5Sdan  SELECT rtreecheck('notanrtree');
1327e2b38c5Sdan} {{Schema corrupt or not an rtree}}
1337e2b38c5Sdan
1347e2b38c5Sdan#-------------------------------------------------------------------------
1357e2b38c5Sdan#
1367e2b38c5Sdanreset_db
1377e2b38c5Sdandb func set_int32 set_int32
1387e2b38c5Sdando_execsql_test 5.0 {
1397e2b38c5Sdan  CREATE VIRTUAL TABLE r3 USING rtree_i32(id, x1, x2, y1, y2);
1407e2b38c5Sdan  WITH x(i) AS (
1417e2b38c5Sdan    SELECT 1 UNION ALL SELECT i+1 FROM x WHERE i<1000
1427e2b38c5Sdan  )
1437e2b38c5Sdan  INSERT INTO r3 SELECT i, i, i, i, i FROM x;
1447e2b38c5Sdan}
1450f0d3ddfSdrhsqlite3_db_config db DEFENSIVE 0
1467e2b38c5Sdando_execsql_test 5.1 {
1477e2b38c5Sdan  BEGIN;
1487e2b38c5Sdan    UPDATE r3_node SET data = set_int32(data, 3, 5000);
1497e2b38c5Sdan    UPDATE r3_node SET data = set_int32(data, 4, 5000);
1507e2b38c5Sdan    SELECT rtreecheck('r3')=='ok'
1517e2b38c5Sdan} 0
1527e2b38c5Sdando_execsql_test 5.2 {
1537e2b38c5Sdan  ROLLBACK;
1547e2b38c5Sdan  BEGIN;
1557e2b38c5Sdan    UPDATE r3_node SET data = set_int32(data, 3, 0);
1567e2b38c5Sdan    UPDATE r3_node SET data = set_int32(data, 4, 0);
1577e2b38c5Sdan    SELECT rtreecheck('r3')=='ok'
1587e2b38c5Sdan} 0
1591917e92fSdan
1601917e92fSdanfinish_test
161