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