xref: /sqlite-3.40.0/ext/rtree/rtree2.test (revision b13dee99)
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