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