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