OLD | NEW |
1 # 2010 November 6 | 1 # 2010 November 6 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 | 12 |
13 set testdir [file dirname $argv0] | 13 set testdir [file dirname $argv0] |
14 source $testdir/tester.tcl | 14 source $testdir/tester.tcl |
15 | 15 |
| 16 ifcapable !compound { |
| 17 finish_test |
| 18 return |
| 19 } |
| 20 |
16 set testprefix eqp | 21 set testprefix eqp |
17 | 22 |
18 #------------------------------------------------------------------------- | 23 #------------------------------------------------------------------------- |
19 # | 24 # |
20 # eqp-1.*: Assorted tests. | 25 # eqp-1.*: Assorted tests. |
21 # eqp-2.*: Tests for single select statements. | 26 # eqp-2.*: Tests for single select statements. |
22 # eqp-3.*: Select statements that execute sub-selects. | 27 # eqp-3.*: Select statements that execute sub-selects. |
23 # eqp-4.*: Compound select statements. | 28 # eqp-4.*: Compound select statements. |
24 # ... | 29 # ... |
25 # eqp-7.*: "SELECT count(*) FROM tbl" statements (VDBE code OP_Count). | 30 # eqp-7.*: "SELECT count(*) FROM tbl" statements (VDBE code OP_Count). |
26 # | 31 # |
27 | 32 |
28 proc det {args} { uplevel do_eqp_test $args } | 33 proc det {args} { uplevel do_eqp_test $args } |
29 | 34 |
30 do_execsql_test 1.1 { | 35 do_execsql_test 1.1 { |
31 CREATE TABLE t1(a, b); | 36 CREATE TABLE t1(a INT, b INT, ex TEXT); |
32 CREATE INDEX i1 ON t1(a); | 37 CREATE INDEX i1 ON t1(a); |
33 CREATE INDEX i2 ON t1(b); | 38 CREATE INDEX i2 ON t1(b); |
34 CREATE TABLE t2(a, b); | 39 CREATE TABLE t2(a INT, b INT, ex TEXT); |
35 CREATE TABLE t3(a, b); | 40 CREATE TABLE t3(a INT, b INT, ex TEXT); |
36 } | 41 } |
37 | 42 |
38 do_eqp_test 1.2 { | 43 do_eqp_test 1.2 { |
39 SELECT * FROM t2, t1 WHERE t1.a=1 OR t1.b=2; | 44 SELECT * FROM t2, t1 WHERE t1.a=1 OR t1.b=2; |
40 } { | 45 } { |
41 0 0 1 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 46 0 0 1 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
42 0 0 1 {SEARCH TABLE t1 USING INDEX i2 (b=?) (~10 rows)} | 47 0 0 1 {SEARCH TABLE t1 USING INDEX i2 (b=?)} |
43 0 1 0 {SCAN TABLE t2 (~1000000 rows)} | 48 0 1 0 {SCAN TABLE t2} |
44 } | 49 } |
45 do_eqp_test 1.3 { | 50 do_eqp_test 1.3 { |
46 SELECT * FROM t2 CROSS JOIN t1 WHERE t1.a=1 OR t1.b=2; | 51 SELECT * FROM t2 CROSS JOIN t1 WHERE t1.a=1 OR t1.b=2; |
47 } { | 52 } { |
48 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 53 0 0 0 {SCAN TABLE t2} |
49 0 1 1 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 54 0 1 1 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
50 0 1 1 {SEARCH TABLE t1 USING INDEX i2 (b=?) (~10 rows)} | 55 0 1 1 {SEARCH TABLE t1 USING INDEX i2 (b=?)} |
51 } | 56 } |
52 do_eqp_test 1.3 { | 57 do_eqp_test 1.3 { |
53 SELECT a FROM t1 ORDER BY a | 58 SELECT a FROM t1 ORDER BY a |
54 } { | 59 } { |
55 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1 (~1000000 rows)} | 60 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
56 } | 61 } |
57 do_eqp_test 1.4 { | 62 do_eqp_test 1.4 { |
58 SELECT a FROM t1 ORDER BY +a | 63 SELECT a FROM t1 ORDER BY +a |
59 } { | 64 } { |
60 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 65 0 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
61 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 66 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
62 } | 67 } |
63 do_eqp_test 1.5 { | 68 do_eqp_test 1.5 { |
64 SELECT a FROM t1 WHERE a=4 | 69 SELECT a FROM t1 WHERE a=4 |
65 } { | 70 } { |
66 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i1 (a=?) (~10 rows)} | 71 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i1 (a=?)} |
67 } | 72 } |
68 do_eqp_test 1.6 { | 73 do_eqp_test 1.6 { |
69 SELECT DISTINCT count(*) FROM t3 GROUP BY a; | 74 SELECT DISTINCT count(*) FROM t3 GROUP BY a; |
70 } { | 75 } { |
71 0 0 0 {SCAN TABLE t3 (~1000000 rows)} | 76 0 0 0 {SCAN TABLE t3} |
72 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 77 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
73 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 78 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
74 } | 79 } |
75 | 80 |
76 do_eqp_test 1.7 { | 81 do_eqp_test 1.7 { |
77 SELECT * FROM t3 JOIN (SELECT 1) | 82 SELECT * FROM t3 JOIN (SELECT 1) |
78 } { | 83 } { |
79 0 0 1 {SCAN SUBQUERY 1 (~1 rows)} | 84 0 0 1 {SCAN SUBQUERY 1} |
80 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 85 0 1 0 {SCAN TABLE t3} |
81 } | 86 } |
82 do_eqp_test 1.8 { | 87 do_eqp_test 1.8 { |
83 SELECT * FROM t3 JOIN (SELECT 1 UNION SELECT 2) | 88 SELECT * FROM t3 JOIN (SELECT 1 UNION SELECT 2) |
84 } { | 89 } { |
85 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} | 90 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} |
86 0 0 1 {SCAN SUBQUERY 1 (~2 rows)} | 91 0 0 1 {SCAN SUBQUERY 1} |
87 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 92 0 1 0 {SCAN TABLE t3} |
88 } | 93 } |
89 do_eqp_test 1.9 { | 94 do_eqp_test 1.9 { |
90 SELECT * FROM t3 JOIN (SELECT 1 EXCEPT SELECT a FROM t3 LIMIT 17) | 95 SELECT * FROM t3 JOIN (SELECT 1 EXCEPT SELECT a FROM t3 LIMIT 17) |
91 } { | 96 } { |
92 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 97 3 0 0 {SCAN TABLE t3} |
93 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (EXCEPT)} | 98 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (EXCEPT)} |
94 0 0 1 {SCAN SUBQUERY 1 (~17 rows)} | 99 0 0 1 {SCAN SUBQUERY 1} |
95 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 100 0 1 0 {SCAN TABLE t3} |
96 } | 101 } |
97 do_eqp_test 1.10 { | 102 do_eqp_test 1.10 { |
98 SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) | 103 SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) |
99 } { | 104 } { |
100 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 105 3 0 0 {SCAN TABLE t3} |
101 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (INTERSECT)} | 106 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (INTERSECT)} |
102 0 0 1 {SCAN SUBQUERY 1 (~1 rows)} | 107 0 0 1 {SCAN SUBQUERY 1} |
103 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 108 0 1 0 {SCAN TABLE t3} |
104 } | 109 } |
105 | 110 |
106 do_eqp_test 1.11 { | 111 do_eqp_test 1.11 { |
107 SELECT * FROM t3 JOIN (SELECT 1 UNION ALL SELECT a FROM t3 LIMIT 17) | 112 SELECT * FROM t3 JOIN (SELECT 1 UNION ALL SELECT a FROM t3 LIMIT 17) |
108 } { | 113 } { |
109 3 0 0 {SCAN TABLE t3 (~1000000 rows)} | 114 3 0 0 {SCAN TABLE t3} |
110 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)} | 115 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION ALL)} |
111 0 0 1 {SCAN SUBQUERY 1 (~17 rows)} | 116 0 0 1 {SCAN SUBQUERY 1} |
112 0 1 0 {SCAN TABLE t3 (~1000000 rows)} | 117 0 1 0 {SCAN TABLE t3} |
113 } | 118 } |
114 | 119 |
115 #------------------------------------------------------------------------- | 120 #------------------------------------------------------------------------- |
116 # Test cases eqp-2.* - tests for single select statements. | 121 # Test cases eqp-2.* - tests for single select statements. |
117 # | 122 # |
118 drop_all_tables | 123 drop_all_tables |
119 do_execsql_test 2.1 { | 124 do_execsql_test 2.1 { |
120 CREATE TABLE t1(x, y); | 125 CREATE TABLE t1(x INT, y INT, ex TEXT); |
121 | 126 |
122 CREATE TABLE t2(x, y); | 127 CREATE TABLE t2(x INT, y INT, ex TEXT); |
123 CREATE INDEX t2i1 ON t2(x); | 128 CREATE INDEX t2i1 ON t2(x); |
124 } | 129 } |
125 | 130 |
126 det 2.2.1 "SELECT DISTINCT min(x), max(x) FROM t1 GROUP BY x ORDER BY 1" { | 131 det 2.2.1 "SELECT DISTINCT min(x), max(x) FROM t1 GROUP BY x ORDER BY 1" { |
127 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 132 0 0 0 {SCAN TABLE t1} |
128 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 133 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
129 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 134 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
130 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 135 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
131 } | 136 } |
132 det 2.2.2 "SELECT DISTINCT min(x), max(x) FROM t2 GROUP BY x ORDER BY 1" { | 137 det 2.2.2 "SELECT DISTINCT min(x), max(x) FROM t2 GROUP BY x ORDER BY 1" { |
133 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 138 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
134 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 139 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
135 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 140 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
136 } | 141 } |
137 det 2.2.3 "SELECT DISTINCT * FROM t1" { | 142 det 2.2.3 "SELECT DISTINCT * FROM t1" { |
138 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 143 0 0 0 {SCAN TABLE t1} |
139 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 144 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
140 } | 145 } |
141 det 2.2.4 "SELECT DISTINCT * FROM t1, t2" { | 146 det 2.2.4 "SELECT DISTINCT * FROM t1, t2" { |
142 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 147 0 0 0 {SCAN TABLE t1} |
143 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 148 0 1 1 {SCAN TABLE t2} |
144 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 149 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
145 } | 150 } |
146 det 2.2.5 "SELECT DISTINCT * FROM t1, t2 ORDER BY t1.x" { | 151 det 2.2.5 "SELECT DISTINCT * FROM t1, t2 ORDER BY t1.x" { |
147 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 152 0 0 0 {SCAN TABLE t1} |
148 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 153 0 1 1 {SCAN TABLE t2} |
149 0 0 0 {USE TEMP B-TREE FOR DISTINCT} | 154 0 0 0 {USE TEMP B-TREE FOR DISTINCT} |
150 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 155 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
151 } | 156 } |
152 det 2.2.6 "SELECT DISTINCT t2.x FROM t1, t2 ORDER BY t2.x" { | 157 det 2.2.6 "SELECT DISTINCT t2.x FROM t1, t2 ORDER BY t2.x" { |
153 0 0 1 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 158 0 0 1 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
154 0 1 0 {SCAN TABLE t1 (~1000000 rows)} | 159 0 1 0 {SCAN TABLE t1} |
155 } | 160 } |
156 | 161 |
157 det 2.3.1 "SELECT max(x) FROM t2" { | 162 det 2.3.1 "SELECT max(x) FROM t2" { |
158 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1 (~1 rows)} | 163 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1} |
159 } | 164 } |
160 det 2.3.2 "SELECT min(x) FROM t2" { | 165 det 2.3.2 "SELECT min(x) FROM t2" { |
161 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1 (~1 rows)} | 166 0 0 0 {SEARCH TABLE t2 USING COVERING INDEX t2i1} |
162 } | 167 } |
163 det 2.3.3 "SELECT min(x), max(x) FROM t2" { | 168 det 2.3.3 "SELECT min(x), max(x) FROM t2" { |
164 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 169 0 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
165 } | 170 } |
166 | 171 |
167 det 2.4.1 "SELECT * FROM t1 WHERE rowid=?" { | 172 det 2.4.1 "SELECT * FROM t1 WHERE rowid=?" { |
168 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 173 0 0 0 {SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?)} |
169 } | 174 } |
170 | 175 |
171 | 176 |
172 | 177 |
173 #------------------------------------------------------------------------- | 178 #------------------------------------------------------------------------- |
174 # Test cases eqp-3.* - tests for select statements that use sub-selects. | 179 # Test cases eqp-3.* - tests for select statements that use sub-selects. |
175 # | 180 # |
176 do_eqp_test 3.1.1 { | 181 do_eqp_test 3.1.1 { |
177 SELECT (SELECT x FROM t1 AS sub) FROM t1; | 182 SELECT (SELECT x FROM t1 AS sub) FROM t1; |
178 } { | 183 } { |
179 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 184 0 0 0 {SCAN TABLE t1} |
180 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 185 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
181 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 186 1 0 0 {SCAN TABLE t1 AS sub} |
182 } | 187 } |
183 do_eqp_test 3.1.2 { | 188 do_eqp_test 3.1.2 { |
184 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub); | 189 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub); |
185 } { | 190 } { |
186 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 191 0 0 0 {SCAN TABLE t1} |
187 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 192 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
188 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 193 1 0 0 {SCAN TABLE t1 AS sub} |
189 } | 194 } |
190 do_eqp_test 3.1.3 { | 195 do_eqp_test 3.1.3 { |
191 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub ORDER BY y); | 196 SELECT * FROM t1 WHERE (SELECT x FROM t1 AS sub ORDER BY y); |
192 } { | 197 } { |
193 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 198 0 0 0 {SCAN TABLE t1} |
194 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 199 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
195 1 0 0 {SCAN TABLE t1 AS sub (~1000000 rows)} | 200 1 0 0 {SCAN TABLE t1 AS sub} |
196 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 201 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
197 } | 202 } |
198 do_eqp_test 3.1.4 { | 203 do_eqp_test 3.1.4 { |
199 SELECT * FROM t1 WHERE (SELECT x FROM t2 ORDER BY x); | 204 SELECT * FROM t1 WHERE (SELECT x FROM t2 ORDER BY x); |
200 } { | 205 } { |
201 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 206 0 0 0 {SCAN TABLE t1} |
202 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 207 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
203 1 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 208 1 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
204 } | 209 } |
205 | 210 |
206 det 3.2.1 { | 211 det 3.2.1 { |
207 SELECT * FROM (SELECT * FROM t1 ORDER BY x LIMIT 10) ORDER BY y LIMIT 5 | 212 SELECT * FROM (SELECT * FROM t1 ORDER BY x LIMIT 10) ORDER BY y LIMIT 5 |
208 } { | 213 } { |
209 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 214 1 0 0 {SCAN TABLE t1} |
210 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 215 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
211 0 0 0 {SCAN SUBQUERY 1 (~10 rows)} | 216 0 0 0 {SCAN SUBQUERY 1} |
212 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 217 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
213 } | 218 } |
214 det 3.2.2 { | 219 det 3.2.2 { |
215 SELECT * FROM | 220 SELECT * FROM |
216 (SELECT * FROM t1 ORDER BY x LIMIT 10) AS x1, | 221 (SELECT * FROM t1 ORDER BY x LIMIT 10) AS x1, |
217 (SELECT * FROM t2 ORDER BY x LIMIT 10) AS x2 | 222 (SELECT * FROM t2 ORDER BY x LIMIT 10) AS x2 |
218 ORDER BY x2.y LIMIT 5 | 223 ORDER BY x2.y LIMIT 5 |
219 } { | 224 } { |
220 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 225 1 0 0 {SCAN TABLE t1} |
221 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 226 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
222 2 0 0 {SCAN TABLE t2 USING INDEX t2i1 (~1000000 rows)} | 227 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
223 0 0 0 {SCAN SUBQUERY 1 AS x1 (~10 rows)} | 228 0 0 0 {SCAN SUBQUERY 1 AS x1} |
224 0 1 1 {SCAN SUBQUERY 2 AS x2 (~10 rows)} | 229 0 1 1 {SCAN SUBQUERY 2 AS x2} |
225 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 230 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
226 } | 231 } |
227 | 232 |
228 det 3.3.1 { | 233 det 3.3.1 { |
229 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2) | 234 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2) |
230 } { | 235 } { |
231 0 0 0 {SCAN TABLE t1 (~100000 rows)} | 236 0 0 0 {SCAN TABLE t1} |
232 0 0 0 {EXECUTE LIST SUBQUERY 1} | 237 0 0 0 {EXECUTE LIST SUBQUERY 1} |
233 1 0 0 {SCAN TABLE t2 (~1000000 rows)} | 238 1 0 0 {SCAN TABLE t2} |
234 } | 239 } |
235 det 3.3.2 { | 240 det 3.3.2 { |
236 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2 WHERE t1.x!=t2.x) | 241 SELECT * FROM t1 WHERE y IN (SELECT y FROM t2 WHERE t1.x!=t2.x) |
237 } { | 242 } { |
238 0 0 0 {SCAN TABLE t1 (~500000 rows)} | 243 0 0 0 {SCAN TABLE t1} |
239 0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1} | 244 0 0 0 {EXECUTE CORRELATED LIST SUBQUERY 1} |
240 1 0 0 {SCAN TABLE t2 (~500000 rows)} | 245 1 0 0 {SCAN TABLE t2} |
241 } | 246 } |
242 det 3.3.3 { | 247 det 3.3.3 { |
243 SELECT * FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE t1.x!=t2.x) | 248 SELECT * FROM t1 WHERE EXISTS (SELECT y FROM t2 WHERE t1.x!=t2.x) |
244 } { | 249 } { |
245 0 0 0 {SCAN TABLE t1 (~500000 rows)} | 250 0 0 0 {SCAN TABLE t1} |
246 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 1} | 251 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 1} |
247 1 0 0 {SCAN TABLE t2 (~500000 rows)} | 252 1 0 0 {SCAN TABLE t2} |
248 } | 253 } |
249 | 254 |
250 #------------------------------------------------------------------------- | 255 #------------------------------------------------------------------------- |
251 # Test cases eqp-4.* - tests for composite select statements. | 256 # Test cases eqp-4.* - tests for composite select statements. |
252 # | 257 # |
253 do_eqp_test 4.1.1 { | 258 do_eqp_test 4.1.1 { |
254 SELECT * FROM t1 UNION ALL SELECT * FROM t2 | 259 SELECT * FROM t1 UNION ALL SELECT * FROM t2 |
255 } { | 260 } { |
256 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 261 1 0 0 {SCAN TABLE t1} |
257 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 262 2 0 0 {SCAN TABLE t2} |
258 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 263 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
259 } | 264 } |
260 do_eqp_test 4.1.2 { | 265 do_eqp_test 4.1.2 { |
261 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 2 | 266 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 2 |
262 } { | 267 } { |
263 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 268 1 0 0 {SCAN TABLE t1} |
264 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 269 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
265 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 270 2 0 0 {SCAN TABLE t2} |
266 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 271 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
267 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 272 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
268 } | 273 } |
269 do_eqp_test 4.1.3 { | 274 do_eqp_test 4.1.3 { |
270 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 2 | 275 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 2 |
271 } { | 276 } { |
272 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 277 1 0 0 {SCAN TABLE t1} |
273 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 278 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
274 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 279 2 0 0 {SCAN TABLE t2} |
275 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 280 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
276 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} | 281 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} |
277 } | 282 } |
278 do_eqp_test 4.1.4 { | 283 do_eqp_test 4.1.4 { |
279 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 2 | 284 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 2 |
280 } { | 285 } { |
281 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 286 1 0 0 {SCAN TABLE t1} |
282 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 287 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
283 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 288 2 0 0 {SCAN TABLE t2} |
284 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 289 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
285 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} | 290 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} |
286 } | 291 } |
287 do_eqp_test 4.1.5 { | 292 do_eqp_test 4.1.5 { |
288 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 2 | 293 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 2 |
289 } { | 294 } { |
290 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 295 1 0 0 {SCAN TABLE t1} |
291 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 296 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
292 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 297 2 0 0 {SCAN TABLE t2} |
293 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 298 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
294 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 299 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
295 } | 300 } |
296 | 301 |
297 do_eqp_test 4.2.2 { | 302 do_eqp_test 4.2.2 { |
298 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 1 | 303 SELECT * FROM t1 UNION ALL SELECT * FROM t2 ORDER BY 1 |
299 } { | 304 } { |
300 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 305 1 0 0 {SCAN TABLE t1} |
301 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 306 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
302 2 0 0 {SCAN TABLE t2 USING INDEX t2i1 (~1000000 rows)} | 307 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
303 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} | 308 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION ALL)} |
304 } | 309 } |
305 do_eqp_test 4.2.3 { | 310 do_eqp_test 4.2.3 { |
306 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 1 | 311 SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY 1 |
307 } { | 312 } { |
308 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 313 1 0 0 {SCAN TABLE t1} |
309 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 314 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
310 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 315 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
311 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 316 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
312 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} | 317 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (UNION)} |
313 } | 318 } |
314 do_eqp_test 4.2.4 { | 319 do_eqp_test 4.2.4 { |
315 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 1 | 320 SELECT * FROM t1 INTERSECT SELECT * FROM t2 ORDER BY 1 |
316 } { | 321 } { |
317 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 322 1 0 0 {SCAN TABLE t1} |
318 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 323 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
319 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 324 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
320 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 325 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
321 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} | 326 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (INTERSECT)} |
322 } | 327 } |
323 do_eqp_test 4.2.5 { | 328 do_eqp_test 4.2.5 { |
324 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 1 | 329 SELECT * FROM t1 EXCEPT SELECT * FROM t2 ORDER BY 1 |
325 } { | 330 } { |
326 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 331 1 0 0 {SCAN TABLE t1} |
327 1 0 0 {USE TEMP B-TREE FOR ORDER BY} | 332 1 0 0 {USE TEMP B-TREE FOR ORDER BY} |
328 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 333 2 0 0 {SCAN TABLE t2 USING INDEX t2i1} |
329 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 334 2 0 0 {USE TEMP B-TREE FOR RIGHT PART OF ORDER BY} |
330 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 335 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
331 } | 336 } |
332 | 337 |
333 do_eqp_test 4.3.1 { | 338 do_eqp_test 4.3.1 { |
334 SELECT x FROM t1 UNION SELECT x FROM t2 | 339 SELECT x FROM t1 UNION SELECT x FROM t2 |
335 } { | 340 } { |
336 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 341 1 0 0 {SCAN TABLE t1} |
337 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 342 2 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
338 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} | 343 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} |
339 } | 344 } |
340 | 345 |
341 do_eqp_test 4.3.2 { | 346 do_eqp_test 4.3.2 { |
342 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 | 347 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 |
343 } { | 348 } { |
344 2 0 0 {SCAN TABLE t1 (~1000000 rows)} | 349 2 0 0 {SCAN TABLE t1} |
345 3 0 0 {SCAN TABLE t2 (~1000000 rows)} | 350 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
346 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} | 351 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (UNION)} |
347 4 0 0 {SCAN TABLE t1 (~1000000 rows)} | 352 4 0 0 {SCAN TABLE t1} |
348 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 USING TEMP B-TREE (UNION)} | 353 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 USING TEMP B-TREE (UNION)} |
349 } | 354 } |
350 do_eqp_test 4.3.3 { | 355 do_eqp_test 4.3.3 { |
351 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 ORDER BY 1 | 356 SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 ORDER BY 1 |
352 } { | 357 } { |
353 2 0 0 {SCAN TABLE t1 (~1000000 rows)} | 358 2 0 0 {SCAN TABLE t1} |
354 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 359 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
355 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1 (~1000000 rows)} | 360 3 0 0 {SCAN TABLE t2 USING COVERING INDEX t2i1} |
356 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION)} | 361 1 0 0 {COMPOUND SUBQUERIES 2 AND 3 (UNION)} |
357 4 0 0 {SCAN TABLE t1 (~1000000 rows)} | 362 4 0 0 {SCAN TABLE t1} |
358 4 0 0 {USE TEMP B-TREE FOR ORDER BY} | 363 4 0 0 {USE TEMP B-TREE FOR ORDER BY} |
359 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 (UNION)} | 364 0 0 0 {COMPOUND SUBQUERIES 1 AND 4 (UNION)} |
360 } | 365 } |
361 | 366 |
362 #------------------------------------------------------------------------- | 367 #------------------------------------------------------------------------- |
363 # This next block of tests verifies that the examples on the | 368 # This next block of tests verifies that the examples on the |
364 # lang_explain.html page are correct. | 369 # lang_explain.html page are correct. |
365 # | 370 # |
366 drop_all_tables | 371 drop_all_tables |
367 | 372 |
368 # EVIDENCE-OF: R-64208-08323 sqlite> EXPLAIN QUERY PLAN SELECT a, b | 373 # EVIDENCE-OF: R-47779-47605 sqlite> EXPLAIN QUERY PLAN SELECT a, b |
369 # FROM t1 WHERE a=1; 0|0|0|SCAN TABLE t1 (~100000 rows) | 374 # FROM t1 WHERE a=1; |
370 do_execsql_test 5.1.0 { CREATE TABLE t1(a, b) } | 375 # 0|0|0|SCAN TABLE t1 |
| 376 # |
| 377 do_execsql_test 5.1.0 { CREATE TABLE t1(a INT, b INT, ex TEXT) } |
371 det 5.1.1 "SELECT a, b FROM t1 WHERE a=1" { | 378 det 5.1.1 "SELECT a, b FROM t1 WHERE a=1" { |
372 0 0 0 {SCAN TABLE t1 (~100000 rows)} | 379 0 0 0 {SCAN TABLE t1} |
373 } | 380 } |
374 | 381 |
375 # EVIDENCE-OF: R-09022-44606 sqlite> CREATE INDEX i1 ON t1(a); | 382 # EVIDENCE-OF: R-55852-17599 sqlite> CREATE INDEX i1 ON t1(a); |
376 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; | 383 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; |
377 # 0|0|0|SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows) | 384 # 0|0|0|SEARCH TABLE t1 USING INDEX i1 |
| 385 # |
378 do_execsql_test 5.2.0 { CREATE INDEX i1 ON t1(a) } | 386 do_execsql_test 5.2.0 { CREATE INDEX i1 ON t1(a) } |
379 det 5.2.1 "SELECT a, b FROM t1 WHERE a=1" { | 387 det 5.2.1 "SELECT a, b FROM t1 WHERE a=1" { |
380 0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?) (~10 rows)} | 388 0 0 0 {SEARCH TABLE t1 USING INDEX i1 (a=?)} |
381 } | 389 } |
382 | 390 |
383 # EVIDENCE-OF: R-62228-34103 sqlite> CREATE INDEX i2 ON t1(a, b); | 391 # EVIDENCE-OF: R-21179-11011 sqlite> CREATE INDEX i2 ON t1(a, b); |
384 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; | 392 # sqlite> EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; |
385 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 393 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
| 394 # |
386 do_execsql_test 5.3.0 { CREATE INDEX i2 ON t1(a, b) } | 395 do_execsql_test 5.3.0 { CREATE INDEX i2 ON t1(a, b) } |
387 det 5.3.1 "SELECT a, b FROM t1 WHERE a=1" { | 396 det 5.3.1 "SELECT a, b FROM t1 WHERE a=1" { |
388 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 397 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
389 } | 398 } |
390 | 399 |
391 # EVIDENCE-OF: R-22253-05302 sqlite> EXPLAIN QUERY PLAN SELECT t1.*, | 400 # EVIDENCE-OF: R-09991-48941 sqlite> EXPLAIN QUERY PLAN |
392 # t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2; 0|0|0|SEARCH TABLE t1 | 401 # SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2; |
393 # USING COVERING INDEX i2 (a=? AND b>?) (~3 rows) 0|1|1|SCAN TABLE t2 | 402 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) |
394 # (~1000000 rows) | 403 # 0|1|1|SCAN TABLE t2 |
395 do_execsql_test 5.4.0 {CREATE TABLE t2(c, d)} | 404 # |
396 det 5.4.1 "SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2" { | 405 do_execsql_test 5.4.0 {CREATE TABLE t2(c INT, d INT, ex TEXT)} |
397 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) (~2 rows)} | 406 det 5.4.1 "SELECT t1.a, t2.c FROM t1, t2 WHERE t1.a=1 AND t1.b>2" { |
398 0 1 1 {SCAN TABLE t2 (~1000000 rows)} | 407 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?)} |
| 408 0 1 1 {SCAN TABLE t2} |
399 } | 409 } |
400 | 410 |
401 # EVIDENCE-OF: R-21040-07025 sqlite> EXPLAIN QUERY PLAN SELECT t1.*, | 411 # EVIDENCE-OF: R-33626-61085 sqlite> EXPLAIN QUERY PLAN |
402 # t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2; 0|0|1|SEARCH TABLE t1 | 412 # SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2; |
403 # USING COVERING INDEX i2 (a=? AND b>?) (~3 rows) 0|1|0|SCAN TABLE t2 | 413 # 0|0|1|SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) |
404 # (~1000000 rows) | 414 # 0|1|0|SCAN TABLE t2 |
405 det 5.5 "SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2" { | 415 # |
406 0 0 1 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?) (~2 rows)} | 416 det 5.5 "SELECT t1.a, t2.c FROM t2, t1 WHERE t1.a=1 AND t1.b>2" { |
407 0 1 0 {SCAN TABLE t2 (~1000000 rows)} | 417 0 0 1 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=? AND b>?)} |
| 418 0 1 0 {SCAN TABLE t2} |
408 } | 419 } |
409 | 420 |
410 # EVIDENCE-OF: R-39007-61103 sqlite> CREATE INDEX i3 ON t1(b); | 421 # EVIDENCE-OF: R-04002-25654 sqlite> CREATE INDEX i3 ON t1(b); |
411 # sqlite> EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2; | 422 # sqlite> EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2; |
412 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 423 # 0|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
413 # 0|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows) | 424 # 0|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) |
| 425 # |
414 do_execsql_test 5.5.0 {CREATE INDEX i3 ON t1(b)} | 426 do_execsql_test 5.5.0 {CREATE INDEX i3 ON t1(b)} |
415 det 5.6.1 "SELECT * FROM t1 WHERE a=1 OR b=2" { | 427 det 5.6.1 "SELECT a, b FROM t1 WHERE a=1 OR b=2" { |
416 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 428 0 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
417 0 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows)} | 429 0 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?)} |
418 } | 430 } |
419 | 431 |
420 # EVIDENCE-OF: R-33025-54904 sqlite> EXPLAIN QUERY PLAN SELECT c, d | 432 # EVIDENCE-OF: R-24577-38891 sqlite> EXPLAIN QUERY PLAN |
421 # FROM t2 ORDER BY c; 0|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|USE TEMP | 433 # SELECT c, d FROM t2 ORDER BY c; |
422 # B-TREE FOR ORDER BY | 434 # 0|0|0|SCAN TABLE t2 |
| 435 # 0|0|0|USE TEMP B-TREE FOR ORDER BY |
| 436 # |
423 det 5.7 "SELECT c, d FROM t2 ORDER BY c" { | 437 det 5.7 "SELECT c, d FROM t2 ORDER BY c" { |
424 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 438 0 0 0 {SCAN TABLE t2} |
425 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 439 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
426 } | 440 } |
427 | 441 |
428 # EVIDENCE-OF: R-38854-22809 sqlite> CREATE INDEX i4 ON t2(c); | 442 # EVIDENCE-OF: R-58157-12355 sqlite> CREATE INDEX i4 ON t2(c); |
429 # sqlite> EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; | 443 # sqlite> EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; |
430 # 0|0|0|SCAN TABLE t2 USING INDEX i4 (~1000000 rows) | 444 # 0|0|0|SCAN TABLE t2 USING INDEX i4 |
| 445 # |
431 do_execsql_test 5.8.0 {CREATE INDEX i4 ON t2(c)} | 446 do_execsql_test 5.8.0 {CREATE INDEX i4 ON t2(c)} |
432 det 5.8.1 "SELECT c, d FROM t2 ORDER BY c" { | 447 det 5.8.1 "SELECT c, d FROM t2 ORDER BY c" { |
433 0 0 0 {SCAN TABLE t2 USING INDEX i4 (~1000000 rows)} | 448 0 0 0 {SCAN TABLE t2 USING INDEX i4} |
434 } | 449 } |
435 | 450 |
436 # EVIDENCE-OF: R-29884-43993 sqlite> EXPLAIN QUERY PLAN SELECT | 451 # EVIDENCE-OF: R-13931-10421 sqlite> EXPLAIN QUERY PLAN SELECT |
437 # (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2; | 452 # (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2; |
438 # 0|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|EXECUTE SCALAR SUBQUERY 1 | 453 # 0|0|0|SCAN TABLE t2 |
439 # 1|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows) | 454 # 0|0|0|EXECUTE SCALAR SUBQUERY 1 |
440 # 0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2 2|0|0|SEARCH TABLE t1 USING | 455 # 1|0|0|SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) |
441 # INDEX i3 (b=?) (~10 rows) | 456 # 0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2 |
| 457 # 2|0|0|SEARCH TABLE t1 USING INDEX i3 (b=?) |
| 458 # |
442 det 5.9 { | 459 det 5.9 { |
443 SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2 | 460 SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2 |
444 } { | 461 } { |
445 0 0 0 {SCAN TABLE t2 (~1000000 rows)} | 462 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i4} |
446 0 0 0 {EXECUTE SCALAR SUBQUERY 1} | 463 0 0 0 {EXECUTE SCALAR SUBQUERY 1} |
447 1 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?) (~10 rows)} | 464 1 0 0 {SEARCH TABLE t1 USING COVERING INDEX i2 (a=?)} |
448 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 2} | 465 0 0 0 {EXECUTE CORRELATED SCALAR SUBQUERY 2} |
449 2 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?) (~10 rows)} | 466 2 0 0 {SEARCH TABLE t1 USING INDEX i3 (b=?)} |
450 } | 467 } |
451 | 468 |
452 # EVIDENCE-OF: R-17911-16445 sqlite> EXPLAIN QUERY PLAN SELECT | 469 # EVIDENCE-OF: R-50892-45943 sqlite> EXPLAIN QUERY PLAN |
453 # count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x; | 470 # SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x; |
454 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows) 0|0|0|SCAN | 471 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 |
455 # SUBQUERY 1 (~1000000 rows) 0|0|0|USE TEMP B-TREE FOR GROUP BY | 472 # 0|0|0|SCAN SUBQUERY 1 |
| 473 # 0|0|0|USE TEMP B-TREE FOR GROUP BY |
| 474 # |
456 det 5.10 { | 475 det 5.10 { |
457 SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x | 476 SELECT count(*) FROM (SELECT max(b) AS x FROM t1 GROUP BY a) GROUP BY x |
458 } { | 477 } { |
459 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows)} | 478 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2} |
460 0 0 0 {SCAN SUBQUERY 1 (~100 rows)} | 479 0 0 0 {SCAN SUBQUERY 1} |
461 0 0 0 {USE TEMP B-TREE FOR GROUP BY} | 480 0 0 0 {USE TEMP B-TREE FOR GROUP BY} |
462 } | 481 } |
463 | 482 |
464 # EVIDENCE-OF: R-18544-33103 sqlite> EXPLAIN QUERY PLAN SELECT * FROM | 483 # EVIDENCE-OF: R-46219-33846 sqlite> EXPLAIN QUERY PLAN |
465 # (SELECT * FROM t2 WHERE c=1), t1; 0|0|0|SEARCH TABLE t2 USING INDEX i4 | 484 # SELECT * FROM (SELECT * FROM t2 WHERE c=1), t1; |
466 # (c=?) (~10 rows) 0|1|1|SCAN TABLE t1 (~1000000 rows) | 485 # 0|0|0|SEARCH TABLE t2 USING INDEX i4 (c=?) |
467 det 5.11 "SELECT * FROM (SELECT * FROM t2 WHERE c=1), t1" { | 486 # 0|1|1|SCAN TABLE t1 |
468 0 0 0 {SEARCH TABLE t2 USING INDEX i4 (c=?) (~10 rows)} | 487 # |
469 0 1 1 {SCAN TABLE t1 (~1000000 rows)} | 488 det 5.11 "SELECT a, b FROM (SELECT * FROM t2 WHERE c=1), t1" { |
| 489 0 0 0 {SEARCH TABLE t2 USING INDEX i4 (c=?)} |
| 490 0 1 1 {SCAN TABLE t1 USING COVERING INDEX i2} |
470 } | 491 } |
471 | 492 |
472 # EVIDENCE-OF: R-40701-42164 sqlite> EXPLAIN QUERY PLAN SELECT a FROM | 493 # EVIDENCE-OF: R-37879-39987 sqlite> EXPLAIN QUERY PLAN |
473 # t1 UNION SELECT c FROM t2; 1|0|0|SCAN TABLE t1 (~1000000 rows) | 494 # SELECT a FROM t1 UNION SELECT c FROM t2; |
474 # 2|0|0|SCAN TABLE t2 (~1000000 rows) 0|0|0|COMPOUND SUBQUERIES 1 AND 2 | 495 # 1|0|0|SCAN TABLE t1 |
475 # USING TEMP B-TREE (UNION) | 496 # 2|0|0|SCAN TABLE t2 |
476 det 5.12 "SELECT a FROM t1 UNION SELECT c FROM t2" { | 497 # 0|0|0|COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION) |
477 1 0 0 {SCAN TABLE t1 (~1000000 rows)} | 498 # |
478 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 499 det 5.12 "SELECT a,b FROM t1 UNION SELECT c, 99 FROM t2" { |
| 500 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2} |
| 501 2 0 0 {SCAN TABLE t2 USING COVERING INDEX i4} |
479 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} | 502 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 USING TEMP B-TREE (UNION)} |
480 } | 503 } |
481 | 504 |
482 # EVIDENCE-OF: R-61538-24748 sqlite> EXPLAIN QUERY PLAN SELECT a FROM | 505 # EVIDENCE-OF: R-44864-63011 sqlite> EXPLAIN QUERY PLAN |
483 # t1 EXCEPT SELECT d FROM t2 ORDER BY 1; 1|0|0|SCAN TABLE t1 USING | 506 # SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1; |
484 # COVERING INDEX i2 (~1000000 rows) 2|0|0|SCAN TABLE t2 (~1000000 rows) | 507 # 1|0|0|SCAN TABLE t1 USING COVERING INDEX i2 |
485 # 2|0|0|USE TEMP B-TREE FOR ORDER BY 0|0|0|COMPOUND SUBQUERIES 1 AND 2 | 508 # 2|0|0|SCAN TABLE t2 2|0|0|USE TEMP B-TREE FOR ORDER BY |
486 # (EXCEPT) | 509 # 0|0|0|COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) |
| 510 # |
487 det 5.13 "SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1" { | 511 det 5.13 "SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1" { |
488 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows)} | 512 1 0 0 {SCAN TABLE t1 USING COVERING INDEX i1} |
489 2 0 0 {SCAN TABLE t2 (~1000000 rows)} | 513 2 0 0 {SCAN TABLE t2} |
490 2 0 0 {USE TEMP B-TREE FOR ORDER BY} | 514 2 0 0 {USE TEMP B-TREE FOR ORDER BY} |
491 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} | 515 0 0 0 {COMPOUND SUBQUERIES 1 AND 2 (EXCEPT)} |
492 } | 516 } |
493 | 517 |
494 | 518 |
495 #------------------------------------------------------------------------- | 519 #------------------------------------------------------------------------- |
496 # The following tests - eqp-6.* - test that the example C code on | 520 # The following tests - eqp-6.* - test that the example C code on |
497 # documentation page eqp.html works. The C code is duplicated in test1.c | 521 # documentation page eqp.html works. The C code is duplicated in test1.c |
498 # and wrapped in Tcl command [print_explain_query_plan] | 522 # and wrapped in Tcl command [print_explain_query_plan] |
499 # | 523 # |
(...skipping 17 matching lines...) Expand all Loading... |
517 | 541 |
518 uplevel do_test $tn [list { | 542 uplevel do_test $tn [list { |
519 set fd [open "|[info nameofexec] script.tcl"] | 543 set fd [open "|[info nameofexec] script.tcl"] |
520 set data [read $fd] | 544 set data [read $fd] |
521 close $fd | 545 close $fd |
522 set data | 546 set data |
523 }] [list $res] | 547 }] [list $res] |
524 } | 548 } |
525 | 549 |
526 do_peqp_test 6.1 { | 550 do_peqp_test 6.1 { |
527 SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1 | 551 SELECT a, b FROM t1 EXCEPT SELECT d, 99 FROM t2 ORDER BY 1 |
528 } [string trimleft { | 552 } [string trimleft { |
529 1 0 0 SCAN TABLE t1 USING COVERING INDEX i2 (~1000000 rows) | 553 1 0 0 SCAN TABLE t1 USING COVERING INDEX i2 |
530 2 0 0 SCAN TABLE t2 (~1000000 rows) | 554 2 0 0 SCAN TABLE t2 |
531 2 0 0 USE TEMP B-TREE FOR ORDER BY | 555 2 0 0 USE TEMP B-TREE FOR ORDER BY |
532 0 0 0 COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) | 556 0 0 0 COMPOUND SUBQUERIES 1 AND 2 (EXCEPT) |
533 }] | 557 }] |
534 | 558 |
535 #------------------------------------------------------------------------- | 559 #------------------------------------------------------------------------- |
536 # The following tests - eqp-7.* - test that queries that use the OP_Count | 560 # The following tests - eqp-7.* - test that queries that use the OP_Count |
537 # optimization return something sensible with EQP. | 561 # optimization return something sensible with EQP. |
538 # | 562 # |
539 drop_all_tables | 563 drop_all_tables |
540 | 564 |
541 do_execsql_test 7.0 { | 565 do_execsql_test 7.0 { |
542 CREATE TABLE t1(a, b); | 566 CREATE TABLE t1(a INT, b INT, ex CHAR(100)); |
543 CREATE TABLE t2(a, b); | 567 CREATE TABLE t2(a INT, b INT, ex CHAR(100)); |
544 CREATE INDEX i1 ON t2(a); | 568 CREATE INDEX i1 ON t2(a); |
545 } | 569 } |
546 | 570 |
547 det 7.1 "SELECT count(*) FROM t1" { | 571 det 7.1 "SELECT count(*) FROM t1" { |
548 0 0 0 {SCAN TABLE t1 (~1000000 rows)} | 572 0 0 0 {SCAN TABLE t1} |
549 } | 573 } |
550 | 574 |
551 det 7.2 "SELECT count(*) FROM t2" { | 575 det 7.2 "SELECT count(*) FROM t2" { |
552 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1(~1000000 rows)} | 576 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} |
553 } | 577 } |
554 | 578 |
555 do_execsql_test 7.3 { | 579 do_execsql_test 7.3 { |
556 INSERT INTO t1 VALUES(1, 2); | 580 INSERT INTO t1(a,b) VALUES(1, 2); |
557 INSERT INTO t1 VALUES(3, 4); | 581 INSERT INTO t1(a,b) VALUES(3, 4); |
558 | 582 |
559 INSERT INTO t2 VALUES(1, 2); | 583 INSERT INTO t2(a,b) VALUES(1, 2); |
560 INSERT INTO t2 VALUES(3, 4); | 584 INSERT INTO t2(a,b) VALUES(3, 4); |
561 INSERT INTO t2 VALUES(5, 6); | 585 INSERT INTO t2(a,b) VALUES(5, 6); |
562 | 586 |
563 ANALYZE; | 587 ANALYZE; |
564 } | 588 } |
565 | 589 |
566 db close | 590 db close |
567 sqlite3 db test.db | 591 sqlite3 db test.db |
568 | 592 |
569 det 7.4 "SELECT count(*) FROM t1" { | 593 det 7.4 "SELECT count(*) FROM t1" { |
570 0 0 0 {SCAN TABLE t1 (~2 rows)} | 594 0 0 0 {SCAN TABLE t1} |
571 } | 595 } |
572 | 596 |
573 det 7.5 "SELECT count(*) FROM t2" { | 597 det 7.5 "SELECT count(*) FROM t2" { |
574 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1(~3 rows)} | 598 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} |
| 599 } |
| 600 |
| 601 #------------------------------------------------------------------------- |
| 602 # The following tests - eqp-8.* - test that queries that use the OP_Count |
| 603 # optimization return something sensible with EQP. |
| 604 # |
| 605 drop_all_tables |
| 606 |
| 607 do_execsql_test 8.0 { |
| 608 CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; |
| 609 CREATE TABLE t2(a, b, c); |
| 610 } |
| 611 |
| 612 det 8.1.1 "SELECT * FROM t2" { |
| 613 0 0 0 {SCAN TABLE t2} |
| 614 } |
| 615 |
| 616 det 8.1.2 "SELECT * FROM t2 WHERE rowid=?" { |
| 617 0 0 0 {SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)} |
| 618 } |
| 619 |
| 620 det 8.1.3 "SELECT count(*) FROM t2" { |
| 621 0 0 0 {SCAN TABLE t2} |
| 622 } |
| 623 |
| 624 det 8.2.1 "SELECT * FROM t1" { |
| 625 0 0 0 {SCAN TABLE t1} |
| 626 } |
| 627 |
| 628 det 8.2.2 "SELECT * FROM t1 WHERE b=?" { |
| 629 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=?)} |
| 630 } |
| 631 |
| 632 det 8.2.3 "SELECT * FROM t1 WHERE b=? AND c=?" { |
| 633 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=? AND c=?)} |
| 634 } |
| 635 |
| 636 det 8.2.4 "SELECT count(*) FROM t1" { |
| 637 0 0 0 {SCAN TABLE t1} |
575 } | 638 } |
576 | 639 |
577 | 640 |
| 641 |
| 642 |
| 643 |
| 644 |
| 645 |
578 finish_test | 646 finish_test |
OLD | NEW |