1ebaecc14Sdanielk1977# 2008 Feb 19 2ebaecc14Sdanielk1977# 3ebaecc14Sdanielk1977# The author disclaims copyright to this source code. In place of 4ebaecc14Sdanielk1977# a legal notice, here is a blessing: 5ebaecc14Sdanielk1977# 6ebaecc14Sdanielk1977# May you do good and not evil. 7ebaecc14Sdanielk1977# May you find forgiveness for yourself and forgive others. 8ebaecc14Sdanielk1977# May you share freely, never taking more than you give. 9ebaecc14Sdanielk1977# 10ebaecc14Sdanielk1977#*********************************************************************** 11ebaecc14Sdanielk1977# 12ebaecc14Sdanielk1977# The focus of this file is testing the r-tree extension. 13ebaecc14Sdanielk1977# 14ebaecc14Sdanielk1977 15b13dee99Sdanielk1977if {![info exists testdir]} { 16897230ebSdan set testdir [file join [file dirname [info script]] .. .. test] 17b13dee99Sdanielk1977} 18b13dee99Sdanielk1977source [file join [file dirname [info script]] rtree_util.tcl] 19ebaecc14Sdanielk1977source $testdir/tester.tcl 20ebaecc14Sdanielk1977 21ebaecc14Sdanielk1977ifcapable !rtree { 22ebaecc14Sdanielk1977 finish_test 23ebaecc14Sdanielk1977 return 24ebaecc14Sdanielk1977} 25ebaecc14Sdanielk1977 26ebaecc14Sdanielk1977set ::NROW 1000 27ebaecc14Sdanielk1977set ::NDEL 10 28ebaecc14Sdanielk1977set ::NSELECT 100 29ebaecc14Sdanielk1977 3092e01aafSdanif {[info exists G(isquick)] && $G(isquick)} { 31b13dee99Sdanielk1977 set ::NROW 100 32b13dee99Sdanielk1977 set ::NSELECT 10 33b13dee99Sdanielk1977} 34b13dee99Sdanielk1977 353ddb5a51Sdanielk1977foreach module {rtree_i32 rtree} { 36*0a64ddbeSdrh if {$module=="rtree_i32"} {set etype INT} {set etype REAL} 37ebaecc14Sdanielk1977 for {set nDim 1} {$nDim <= 5} {incr nDim} { 38ebaecc14Sdanielk1977 393ddb5a51Sdanielk1977 do_test rtree2-$module.$nDim.1 { 40ebaecc14Sdanielk1977 set cols [list] 41ebaecc14Sdanielk1977 foreach c [list c0 c1 c2 c3 c4 c5 c6 c7 c8 c9] { 42*0a64ddbeSdrh lappend cols "$c $etype" 43ebaecc14Sdanielk1977 } 44ebaecc14Sdanielk1977 set cols [join [lrange $cols 0 [expr {$nDim*2-1}]] ", "] 45ebaecc14Sdanielk1977 execsql " 463ddb5a51Sdanielk1977 CREATE VIRTUAL TABLE t1 USING ${module}(ii, $cols); 47ebaecc14Sdanielk1977 CREATE TABLE t2 (ii, $cols); 48ebaecc14Sdanielk1977 " 49ebaecc14Sdanielk1977 } {} 50ebaecc14Sdanielk1977 513ddb5a51Sdanielk1977 do_test rtree2-$module.$nDim.2 { 52ebaecc14Sdanielk1977 db transaction { 53ebaecc14Sdanielk1977 for {set ii 0} {$ii < $::NROW} {incr ii} { 54ebaecc14Sdanielk1977 #puts "Row $ii" 55ebaecc14Sdanielk1977 set values [list] 56ebaecc14Sdanielk1977 for {set jj 0} {$jj<$nDim*2} {incr jj} { 57ebaecc14Sdanielk1977 lappend values [expr int(rand()*1000)] 58ebaecc14Sdanielk1977 } 59ebaecc14Sdanielk1977 set values [join $values ,] 60ebaecc14Sdanielk1977 #puts [rtree_treedump db t1] 61ebaecc14Sdanielk1977 #puts "INSERT INTO t2 VALUES($ii, $values)" 62ebaecc14Sdanielk1977 set rc [catch {db eval "INSERT INTO t1 VALUES($ii, $values)"}] 63ebaecc14Sdanielk1977 if {$rc} { 64ebaecc14Sdanielk1977 incr ii -1 65ebaecc14Sdanielk1977 } else { 66ebaecc14Sdanielk1977 db eval "INSERT INTO t2 VALUES($ii, $values)" 67ebaecc14Sdanielk1977 } 68ebaecc14Sdanielk1977 #if {[rtree_check db t1]} { 69ebaecc14Sdanielk1977 #puts [rtree_treedump db t1] 70ebaecc14Sdanielk1977 #exit 71ebaecc14Sdanielk1977 #} 72ebaecc14Sdanielk1977 } 73ebaecc14Sdanielk1977 } 74ebaecc14Sdanielk1977 75ebaecc14Sdanielk1977 set t1 [execsql {SELECT * FROM t1 ORDER BY ii}] 76ebaecc14Sdanielk1977 set t2 [execsql {SELECT * FROM t2 ORDER BY ii}] 77ebaecc14Sdanielk1977 set rc [expr {$t1 eq $t2}] 78ebaecc14Sdanielk1977 if {$rc != 1} { 79ebaecc14Sdanielk1977 puts $t1 80ebaecc14Sdanielk1977 puts $t2 81ebaecc14Sdanielk1977 } 82ebaecc14Sdanielk1977 set rc 83ebaecc14Sdanielk1977 } {1} 84ebaecc14Sdanielk1977 851917e92fSdan do_rtree_integrity_test rtree2-$module.$nDim.3 t1 86ebaecc14Sdanielk1977 87ebaecc14Sdanielk1977 set OPS [list < > <= >= =] 88ebaecc14Sdanielk1977 for {set ii 0} {$ii < $::NSELECT} {incr ii} { 893ddb5a51Sdanielk1977 do_test rtree2-$module.$nDim.4.$ii.1 { 90ebaecc14Sdanielk1977 set where [list] 91ebaecc14Sdanielk1977 foreach look_three_dots! {. . .} { 92ebaecc14Sdanielk1977 set colidx [expr int(rand()*($nDim*2+1))-1] 93ebaecc14Sdanielk1977 if {$colidx<0} { 94ebaecc14Sdanielk1977 set col ii 95ebaecc14Sdanielk1977 } else { 96ebaecc14Sdanielk1977 set col "c$colidx" 97ebaecc14Sdanielk1977 } 98ebaecc14Sdanielk1977 set op [lindex $OPS [expr int(rand()*[llength $OPS])]] 99ebaecc14Sdanielk1977 set val [expr int(rand()*1000)] 100ebaecc14Sdanielk1977 lappend where "$col $op $val" 101ebaecc14Sdanielk1977 } 102ebaecc14Sdanielk1977 set where [join $where " AND "] 103ebaecc14Sdanielk1977 104ebaecc14Sdanielk1977 set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"] 105ebaecc14Sdanielk1977 set t2 [execsql "SELECT * FROM t2 WHERE $where ORDER BY ii"] 106ebaecc14Sdanielk1977 set rc [expr {$t1 eq $t2}] 107ebaecc14Sdanielk1977 if {$rc != 1} { 1084b4f7801Sdrh #puts $where 109ebaecc14Sdanielk1977 puts $t1 110ebaecc14Sdanielk1977 puts $t2 1114b4f7801Sdrh #puts [rtree_treedump db t1] 1124b4f7801Sdrh #breakpoint 1134b4f7801Sdrh #set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"] 1144b4f7801Sdrh #exit 115ebaecc14Sdanielk1977 } 116ebaecc14Sdanielk1977 set rc 117ebaecc14Sdanielk1977 } {1} 118ebaecc14Sdanielk1977 } 119ebaecc14Sdanielk1977 120ebaecc14Sdanielk1977 for {set ii 0} {$ii < $::NROW} {incr ii $::NDEL} { 121ebaecc14Sdanielk1977 #puts [rtree_treedump db t1] 1223ddb5a51Sdanielk1977 do_test rtree2-$module.$nDim.5.$ii.1 { 123ebaecc14Sdanielk1977 execsql "DELETE FROM t2 WHERE ii <= $::ii" 124ebaecc14Sdanielk1977 execsql "DELETE FROM t1 WHERE ii <= $::ii" 125ebaecc14Sdanielk1977 126ebaecc14Sdanielk1977 set t1 [execsql {SELECT * FROM t1 ORDER BY ii}] 127ebaecc14Sdanielk1977 set t2 [execsql {SELECT * FROM t2 ORDER BY ii}] 128ebaecc14Sdanielk1977 set rc [expr {$t1 eq $t2}] 129ebaecc14Sdanielk1977 if {$rc != 1} { 130ebaecc14Sdanielk1977 puts $t1 131ebaecc14Sdanielk1977 puts $t2 132ebaecc14Sdanielk1977 } 133ebaecc14Sdanielk1977 set rc 134ebaecc14Sdanielk1977 } {1} 1351917e92fSdan do_rtree_integrity_test rtree2-$module.$nDim.5.$ii.2 t1 136ebaecc14Sdanielk1977 } 137ebaecc14Sdanielk1977 1383ddb5a51Sdanielk1977 do_test rtree2-$module.$nDim.6 { 139ebaecc14Sdanielk1977 execsql { 140ebaecc14Sdanielk1977 DROP TABLE t1; 141ebaecc14Sdanielk1977 DROP TABLE t2; 142ebaecc14Sdanielk1977 } 143ebaecc14Sdanielk1977 } {} 144ebaecc14Sdanielk1977 } 1453ddb5a51Sdanielk1977} 146ebaecc14Sdanielk1977 147ebaecc14Sdanielk1977finish_test 148