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