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