xref: /sqlite-3.40.0/ext/rtree/rtree6.test (revision 8210233c)
1# 2008 Sep 1
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#
13
14if {![info exists testdir]} {
15  set testdir [file join [file dirname [info script]] .. .. test]
16}
17source $testdir/tester.tcl
18set testprefix rtree6
19
20ifcapable {!rtree || rtree_int_only} {
21  finish_test
22  return
23}
24
25#   Operator    Byte Value
26#   ----------------------
27#      =        0x41 ('A')
28#     <=        0x42 ('B')
29#      <        0x43 ('C')
30#     >=        0x44 ('D')
31#      >        0x45 ('E')
32#   ----------------------
33
34proc rtree_strategy {sql} {
35  set ret [list]
36  db eval "explain $sql" a {
37    if {$a(opcode) eq "VFilter"} {
38      lappend ret $a(p4)
39    }
40  }
41  set ret
42}
43
44proc query_plan {sql} {
45  set ret [list]
46  db eval "explain query plan $sql" a {
47    lappend ret $a(detail)
48  }
49  set ret
50}
51
52do_test rtree6-1.1 {
53  execsql {
54    CREATE TABLE t2(k INTEGER PRIMARY KEY, v);
55    CREATE VIRTUAL TABLE t1 USING rtree(ii, x1, x2, y1, y2);
56  }
57} {}
58
59do_test rtree6-1.2 {
60  rtree_strategy {SELECT * FROM t1 WHERE x1>10}
61} {E0}
62do_test rtree6-1.2.1 {
63  rtree_strategy {SELECT * FROM t1 WHERE x1>10 AND x2 LIKE '%x%'}
64} {E0}
65
66do_test rtree6-1.3 {
67  rtree_strategy {SELECT * FROM t1 WHERE x1<10}
68} {C0}
69
70do_test rtree6-1.4 {
71  rtree_strategy {SELECT * FROM t1,t2 WHERE k=ii AND x1<10}
72} {C0}
73
74do_test rtree6-1.5 {
75  rtree_strategy {SELECT * FROM t1,t2 WHERE k=+ii AND x1<10}
76} {C0}
77
78do_eqp_test rtree6.2.1 {
79  SELECT * FROM t1,t2 WHERE k=+ii AND x1<10
80} {
81  QUERY PLAN
82  |--SCAN t1 VIRTUAL TABLE INDEX 2:C0
83  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
84}
85
86do_eqp_test rtree6.2.2 {
87  SELECT * FROM t1,t2 WHERE k=ii AND x1<10
88} {
89  QUERY PLAN
90  |--SCAN t1 VIRTUAL TABLE INDEX 2:C0
91  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
92}
93
94do_eqp_test rtree6.2.3 {
95  SELECT * FROM t1,t2 WHERE k=ii
96} {
97  QUERY PLAN
98  |--SCAN t1 VIRTUAL TABLE INDEX 2:
99  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
100}
101
102do_eqp_test rtree6.2.4.1 {
103  SELECT * FROM t1,t2 WHERE v=+ii and x1<10 and x2>10
104} {
105  QUERY PLAN
106  |--SCAN t1 VIRTUAL TABLE INDEX 2:C0E1
107  `--SEARCH t2 USING AUTOMATIC COVERING INDEX (v=?)
108}
109do_eqp_test rtree6.2.4.2 {
110  SELECT * FROM t1,t2 WHERE v=10 and x1<10 and x2>10
111} {
112  QUERY PLAN
113  |--SCAN t1 VIRTUAL TABLE INDEX 2:C0E1
114  `--SEARCH t2 USING AUTOMATIC PARTIAL COVERING INDEX (v=?)
115}
116
117do_eqp_test rtree6.2.5 {
118  SELECT * FROM t1,t2 WHERE k=ii AND x1<v
119} {
120  QUERY PLAN
121  |--SCAN t1 VIRTUAL TABLE INDEX 2:
122  `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
123}
124
125do_execsql_test rtree6-3.1 {
126  CREATE VIRTUAL TABLE t3 USING rtree(id, x1, x2, y1, y2);
127  INSERT INTO t3 VALUES(NULL, 1, 1, 2, 2);
128  SELECT * FROM t3 WHERE
129    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
130    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
131    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
132    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
133    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
134    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5;
135} {1 1.0 1.0 2.0 2.0}
136
137do_test rtree6.3.2 {
138  rtree_strategy {
139    SELECT * FROM t3 WHERE
140      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
141      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
142      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
143      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5
144  }
145} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0}
146do_test rtree6.3.3 {
147  rtree_strategy {
148    SELECT * FROM t3 WHERE
149      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
150      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
151      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
152      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
153      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
154      x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5
155  }
156} {E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0}
157
158do_execsql_test rtree6-3.4 {
159  SELECT * FROM t3 WHERE x1>0.5 AND x1>0.8 AND x1>1.1
160} {}
161do_execsql_test rtree6-3.5 {
162  SELECT * FROM t3 WHERE
163    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
164    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
165    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
166    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
167    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND
168    x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1
169} {}
170
171#-------------------------------------------------------------------------
172reset_db
173do_execsql_test 4.0 {
174  CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1);
175}
176do_execsql_test 4.1 {
177  DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92;
178}
179
180expand_all_sql db
181finish_test
182