Annotation of embedaddon/sqlite3/ext/rtree/rtree4.test, revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>