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