1# 2008 Feb 19 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# The focus of this file is testing the r-tree extension. 13# 14 15if {![info exists testdir]} { 16 set testdir [file join [file dirname [info script]] .. .. test] 17} 18source [file join [file dirname [info script]] rtree_util.tcl] 19source $testdir/tester.tcl 20 21ifcapable !rtree { 22 finish_test 23 return 24} 25 26set ::NROW 1000 27set ::NDEL 10 28set ::NSELECT 100 29 30if {[info exists G(isquick)] && $G(isquick)} { 31 set ::NROW 100 32 set ::NSELECT 10 33} 34 35foreach module {rtree_i32 rtree} { 36 for {set nDim 1} {$nDim <= 5} {incr nDim} { 37 38 do_test rtree2-$module.$nDim.1 { 39 set cols [list] 40 foreach c [list c0 c1 c2 c3 c4 c5 c6 c7 c8 c9] { 41 lappend cols "$c REAL" 42 } 43 set cols [join [lrange $cols 0 [expr {$nDim*2-1}]] ", "] 44 execsql " 45 CREATE VIRTUAL TABLE t1 USING ${module}(ii, $cols); 46 CREATE TABLE t2 (ii, $cols); 47 " 48 } {} 49 50 do_test rtree2-$module.$nDim.2 { 51 db transaction { 52 for {set ii 0} {$ii < $::NROW} {incr ii} { 53 #puts "Row $ii" 54 set values [list] 55 for {set jj 0} {$jj<$nDim*2} {incr jj} { 56 lappend values [expr int(rand()*1000)] 57 } 58 set values [join $values ,] 59 #puts [rtree_treedump db t1] 60 #puts "INSERT INTO t2 VALUES($ii, $values)" 61 set rc [catch {db eval "INSERT INTO t1 VALUES($ii, $values)"}] 62 if {$rc} { 63 incr ii -1 64 } else { 65 db eval "INSERT INTO t2 VALUES($ii, $values)" 66 } 67 #if {[rtree_check db t1]} { 68 #puts [rtree_treedump db t1] 69 #exit 70 #} 71 } 72 } 73 74 set t1 [execsql {SELECT * FROM t1 ORDER BY ii}] 75 set t2 [execsql {SELECT * FROM t2 ORDER BY ii}] 76 set rc [expr {$t1 eq $t2}] 77 if {$rc != 1} { 78 puts $t1 79 puts $t2 80 } 81 set rc 82 } {1} 83 84 do_rtree_integrity_test rtree2-$module.$nDim.3 t1 85 86 set OPS [list < > <= >= =] 87 for {set ii 0} {$ii < $::NSELECT} {incr ii} { 88 do_test rtree2-$module.$nDim.4.$ii.1 { 89 set where [list] 90 foreach look_three_dots! {. . .} { 91 set colidx [expr int(rand()*($nDim*2+1))-1] 92 if {$colidx<0} { 93 set col ii 94 } else { 95 set col "c$colidx" 96 } 97 set op [lindex $OPS [expr int(rand()*[llength $OPS])]] 98 set val [expr int(rand()*1000)] 99 lappend where "$col $op $val" 100 } 101 set where [join $where " AND "] 102 103 set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"] 104 set t2 [execsql "SELECT * FROM t2 WHERE $where ORDER BY ii"] 105 set rc [expr {$t1 eq $t2}] 106 if {$rc != 1} { 107 #puts $where 108 puts $t1 109 puts $t2 110 #puts [rtree_treedump db t1] 111 #breakpoint 112 #set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"] 113 #exit 114 } 115 set rc 116 } {1} 117 } 118 119 for {set ii 0} {$ii < $::NROW} {incr ii $::NDEL} { 120 #puts [rtree_treedump db t1] 121 do_test rtree2-$module.$nDim.5.$ii.1 { 122 execsql "DELETE FROM t2 WHERE ii <= $::ii" 123 execsql "DELETE FROM t1 WHERE ii <= $::ii" 124 125 set t1 [execsql {SELECT * FROM t1 ORDER BY ii}] 126 set t2 [execsql {SELECT * FROM t2 ORDER BY ii}] 127 set rc [expr {$t1 eq $t2}] 128 if {$rc != 1} { 129 puts $t1 130 puts $t2 131 } 132 set rc 133 } {1} 134 do_rtree_integrity_test rtree2-$module.$nDim.5.$ii.2 t1 135 } 136 137 do_test rtree2-$module.$nDim.6 { 138 execsql { 139 DROP TABLE t1; 140 DROP TABLE t2; 141 } 142 } {} 143 } 144} 145 146finish_test 147