1 # 2001 September 15 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 # This file implements regression tests for SQLite library. The 12 # focus of this file is testing the use of indices in WHERE clases. 13 # 14 # $Id: where.test,v 1.50 2008/11/03 09:06:06 danielk1977 Exp $ 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 # Build some test data 20 # 21 do_test where-1.0 { 22 execsql { 23 CREATE TABLE t1(w int, x int, y int); 24 CREATE TABLE t2(p int, q int, r int, s int); 25 } 26 for {set i 1} {$i<=100} {incr i} { 27 set w $i 28 set x [expr {int(log($i)/log(2))}] 29 set y [expr {$i*$i + 2*$i + 1}] 30 execsql "INSERT INTO t1 VALUES($w,$x,$y)" 31 } 32 33 ifcapable subquery { 34 execsql { 35 INSERT INTO t2 SELECT 101-w, x, (SELECT max(y) FROM t1)+1-y, y FROM t1; 36 } 37 } else { 38 set maxy [execsql {select max(y) from t1}] 39 execsql " 40 INSERT INTO t2 SELECT 101-w, x, $maxy+1-y, y FROM t1; 41 " 42 } 43 44 execsql { 45 CREATE INDEX i1w ON t1(w); 46 CREATE INDEX i1xy ON t1(x,y); 47 CREATE INDEX i2p ON t2(p); 48 CREATE INDEX i2r ON t2(r); 49 CREATE INDEX i2qs ON t2(q, s); 50 } 51 } {} 52 53 # Do an SQL statement. Append the search count to the end of the result. 54 # 55 proc count sql { 56 set ::sqlite_search_count 0 57 return [concat [execsql $sql] $::sqlite_search_count] 58 } 59 60 # Verify that queries use an index. We are using the special variable 61 # "sqlite_search_count" which tallys the number of executions of MoveTo 62 # and Next operators in the VDBE. By verifing that the search count is 63 # small we can be assured that indices are being used properly. 64 # 65 do_test where-1.1.1 { 66 count {SELECT x, y, w FROM t1 WHERE w=10} 67 } {3 121 10 3} 68 do_test where-1.1.2 { 69 set sqlite_query_plan 70 } {t1 i1w} 71 do_test where-1.1.3 { 72 db status step 73 } {0} 74 do_test where-1.1.4 { 75 db eval {SELECT x, y, w FROM t1 WHERE +w=10} 76 } {3 121 10} 77 do_test where-1.1.5 { 78 db status step 79 } {99} 80 do_test where-1.1.6 { 81 set sqlite_query_plan 82 } {t1 {}} 83 do_test where-1.1.7 { 84 count {SELECT x, y, w AS abc FROM t1 WHERE abc=10} 85 } {3 121 10 3} 86 do_test where-1.1.8 { 87 set sqlite_query_plan 88 } {t1 i1w} 89 do_test where-1.1.9 { 90 db status step 91 } {0} 92 do_test where-1.2.1 { 93 count {SELECT x, y, w FROM t1 WHERE w=11} 94 } {3 144 11 3} 95 do_test where-1.2.2 { 96 count {SELECT x, y, w AS abc FROM t1 WHERE abc=11} 97 } {3 144 11 3} 98 do_test where-1.3.1 { 99 count {SELECT x, y, w AS abc FROM t1 WHERE 11=w} 100 } {3 144 11 3} 101 do_test where-1.3.2 { 102 count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc} 103 } {3 144 11 3} 104 do_test where-1.4.1 { 105 count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2} 106 } {11 3 144 3} 107 do_test where-1.4.2 { 108 set sqlite_query_plan 109 } {t1 i1w} 110 do_test where-1.4.3 { 111 count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2} 112 } {11 3 144 3} 113 do_test where-1.4.4 { 114 set sqlite_query_plan 115 } {t1 i1w} 116 do_test where-1.5 { 117 count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2} 118 } {3 144 3} 119 do_test where-1.5.2 { 120 set sqlite_query_plan 121 } {t1 i1w} 122 do_test where-1.6 { 123 count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11} 124 } {3 144 3} 125 do_test where-1.7 { 126 count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2} 127 } {3 144 3} 128 do_test where-1.8 { 129 count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3} 130 } {3 144 3} 131 do_test where-1.8.2 { 132 set sqlite_query_plan 133 } {t1 i1xy} 134 do_test where-1.8.3 { 135 count {SELECT x, y FROM t1 WHERE y=144 AND x=3} 136 set sqlite_query_plan 137 } {{} i1xy} 138 do_test where-1.9 { 139 count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3} 140 } {3 144 3} 141 do_test where-1.10 { 142 count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121} 143 } {3 121 3} 144 do_test where-1.11 { 145 count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10} 146 } {3 100 3} 147 148 # New for SQLite version 2.1: Verify that that inequality constraints 149 # are used correctly. 150 # 151 do_test where-1.12 { 152 count {SELECT w FROM t1 WHERE x=3 AND y<100} 153 } {8 3} 154 do_test where-1.13 { 155 count {SELECT w FROM t1 WHERE x=3 AND 100>y} 156 } {8 3} 157 do_test where-1.14 { 158 count {SELECT w FROM t1 WHERE 3=x AND y<100} 159 } {8 3} 160 do_test where-1.15 { 161 count {SELECT w FROM t1 WHERE 3=x AND 100>y} 162 } {8 3} 163 do_test where-1.16 { 164 count {SELECT w FROM t1 WHERE x=3 AND y<=100} 165 } {8 9 5} 166 do_test where-1.17 { 167 count {SELECT w FROM t1 WHERE x=3 AND 100>=y} 168 } {8 9 5} 169 do_test where-1.18 { 170 count {SELECT w FROM t1 WHERE x=3 AND y>225} 171 } {15 3} 172 do_test where-1.19 { 173 count {SELECT w FROM t1 WHERE x=3 AND 225<y} 174 } {15 3} 175 do_test where-1.20 { 176 count {SELECT w FROM t1 WHERE x=3 AND y>=225} 177 } {14 15 5} 178 do_test where-1.21 { 179 count {SELECT w FROM t1 WHERE x=3 AND 225<=y} 180 } {14 15 5} 181 do_test where-1.22 { 182 count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196} 183 } {11 12 5} 184 do_test where-1.23 { 185 count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196} 186 } {10 11 12 13 9} 187 do_test where-1.24 { 188 count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y} 189 } {11 12 5} 190 do_test where-1.25 { 191 count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y} 192 } {10 11 12 13 9} 193 194 # Need to work on optimizing the BETWEEN operator. 195 # 196 # do_test where-1.26 { 197 # count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196} 198 # } {10 11 12 13 9} 199 200 do_test where-1.27 { 201 count {SELECT w FROM t1 WHERE x=3 AND y+1==122} 202 } {10 10} 203 204 do_test where-1.28 { 205 count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122} 206 } {10 99} 207 do_test where-1.29 { 208 count {SELECT w FROM t1 WHERE y==121} 209 } {10 99} 210 211 212 do_test where-1.30 { 213 count {SELECT w FROM t1 WHERE w>97} 214 } {98 99 100 3} 215 do_test where-1.31 { 216 count {SELECT w FROM t1 WHERE w>=97} 217 } {97 98 99 100 4} 218 do_test where-1.33 { 219 count {SELECT w FROM t1 WHERE w==97} 220 } {97 2} 221 do_test where-1.33.1 { 222 count {SELECT w FROM t1 WHERE w<=97 AND w==97} 223 } {97 2} 224 do_test where-1.33.2 { 225 count {SELECT w FROM t1 WHERE w<98 AND w==97} 226 } {97 2} 227 do_test where-1.33.3 { 228 count {SELECT w FROM t1 WHERE w>=97 AND w==97} 229 } {97 2} 230 do_test where-1.33.4 { 231 count {SELECT w FROM t1 WHERE w>96 AND w==97} 232 } {97 2} 233 do_test where-1.33.5 { 234 count {SELECT w FROM t1 WHERE w==97 AND w==97} 235 } {97 2} 236 do_test where-1.34 { 237 count {SELECT w FROM t1 WHERE w+1==98} 238 } {97 99} 239 do_test where-1.35 { 240 count {SELECT w FROM t1 WHERE w<3} 241 } {1 2 2} 242 do_test where-1.36 { 243 count {SELECT w FROM t1 WHERE w<=3} 244 } {1 2 3 3} 245 do_test where-1.37 { 246 count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w} 247 } {1 2 3 99} 248 249 do_test where-1.38 { 250 count {SELECT (w) FROM t1 WHERE (w)>(97)} 251 } {98 99 100 3} 252 do_test where-1.39 { 253 count {SELECT (w) FROM t1 WHERE (w)>=(97)} 254 } {97 98 99 100 4} 255 do_test where-1.40 { 256 count {SELECT (w) FROM t1 WHERE (w)==(97)} 257 } {97 2} 258 do_test where-1.41 { 259 count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)} 260 } {97 99} 261 262 263 # Do the same kind of thing except use a join as the data source. 264 # 265 do_test where-2.1 { 266 count { 267 SELECT w, p FROM t2, t1 268 WHERE x=q AND y=s AND r=8977 269 } 270 } {34 67 6} 271 do_test where-2.2 { 272 count { 273 SELECT w, p FROM t2, t1 274 WHERE x=q AND s=y AND r=8977 275 } 276 } {34 67 6} 277 do_test where-2.3 { 278 count { 279 SELECT w, p FROM t2, t1 280 WHERE x=q AND s=y AND r=8977 AND w>10 281 } 282 } {34 67 6} 283 do_test where-2.4 { 284 count { 285 SELECT w, p FROM t2, t1 286 WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10 287 } 288 } {34 67 6} 289 do_test where-2.5 { 290 count { 291 SELECT w, p FROM t2, t1 292 WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10 293 } 294 } {34 67 6} 295 do_test where-2.6 { 296 count { 297 SELECT w, p FROM t2, t1 298 WHERE x=q AND p=77 AND s=y AND w>5 299 } 300 } {24 77 6} 301 do_test where-2.7 { 302 count { 303 SELECT w, p FROM t1, t2 304 WHERE x=q AND p>77 AND s=y AND w=5 305 } 306 } {5 96 6} 307 308 # Lets do a 3-way join. 309 # 310 do_test where-3.1 { 311 count { 312 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 313 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11 314 } 315 } {11 90 11 8} 316 do_test where-3.2 { 317 count { 318 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 319 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12 320 } 321 } {12 89 12 8} 322 do_test where-3.3 { 323 count { 324 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 325 WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y 326 } 327 } {15 86 86 8} 328 329 # Test to see that the special case of a constant WHERE clause is 330 # handled. 331 # 332 do_test where-4.1 { 333 count { 334 SELECT * FROM t1 WHERE 0 335 } 336 } {0} 337 do_test where-4.2 { 338 count { 339 SELECT * FROM t1 WHERE 1 LIMIT 1 340 } 341 } {1 0 4 0} 342 do_test where-4.3 { 343 execsql { 344 SELECT 99 WHERE 0 345 } 346 } {} 347 do_test where-4.4 { 348 execsql { 349 SELECT 99 WHERE 1 350 } 351 } {99} 352 do_test where-4.5 { 353 execsql { 354 SELECT 99 WHERE 0.1 355 } 356 } {99} 357 do_test where-4.6 { 358 execsql { 359 SELECT 99 WHERE 0.0 360 } 361 } {} 362 do_test where-4.7 { 363 execsql { 364 SELECT count(*) FROM t1 WHERE t1.w 365 } 366 } {100} 367 368 # Verify that IN operators in a WHERE clause are handled correctly. 369 # Omit these tests if the build is not capable of sub-queries. 370 # 371 ifcapable subquery { 372 do_test where-5.1 { 373 count { 374 SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1; 375 } 376 } {1 0 4 2 1 9 3 1 16 4} 377 do_test where-5.2 { 378 count { 379 SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1; 380 } 381 } {1 0 4 2 1 9 3 1 16 102} 382 do_test where-5.3 { 383 count { 384 SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1; 385 } 386 } {1 0 4 2 1 9 3 1 16 14} 387 do_test where-5.4 { 388 count { 389 SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1; 390 } 391 } {1 0 4 2 1 9 3 1 16 102} 392 do_test where-5.5 { 393 count { 394 SELECT * FROM t1 WHERE rowid IN 395 (select rowid from t1 where rowid IN (-1,2,4)) 396 ORDER BY 1; 397 } 398 } {2 1 9 4 2 25 3} 399 do_test where-5.6 { 400 count { 401 SELECT * FROM t1 WHERE rowid+0 IN 402 (select rowid from t1 where rowid IN (-1,2,4)) 403 ORDER BY 1; 404 } 405 } {2 1 9 4 2 25 103} 406 do_test where-5.7 { 407 count { 408 SELECT * FROM t1 WHERE w IN 409 (select rowid from t1 where rowid IN (-1,2,4)) 410 ORDER BY 1; 411 } 412 } {2 1 9 4 2 25 9} 413 do_test where-5.8 { 414 count { 415 SELECT * FROM t1 WHERE w+0 IN 416 (select rowid from t1 where rowid IN (-1,2,4)) 417 ORDER BY 1; 418 } 419 } {2 1 9 4 2 25 103} 420 do_test where-5.9 { 421 count { 422 SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1; 423 } 424 } {2 1 9 3 1 16 7} 425 do_test where-5.10 { 426 count { 427 SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1; 428 } 429 } {2 1 9 3 1 16 199} 430 do_test where-5.11 { 431 count { 432 SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1; 433 } 434 } {79 6 6400 89 6 8100 199} 435 do_test where-5.12 { 436 count { 437 SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1; 438 } 439 } {79 6 6400 89 6 8100 7} 440 do_test where-5.13 { 441 count { 442 SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1; 443 } 444 } {2 1 9 3 1 16 7} 445 do_test where-5.14 { 446 count { 447 SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1; 448 } 449 } {2 1 9 8} 450 do_test where-5.15 { 451 count { 452 SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1; 453 } 454 } {2 1 9 3 1 16 11} 455 } 456 457 # This procedure executes the SQL. Then it checks to see if the OP_Sort 458 # opcode was executed. If an OP_Sort did occur, then "sort" is appended 459 # to the result. If no OP_Sort happened, then "nosort" is appended. 460 # 461 # This procedure is used to check to make sure sorting is or is not 462 # occurring as expected. 463 # 464 proc cksort {sql} { 465 set data [execsql $sql] 466 if {[db status sort]} {set x sort} {set x nosort} 467 lappend data $x 468 return $data 469 } 470 # Check out the logic that attempts to implement the ORDER BY clause 471 # using an index rather than by sorting. 472 # 473 do_test where-6.1 { 474 execsql { 475 CREATE TABLE t3(a,b,c); 476 CREATE INDEX t3a ON t3(a); 477 CREATE INDEX t3bc ON t3(b,c); 478 CREATE INDEX t3acb ON t3(a,c,b); 479 INSERT INTO t3 SELECT w, 101-w, y FROM t1; 480 SELECT count(*), sum(a), sum(b), sum(c) FROM t3; 481 } 482 } {100 5050 5050 348550} 483 do_test where-6.2 { 484 cksort { 485 SELECT * FROM t3 ORDER BY a LIMIT 3 486 } 487 } {1 100 4 2 99 9 3 98 16 nosort} 488 do_test where-6.3 { 489 cksort { 490 SELECT * FROM t3 ORDER BY a+1 LIMIT 3 491 } 492 } {1 100 4 2 99 9 3 98 16 sort} 493 do_test where-6.4 { 494 cksort { 495 SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3 496 } 497 } {1 100 4 2 99 9 3 98 16 nosort} 498 do_test where-6.5 { 499 cksort { 500 SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3 501 } 502 } {1 100 4 2 99 9 3 98 16 nosort} 503 do_test where-6.6 { 504 cksort { 505 SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3 506 } 507 } {1 100 4 2 99 9 3 98 16 nosort} 508 do_test where-6.7 { 509 cksort { 510 SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 3 511 } 512 } {1 100 4 2 99 9 3 98 16 nosort} 513 ifcapable subquery { 514 do_test where-6.8 { 515 cksort { 516 SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3 517 } 518 } {1 100 4 2 99 9 3 98 16 sort} 519 } 520 do_test where-6.9.1 { 521 cksort { 522 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 523 } 524 } {1 100 4 nosort} 525 do_test where-6.9.1.1 { 526 cksort { 527 SELECT * FROM t3 WHERE a>=1 AND a=1 AND c>0 ORDER BY a LIMIT 3 528 } 529 } {1 100 4 nosort} 530 do_test where-6.9.1.2 { 531 cksort { 532 SELECT * FROM t3 WHERE a<2 AND a=1 AND c>0 ORDER BY a LIMIT 3 533 } 534 } {1 100 4 nosort} 535 do_test where-6.9.2 { 536 cksort { 537 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 538 } 539 } {1 100 4 nosort} 540 do_test where-6.9.3 { 541 cksort { 542 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3 543 } 544 } {1 100 4 nosort} 545 do_test where-6.9.4 { 546 cksort { 547 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3 548 } 549 } {1 100 4 nosort} 550 do_test where-6.9.5 { 551 cksort { 552 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3 553 } 554 } {1 100 4 nosort} 555 do_test where-6.9.6 { 556 cksort { 557 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3 558 } 559 } {1 100 4 nosort} 560 do_test where-6.9.7 { 561 cksort { 562 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3 563 } 564 } {1 100 4 sort} 565 do_test where-6.9.8 { 566 cksort { 567 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3 568 } 569 } {1 100 4 nosort} 570 do_test where-6.9.9 { 571 cksort { 572 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3 573 } 574 } {1 100 4 nosort} 575 do_test where-6.10 { 576 cksort { 577 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 578 } 579 } {1 100 4 nosort} 580 do_test where-6.11 { 581 cksort { 582 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 583 } 584 } {1 100 4 nosort} 585 do_test where-6.12 { 586 cksort { 587 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3 588 } 589 } {1 100 4 nosort} 590 do_test where-6.13 { 591 cksort { 592 SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3 593 } 594 } {100 1 10201 99 2 10000 98 3 9801 nosort} 595 do_test where-6.13.1 { 596 cksort { 597 SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3 598 } 599 } {100 1 10201 99 2 10000 98 3 9801 sort} 600 do_test where-6.14 { 601 cksort { 602 SELECT * FROM t3 ORDER BY b LIMIT 3 603 } 604 } {100 1 10201 99 2 10000 98 3 9801 nosort} 605 do_test where-6.15 { 606 cksort { 607 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3 608 } 609 } {1 0 2 1 3 1 nosort} 610 do_test where-6.16 { 611 cksort { 612 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3 613 } 614 } {1 0 2 1 3 1 sort} 615 do_test where-6.19 { 616 cksort { 617 SELECT y FROM t1 ORDER BY w LIMIT 3; 618 } 619 } {4 9 16 nosort} 620 do_test where-6.20 { 621 cksort { 622 SELECT y FROM t1 ORDER BY rowid LIMIT 3; 623 } 624 } {4 9 16 nosort} 625 do_test where-6.21 { 626 cksort { 627 SELECT y FROM t1 ORDER BY rowid, y LIMIT 3; 628 } 629 } {4 9 16 nosort} 630 do_test where-6.22 { 631 cksort { 632 SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3; 633 } 634 } {4 9 16 nosort} 635 do_test where-6.23 { 636 cksort { 637 SELECT y FROM t1 WHERE y>4 ORDER BY rowid, w, x LIMIT 3; 638 } 639 } {9 16 25 nosort} 640 do_test where-6.24 { 641 cksort { 642 SELECT y FROM t1 WHERE y>=9 ORDER BY rowid, x DESC, w LIMIT 3; 643 } 644 } {9 16 25 nosort} 645 do_test where-6.25 { 646 cksort { 647 SELECT y FROM t1 WHERE y>4 AND y<25 ORDER BY rowid; 648 } 649 } {9 16 nosort} 650 do_test where-6.26 { 651 cksort { 652 SELECT y FROM t1 WHERE y>=4 AND y<=25 ORDER BY oid; 653 } 654 } {4 9 16 25 nosort} 655 do_test where-6.27 { 656 cksort { 657 SELECT y FROM t1 WHERE y<=25 ORDER BY _rowid_, w+y; 658 } 659 } {4 9 16 25 nosort} 660 661 662 # Tests for reverse-order sorting. 663 # 664 do_test where-7.1 { 665 cksort { 666 SELECT w FROM t1 WHERE x=3 ORDER BY y; 667 } 668 } {8 9 10 11 12 13 14 15 nosort} 669 do_test where-7.2 { 670 cksort { 671 SELECT w FROM t1 WHERE x=3 ORDER BY y DESC; 672 } 673 } {15 14 13 12 11 10 9 8 nosort} 674 do_test where-7.3 { 675 cksort { 676 SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3; 677 } 678 } {10 11 12 nosort} 679 do_test where-7.4 { 680 cksort { 681 SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3; 682 } 683 } {15 14 13 nosort} 684 do_test where-7.5 { 685 cksort { 686 SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC; 687 } 688 } {15 14 13 12 11 nosort} 689 do_test where-7.6 { 690 cksort { 691 SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC; 692 } 693 } {15 14 13 12 11 10 nosort} 694 do_test where-7.7 { 695 cksort { 696 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC; 697 } 698 } {12 11 10 nosort} 699 do_test where-7.8 { 700 cksort { 701 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC; 702 } 703 } {13 12 11 10 nosort} 704 do_test where-7.9 { 705 cksort { 706 SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC; 707 } 708 } {13 12 11 nosort} 709 do_test where-7.10 { 710 cksort { 711 SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC; 712 } 713 } {12 11 10 nosort} 714 do_test where-7.11 { 715 cksort { 716 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y; 717 } 718 } {10 11 12 nosort} 719 do_test where-7.12 { 720 cksort { 721 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y; 722 } 723 } {10 11 12 13 nosort} 724 do_test where-7.13 { 725 cksort { 726 SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y; 727 } 728 } {11 12 13 nosort} 729 do_test where-7.14 { 730 cksort { 731 SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y; 732 } 733 } {10 11 12 nosort} 734 do_test where-7.15 { 735 cksort { 736 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y; 737 } 738 } {nosort} 739 do_test where-7.16 { 740 cksort { 741 SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y; 742 } 743 } {8 nosort} 744 do_test where-7.17 { 745 cksort { 746 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y; 747 } 748 } {nosort} 749 do_test where-7.18 { 750 cksort { 751 SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y; 752 } 753 } {15 nosort} 754 do_test where-7.19 { 755 cksort { 756 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC; 757 } 758 } {nosort} 759 do_test where-7.20 { 760 cksort { 761 SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC; 762 } 763 } {8 nosort} 764 do_test where-7.21 { 765 cksort { 766 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC; 767 } 768 } {nosort} 769 do_test where-7.22 { 770 cksort { 771 SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC; 772 } 773 } {15 nosort} 774 do_test where-7.23 { 775 cksort { 776 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y; 777 } 778 } {nosort} 779 do_test where-7.24 { 780 cksort { 781 SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y; 782 } 783 } {1 nosort} 784 do_test where-7.25 { 785 cksort { 786 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y; 787 } 788 } {nosort} 789 do_test where-7.26 { 790 cksort { 791 SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y; 792 } 793 } {100 nosort} 794 do_test where-7.27 { 795 cksort { 796 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC; 797 } 798 } {nosort} 799 do_test where-7.28 { 800 cksort { 801 SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC; 802 } 803 } {1 nosort} 804 do_test where-7.29 { 805 cksort { 806 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC; 807 } 808 } {nosort} 809 do_test where-7.30 { 810 cksort { 811 SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC; 812 } 813 } {100 nosort} 814 do_test where-7.31 { 815 cksort { 816 SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3 817 } 818 } {10201 10000 9801 nosort} 819 do_test where-7.32 { 820 cksort { 821 SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC 822 } 823 } {16 9 4 nosort} 824 do_test where-7.33 { 825 cksort { 826 SELECT y FROM t1 WHERE y<=25 ORDER BY rowid DESC 827 } 828 } {25 16 9 4 nosort} 829 do_test where-7.34 { 830 cksort { 831 SELECT y FROM t1 WHERE y<25 AND y>4 ORDER BY rowid DESC, y DESC 832 } 833 } {16 9 nosort} 834 do_test where-7.35 { 835 cksort { 836 SELECT y FROM t1 WHERE y<25 AND y>=4 ORDER BY rowid DESC 837 } 838 } {16 9 4 nosort} 839 840 do_test where-8.1 { 841 execsql { 842 CREATE TABLE t4 AS SELECT * FROM t1; 843 CREATE INDEX i4xy ON t4(x,y); 844 } 845 cksort { 846 SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3; 847 } 848 } {30 29 28 nosort} 849 do_test where-8.2 { 850 execsql { 851 DELETE FROM t4; 852 } 853 cksort { 854 SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3; 855 } 856 } {nosort} 857 858 # Make sure searches with an index work with an empty table. 859 # 860 do_test where-9.1 { 861 execsql { 862 CREATE TABLE t5(x PRIMARY KEY); 863 SELECT * FROM t5 WHERE x<10; 864 } 865 } {} 866 do_test where-9.2 { 867 execsql { 868 SELECT * FROM t5 WHERE x<10 ORDER BY x DESC; 869 } 870 } {} 871 do_test where-9.3 { 872 execsql { 873 SELECT * FROM t5 WHERE x=10; 874 } 875 } {} 876 877 do_test where-10.1 { 878 execsql { 879 SELECT 1 WHERE abs(random())<0 880 } 881 } {} 882 do_test where-10.2 { 883 proc tclvar_func {vname} {return [set ::$vname]} 884 db function tclvar tclvar_func 885 set ::v1 0 886 execsql { 887 SELECT count(*) FROM t1 WHERE tclvar('v1'); 888 } 889 } {0} 890 do_test where-10.3 { 891 set ::v1 1 892 execsql { 893 SELECT count(*) FROM t1 WHERE tclvar('v1'); 894 } 895 } {100} 896 do_test where-10.4 { 897 set ::v1 1 898 proc tclvar_func {vname} { 899 upvar #0 $vname v 900 set v [expr {!$v}] 901 return $v 902 } 903 execsql { 904 SELECT count(*) FROM t1 WHERE tclvar('v1'); 905 } 906 } {50} 907 908 # Ticket #1376. The query below was causing a segfault. 909 # The problem was the age-old error of calling realloc() on an 910 # array while there are still pointers to individual elements of 911 # that array. 912 # 913 do_test where-11.1 { 914 execsql { 915 CREATE TABLE t99(Dte INT, X INT); 916 DELETE FROM t99 WHERE (Dte = 2451337) OR (Dte = 2451339) OR 917 (Dte BETWEEN 2451345 AND 2451347) OR (Dte = 2451351) OR 918 (Dte BETWEEN 2451355 AND 2451356) OR (Dte = 2451358) OR 919 (Dte = 2451362) OR (Dte = 2451365) OR (Dte = 2451367) OR 920 (Dte BETWEEN 2451372 AND 2451376) OR (Dte BETWEEN 2451382 AND 2451384) OR 921 (Dte = 2451387) OR (Dte BETWEEN 2451389 AND 2451391) OR 922 (Dte BETWEEN 2451393 AND 2451395) OR (Dte = 2451400) OR 923 (Dte = 2451402) OR (Dte = 2451404) OR (Dte BETWEEN 2451416 AND 2451418) OR 924 (Dte = 2451422) OR (Dte = 2451426) OR (Dte BETWEEN 2451445 AND 2451446) OR 925 (Dte = 2451456) OR (Dte = 2451458) OR (Dte BETWEEN 2451465 AND 2451467) OR 926 (Dte BETWEEN 2451469 AND 2451471) OR (Dte = 2451474) OR 927 (Dte BETWEEN 2451477 AND 2451501) OR (Dte BETWEEN 2451503 AND 2451509) OR 928 (Dte BETWEEN 2451511 AND 2451514) OR (Dte BETWEEN 2451518 AND 2451521) OR 929 (Dte BETWEEN 2451523 AND 2451531) OR (Dte BETWEEN 2451533 AND 2451537) OR 930 (Dte BETWEEN 2451539 AND 2451544) OR (Dte BETWEEN 2451546 AND 2451551) OR 931 (Dte BETWEEN 2451553 AND 2451555) OR (Dte = 2451557) OR 932 (Dte BETWEEN 2451559 AND 2451561) OR (Dte = 2451563) OR 933 (Dte BETWEEN 2451565 AND 2451566) OR (Dte BETWEEN 2451569 AND 2451571) OR 934 (Dte = 2451573) OR (Dte = 2451575) OR (Dte = 2451577) OR (Dte = 2451581) OR 935 (Dte BETWEEN 2451583 AND 2451586) OR (Dte BETWEEN 2451588 AND 2451592) OR 936 (Dte BETWEEN 2451596 AND 2451598) OR (Dte = 2451600) OR 937 (Dte BETWEEN 2451602 AND 2451603) OR (Dte = 2451606) OR (Dte = 2451611); 938 } 939 } {} 940 941 # Ticket #2116: Make sure sorting by index works well with nn INTEGER PRIMARY 942 # KEY. 943 # 944 do_test where-12.1 { 945 execsql { 946 CREATE TABLE t6(a INTEGER PRIMARY KEY, b TEXT); 947 INSERT INTO t6 VALUES(1,'one'); 948 INSERT INTO t6 VALUES(4,'four'); 949 CREATE INDEX t6i1 ON t6(b); 950 } 951 cksort { 952 SELECT * FROM t6 ORDER BY b; 953 } 954 } {4 four 1 one nosort} 955 do_test where-12.2 { 956 cksort { 957 SELECT * FROM t6 ORDER BY b, a; 958 } 959 } {4 four 1 one nosort} 960 do_test where-12.3 { 961 cksort { 962 SELECT * FROM t6 ORDER BY a; 963 } 964 } {1 one 4 four nosort} 965 do_test where-12.4 { 966 cksort { 967 SELECT * FROM t6 ORDER BY a, b; 968 } 969 } {1 one 4 four nosort} 970 do_test where-12.5 { 971 cksort { 972 SELECT * FROM t6 ORDER BY b DESC; 973 } 974 } {1 one 4 four nosort} 975 do_test where-12.6 { 976 cksort { 977 SELECT * FROM t6 ORDER BY b DESC, a DESC; 978 } 979 } {1 one 4 four nosort} 980 do_test where-12.7 { 981 cksort { 982 SELECT * FROM t6 ORDER BY b DESC, a ASC; 983 } 984 } {1 one 4 four sort} 985 do_test where-12.8 { 986 cksort { 987 SELECT * FROM t6 ORDER BY b ASC, a DESC; 988 } 989 } {4 four 1 one sort} 990 do_test where-12.9 { 991 cksort { 992 SELECT * FROM t6 ORDER BY a DESC; 993 } 994 } {4 four 1 one nosort} 995 do_test where-12.10 { 996 cksort { 997 SELECT * FROM t6 ORDER BY a DESC, b DESC; 998 } 999 } {4 four 1 one nosort} 1000 do_test where-12.11 { 1001 cksort { 1002 SELECT * FROM t6 ORDER BY a DESC, b ASC; 1003 } 1004 } {4 four 1 one nosort} 1005 do_test where-12.12 { 1006 cksort { 1007 SELECT * FROM t6 ORDER BY a ASC, b DESC; 1008 } 1009 } {1 one 4 four nosort} 1010 do_test where-13.1 { 1011 execsql { 1012 CREATE TABLE t7(a INTEGER PRIMARY KEY, b TEXT); 1013 INSERT INTO t7 VALUES(1,'one'); 1014 INSERT INTO t7 VALUES(4,'four'); 1015 CREATE INDEX t7i1 ON t7(b); 1016 } 1017 cksort { 1018 SELECT * FROM t7 ORDER BY b; 1019 } 1020 } {4 four 1 one nosort} 1021 do_test where-13.2 { 1022 cksort { 1023 SELECT * FROM t7 ORDER BY b, a; 1024 } 1025 } {4 four 1 one nosort} 1026 do_test where-13.3 { 1027 cksort { 1028 SELECT * FROM t7 ORDER BY a; 1029 } 1030 } {1 one 4 four nosort} 1031 do_test where-13.4 { 1032 cksort { 1033 SELECT * FROM t7 ORDER BY a, b; 1034 } 1035 } {1 one 4 four nosort} 1036 do_test where-13.5 { 1037 cksort { 1038 SELECT * FROM t7 ORDER BY b DESC; 1039 } 1040 } {1 one 4 four nosort} 1041 do_test where-13.6 { 1042 cksort { 1043 SELECT * FROM t7 ORDER BY b DESC, a DESC; 1044 } 1045 } {1 one 4 four nosort} 1046 do_test where-13.7 { 1047 cksort { 1048 SELECT * FROM t7 ORDER BY b DESC, a ASC; 1049 } 1050 } {1 one 4 four sort} 1051 do_test where-13.8 { 1052 cksort { 1053 SELECT * FROM t7 ORDER BY b ASC, a DESC; 1054 } 1055 } {4 four 1 one sort} 1056 do_test where-13.9 { 1057 cksort { 1058 SELECT * FROM t7 ORDER BY a DESC; 1059 } 1060 } {4 four 1 one nosort} 1061 do_test where-13.10 { 1062 cksort { 1063 SELECT * FROM t7 ORDER BY a DESC, b DESC; 1064 } 1065 } {4 four 1 one nosort} 1066 do_test where-13.11 { 1067 cksort { 1068 SELECT * FROM t7 ORDER BY a DESC, b ASC; 1069 } 1070 } {4 four 1 one nosort} 1071 do_test where-13.12 { 1072 cksort { 1073 SELECT * FROM t7 ORDER BY a ASC, b DESC; 1074 } 1075 } {1 one 4 four nosort} 1076 1077 # Ticket #2211. 1078 # 1079 # When optimizing out ORDER BY clauses, make sure that trailing terms 1080 # of the ORDER BY clause do not reference other tables in a join. 1081 # 1082 do_test where-14.1 { 1083 execsql { 1084 CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT UNIQUE); 1085 INSERT INTO t8 VALUES(1,'one'); 1086 INSERT INTO t8 VALUES(4,'four'); 1087 } 1088 cksort { 1089 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b 1090 } 1091 } {1/4 1/1 4/4 4/1 sort} 1092 do_test where-14.2 { 1093 cksort { 1094 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b DESC 1095 } 1096 } {1/1 1/4 4/1 4/4 sort} 1097 do_test where-14.3 { 1098 cksort { 1099 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b 1100 } 1101 } {1/1 1/4 4/1 4/4 nosort} 1102 do_test where-14.4 { 1103 cksort { 1104 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b DESC 1105 } 1106 } {1/1 1/4 4/1 4/4 nosort} 1107 do_test where-14.5 { 1108 cksort { 1109 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b 1110 } 1111 } {4/1 4/4 1/1 1/4 nosort} 1112 do_test where-14.6 { 1113 cksort { 1114 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC 1115 } 1116 } {4/1 4/4 1/1 1/4 nosort} 1117 do_test where-14.7 { 1118 cksort { 1119 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b 1120 } 1121 } {4/1 4/4 1/1 1/4 sort} 1122 do_test where-14.7.1 { 1123 cksort { 1124 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b 1125 } 1126 } {4/1 4/4 1/1 1/4 sort} 1127 do_test where-14.7.2 { 1128 cksort { 1129 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b 1130 } 1131 } {4/1 4/4 1/1 1/4 nosort} 1132 do_test where-14.8 { 1133 cksort { 1134 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC 1135 } 1136 } {4/4 4/1 1/4 1/1 sort} 1137 do_test where-14.9 { 1138 cksort { 1139 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b 1140 } 1141 } {4/4 4/1 1/4 1/1 sort} 1142 do_test where-14.10 { 1143 cksort { 1144 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC 1145 } 1146 } {4/1 4/4 1/1 1/4 sort} 1147 do_test where-14.11 { 1148 cksort { 1149 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b 1150 } 1151 } {4/1 4/4 1/1 1/4 sort} 1152 do_test where-14.12 { 1153 cksort { 1154 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC 1155 } 1156 } {4/4 4/1 1/4 1/1 sort} 1157 1158 # Ticket #2445. 1159 # 1160 # There was a crash that could occur when a where clause contains an 1161 # alias for an expression in the result set, and that expression retrieves 1162 # a column of the second or subsequent table in a join. 1163 # 1164 do_test where-15.1 { 1165 execsql { 1166 CREATE TEMP TABLE t1 (a, b, c, d, e); 1167 CREATE TEMP TABLE t2 (f); 1168 SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ; 1169 } 1170 } {} 1171 1172 # Ticket #3408. 1173 # 1174 # The branch of code in where.c that generated rowid lookups was 1175 # incorrectly deallocating a constant register, meaning that if the 1176 # vdbe code ran more than once, the second time around the constant 1177 # value may have been clobbered by some other value. 1178 # 1179 do_test where-16.1 { 1180 execsql { 1181 CREATE TABLE a1(id INTEGER PRIMARY KEY, v); 1182 CREATE TABLE a2(id INTEGER PRIMARY KEY, v); 1183 INSERT INTO a1 VALUES(1, 'one'); 1184 INSERT INTO a1 VALUES(2, 'two'); 1185 INSERT INTO a2 VALUES(1, 'one'); 1186 INSERT INTO a2 VALUES(2, 'two'); 1187 } 1188 } {} 1189 do_test where-16.2 { 1190 execsql { 1191 SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one'; 1192 } 1193 } {1 one 1 one 2 two 1 one} 1194 1195 # The actual problem reported in #3408. 1196 do_test where-16.3 { 1197 execsql { 1198 CREATE TEMP TABLE foo(idx INTEGER); 1199 INSERT INTO foo VALUES(1); 1200 INSERT INTO foo VALUES(1); 1201 INSERT INTO foo VALUES(1); 1202 INSERT INTO foo VALUES(2); 1203 INSERT INTO foo VALUES(2); 1204 CREATE TEMP TABLE bar(stuff INTEGER); 1205 INSERT INTO bar VALUES(100); 1206 INSERT INTO bar VALUES(200); 1207 INSERT INTO bar VALUES(300); 1208 } 1209 } {} 1210 do_test where-16.4 { 1211 execsql { 1212 SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2; 1213 } 1214 } {2 2} 1215 1216 integrity_check {where-99.0} 1217 1218 #--------------------------------------------------------------------- 1219 # These tests test that a bug surrounding the use of ForceInt has been 1220 # fixed in where.c. 1221 # 1222 do_test where-17.1 { 1223 execsql { 1224 CREATE TABLE tbooking ( 1225 id INTEGER PRIMARY KEY, 1226 eventtype INTEGER NOT NULL 1227 ); 1228 INSERT INTO tbooking VALUES(42, 3); 1229 INSERT INTO tbooking VALUES(43, 4); 1230 } 1231 } {} 1232 do_test where-17.2 { 1233 execsql { 1234 SELECT a.id 1235 FROM tbooking AS a 1236 WHERE a.eventtype=3; 1237 } 1238 } {42} 1239 do_test where-17.3 { 1240 execsql { 1241 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1242 FROM tbooking AS a 1243 WHERE a.eventtype=3; 1244 } 1245 } {42 43} 1246 do_test where-17.4 { 1247 execsql { 1248 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1249 FROM (SELECT 1.5 AS id) AS a 1250 } 1251 } {1.5 42} 1252 do_test where-17.5 { 1253 execsql { 1254 CREATE TABLE tother(a, b); 1255 INSERT INTO tother VALUES(1, 3.7); 1256 SELECT id, a FROM tbooking, tother WHERE id>a; 1257 } 1258 } {42 1 43 1} 1259 1260 finish_test 1261