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 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19# Build some test data 20# 21do_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# 55proc 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# 65do_test where-1.1.1 { 66 count {SELECT x, y, w FROM t1 WHERE w=10} 67} {3 121 10 3} 68do_test where-1.1.2 { 69 set sqlite_query_plan 70} {t1 i1w} 71do_test where-1.1.3 { 72 db status step 73} {0} 74do_test where-1.1.4 { 75 db eval {SELECT x, y, w FROM t1 WHERE +w=10} 76} {3 121 10} 77do_test where-1.1.5 { 78 db status step 79} {99} 80do_test where-1.1.6 { 81 set sqlite_query_plan 82} {t1 {}} 83do_test where-1.1.7 { 84 count {SELECT x, y, w AS abc FROM t1 WHERE abc=10} 85} {3 121 10 3} 86do_test where-1.1.8 { 87 set sqlite_query_plan 88} {t1 i1w} 89do_test where-1.1.9 { 90 db status step 91} {0} 92do_test where-1.2.1 { 93 count {SELECT x, y, w FROM t1 WHERE w=11} 94} {3 144 11 3} 95do_test where-1.2.2 { 96 count {SELECT x, y, w AS abc FROM t1 WHERE abc=11} 97} {3 144 11 3} 98do_test where-1.3.1 { 99 count {SELECT x, y, w AS abc FROM t1 WHERE 11=w} 100} {3 144 11 3} 101do_test where-1.3.2 { 102 count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc} 103} {3 144 11 3} 104do_test where-1.4.1 { 105 count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2} 106} {11 3 144 3} 107do_test where-1.4.2 { 108 set sqlite_query_plan 109} {t1 i1w} 110do_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} 113do_test where-1.4.4 { 114 set sqlite_query_plan 115} {t1 i1w} 116do_test where-1.5 { 117 count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2} 118} {3 144 3} 119do_test where-1.5.2 { 120 set sqlite_query_plan 121} {t1 i1w} 122do_test where-1.6 { 123 count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11} 124} {3 144 3} 125do_test where-1.7 { 126 count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2} 127} {3 144 3} 128do_test where-1.8 { 129 count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3} 130} {3 144 3} 131do_test where-1.8.2 { 132 set sqlite_query_plan 133} {t1 i1xy} 134do_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} 138do_test where-1.9 { 139 count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3} 140} {3 144 3} 141do_test where-1.10 { 142 count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121} 143} {3 121 3} 144do_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# 151do_test where-1.12 { 152 count {SELECT w FROM t1 WHERE x=3 AND y<100} 153} {8 3} 154do_test where-1.13 { 155 count {SELECT w FROM t1 WHERE x=3 AND 100>y} 156} {8 3} 157do_test where-1.14 { 158 count {SELECT w FROM t1 WHERE 3=x AND y<100} 159} {8 3} 160do_test where-1.15 { 161 count {SELECT w FROM t1 WHERE 3=x AND 100>y} 162} {8 3} 163do_test where-1.16 { 164 count {SELECT w FROM t1 WHERE x=3 AND y<=100} 165} {8 9 5} 166do_test where-1.17 { 167 count {SELECT w FROM t1 WHERE x=3 AND 100>=y} 168} {8 9 5} 169do_test where-1.18 { 170 count {SELECT w FROM t1 WHERE x=3 AND y>225} 171} {15 3} 172do_test where-1.19 { 173 count {SELECT w FROM t1 WHERE x=3 AND 225<y} 174} {15 3} 175do_test where-1.20 { 176 count {SELECT w FROM t1 WHERE x=3 AND y>=225} 177} {14 15 5} 178do_test where-1.21 { 179 count {SELECT w FROM t1 WHERE x=3 AND 225<=y} 180} {14 15 5} 181do_test where-1.22 { 182 count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196} 183} {11 12 5} 184do_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} 187do_test where-1.24 { 188 count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y} 189} {11 12 5} 190do_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 200do_test where-1.27 { 201 count {SELECT w FROM t1 WHERE x=3 AND y+1==122} 202} {10 10} 203 204do_test where-1.28 { 205 count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122} 206} {10 99} 207do_test where-1.29 { 208 count {SELECT w FROM t1 WHERE y==121} 209} {10 99} 210 211 212do_test where-1.30 { 213 count {SELECT w FROM t1 WHERE w>97} 214} {98 99 100 3} 215do_test where-1.31 { 216 count {SELECT w FROM t1 WHERE w>=97} 217} {97 98 99 100 4} 218do_test where-1.33 { 219 count {SELECT w FROM t1 WHERE w==97} 220} {97 2} 221do_test where-1.33.1 { 222 count {SELECT w FROM t1 WHERE w<=97 AND w==97} 223} {97 2} 224do_test where-1.33.2 { 225 count {SELECT w FROM t1 WHERE w<98 AND w==97} 226} {97 2} 227do_test where-1.33.3 { 228 count {SELECT w FROM t1 WHERE w>=97 AND w==97} 229} {97 2} 230do_test where-1.33.4 { 231 count {SELECT w FROM t1 WHERE w>96 AND w==97} 232} {97 2} 233do_test where-1.33.5 { 234 count {SELECT w FROM t1 WHERE w==97 AND w==97} 235} {97 2} 236do_test where-1.34 { 237 count {SELECT w FROM t1 WHERE w+1==98} 238} {97 99} 239do_test where-1.35 { 240 count {SELECT w FROM t1 WHERE w<3} 241} {1 2 2} 242do_test where-1.36 { 243 count {SELECT w FROM t1 WHERE w<=3} 244} {1 2 3 3} 245do_test where-1.37 { 246 count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w} 247} {1 2 3 99} 248 249do_test where-1.38 { 250 count {SELECT (w) FROM t1 WHERE (w)>(97)} 251} {98 99 100 3} 252do_test where-1.39 { 253 count {SELECT (w) FROM t1 WHERE (w)>=(97)} 254} {97 98 99 100 4} 255do_test where-1.40 { 256 count {SELECT (w) FROM t1 WHERE (w)==(97)} 257} {97 2} 258do_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# 265do_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} 271do_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} 277do_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} 283do_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} 289do_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} 295do_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} 301do_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# 310do_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} 316do_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} 322do_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# 332do_test where-4.1 { 333 count { 334 SELECT * FROM t1 WHERE 0 335 } 336} {0} 337do_test where-4.2 { 338 count { 339 SELECT * FROM t1 WHERE 1 LIMIT 1 340 } 341} {1 0 4 0} 342do_test where-4.3 { 343 execsql { 344 SELECT 99 WHERE 0 345 } 346} {} 347do_test where-4.4 { 348 execsql { 349 SELECT 99 WHERE 1 350 } 351} {99} 352do_test where-4.5 { 353 execsql { 354 SELECT 99 WHERE 0.1 355 } 356} {99} 357do_test where-4.6 { 358 execsql { 359 SELECT 99 WHERE 0.0 360 } 361} {} 362do_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# 371ifcapable 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# 464proc 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# 473do_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} 483do_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} 488do_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} 493do_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} 498do_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} 503do_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} 508do_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} 513ifcapable 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} 520do_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} 525do_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} 530do_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} 535do_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} 540do_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} 545do_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} 550do_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} 555do_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} 560do_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} 565do_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} 570do_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} 575do_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} 580do_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} 585do_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} 590do_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} 595do_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} 600do_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} 605do_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} 610do_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} 615do_test where-6.19 { 616 cksort { 617 SELECT y FROM t1 ORDER BY w LIMIT 3; 618 } 619} {4 9 16 nosort} 620do_test where-6.20 { 621 cksort { 622 SELECT y FROM t1 ORDER BY rowid LIMIT 3; 623 } 624} {4 9 16 nosort} 625do_test where-6.21 { 626 cksort { 627 SELECT y FROM t1 ORDER BY rowid, y LIMIT 3; 628 } 629} {4 9 16 nosort} 630do_test where-6.22 { 631 cksort { 632 SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3; 633 } 634} {4 9 16 nosort} 635do_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} 640do_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} 645do_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} 650do_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} 655do_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# 664do_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} 669do_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} 674do_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} 679do_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} 684do_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} 689do_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} 694do_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} 699do_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} 704do_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} 709do_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} 714do_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} 719do_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} 724do_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} 729do_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} 734do_test where-7.15 { 735 cksort { 736 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y; 737 } 738} {nosort} 739do_test where-7.16 { 740 cksort { 741 SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y; 742 } 743} {8 nosort} 744do_test where-7.17 { 745 cksort { 746 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y; 747 } 748} {nosort} 749do_test where-7.18 { 750 cksort { 751 SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y; 752 } 753} {15 nosort} 754do_test where-7.19 { 755 cksort { 756 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC; 757 } 758} {nosort} 759do_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} 764do_test where-7.21 { 765 cksort { 766 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC; 767 } 768} {nosort} 769do_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} 774do_test where-7.23 { 775 cksort { 776 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y; 777 } 778} {nosort} 779do_test where-7.24 { 780 cksort { 781 SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y; 782 } 783} {1 nosort} 784do_test where-7.25 { 785 cksort { 786 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y; 787 } 788} {nosort} 789do_test where-7.26 { 790 cksort { 791 SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y; 792 } 793} {100 nosort} 794do_test where-7.27 { 795 cksort { 796 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC; 797 } 798} {nosort} 799do_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} 804do_test where-7.29 { 805 cksort { 806 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC; 807 } 808} {nosort} 809do_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} 814do_test where-7.31 { 815 cksort { 816 SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3 817 } 818} {10201 10000 9801 nosort} 819do_test where-7.32 { 820 cksort { 821 SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC 822 } 823} {16 9 4 nosort} 824do_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} 829do_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} 834do_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 840do_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} 849do_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# 860do_test where-9.1 { 861 execsql { 862 CREATE TABLE t5(x PRIMARY KEY); 863 SELECT * FROM t5 WHERE x<10; 864 } 865} {} 866do_test where-9.2 { 867 execsql { 868 SELECT * FROM t5 WHERE x<10 ORDER BY x DESC; 869 } 870} {} 871do_test where-9.3 { 872 execsql { 873 SELECT * FROM t5 WHERE x=10; 874 } 875} {} 876 877do_test where-10.1 { 878 execsql { 879 SELECT 1 WHERE abs(random())<0 880 } 881} {} 882do_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} 890do_test where-10.3 { 891 set ::v1 1 892 execsql { 893 SELECT count(*) FROM t1 WHERE tclvar('v1'); 894 } 895} {100} 896do_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# 913do_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# 944do_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} 955do_test where-12.2 { 956 cksort { 957 SELECT * FROM t6 ORDER BY b, a; 958 } 959} {4 four 1 one nosort} 960do_test where-12.3 { 961 cksort { 962 SELECT * FROM t6 ORDER BY a; 963 } 964} {1 one 4 four nosort} 965do_test where-12.4 { 966 cksort { 967 SELECT * FROM t6 ORDER BY a, b; 968 } 969} {1 one 4 four nosort} 970do_test where-12.5 { 971 cksort { 972 SELECT * FROM t6 ORDER BY b DESC; 973 } 974} {1 one 4 four nosort} 975do_test where-12.6 { 976 cksort { 977 SELECT * FROM t6 ORDER BY b DESC, a DESC; 978 } 979} {1 one 4 four nosort} 980do_test where-12.7 { 981 cksort { 982 SELECT * FROM t6 ORDER BY b DESC, a ASC; 983 } 984} {1 one 4 four sort} 985do_test where-12.8 { 986 cksort { 987 SELECT * FROM t6 ORDER BY b ASC, a DESC; 988 } 989} {4 four 1 one sort} 990do_test where-12.9 { 991 cksort { 992 SELECT * FROM t6 ORDER BY a DESC; 993 } 994} {4 four 1 one nosort} 995do_test where-12.10 { 996 cksort { 997 SELECT * FROM t6 ORDER BY a DESC, b DESC; 998 } 999} {4 four 1 one nosort} 1000do_test where-12.11 { 1001 cksort { 1002 SELECT * FROM t6 ORDER BY a DESC, b ASC; 1003 } 1004} {4 four 1 one nosort} 1005do_test where-12.12 { 1006 cksort { 1007 SELECT * FROM t6 ORDER BY a ASC, b DESC; 1008 } 1009} {1 one 4 four nosort} 1010do_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} 1021do_test where-13.2 { 1022 cksort { 1023 SELECT * FROM t7 ORDER BY b, a; 1024 } 1025} {4 four 1 one nosort} 1026do_test where-13.3 { 1027 cksort { 1028 SELECT * FROM t7 ORDER BY a; 1029 } 1030} {1 one 4 four nosort} 1031do_test where-13.4 { 1032 cksort { 1033 SELECT * FROM t7 ORDER BY a, b; 1034 } 1035} {1 one 4 four nosort} 1036do_test where-13.5 { 1037 cksort { 1038 SELECT * FROM t7 ORDER BY b DESC; 1039 } 1040} {1 one 4 four nosort} 1041do_test where-13.6 { 1042 cksort { 1043 SELECT * FROM t7 ORDER BY b DESC, a DESC; 1044 } 1045} {1 one 4 four nosort} 1046do_test where-13.7 { 1047 cksort { 1048 SELECT * FROM t7 ORDER BY b DESC, a ASC; 1049 } 1050} {1 one 4 four sort} 1051do_test where-13.8 { 1052 cksort { 1053 SELECT * FROM t7 ORDER BY b ASC, a DESC; 1054 } 1055} {4 four 1 one sort} 1056do_test where-13.9 { 1057 cksort { 1058 SELECT * FROM t7 ORDER BY a DESC; 1059 } 1060} {4 four 1 one nosort} 1061do_test where-13.10 { 1062 cksort { 1063 SELECT * FROM t7 ORDER BY a DESC, b DESC; 1064 } 1065} {4 four 1 one nosort} 1066do_test where-13.11 { 1067 cksort { 1068 SELECT * FROM t7 ORDER BY a DESC, b ASC; 1069 } 1070} {4 four 1 one nosort} 1071do_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# 1082do_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} 1092do_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} 1097do_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} 1102do_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} 1107do_test where-14.5 { 1108 # This test case changed from "nosort" to "sort". See ticket 2a5629202f. 1109 cksort { 1110 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b 1111 } 1112} {4/1 4/4 1/1 1/4 sort} 1113do_test where-14.6 { 1114 # This test case changed from "nosort" to "sort". See ticket 2a5629202f. 1115 cksort { 1116 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC 1117 } 1118} {4/1 4/4 1/1 1/4 sort} 1119do_test where-14.7 { 1120 cksort { 1121 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b 1122 } 1123} {4/1 4/4 1/1 1/4 sort} 1124do_test where-14.7.1 { 1125 cksort { 1126 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b 1127 } 1128} {4/1 4/4 1/1 1/4 sort} 1129do_test where-14.7.2 { 1130 cksort { 1131 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b 1132 } 1133} {4/1 4/4 1/1 1/4 nosort} 1134do_test where-14.8 { 1135 cksort { 1136 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC 1137 } 1138} {4/4 4/1 1/4 1/1 sort} 1139do_test where-14.9 { 1140 cksort { 1141 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b 1142 } 1143} {4/4 4/1 1/4 1/1 sort} 1144do_test where-14.10 { 1145 cksort { 1146 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC 1147 } 1148} {4/1 4/4 1/1 1/4 sort} 1149do_test where-14.11 { 1150 cksort { 1151 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b 1152 } 1153} {4/1 4/4 1/1 1/4 sort} 1154do_test where-14.12 { 1155 cksort { 1156 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC 1157 } 1158} {4/4 4/1 1/4 1/1 sort} 1159 1160# Ticket #2445. 1161# 1162# There was a crash that could occur when a where clause contains an 1163# alias for an expression in the result set, and that expression retrieves 1164# a column of the second or subsequent table in a join. 1165# 1166do_test where-15.1 { 1167 execsql { 1168 CREATE TEMP TABLE t1 (a, b, c, d, e); 1169 CREATE TEMP TABLE t2 (f); 1170 SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ; 1171 } 1172} {} 1173 1174# Ticket #3408. 1175# 1176# The branch of code in where.c that generated rowid lookups was 1177# incorrectly deallocating a constant register, meaning that if the 1178# vdbe code ran more than once, the second time around the constant 1179# value may have been clobbered by some other value. 1180# 1181do_test where-16.1 { 1182 execsql { 1183 CREATE TABLE a1(id INTEGER PRIMARY KEY, v); 1184 CREATE TABLE a2(id INTEGER PRIMARY KEY, v); 1185 INSERT INTO a1 VALUES(1, 'one'); 1186 INSERT INTO a1 VALUES(2, 'two'); 1187 INSERT INTO a2 VALUES(1, 'one'); 1188 INSERT INTO a2 VALUES(2, 'two'); 1189 } 1190} {} 1191do_test where-16.2 { 1192 execsql { 1193 SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one'; 1194 } 1195} {1 one 1 one 2 two 1 one} 1196 1197# The actual problem reported in #3408. 1198do_test where-16.3 { 1199 execsql { 1200 CREATE TEMP TABLE foo(idx INTEGER); 1201 INSERT INTO foo VALUES(1); 1202 INSERT INTO foo VALUES(1); 1203 INSERT INTO foo VALUES(1); 1204 INSERT INTO foo VALUES(2); 1205 INSERT INTO foo VALUES(2); 1206 CREATE TEMP TABLE bar(stuff INTEGER); 1207 INSERT INTO bar VALUES(100); 1208 INSERT INTO bar VALUES(200); 1209 INSERT INTO bar VALUES(300); 1210 } 1211} {} 1212do_test where-16.4 { 1213 execsql { 1214 SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2; 1215 } 1216} {2 2} 1217 1218integrity_check {where-99.0} 1219 1220#--------------------------------------------------------------------- 1221# These tests test that a bug surrounding the use of ForceInt has been 1222# fixed in where.c. 1223# 1224do_test where-17.1 { 1225 execsql { 1226 CREATE TABLE tbooking ( 1227 id INTEGER PRIMARY KEY, 1228 eventtype INTEGER NOT NULL 1229 ); 1230 INSERT INTO tbooking VALUES(42, 3); 1231 INSERT INTO tbooking VALUES(43, 4); 1232 } 1233} {} 1234do_test where-17.2 { 1235 execsql { 1236 SELECT a.id 1237 FROM tbooking AS a 1238 WHERE a.eventtype=3; 1239 } 1240} {42} 1241do_test where-17.3 { 1242 execsql { 1243 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1244 FROM tbooking AS a 1245 WHERE a.eventtype=3; 1246 } 1247} {42 43} 1248do_test where-17.4 { 1249 execsql { 1250 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1251 FROM (SELECT 1.5 AS id) AS a 1252 } 1253} {1.5 42} 1254do_test where-17.5 { 1255 execsql { 1256 CREATE TABLE tother(a, b); 1257 INSERT INTO tother VALUES(1, 3.7); 1258 SELECT id, a FROM tbooking, tother WHERE id>a; 1259 } 1260} {42 1 43 1} 1261 1262finish_test 1263