OLD | NEW |
1 # 2006 January 31 | 1 # 2006 January 31 |
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 #*********************************************************************** |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 } | 96 } |
97 } [explain_no_trace { | 97 } [explain_no_trace { |
98 SELECT parent1.parent1key, child1.value, child2.value | 98 SELECT parent1.parent1key, child1.value, child2.value |
99 FROM parent1 | 99 FROM parent1 |
100 LEFT OUTER JOIN child1 ON parent1.child1key = child1.child1key | 100 LEFT OUTER JOIN child1 ON parent1.child1key = child1.child1key |
101 INNER JOIN child2 ON child2.child2key = parent1.child2key; | 101 INNER JOIN child2 ON child2.child2key = parent1.child2key; |
102 }] | 102 }] |
103 } | 103 } |
104 | 104 |
105 # This procedure executes the SQL. Then it appends | 105 # This procedure executes the SQL. Then it appends |
106 # the ::sqlite_query_plan variable. | 106 # the names of the table and index used |
107 # | 107 # |
108 proc queryplan {sql} { | 108 proc queryplan {sql} { |
109 set ::sqlite_sort_count 0 | 109 set ::sqlite_sort_count 0 |
110 set data [execsql $sql] | 110 set data [execsql $sql] |
111 return [concat $data $::sqlite_query_plan] | 111 set eqp [execsql "EXPLAIN QUERY PLAN $sql"] |
| 112 # puts eqp=$eqp |
| 113 foreach {a b c x} $eqp { |
| 114 if {[regexp { TABLE (\w+ AS )?(\w+) USING.* INDEX (\w+)\y} \ |
| 115 $x all as tab idx]} { |
| 116 lappend data $tab $idx |
| 117 } elseif {[regexp { TABLE (\w+ AS )?(\w+)\y} $x all as tab]} { |
| 118 lappend data $tab * |
| 119 } |
| 120 } |
| 121 return $data |
112 } | 122 } |
113 | 123 |
114 | 124 |
115 # If you have a from clause of the form: A B C left join D | 125 # If you have a from clause of the form: A B C left join D |
116 # then make sure the query optimizer is able to reorder the | 126 # then make sure the query optimizer is able to reorder the |
117 # A B C part anyway it wants. | 127 # A B C part anyway it wants. |
118 # | 128 # |
119 # Following the fix to ticket #1652, there was a time when | 129 # Following the fix to ticket #1652, there was a time when |
120 # the C table would not reorder. So the following reorderings | 130 # the C table would not reorder. So the following reorderings |
121 # were possible: | 131 # were possible: |
(...skipping 15 matching lines...) Expand all Loading... |
137 execsql { | 147 execsql { |
138 CREATE TABLE tA(apk integer primary key, ax); | 148 CREATE TABLE tA(apk integer primary key, ax); |
139 CREATE TABLE tB(bpk integer primary key, bx); | 149 CREATE TABLE tB(bpk integer primary key, bx); |
140 CREATE TABLE tC(cpk integer primary key, cx); | 150 CREATE TABLE tC(cpk integer primary key, cx); |
141 CREATE TABLE tD(dpk integer primary key, dx); | 151 CREATE TABLE tD(dpk integer primary key, dx); |
142 } | 152 } |
143 queryplan { | 153 queryplan { |
144 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 154 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
145 WHERE cpk=bx AND bpk=ax | 155 WHERE cpk=bx AND bpk=ax |
146 } | 156 } |
147 } {tA {} tB * tC * tD *} | 157 } {tA * tB * tC * tD *} |
148 do_test where3-2.1.1 { | 158 do_test where3-2.1.1 { |
149 queryplan { | 159 queryplan { |
150 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk | 160 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk |
151 WHERE cpk=bx AND bpk=ax | 161 WHERE cpk=bx AND bpk=ax |
152 } | 162 } |
153 } {tA {} tB * tC * tD *} | 163 } {tA * tB * tC * tD *} |
154 do_test where3-2.1.2 { | 164 do_test where3-2.1.2 { |
155 queryplan { | 165 queryplan { |
156 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk | 166 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk |
157 WHERE bx=cpk AND bpk=ax | 167 WHERE bx=cpk AND bpk=ax |
158 } | 168 } |
159 } {tA {} tB * tC * tD *} | 169 } {tA * tB * tC * tD *} |
160 do_test where3-2.1.3 { | 170 do_test where3-2.1.3 { |
161 queryplan { | 171 queryplan { |
162 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk | 172 SELECT * FROM tA, tB, tC LEFT JOIN tD ON cx=dpk |
163 WHERE bx=cpk AND ax=bpk | 173 WHERE bx=cpk AND ax=bpk |
164 } | 174 } |
165 } {tA {} tB * tC * tD *} | 175 } {tA * tB * tC * tD *} |
166 do_test where3-2.1.4 { | 176 do_test where3-2.1.4 { |
167 queryplan { | 177 queryplan { |
168 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 178 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
169 WHERE bx=cpk AND ax=bpk | 179 WHERE bx=cpk AND ax=bpk |
170 } | 180 } |
171 } {tA {} tB * tC * tD *} | 181 } {tA * tB * tC * tD *} |
172 do_test where3-2.1.5 { | 182 do_test where3-2.1.5 { |
173 queryplan { | 183 queryplan { |
174 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 184 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
175 WHERE cpk=bx AND ax=bpk | 185 WHERE cpk=bx AND ax=bpk |
176 } | 186 } |
177 } {tA {} tB * tC * tD *} | 187 } {tA * tB * tC * tD *} |
178 do_test where3-2.2 { | 188 do_test where3-2.2 { |
179 queryplan { | 189 queryplan { |
180 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 190 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
181 WHERE cpk=bx AND apk=bx | 191 WHERE cpk=bx AND apk=bx |
182 } | 192 } |
183 } {tB {} tA * tC * tD *} | 193 } {tB * tA * tC * tD *} |
184 do_test where3-2.3 { | 194 do_test where3-2.3 { |
185 queryplan { | 195 queryplan { |
186 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 196 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
187 WHERE cpk=bx AND apk=bx | 197 WHERE cpk=bx AND apk=bx |
188 } | 198 } |
189 } {tB {} tA * tC * tD *} | 199 } {tB * tA * tC * tD *} |
190 do_test where3-2.4 { | 200 do_test where3-2.4 { |
191 queryplan { | 201 queryplan { |
192 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 202 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
193 WHERE apk=cx AND bpk=ax | 203 WHERE apk=cx AND bpk=ax |
194 } | 204 } |
195 } {tC {} tA * tB * tD *} | 205 } {tC * tA * tB * tD *} |
196 do_test where3-2.5 { | 206 do_test where3-2.5 { |
197 queryplan { | 207 queryplan { |
198 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 208 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
199 WHERE cpk=ax AND bpk=cx | 209 WHERE cpk=ax AND bpk=cx |
200 } | 210 } |
201 } {tA {} tC * tB * tD *} | 211 } {tA * tC * tB * tD *} |
202 do_test where3-2.6 { | 212 do_test where3-2.6 { |
203 queryplan { | 213 queryplan { |
204 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 214 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
205 WHERE bpk=cx AND apk=bx | 215 WHERE bpk=cx AND apk=bx |
206 } | 216 } |
207 } {tC {} tB * tA * tD *} | 217 } {tC * tB * tA * tD *} |
208 do_test where3-2.7 { | 218 do_test where3-2.7 { |
209 queryplan { | 219 queryplan { |
210 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx | 220 SELECT * FROM tA, tB, tC LEFT JOIN tD ON dpk=cx |
211 WHERE cpk=bx AND apk=cx | 221 WHERE cpk=bx AND apk=cx |
212 } | 222 } |
213 } {tB {} tC * tA * tD *} | 223 } {tB * tC * tA * tD *} |
214 | 224 |
215 # Ticket [13f033c865f878953] | 225 # Ticket [13f033c865f878953] |
216 # If the outer loop must be a full table scan, do not let ANALYZE trick | 226 # If the outer loop must be a full table scan, do not let ANALYZE trick |
217 # the planner into use a table for the outer loop that might be indexable | 227 # the planner into use a table for the outer loop that might be indexable |
218 # if held until an inner loop. | 228 # if held until an inner loop. |
219 # | 229 # |
220 do_execsql_test where3-3.0 { | 230 do_execsql_test where3-3.0 { |
221 CREATE TABLE t301(a INTEGER PRIMARY KEY,b,c); | 231 CREATE TABLE t301(a INTEGER PRIMARY KEY,b,c); |
222 CREATE INDEX t301c ON t301(c); | 232 CREATE INDEX t301c ON t301(c); |
223 INSERT INTO t301 VALUES(1,2,3); | 233 INSERT INTO t301 VALUES(1,2,3); |
| 234 INSERT INTO t301 VALUES(2,2,3); |
224 CREATE TABLE t302(x, y); | 235 CREATE TABLE t302(x, y); |
225 INSERT INTO t302 VALUES(4,5); | 236 INSERT INTO t302 VALUES(4,5); |
226 ANALYZE; | 237 ANALYZE; |
227 explain query plan SELECT * FROM t302, t301 WHERE t302.x=5 AND t301.a=t302.y; | 238 explain query plan SELECT * FROM t302, t301 WHERE t302.x=5 AND t301.a=t302.y; |
228 } { | 239 } { |
229 0 0 0 {SCAN TABLE t302 (~1 rows)} | 240 0 0 0 {SCAN TABLE t302} |
230 0 1 1 {SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 241 0 1 1 {SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)} |
231 } | 242 } |
232 do_execsql_test where3-3.1 { | 243 do_execsql_test where3-3.1 { |
233 explain query plan | 244 explain query plan |
234 SELECT * FROM t301, t302 WHERE t302.x=5 AND t301.a=t302.y; | 245 SELECT * FROM t301, t302 WHERE t302.x=5 AND t301.a=t302.y; |
235 } { | 246 } { |
236 0 0 1 {SCAN TABLE t302 (~1 rows)} | 247 0 0 1 {SCAN TABLE t302} |
237 0 1 0 {SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 248 0 1 0 {SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?)} |
238 } | 249 } |
| 250 do_execsql_test where3-3.2 { |
| 251 SELECT * FROM t301 WHERE c=3 AND a IS NULL; |
| 252 } {} |
| 253 do_execsql_test where3-3.3 { |
| 254 SELECT * FROM t301 WHERE c=3 AND a IS NOT NULL; |
| 255 } {1 2 3 2 2 3} |
239 | 256 |
| 257 if 0 { # Query planner no longer does this |
240 # Verify that when there are multiple tables in a join which must be | 258 # Verify that when there are multiple tables in a join which must be |
241 # full table scans that the query planner attempts put the table with | 259 # full table scans that the query planner attempts put the table with |
242 # the fewest number of output rows as the outer loop. | 260 # the fewest number of output rows as the outer loop. |
243 # | 261 # |
244 do_execsql_test where3-4.0 { | 262 do_execsql_test where3-4.0 { |
245 CREATE TABLE t400(a INTEGER PRIMARY KEY, b, c); | 263 CREATE TABLE t400(a INTEGER PRIMARY KEY, b, c); |
246 CREATE TABLE t401(p INTEGER PRIMARY KEY, q, r); | 264 CREATE TABLE t401(p INTEGER PRIMARY KEY, q, r); |
247 CREATE TABLE t402(x INTEGER PRIMARY KEY, y, z); | 265 CREATE TABLE t402(x INTEGER PRIMARY KEY, y, z); |
248 EXPLAIN QUERY PLAN | 266 EXPLAIN QUERY PLAN |
249 SELECT * FROM t400, t401, t402 WHERE t402.z GLOB 'abc*'; | 267 SELECT * FROM t400, t401, t402 WHERE t402.z GLOB 'abc*'; |
250 } { | 268 } { |
251 0 0 2 {SCAN TABLE t402 (~500000 rows)} | 269 0 0 2 {SCAN TABLE t402} |
252 0 1 0 {SCAN TABLE t400 (~1000000 rows)} | 270 0 1 0 {SCAN TABLE t400} |
253 0 2 1 {SCAN TABLE t401 (~1000000 rows)} | 271 0 2 1 {SCAN TABLE t401} |
254 } | 272 } |
255 do_execsql_test where3-4.1 { | 273 do_execsql_test where3-4.1 { |
256 EXPLAIN QUERY PLAN | 274 EXPLAIN QUERY PLAN |
257 SELECT * FROM t400, t401, t402 WHERE t401.r GLOB 'abc*'; | 275 SELECT * FROM t400, t401, t402 WHERE t401.r GLOB 'abc*'; |
258 } { | 276 } { |
259 0 0 1 {SCAN TABLE t401 (~500000 rows)} | 277 0 0 1 {SCAN TABLE t401} |
260 0 1 0 {SCAN TABLE t400 (~1000000 rows)} | 278 0 1 0 {SCAN TABLE t400} |
261 0 2 2 {SCAN TABLE t402 (~1000000 rows)} | 279 0 2 2 {SCAN TABLE t402} |
262 } | 280 } |
263 do_execsql_test where3-4.2 { | 281 do_execsql_test where3-4.2 { |
264 EXPLAIN QUERY PLAN | 282 EXPLAIN QUERY PLAN |
265 SELECT * FROM t400, t401, t402 WHERE t400.c GLOB 'abc*'; | 283 SELECT * FROM t400, t401, t402 WHERE t400.c GLOB 'abc*'; |
266 } { | 284 } { |
267 0 0 0 {SCAN TABLE t400 (~500000 rows)} | 285 0 0 0 {SCAN TABLE t400} |
268 0 1 1 {SCAN TABLE t401 (~1000000 rows)} | 286 0 1 1 {SCAN TABLE t401} |
269 0 2 2 {SCAN TABLE t402 (~1000000 rows)} | 287 0 2 2 {SCAN TABLE t402} |
270 } | 288 } |
| 289 } ;# endif |
271 | 290 |
272 # Verify that a performance regression encountered by firefox | 291 # Verify that a performance regression encountered by firefox |
273 # has been fixed. | 292 # has been fixed. |
274 # | 293 # |
275 do_execsql_test where3-5.0 { | 294 do_execsql_test where3-5.0 { |
276 CREATE TABLE aaa (id INTEGER PRIMARY KEY, type INTEGER, | 295 CREATE TABLE aaa (id INTEGER PRIMARY KEY, type INTEGER, |
277 fk INTEGER DEFAULT NULL, parent INTEGER, | 296 fk INTEGER DEFAULT NULL, parent INTEGER, |
278 position INTEGER, title LONGVARCHAR, | 297 position INTEGER, title LONGVARCHAR, |
279 keyword_id INTEGER, folder_type TEXT, | 298 keyword_id INTEGER, folder_type TEXT, |
280 dateAdded INTEGER, lastModified INTEGER); | 299 dateAdded INTEGER, lastModified INTEGER); |
(...skipping 10 matching lines...) Expand all Loading... |
291 CREATE INDEX bbb_333 ON bbb (fk, lastModified); | 310 CREATE INDEX bbb_333 ON bbb (fk, lastModified); |
292 | 311 |
293 EXPLAIN QUERY PLAN | 312 EXPLAIN QUERY PLAN |
294 SELECT bbb.title AS tag_title | 313 SELECT bbb.title AS tag_title |
295 FROM aaa JOIN bbb ON bbb.id = aaa.parent | 314 FROM aaa JOIN bbb ON bbb.id = aaa.parent |
296 WHERE aaa.fk = 'constant' | 315 WHERE aaa.fk = 'constant' |
297 AND LENGTH(bbb.title) > 0 | 316 AND LENGTH(bbb.title) > 0 |
298 AND bbb.parent = 4 | 317 AND bbb.parent = 4 |
299 ORDER BY bbb.title COLLATE NOCASE ASC; | 318 ORDER BY bbb.title COLLATE NOCASE ASC; |
300 } { | 319 } { |
301 0 0 0 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?) (~10 rows)} | 320 0 0 0 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?)} |
302 0 1 1 {SEARCH TABLE bbb USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 321 0 1 1 {SEARCH TABLE bbb USING INTEGER PRIMARY KEY (rowid=?)} |
303 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 322 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
304 } | 323 } |
305 do_execsql_test where3-5.1 { | 324 do_execsql_test where3-5.1 { |
306 EXPLAIN QUERY PLAN | 325 EXPLAIN QUERY PLAN |
307 SELECT bbb.title AS tag_title | 326 SELECT bbb.title AS tag_title |
308 FROM aaa JOIN aaa AS bbb ON bbb.id = aaa.parent | 327 FROM aaa JOIN aaa AS bbb ON bbb.id = aaa.parent |
309 WHERE aaa.fk = 'constant' | 328 WHERE aaa.fk = 'constant' |
310 AND LENGTH(bbb.title) > 0 | 329 AND LENGTH(bbb.title) > 0 |
311 AND bbb.parent = 4 | 330 AND bbb.parent = 4 |
312 ORDER BY bbb.title COLLATE NOCASE ASC; | 331 ORDER BY bbb.title COLLATE NOCASE ASC; |
313 } { | 332 } { |
314 0 0 0 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?) (~10 rows)} | 333 0 0 0 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?)} |
315 0 1 1 {SEARCH TABLE aaa AS bbb USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 334 0 1 1 {SEARCH TABLE aaa AS bbb USING INTEGER PRIMARY KEY (rowid=?)} |
316 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 335 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
317 } | 336 } |
318 do_execsql_test where3-5.2 { | 337 do_execsql_test where3-5.2 { |
319 EXPLAIN QUERY PLAN | 338 EXPLAIN QUERY PLAN |
320 SELECT bbb.title AS tag_title | 339 SELECT bbb.title AS tag_title |
321 FROM bbb JOIN aaa ON bbb.id = aaa.parent | 340 FROM bbb JOIN aaa ON bbb.id = aaa.parent |
322 WHERE aaa.fk = 'constant' | 341 WHERE aaa.fk = 'constant' |
323 AND LENGTH(bbb.title) > 0 | 342 AND LENGTH(bbb.title) > 0 |
324 AND bbb.parent = 4 | 343 AND bbb.parent = 4 |
325 ORDER BY bbb.title COLLATE NOCASE ASC; | 344 ORDER BY bbb.title COLLATE NOCASE ASC; |
326 } { | 345 } { |
327 0 0 1 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?) (~10 rows)} | 346 0 0 1 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?)} |
328 0 1 0 {SEARCH TABLE bbb USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 347 0 1 0 {SEARCH TABLE bbb USING INTEGER PRIMARY KEY (rowid=?)} |
329 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 348 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
330 } | 349 } |
331 do_execsql_test where3-5.3 { | 350 do_execsql_test where3-5.3 { |
332 EXPLAIN QUERY PLAN | 351 EXPLAIN QUERY PLAN |
333 SELECT bbb.title AS tag_title | 352 SELECT bbb.title AS tag_title |
334 FROM aaa AS bbb JOIN aaa ON bbb.id = aaa.parent | 353 FROM aaa AS bbb JOIN aaa ON bbb.id = aaa.parent |
335 WHERE aaa.fk = 'constant' | 354 WHERE aaa.fk = 'constant' |
336 AND LENGTH(bbb.title) > 0 | 355 AND LENGTH(bbb.title) > 0 |
337 AND bbb.parent = 4 | 356 AND bbb.parent = 4 |
338 ORDER BY bbb.title COLLATE NOCASE ASC; | 357 ORDER BY bbb.title COLLATE NOCASE ASC; |
339 } { | 358 } { |
340 0 0 1 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?) (~10 rows)} | 359 0 0 1 {SEARCH TABLE aaa USING INDEX aaa_333 (fk=?)} |
341 0 1 0 {SEARCH TABLE aaa AS bbb USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)} | 360 0 1 0 {SEARCH TABLE aaa AS bbb USING INTEGER PRIMARY KEY (rowid=?)} |
342 0 0 0 {USE TEMP B-TREE FOR ORDER BY} | 361 0 0 0 {USE TEMP B-TREE FOR ORDER BY} |
343 } | 362 } |
344 | 363 |
| 364 # Name resolution with NATURAL JOIN and USING |
| 365 # |
| 366 do_test where3-6.setup { |
| 367 db eval { |
| 368 CREATE TABLE t6w(a, w); |
| 369 INSERT INTO t6w VALUES(1, 'w-one'); |
| 370 INSERT INTO t6w VALUES(2, 'w-two'); |
| 371 INSERT INTO t6w VALUES(9, 'w-nine'); |
| 372 CREATE TABLE t6x(a, x); |
| 373 INSERT INTO t6x VALUES(1, 'x-one'); |
| 374 INSERT INTO t6x VALUES(3, 'x-three'); |
| 375 INSERT INTO t6x VALUES(9, 'x-nine'); |
| 376 CREATE TABLE t6y(a, y); |
| 377 INSERT INTO t6y VALUES(1, 'y-one'); |
| 378 INSERT INTO t6y VALUES(4, 'y-four'); |
| 379 INSERT INTO t6y VALUES(9, 'y-nine'); |
| 380 CREATE TABLE t6z(a, z); |
| 381 INSERT INTO t6z VALUES(1, 'z-one'); |
| 382 INSERT INTO t6z VALUES(5, 'z-five'); |
| 383 INSERT INTO t6z VALUES(9, 'z-nine'); |
| 384 } |
| 385 } {} |
| 386 set cnt 0 |
| 387 foreach predicate { |
| 388 {} |
| 389 {ORDER BY a} |
| 390 {ORDER BY t6w.a} |
| 391 {WHERE a>0} |
| 392 {WHERE t6y.a>0} |
| 393 {WHERE a>0 ORDER BY a} |
| 394 } { |
| 395 incr cnt |
| 396 do_test where3-6.$cnt.1 { |
| 397 set sql "SELECT * FROM t6w NATURAL JOIN t6x NATURAL JOIN t6y" |
| 398 append sql " NATURAL JOIN t6z " |
| 399 append sql $::predicate |
| 400 db eval $sql |
| 401 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 402 do_test where3-6.$cnt.2 { |
| 403 set sql "SELECT * FROM t6w JOIN t6x USING(a) JOIN t6y USING(a)" |
| 404 append sql " JOIN t6z USING(a) " |
| 405 append sql $::predicate |
| 406 db eval $sql |
| 407 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 408 do_test where3-6.$cnt.3 { |
| 409 set sql "SELECT * FROM t6w NATURAL JOIN t6x JOIN t6y USING(a)" |
| 410 append sql " JOIN t6z USING(a) " |
| 411 append sql $::predicate |
| 412 db eval $sql |
| 413 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 414 do_test where3-6.$cnt.4 { |
| 415 set sql "SELECT * FROM t6w JOIN t6x USING(a) NATURAL JOIN t6y" |
| 416 append sql " JOIN t6z USING(a) " |
| 417 append sql $::predicate |
| 418 db eval $sql |
| 419 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 420 do_test where3-6.$cnt.5 { |
| 421 set sql "SELECT * FROM t6w JOIN t6x USING(a) JOIN t6y USING(a)" |
| 422 append sql " NATURAL JOIN t6z " |
| 423 append sql $::predicate |
| 424 db eval $sql |
| 425 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 426 do_test where3-6.$cnt.6 { |
| 427 set sql "SELECT * FROM t6w JOIN t6x USING(a) NATURAL JOIN t6y" |
| 428 append sql " NATURAL JOIN t6z " |
| 429 append sql $::predicate |
| 430 db eval $sql |
| 431 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 432 do_test where3-6.$cnt.7 { |
| 433 set sql "SELECT * FROM t6w NATURAL JOIN t6x JOIN t6y USING(a)" |
| 434 append sql " NATURAL JOIN t6z " |
| 435 append sql $::predicate |
| 436 db eval $sql |
| 437 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 438 do_test where3-6.$cnt.8 { |
| 439 set sql "SELECT * FROM t6w NATURAL JOIN t6x NATURAL JOIN t6y" |
| 440 append sql " JOIN t6z USING(a) " |
| 441 append sql $::predicate |
| 442 db eval $sql |
| 443 } {1 w-one x-one y-one z-one 9 w-nine x-nine y-nine z-nine} |
| 444 } |
| 445 |
| 446 do_execsql_test where3-7-setup { |
| 447 CREATE TABLE t71(x1 INTEGER PRIMARY KEY, y1); |
| 448 CREATE TABLE t72(x2 INTEGER PRIMARY KEY, y2); |
| 449 CREATE TABLE t73(x3, y3); |
| 450 CREATE TABLE t74(x4, y4); |
| 451 INSERT INTO t71 VALUES(123,234); |
| 452 INSERT INTO t72 VALUES(234,345); |
| 453 INSERT INTO t73 VALUES(123,234); |
| 454 INSERT INTO t74 VALUES(234,345); |
| 455 INSERT INTO t74 VALUES(234,678); |
| 456 } {} |
| 457 foreach disabled_opt {none omit-noop-join all} { |
| 458 optimization_control db all 1 |
| 459 optimization_control db $disabled_opt 0 |
| 460 do_execsql_test where3-7.$disabled_opt.1 { |
| 461 SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1; |
| 462 } {123} |
| 463 do_execsql_test where3-7.$disabled_opt.2 { |
| 464 SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 WHERE y2 IS NULL; |
| 465 } {} |
| 466 do_execsql_test where3-7.$disabled_opt.3 { |
| 467 SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 WHERE y2 IS NOT NULL; |
| 468 } {123} |
| 469 do_execsql_test where3-7.$disabled_opt.4 { |
| 470 SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 AND y2 IS NULL; |
| 471 } {123} |
| 472 do_execsql_test where3-7.$disabled_opt.5 { |
| 473 SELECT x1 FROM t71 LEFT JOIN t72 ON x2=y1 AND y2 IS NOT NULL; |
| 474 } {123} |
| 475 do_execsql_test where3-7.$disabled_opt.6 { |
| 476 SELECT x3 FROM t73 LEFT JOIN t72 ON x2=y3; |
| 477 } {123} |
| 478 do_execsql_test where3-7.$disabled_opt.7 { |
| 479 SELECT DISTINCT x3 FROM t73 LEFT JOIN t72 ON x2=y3; |
| 480 } {123} |
| 481 do_execsql_test where3-7.$disabled_opt.8 { |
| 482 SELECT x3 FROM t73 LEFT JOIN t74 ON x4=y3; |
| 483 } {123 123} |
| 484 do_execsql_test where3-7.$disabled_opt.9 { |
| 485 SELECT DISTINCT x3 FROM t73 LEFT JOIN t74 ON x4=y3; |
| 486 } {123} |
| 487 } |
| 488 |
| 489 |
345 finish_test | 490 finish_test |
OLD | NEW |