summaryrefslogtreecommitdiff
path: root/ext/rtree/rtree2.test
blob: f5d15cc6b935d1120df9e7c8e58a4a24acca5a65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# 2008 Feb 19
#
# The author disclaims copyright to this source code.  In place of
# a legal notice, here is a blessing:
#
#    May you do good and not evil.
#    May you find forgiveness for yourself and forgive others.
#    May you share freely, never taking more than you give.
#
#***********************************************************************
#
# The focus of this file is testing the r-tree extension.
#

if {![info exists testdir]} {
  set testdir [file join [file dirname [info script]] .. .. test]
} 
source [file join [file dirname [info script]] rtree_util.tcl]
source $testdir/tester.tcl

ifcapable !rtree {
  finish_test
  return
}

set ::NROW   1000
set ::NDEL     10
set ::NSELECT 100

if {[info exists G(isquick)] && $G(isquick)} {
  set ::NROW 100
  set ::NSELECT 10
}

foreach module {rtree_i32 rtree} {
  for {set nDim 1} {$nDim <= 5} {incr nDim} {
  
    do_test rtree2-$module.$nDim.1 {
      set cols [list]
      foreach c [list c0 c1 c2 c3 c4 c5 c6 c7 c8 c9] {
        lappend cols "$c REAL"
      }
      set cols [join [lrange $cols 0 [expr {$nDim*2-1}]] ", "]
      execsql " 
        CREATE VIRTUAL TABLE t1 USING ${module}(ii, $cols);
        CREATE TABLE t2 (ii, $cols);
      "
    } {}
  
    do_test rtree2-$module.$nDim.2 {
      db transaction {
        for {set ii 0} {$ii < $::NROW} {incr ii} {
          #puts "Row $ii"
          set values [list]
          for {set jj 0} {$jj<$nDim*2} {incr jj} {
            lappend values [expr int(rand()*1000)]
          }
          set values [join $values ,]
          #puts [rtree_treedump db t1]
          #puts "INSERT INTO t2 VALUES($ii, $values)"
          set rc [catch {db eval "INSERT INTO t1 VALUES($ii, $values)"}]
          if {$rc} {
            incr ii -1
          } else {
            db eval "INSERT INTO t2 VALUES($ii, $values)"
          }
          #if {[rtree_check db t1]} {
            #puts [rtree_treedump db t1]
            #exit
          #}
        }
      }
  
      set t1 [execsql {SELECT * FROM t1 ORDER BY ii}]
      set t2 [execsql {SELECT * FROM t2 ORDER BY ii}]
      set rc [expr {$t1 eq $t2}]
      if {$rc != 1} {
        puts $t1
        puts $t2
      }
      set rc
    } {1}
  
    do_test rtree2-$module.$nDim.3 {
      rtree_check db t1
    } 0
  
    set OPS [list < > <= >= =]
    for {set ii 0} {$ii < $::NSELECT} {incr ii} {
      do_test rtree2-$module.$nDim.4.$ii.1 {
        set where [list]
        foreach look_three_dots! {. . .} {
          set colidx [expr int(rand()*($nDim*2+1))-1]
          if {$colidx<0} {
            set col ii
          } else {
            set col "c$colidx"
          }
          set op  [lindex $OPS [expr int(rand()*[llength $OPS])]]
          set val [expr int(rand()*1000)]
          lappend where "$col $op $val"
        }
        set where [join $where " AND "]
  
        set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"]
        set t2 [execsql "SELECT * FROM t2 WHERE $where ORDER BY ii"]
        set rc [expr {$t1 eq $t2}]
        if {$rc != 1} {
          #puts $where
          puts $t1
          puts $t2
          #puts [rtree_treedump db t1]
          #breakpoint
          #set t1 [execsql "SELECT * FROM t1 WHERE $where ORDER BY ii"]
          #exit
        }
        set rc
      } {1}
    }
  
    for {set ii 0} {$ii < $::NROW} {incr ii $::NDEL} {
      #puts [rtree_treedump db t1]
      do_test rtree2-$module.$nDim.5.$ii.1 {
        execsql "DELETE FROM t2 WHERE ii <= $::ii"
        execsql "DELETE FROM t1 WHERE ii <= $::ii"
  
        set t1 [execsql {SELECT * FROM t1 ORDER BY ii}]
        set t2 [execsql {SELECT * FROM t2 ORDER BY ii}]
        set rc [expr {$t1 eq $t2}]
        if {$rc != 1} {
          puts $t1
          puts $t2
        }
        set rc
      } {1}
      do_test rtree2-$module.$nDim.5.$ii.2 {
        rtree_check db t1
      } {0}
    }
  
    do_test rtree2-$module.$nDim.6 {
      execsql {
        DROP TABLE t1;
        DROP TABLE t2;
      }
    } {}
  }
}

finish_test