/ Hex Artifact Content
Login

Artifact 2c6c7742957a9970a625762fee625444412b0a89:


0000: 23 20 32 30 31 30 20 53 65 70 74 65 6d 62 65 72  # 2010 September
0010: 20 32 32 0a 23 0a 23 20 54 68 65 20 61 75 74 68   22.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place of.# a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .#**************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73  *********.# This
0170: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0180: 65 73 74 73 20 66 6f 72 20 74 68 65 20 72 2d 74  ests for the r-t
0190: 72 65 65 20 6d 6f 64 75 6c 65 2e 20 53 70 65 63  ree module. Spec
01a0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 74 65 73  ifically, it tes
01b0: 74 73 0a 23 20 74 68 61 74 20 63 6f 72 72 75 70  ts.# that corrup
01c0: 74 20 6f 72 20 69 6e 63 6f 6e 73 69 73 74 65 6e  t or inconsisten
01d0: 74 20 64 61 74 61 62 61 73 65 73 20 64 6f 20 6e  t databases do n
01e0: 6f 74 20 63 61 75 73 65 20 63 72 61 73 68 65 73  ot cause crashes
01f0: 20 69 6e 20 74 68 65 20 72 2d 74 72 65 65 0a 23   in the r-tree.#
0200: 20 6d 6f 64 75 6c 65 2e 0a 23 20 0a 0a 69 66 20   module..# ..if 
0210: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74  {![info exists t
0220: 65 73 74 64 69 72 5d 7d 20 7b 0a 20 20 73 65 74  estdir]} {.  set
0230: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 6a   testdir [file j
0240: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
0250: 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d  e [info script]]
0260: 20 2e 2e 20 2e 2e 20 74 65 73 74 5d 0a 7d 20 0a   .. .. test].} .
0270: 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f  source $testdir/
0280: 74 65 73 74 65 72 2e 74 63 6c 0a 69 66 63 61 70  tester.tcl.ifcap
0290: 61 62 6c 65 20 21 72 74 72 65 65 20 7b 20 66 69  able !rtree { fi
02a0: 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74 75  nish_test ; retu
02b0: 72 6e 20 7d 0a 0a 70 72 6f 63 20 63 72 65 61 74  rn }..proc creat
02c0: 65 5f 74 31 20 7b 7d 20 7b 0a 20 20 64 62 20 63  e_t1 {} {.  db c
02d0: 6c 6f 73 65 0a 20 20 66 6f 72 63 65 64 65 6c 65  lose.  forcedele
02e0: 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  te test.db.  sql
02f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0300: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0310: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0320: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74  ABLE t1 USING rt
0330: 72 65 65 28 69 64 2c 20 78 31 2c 20 78 32 2c 20  ree(id, x1, x2, 
0340: 79 31 2c 20 79 32 29 3b 0a 20 20 7d 0a 7d 0a 70  y1, y2);.  }.}.p
0350: 72 6f 63 20 70 6f 70 75 6c 61 74 65 5f 74 31 20  roc populate_t1 
0360: 7b 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 42  {} {.  execsql B
0370: 45 47 49 4e 0a 20 20 66 6f 72 20 7b 73 65 74 20  EGIN.  for {set 
0380: 69 20 30 7d 20 7b 24 69 20 3c 20 35 30 30 7d 20  i 0} {$i < 500} 
0390: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 73  {incr i} {.    s
03a0: 65 74 20 78 32 20 5b 65 78 70 72 20 24 69 2b 35  et x2 [expr $i+5
03b0: 5d 0a 20 20 20 20 73 65 74 20 79 32 20 5b 65 78  ].    set y2 [ex
03c0: 70 72 20 24 69 2b 35 5d 0a 20 20 20 20 65 78 65  pr $i+5].    exe
03d0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
03e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 69 2c  TO t1 VALUES($i,
03f0: 20 24 69 2c 20 24 78 32 2c 20 24 69 2c 20 24 79   $i, $x2, $i, $y
0400: 32 29 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  2) }.  }.  execs
0410: 71 6c 20 43 4f 4d 4d 49 54 0a 7d 0a 0a 70 72 6f  ql COMMIT.}..pro
0420: 63 20 74 72 75 6e 63 61 74 65 5f 6e 6f 64 65 20  c truncate_node 
0430: 7b 6e 6f 64 65 6e 6f 20 6e 54 72 75 6e 63 7d 20  {nodeno nTrunc} 
0440: 7b 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 64 62  {.  set blob [db
0450: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 64 61 74   one {SELECT dat
0460: 61 20 46 52 4f 4d 20 74 31 5f 6e 6f 64 65 20 57  a FROM t1_node W
0470: 48 45 52 45 20 6e 6f 64 65 6e 6f 3d 24 6e 6f 64  HERE nodeno=$nod
0480: 65 6e 6f 7d 5d 0a 20 20 69 66 20 7b 24 6e 54 72  eno}].  if {$nTr
0490: 75 6e 63 3c 30 7d 20 7b 73 65 74 20 6e 54 72 75  unc<0} {set nTru
04a0: 6e 63 20 22 65 6e 64 2d 24 6e 54 72 75 6e 63 22  nc "end-$nTrunc"
04b0: 7d 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 73 74  }.  set blob [st
04c0: 72 69 6e 67 20 72 61 6e 67 65 20 24 62 6c 6f 62  ring range $blob
04d0: 20 30 20 24 6e 54 72 75 6e 63 5d 0a 20 20 64 62   0 $nTrunc].  db
04e0: 20 65 76 61 6c 20 7b 20 55 50 44 41 54 45 20 74   eval { UPDATE t
04f0: 31 5f 6e 6f 64 65 20 53 45 54 20 64 61 74 61 20  1_node SET data 
0500: 3d 20 24 62 6c 6f 62 20 57 48 45 52 45 20 6e 6f  = $blob WHERE no
0510: 64 65 6e 6f 3d 24 6e 6f 64 65 6e 6f 20 7d 0a 7d  deno=$nodeno }.}
0520: 0a 0a 70 72 6f 63 20 73 65 74 5f 74 72 65 65 5f  ..proc set_tree_
0530: 64 65 70 74 68 20 7b 74 62 6c 20 7b 6e 65 77 76  depth {tbl {newv
0540: 61 6c 75 65 20 22 22 7d 7d 20 7b 0a 20 20 73 65  alue ""}} {.  se
0550: 74 20 62 6c 6f 62 20 5b 64 62 20 6f 6e 65 20 22  t blob [db one "
0560: 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
0570: 20 24 7b 74 62 6c 7d 5f 6e 6f 64 65 20 57 48 45   ${tbl}_node WHE
0580: 52 45 20 6e 6f 64 65 6e 6f 3d 31 22 5d 0a 0a 20  RE nodeno=1"].. 
0590: 20 69 66 20 7b 24 6e 65 77 76 61 6c 75 65 20 3d   if {$newvalue =
05a0: 3d 20 22 22 7d 20 7b 0a 20 20 20 20 62 69 6e 61  = ""} {.    bina
05b0: 72 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 53 75  ry scan $blob Su
05c0: 20 6f 6c 64 76 61 6c 75 65 0a 20 20 20 20 72 65   oldvalue.    re
05d0: 74 75 72 6e 20 24 6f 6c 64 76 61 6c 75 65 0a 20  turn $oldvalue. 
05e0: 20 7d 0a 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b   }..  set blob [
05f0: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 53 75  binary format Su
0600: 61 2a 20 24 6e 65 77 76 61 6c 75 65 20 5b 73 74  a* $newvalue [st
0610: 72 69 6e 67 20 72 61 6e 67 65 20 24 62 6c 6f 62  ring range $blob
0620: 20 32 20 65 6e 64 5d 5d 0a 20 20 64 62 20 65 76   2 end]].  db ev
0630: 61 6c 20 22 55 50 44 41 54 45 20 24 7b 74 62 6c  al "UPDATE ${tbl
0640: 7d 5f 6e 6f 64 65 20 53 45 54 20 64 61 74 61 20  }_node SET data 
0650: 3d 20 5c 24 62 6c 6f 62 20 57 48 45 52 45 20 6e  = \$blob WHERE n
0660: 6f 64 65 6e 6f 3d 31 22 0a 20 20 72 65 74 75 72  odeno=1".  retur
0670: 6e 20 5b 73 65 74 5f 74 72 65 65 5f 64 65 70 74  n [set_tree_dept
0680: 68 20 24 74 62 6c 5d 0a 7d 0a 0a 70 72 6f 63 20  h $tbl].}..proc 
0690: 73 65 74 5f 65 6e 74 72 79 5f 63 6f 75 6e 74 20  set_entry_count 
06a0: 7b 74 62 6c 20 6e 6f 64 65 6e 6f 20 7b 6e 65 77  {tbl nodeno {new
06b0: 76 61 6c 75 65 20 22 22 7d 7d 20 7b 0a 20 20 73  value ""}} {.  s
06c0: 65 74 20 62 6c 6f 62 20 5b 64 62 20 6f 6e 65 20  et blob [db one 
06d0: 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f  "SELECT data FRO
06e0: 4d 20 24 7b 74 62 6c 7d 5f 6e 6f 64 65 20 57 48  M ${tbl}_node WH
06f0: 45 52 45 20 6e 6f 64 65 6e 6f 3d 24 6e 6f 64 65  ERE nodeno=$node
0700: 6e 6f 22 5d 0a 0a 20 20 69 66 20 7b 24 6e 65 77  no"]..  if {$new
0710: 76 61 6c 75 65 20 3d 3d 20 22 22 7d 20 7b 0a 20  value == ""} {. 
0720: 20 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 5b     binary scan [
0730: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 62 6c  string range $bl
0740: 6f 62 20 32 20 65 6e 64 5d 20 53 75 20 6f 6c 64  ob 2 end] Su old
0750: 76 61 6c 75 65 0a 20 20 20 20 72 65 74 75 72 6e  value.    return
0760: 20 24 6f 6c 64 76 61 6c 75 65 0a 20 20 7d 0a 0a   $oldvalue.  }..
0770: 20 20 73 65 74 20 62 6c 6f 62 20 5b 62 69 6e 61    set blob [bina
0780: 72 79 20 66 6f 72 6d 61 74 20 61 2a 53 75 61 2a  ry format a*Sua*
0790: 20 5c 0a 20 20 20 20 5b 73 74 72 69 6e 67 20 72   \.    [string r
07a0: 61 6e 67 65 20 24 62 6c 6f 62 20 30 20 31 5d 20  ange $blob 0 1] 
07b0: 24 6e 65 77 76 61 6c 75 65 20 5b 73 74 72 69 6e  $newvalue [strin
07c0: 67 20 72 61 6e 67 65 20 24 62 6c 6f 62 20 34 20  g range $blob 4 
07d0: 65 6e 64 5d 0a 20 20 5d 0a 20 20 64 62 20 65 76  end].  ].  db ev
07e0: 61 6c 20 22 55 50 44 41 54 45 20 24 7b 74 62 6c  al "UPDATE ${tbl
07f0: 7d 5f 6e 6f 64 65 20 53 45 54 20 64 61 74 61 20  }_node SET data 
0800: 3d 20 5c 24 62 6c 6f 62 20 57 48 45 52 45 20 6e  = \$blob WHERE n
0810: 6f 64 65 6e 6f 3d 24 6e 6f 64 65 6e 6f 22 0a 20  odeno=$nodeno". 
0820: 20 72 65 74 75 72 6e 20 5b 73 65 74 5f 65 6e 74   return [set_ent
0830: 72 79 5f 63 6f 75 6e 74 20 24 74 62 6c 20 24 6e  ry_count $tbl $n
0840: 6f 64 65 6e 6f 5d 0a 7d 0a 0a 0a 0a 70 72 6f 63  odeno].}....proc
0850: 20 64 6f 5f 63 6f 72 72 75 70 74 69 6f 6e 5f 74   do_corruption_t
0860: 65 73 74 73 20 7b 70 72 65 66 69 78 20 61 72 67  ests {prefix arg
0870: 73 7d 20 7b 0a 20 20 73 65 74 20 74 65 73 74 61  s} {.  set testa
0880: 72 72 61 79 20 5b 6c 69 6e 64 65 78 20 24 61 72  rray [lindex $ar
0890: 67 73 20 65 6e 64 5d 0a 20 20 73 65 74 20 65 72  gs end].  set er
08a0: 72 6f 72 6d 73 67 20 7b 64 61 74 61 62 61 73 65  rormsg {database
08b0: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
08c0: 61 6c 66 6f 72 6d 65 64 7d 0a 0a 20 20 66 6f 72  alformed}..  for
08d0: 65 61 63 68 20 7b 7a 20 76 61 6c 75 65 7d 20 5b  each {z value} [
08e0: 6c 72 61 6e 67 65 20 24 61 72 67 73 20 30 20 65  lrange $args 0 e
08f0: 6e 64 2d 31 5d 20 7b 0a 20 20 20 20 73 65 74 20  nd-1] {.    set 
0900: 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  n [string length
0910: 20 24 7a 5d 0a 20 20 20 20 69 66 20 7b 24 6e 3e   $z].    if {$n>
0920: 3d 32 20 26 26 20 5b 73 74 72 69 6e 67 20 65 71  =2 && [string eq
0930: 75 61 6c 20 2d 6c 65 6e 67 74 68 20 24 6e 20 24  ual -length $n $
0940: 7a 20 22 2d 65 72 72 6f 72 22 5d 7d 20 7b 0a 20  z "-error"]} {. 
0950: 20 20 20 20 20 73 65 74 20 65 72 72 6f 72 6d 73       set errorms
0960: 67 20 24 76 61 6c 75 65 0a 20 20 20 20 7d 0a 20  g $value.    }. 
0970: 20 7d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 74   }..  foreach {t
0980: 6e 20 73 71 6c 7d 20 24 74 65 73 74 61 72 72 61  n sql} $testarra
0990: 79 20 7b 0a 20 20 20 20 64 6f 5f 63 61 74 63 68  y {.    do_catch
09a0: 73 71 6c 5f 74 65 73 74 20 24 70 72 65 66 69 78  sql_test $prefix
09b0: 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20  .$tn $sql [list 
09c0: 31 20 24 65 72 72 6f 72 6d 73 67 5d 0a 20 20 7d  1 $errormsg].  }
09d0: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0a20: 20 54 65 73 74 20 74 68 65 20 6c 69 62 72 61 72   Test the librar
0a30: 69 65 73 20 72 65 73 70 6f 6e 73 65 20 69 66 20  ies response if 
0a40: 74 68 65 20 25 5f 6e 6f 64 65 20 74 61 62 6c 65  the %_node table
0a50: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
0a60: 6d 70 74 79 0a 23 20 28 69 2e 65 2e 20 74 68 65  mpty.# (i.e. the
0a70: 20 72 6f 6f 74 20 6e 6f 64 65 20 69 73 20 6d 69   root node is mi
0a80: 73 73 69 6e 67 29 2c 20 6f 72 20 68 61 73 20 62  ssing), or has b
0a90: 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  een removed from
0aa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 23 20   the database.# 
0ab0: 65 6e 74 69 72 65 6c 79 2e 0a 23 0a 63 72 65 61  entirely..#.crea
0ac0: 74 65 5f 74 31 0a 70 6f 70 75 6c 61 74 65 5f 74  te_t1.populate_t
0ad0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
0ae0: 74 20 72 74 72 65 65 41 2d 31 2e 30 20 7b 0a 20  t rtreeA-1.0 {. 
0af0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 5f   DELETE FROM t1_
0b00: 6e 6f 64 65 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 63  node;.} {}..do_c
0b10: 6f 72 72 75 70 74 69 6f 6e 5f 74 65 73 74 73 20  orruption_tests 
0b20: 72 74 72 65 65 41 2d 31 2e 31 20 7b 0a 20 20 31  rtreeA-1.1 {.  1
0b30: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
0b40: 4d 20 74 31 22 0a 20 20 32 20 20 20 22 53 45 4c  M t1".  2   "SEL
0b50: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0b60: 45 52 45 20 72 6f 77 69 64 3d 35 22 0a 20 20 33  ERE rowid=5".  3
0b70: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
0b80: 74 31 20 56 41 4c 55 45 53 28 31 30 30 30 2c 20  t1 VALUES(1000, 
0b90: 31 2c 20 32 2c 20 33 2c 20 34 29 22 0a 20 20 34  1, 2, 3, 4)".  4
0ba0: 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f     "SELECT * FRO
0bb0: 4d 20 74 31 20 57 48 45 52 45 20 78 31 3c 31 30  M t1 WHERE x1<10
0bc0: 20 41 4e 44 20 78 32 3e 31 32 22 0a 7d 0a 0a 64   AND x2>12".}..d
0bd0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 20  o_execsql_test  
0be0: 72 74 72 65 65 41 2d 31 2e 32 2e 30 20 7b 20 44  rtreeA-1.2.0 { D
0bf0: 52 4f 50 20 54 41 42 4c 45 20 74 31 5f 6e 6f 64  ROP TABLE t1_nod
0c00: 65 20 7d 20 7b 7d 0a 64 6f 5f 63 6f 72 72 75 70  e } {}.do_corrup
0c10: 74 69 6f 6e 5f 74 65 73 74 73 20 72 74 72 65 65  tion_tests rtree
0c20: 41 2d 31 2e 32 20 2d 65 72 72 6f 72 20 22 53 51  A-1.2 -error "SQ
0c30: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
0c40: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
0c50: 65 22 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45  e" {.  1   "SELE
0c60: 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 0a 20 20  CT * FROM t1".  
0c70: 32 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  2   "SELECT * FR
0c80: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
0c90: 64 3d 35 22 0a 20 20 33 20 20 20 22 49 4e 53 45  d=5".  3   "INSE
0ca0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0cb0: 53 28 31 30 30 30 2c 20 31 2c 20 32 2c 20 33 2c  S(1000, 1, 2, 3,
0cc0: 20 34 29 22 0a 20 20 34 20 20 20 22 53 45 4c 45   4)".  4   "SELE
0cd0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0ce0: 52 45 20 78 31 3c 31 30 20 41 4e 44 20 78 32 3e  RE x1<10 AND x2>
0cf0: 31 32 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  12".}..#--------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 0a 23 20 54 65 73 74 20 74 68 65 20 6c 69 62  -.# Test the lib
0d50: 72 61 72 69 65 73 20 72 65 73 70 6f 6e 73 65 20  raries response 
0d60: 69 66 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 65  if some of the e
0d70: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f  ntries in the %_
0d80: 6e 6f 64 65 20 74 61 62 6c 65 20 0a 23 20 61 72  node table .# ar
0d90: 65 20 74 68 65 20 77 72 6f 6e 67 20 73 69 7a 65  e the wrong size
0da0: 2e 0a 23 0a 63 72 65 61 74 65 5f 74 31 0a 70 6f  ..#.create_t1.po
0db0: 70 75 6c 61 74 65 5f 74 31 0a 64 6f 5f 74 65 73  pulate_t1.do_tes
0dc0: 74 20 72 74 72 65 65 41 2d 32 2e 31 2e 30 20 7b  t rtreeA-2.1.0 {
0dd0: 0a 20 20 73 65 74 20 6e 6f 64 65 73 20 5b 64 62  .  set nodes [db
0de0: 20 65 76 61 6c 20 7b 73 65 6c 65 63 74 20 6e 6f   eval {select no
0df0: 64 65 6e 6f 20 46 52 4f 4d 20 74 31 5f 6e 6f 64  deno FROM t1_nod
0e00: 65 7d 5d 0a 20 20 66 6f 72 65 61 63 68 20 7b 61  e}].  foreach {a
0e10: 20 62 20 63 7d 20 24 6e 6f 64 65 73 20 7b 20 74   b c} $nodes { t
0e20: 72 75 6e 63 61 74 65 5f 6e 6f 64 65 20 24 63 20  runcate_node $c 
0e30: 32 30 30 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 63 6f  200 }.} {}.do_co
0e40: 72 72 75 70 74 69 6f 6e 5f 74 65 73 74 73 20 72  rruption_tests r
0e50: 74 72 65 65 41 2d 32 2e 31 20 7b 0a 20 20 31 20  treeA-2.1 {.  1 
0e60: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
0e70: 20 74 31 22 0a 20 20 32 20 20 20 22 53 45 4c 45   t1".  2   "SELE
0e80: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0e90: 52 45 20 72 6f 77 69 64 3d 35 22 0a 20 20 33 20  RE rowid=5".  3 
0ea0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
0eb0: 31 20 56 41 4c 55 45 53 28 31 30 30 30 2c 20 31  1 VALUES(1000, 1
0ec0: 2c 20 32 2c 20 33 2c 20 34 29 22 0a 20 20 34 20  , 2, 3, 4)".  4 
0ed0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
0ee0: 20 74 31 20 57 48 45 52 45 20 78 31 3c 31 30 20   t1 WHERE x1<10 
0ef0: 41 4e 44 20 78 32 3e 31 32 22 0a 7d 0a 0a 63 72  AND x2>12".}..cr
0f00: 65 61 74 65 5f 74 31 0a 70 6f 70 75 6c 61 74 65  eate_t1.populate
0f10: 5f 74 31 0a 64 6f 5f 74 65 73 74 20 72 74 72 65  _t1.do_test rtre
0f20: 65 41 2d 32 2e 32 2e 30 20 7b 20 74 72 75 6e 63  eA-2.2.0 { trunc
0f30: 61 74 65 5f 6e 6f 64 65 20 31 20 32 30 30 20 7d  ate_node 1 200 }
0f40: 20 7b 7d 0a 64 6f 5f 63 6f 72 72 75 70 74 69 6f   {}.do_corruptio
0f50: 6e 5f 74 65 73 74 73 20 72 74 72 65 65 41 2d 32  n_tests rtreeA-2
0f60: 2e 32 20 7b 0a 20 20 31 20 20 20 22 53 45 4c 45  .2 {.  1   "SELE
0f70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 0a 20 20  CT * FROM t1".  
0f80: 32 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  2   "SELECT * FR
0f90: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
0fa0: 64 3d 35 22 0a 20 20 33 20 20 20 22 49 4e 53 45  d=5".  3   "INSE
0fb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0fc0: 53 28 31 30 30 30 2c 20 31 2c 20 32 2c 20 33 2c  S(1000, 1, 2, 3,
0fd0: 20 34 29 22 0a 20 20 34 20 20 20 22 53 45 4c 45   4)".  4   "SELE
0fe0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0ff0: 52 45 20 78 31 3c 31 30 20 41 4e 44 20 78 32 3e  RE x1<10 AND x2>
1000: 31 32 22 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  12".}..#--------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 0a 23 20 53 65 74 20 74 68 65 20 22 64 65 70  -.# Set the "dep
1060: 74 68 22 20 6f 66 20 74 68 65 20 74 72 65 65 20  th" of the tree 
1070: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 72 6f  stored on the ro
1080: 6f 74 20 6e 6f 64 65 20 69 6e 63 6f 72 72 65 63  ot node incorrec
1090: 74 6c 79 2e 20 54 65 73 74 0a 23 20 74 68 61 74  tly. Test.# that
10a0: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63   this does not c
10b0: 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
10c0: 73 2e 0a 23 0a 63 72 65 61 74 65 5f 74 31 0a 70  s..#.create_t1.p
10d0: 6f 70 75 6c 61 74 65 5f 74 31 0a 64 6f 5f 74 65  opulate_t1.do_te
10e0: 73 74 20 72 74 72 65 65 41 2d 33 2e 31 2e 30 2e  st rtreeA-3.1.0.
10f0: 31 20 7b 20 73 65 74 5f 74 72 65 65 5f 64 65 70  1 { set_tree_dep
1100: 74 68 20 74 31 20 7d 20 7b 31 7d 0a 64 6f 5f 74  th t1 } {1}.do_t
1110: 65 73 74 20 72 74 72 65 65 41 2d 33 2e 31 2e 30  est rtreeA-3.1.0
1120: 2e 32 20 7b 20 73 65 74 5f 74 72 65 65 5f 64 65  .2 { set_tree_de
1130: 70 74 68 20 74 31 20 33 20 7d 20 7b 33 7d 0a 64  pth t1 3 } {3}.d
1140: 6f 5f 63 6f 72 72 75 70 74 69 6f 6e 5f 74 65 73  o_corruption_tes
1150: 74 73 20 72 74 72 65 65 41 2d 33 2e 31 20 7b 0a  ts rtreeA-3.1 {.
1160: 20 20 31 20 20 20 22 53 45 4c 45 43 54 20 2a 20    1   "SELECT * 
1170: 46 52 4f 4d 20 74 31 22 0a 20 20 32 20 20 20 22  FROM t1".  2   "
1180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1190: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 35 22 0a   WHERE rowid=5".
11a0: 20 20 33 20 20 20 22 49 4e 53 45 52 54 20 49 4e    3   "INSERT IN
11b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 30 30  TO t1 VALUES(100
11c0: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 29 22 0a  0, 1, 2, 3, 4)".
11d0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 72 74 72 65 65  }..do_test rtree
11e0: 41 2d 33 2e 32 2e 30 20 7b 20 73 65 74 5f 74 72  A-3.2.0 { set_tr
11f0: 65 65 5f 64 65 70 74 68 20 74 31 20 31 30 30 30  ee_depth t1 1000
1200: 20 7d 20 7b 31 30 30 30 7d 0a 64 6f 5f 63 6f 72   } {1000}.do_cor
1210: 72 75 70 74 69 6f 6e 5f 74 65 73 74 73 20 72 74  ruption_tests rt
1220: 72 65 65 41 2d 33 2e 32 20 7b 0a 20 20 31 20 20  reeA-3.2 {.  1  
1230: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
1240: 74 31 22 0a 20 20 32 20 20 20 22 53 45 4c 45 43  t1".  2   "SELEC
1250: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1260: 45 20 72 6f 77 69 64 3d 35 22 0a 20 20 33 20 20  E rowid=5".  3  
1270: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31   "INSERT INTO t1
1280: 20 56 41 4c 55 45 53 28 31 30 30 30 2c 20 31 2c   VALUES(1000, 1,
1290: 20 32 2c 20 33 2c 20 34 29 22 0a 7d 0a 0a 63 72   2, 3, 4)".}..cr
12a0: 65 61 74 65 5f 74 31 0a 70 6f 70 75 6c 61 74 65  eate_t1.populate
12b0: 5f 74 31 0a 64 6f 5f 74 65 73 74 20 72 74 72 65  _t1.do_test rtre
12c0: 65 41 2d 33 2e 33 2e 30 20 7b 20 0a 20 20 65 78  eA-3.3.0 { .  ex
12d0: 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
12e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77  ROM t1 WHERE row
12f0: 69 64 20 3d 20 30 20 7d 0a 20 20 73 65 74 5f 74  id = 0 }.  set_t
1300: 72 65 65 5f 64 65 70 74 68 20 74 31 20 36 35 35  ree_depth t1 655
1310: 33 35 0a 7d 20 7b 36 35 35 33 35 7d 0a 64 6f 5f  35.} {65535}.do_
1320: 63 6f 72 72 75 70 74 69 6f 6e 5f 74 65 73 74 73  corruption_tests
1330: 20 72 74 72 65 65 41 2d 33 2e 33 20 7b 0a 20 20   rtreeA-3.3 {.  
1340: 31 20 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52  1   "SELECT * FR
1350: 4f 4d 20 74 31 22 0a 20 20 32 20 20 20 22 53 45  OM t1".  2   "SE
1360: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1370: 48 45 52 45 20 72 6f 77 69 64 3d 35 22 0a 20 20  HERE rowid=5".  
1380: 33 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  3   "INSERT INTO
1390: 20 74 31 20 56 41 4c 55 45 53 28 31 30 30 30 2c   t1 VALUES(1000,
13a0: 20 31 2c 20 32 2c 20 33 2c 20 34 29 22 0a 7d 0a   1, 2, 3, 4)".}.
13b0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 53 65  -----------.# Se
1400: 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  t the "number of
1410: 20 65 6e 74 72 69 65 73 22 20 66 69 65 6c 64 20   entries" field 
1420: 6f 6e 20 73 6f 6d 65 20 6e 6f 64 65 73 20 69 6e  on some nodes in
1430: 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 63 72 65  correctly..#.cre
1440: 61 74 65 5f 74 31 0a 70 6f 70 75 6c 61 74 65 5f  ate_t1.populate_
1450: 74 31 0a 64 6f 5f 74 65 73 74 20 72 74 72 65 65  t1.do_test rtree
1460: 41 2d 34 2e 31 2e 30 20 7b 20 0a 20 20 73 65 74  A-4.1.0 { .  set
1470: 5f 65 6e 74 72 79 5f 63 6f 75 6e 74 20 74 31 20  _entry_count t1 
1480: 31 20 34 30 30 30 0a 7d 20 7b 34 30 30 30 7d 0a  1 4000.} {4000}.
1490: 62 72 65 61 6b 70 6f 69 6e 74 0a 64 6f 5f 63 6f  breakpoint.do_co
14a0: 72 72 75 70 74 69 6f 6e 5f 74 65 73 74 73 20 72  rruption_tests r
14b0: 74 72 65 65 41 2d 34 2e 31 20 7b 0a 20 20 31 20  treeA-4.1 {.  1 
14c0: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
14d0: 20 74 31 22 0a 20 20 32 20 20 20 22 53 45 4c 45   t1".  2   "SELE
14e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
14f0: 52 45 20 72 6f 77 69 64 3d 35 22 0a 20 20 33 20  RE rowid=5".  3 
1500: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    "INSERT INTO t
1510: 31 20 56 41 4c 55 45 53 28 31 30 30 30 2c 20 31  1 VALUES(1000, 1
1520: 2c 20 32 2c 20 33 2c 20 34 29 22 0a 20 20 34 20  , 2, 3, 4)".  4 
1530: 20 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d    "SELECT * FROM
1540: 20 74 31 20 57 48 45 52 45 20 78 31 3c 31 30 20   t1 WHERE x1<10 
1550: 41 4e 44 20 78 32 3e 31 32 22 0a 7d 0a 0a 23 2d  AND x2>12".}..#-
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 6d 6f 76  --------.# Remov
15b0: 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
15c0: 68 65 20 25 5f 70 61 72 65 6e 74 20 74 61 62 6c  he %_parent tabl
15d0: 65 20 61 6e 64 20 63 68 65 63 6b 20 74 68 61 74  e and check that
15e0: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 0a 23   this does not.#
15f0: 20 63 61 75 73 65 20 61 20 63 72 61 73 68 2e 0a   cause a crash..
1600: 23 0a 63 72 65 61 74 65 5f 74 31 0a 70 6f 70 75  #.create_t1.popu
1610: 6c 61 74 65 5f 74 31 0a 64 6f 5f 65 78 65 63 73  late_t1.do_execs
1620: 71 6c 5f 74 65 73 74 20 72 74 72 65 65 41 2d 35  ql_test rtreeA-5
1630: 2e 31 2e 30 20 7b 20 44 45 4c 45 54 45 20 46 52  .1.0 { DELETE FR
1640: 4f 4d 20 74 31 5f 70 61 72 65 6e 74 20 7d 20 7b  OM t1_parent } {
1650: 7d 0a 64 6f 5f 63 6f 72 72 75 70 74 69 6f 6e 5f  }.do_corruption_
1660: 74 65 73 74 73 20 72 74 72 65 65 41 2d 35 2e 31  tests rtreeA-5.1
1670: 20 7b 0a 20 20 31 20 20 20 22 44 45 4c 45 54 45   {.  1   "DELETE
1680: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72   FROM t1 WHERE r
1690: 6f 77 69 64 20 3d 20 35 22 0a 20 20 32 20 20 20  owid = 5".  2   
16a0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 22  "DELETE FROM t1"
16b0: 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.