1
0

rtree4.test 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. # 2008 May 23
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. #
  12. # Randomized test cases for the rtree extension.
  13. #
  14. if {![info exists testdir]} {
  15. set testdir [file join [file dirname [info script]] .. .. test]
  16. }
  17. source $testdir/tester.tcl
  18. ifcapable !rtree {
  19. finish_test
  20. return
  21. }
  22. set ::NROW 2500
  23. if {[info exists G(isquick)] && $G(isquick)} {
  24. set ::NROW 250
  25. }
  26. ifcapable !rtree_int_only {
  27. # Return a floating point number between -X and X.
  28. #
  29. proc rand {X} {
  30. return [expr {int((rand()-0.5)*1024.0*$X)/512.0}]
  31. }
  32. # Return a positive floating point number less than or equal to X
  33. #
  34. proc randincr {X} {
  35. while 1 {
  36. set r [expr {int(rand()*$X*32.0)/32.0}]
  37. if {$r>0.0} {return $r}
  38. }
  39. }
  40. } else {
  41. # For rtree_int_only, return an number between -X and X.
  42. #
  43. proc rand {X} {
  44. return [expr {int((rand()-0.5)*2*$X)}]
  45. }
  46. # Return a positive integer less than or equal to X
  47. #
  48. proc randincr {X} {
  49. while 1 {
  50. set r [expr {int(rand()*$X)+1}]
  51. if {$r>0} {return $r}
  52. }
  53. }
  54. }
  55. # Scramble the $inlist into a random order.
  56. #
  57. proc scramble {inlist} {
  58. set y {}
  59. foreach x $inlist {
  60. lappend y [list [expr {rand()}] $x]
  61. }
  62. set y [lsort $y]
  63. set outlist {}
  64. foreach x $y {
  65. lappend outlist [lindex $x 1]
  66. }
  67. return $outlist
  68. }
  69. # Always use the same random seed so that the sequence of tests
  70. # is repeatable.
  71. #
  72. expr {srand(1234)}
  73. # Run these tests for all number of dimensions between 1 and 5.
  74. #
  75. for {set nDim 1} {$nDim<=5} {incr nDim} {
  76. # Construct an rtree virtual table and an ordinary btree table
  77. # to mirror it. The ordinary table should be much slower (since
  78. # it has to do a full table scan) but should give the exact same
  79. # answers.
  80. #
  81. do_test rtree4-$nDim.1 {
  82. set clist {}
  83. set cklist {}
  84. for {set i 0} {$i<$nDim} {incr i} {
  85. lappend clist mn$i mx$i
  86. lappend cklist "mn$i<mx$i"
  87. }
  88. db eval "DROP TABLE IF EXISTS rx"
  89. db eval "DROP TABLE IF EXISTS bx"
  90. db eval "CREATE VIRTUAL TABLE rx USING rtree(id, [join $clist ,])"
  91. db eval "CREATE TABLE bx(id INTEGER PRIMARY KEY,\
  92. [join $clist ,], CHECK( [join $cklist { AND }] ))"
  93. } {}
  94. # Do many insertions of small objects. Do both overlapping and
  95. # contained-within queries after each insert to verify that all
  96. # is well.
  97. #
  98. unset -nocomplain where
  99. for {set i 1} {$i<$::NROW} {incr i} {
  100. # Do a random insert
  101. #
  102. do_test rtree4-$nDim.2.$i.1 {
  103. set vlist {}
  104. for {set j 0} {$j<$nDim} {incr j} {
  105. set mn [rand 10000]
  106. set mx [expr {$mn+[randincr 50]}]
  107. lappend vlist $mn $mx
  108. }
  109. db eval "INSERT INTO rx VALUES(NULL, [join $vlist ,])"
  110. db eval "INSERT INTO bx VALUES(NULL, [join $vlist ,])"
  111. } {}
  112. # Do a contained-in query on all dimensions
  113. #
  114. set where {}
  115. for {set j 0} {$j<$nDim} {incr j} {
  116. set mn [rand 10000]
  117. set mx [expr {$mn+[randincr 500]}]
  118. lappend where mn$j>=$mn mx$j<=$mx
  119. }
  120. set where "WHERE [join $where { AND }]"
  121. do_test rtree4-$nDim.2.$i.2 {
  122. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  123. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  124. # Do an overlaps query on all dimensions
  125. #
  126. set where {}
  127. for {set j 0} {$j<$nDim} {incr j} {
  128. set mn [rand 10000]
  129. set mx [expr {$mn+[randincr 500]}]
  130. lappend where mx$j>=$mn mn$j<=$mx
  131. }
  132. set where "WHERE [join $where { AND }]"
  133. do_test rtree4-$nDim.2.$i.3 {
  134. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  135. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  136. # Do a contained-in query with surplus contraints at the beginning.
  137. # This should force a full-table scan on the rtree.
  138. #
  139. set where {}
  140. for {set j 0} {$j<$nDim} {incr j} {
  141. lappend where mn$j>-10000 mx$j<10000
  142. }
  143. for {set j 0} {$j<$nDim} {incr j} {
  144. set mn [rand 10000]
  145. set mx [expr {$mn+[randincr 500]}]
  146. lappend where mn$j>=$mn mx$j<=$mx
  147. }
  148. set where "WHERE [join $where { AND }]"
  149. do_test rtree4-$nDim.2.$i.3 {
  150. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  151. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  152. # Do an overlaps query with surplus contraints at the beginning.
  153. # This should force a full-table scan on the rtree.
  154. #
  155. set where {}
  156. for {set j 0} {$j<$nDim} {incr j} {
  157. lappend where mn$j>=-10000 mx$j<=10000
  158. }
  159. for {set j 0} {$j<$nDim} {incr j} {
  160. set mn [rand 10000]
  161. set mx [expr {$mn+[randincr 500]}]
  162. lappend where mx$j>$mn mn$j<$mx
  163. }
  164. set where "WHERE [join $where { AND }]"
  165. do_test rtree4-$nDim.2.$i.4 {
  166. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  167. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  168. # Do a contained-in query with surplus contraints at the end
  169. #
  170. set where {}
  171. for {set j 0} {$j<$nDim} {incr j} {
  172. set mn [rand 10000]
  173. set mx [expr {$mn+[randincr 500]}]
  174. lappend where mn$j>=$mn mx$j<$mx
  175. }
  176. for {set j [expr {$nDim-1}]} {$j>=0} {incr j -1} {
  177. lappend where mn$j>=-10000 mx$j<10000
  178. }
  179. set where "WHERE [join $where { AND }]"
  180. do_test rtree4-$nDim.2.$i.5 {
  181. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  182. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  183. # Do an overlaps query with surplus contraints at the end
  184. #
  185. set where {}
  186. for {set j [expr {$nDim-1}]} {$j>=0} {incr j -1} {
  187. set mn [rand 10000]
  188. set mx [expr {$mn+[randincr 500]}]
  189. lappend where mx$j>$mn mn$j<=$mx
  190. }
  191. for {set j 0} {$j<$nDim} {incr j} {
  192. lappend where mx$j>-10000 mn$j<=10000
  193. }
  194. set where "WHERE [join $where { AND }]"
  195. do_test rtree4-$nDim.2.$i.6 {
  196. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  197. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  198. # Do a contained-in query with surplus contraints where the
  199. # constraints appear in a random order.
  200. #
  201. set where {}
  202. for {set j 0} {$j<$nDim} {incr j} {
  203. set mn1 [rand 10000]
  204. set mn2 [expr {$mn1+[randincr 100]}]
  205. set mx1 [expr {$mn2+[randincr 400]}]
  206. set mx2 [expr {$mx1+[randincr 100]}]
  207. lappend where mn$j>=$mn1 mn$j>$mn2 mx$j<$mx1 mx$j<=$mx2
  208. }
  209. set where "WHERE [join [scramble $where] { AND }]"
  210. do_test rtree4-$nDim.2.$i.7 {
  211. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  212. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  213. # Do an overlaps query with surplus contraints where the
  214. # constraints appear in a random order.
  215. #
  216. set where {}
  217. for {set j 0} {$j<$nDim} {incr j} {
  218. set mn1 [rand 10000]
  219. set mn2 [expr {$mn1+[randincr 100]}]
  220. set mx1 [expr {$mn2+[randincr 400]}]
  221. set mx2 [expr {$mx1+[randincr 100]}]
  222. lappend where mx$j>=$mn1 mx$j>$mn2 mn$j<$mx1 mn$j<=$mx2
  223. }
  224. set where "WHERE [join [scramble $where] { AND }]"
  225. do_test rtree4-$nDim.2.$i.8 {
  226. list $where [db eval "SELECT id FROM rx $where ORDER BY id"]
  227. } [list $where [db eval "SELECT id FROM bx $where ORDER BY id"]]
  228. }
  229. }
  230. finish_test