github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/where.test (about) 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"); -- Verify quoted identifier names 46 CREATE INDEX i1xy ON t1(`x`,'y' ASC); -- Old MySQL compatibility 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.1b { 69 count {SELECT x, y, w FROM t1 WHERE w IS 10} 70 } {3 121 10 3} 71 do_eqp_test where-1.1.2 { 72 SELECT x, y, w FROM t1 WHERE w=10 73 } {*SEARCH t1 USING INDEX i1w (w=?)*} 74 do_eqp_test where-1.1.2b { 75 SELECT x, y, w FROM t1 WHERE w IS 10 76 } {*SEARCH t1 USING INDEX i1w (w=?)*} 77 do_test where-1.1.3 { 78 db status step 79 } {0} 80 do_test where-1.1.4 { 81 db eval {SELECT x, y, w FROM t1 WHERE +w=10} 82 } {3 121 10} 83 do_test where-1.1.5 { 84 db status step 85 } {99} 86 do_eqp_test where-1.1.6 { 87 SELECT x, y, w FROM t1 WHERE +w=10 88 } {*SCAN t1*} 89 do_test where-1.1.7 { 90 count {SELECT x, y, w AS abc FROM t1 WHERE abc=10} 91 } {3 121 10 3} 92 do_eqp_test where-1.1.8 { 93 SELECT x, y, w AS abc FROM t1 WHERE abc=10 94 } {*SEARCH t1 USING INDEX i1w (w=?)*} 95 do_test where-1.1.9 { 96 db status step 97 } {0} 98 do_test where-1.2.1 { 99 count {SELECT x, y, w FROM t1 WHERE w=11} 100 } {3 144 11 3} 101 do_test where-1.2.2 { 102 count {SELECT x, y, w AS abc FROM t1 WHERE abc=11} 103 } {3 144 11 3} 104 do_test where-1.3.1 { 105 count {SELECT x, y, w AS abc FROM t1 WHERE 11=w} 106 } {3 144 11 3} 107 do_test where-1.3.2 { 108 count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc} 109 } {3 144 11 3} 110 do_test where-1.3.3 { 111 count {SELECT x, y, w AS abc FROM t1 WHERE 11 IS abc} 112 } {3 144 11 3} 113 do_test where-1.4.1 { 114 count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2} 115 } {11 3 144 3} 116 do_test where-1.4.1b { 117 count {SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2} 118 } {11 3 144 3} 119 do_eqp_test where-1.4.2 { 120 SELECT w, x, y FROM t1 WHERE 11=w AND x>2 121 } {*SEARCH t1 USING INDEX i1w (w=?)*} 122 do_eqp_test where-1.4.2b { 123 SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2 124 } {*SEARCH t1 USING INDEX i1w (w=?)*} 125 do_test where-1.4.3 { 126 count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2} 127 } {11 3 144 3} 128 do_eqp_test where-1.4.4 { 129 SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2 130 } {*SEARCH t1 USING INDEX i1w (w=?)*} 131 do_test where-1.5 { 132 count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2} 133 } {3 144 3} 134 do_eqp_test where-1.5.2 { 135 SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2 136 } {*SEARCH t1 USING INDEX i1w (w=?)*} 137 do_test where-1.6 { 138 count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11} 139 } {3 144 3} 140 do_test where-1.7 { 141 count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2} 142 } {3 144 3} 143 do_test where-1.8 { 144 count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3} 145 } {3 144 3} 146 do_eqp_test where-1.8.2 { 147 SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3 148 } {*SEARCH t1 USING INDEX i1xy (x=? AND y=?)*} 149 do_eqp_test where-1.8.3 { 150 SELECT x, y FROM t1 WHERE y=144 AND x=3 151 } {*SEARCH t1 USING COVERING INDEX i1xy (x=? AND y=?)*} 152 do_test where-1.9 { 153 count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3} 154 } {3 144 3} 155 do_test where-1.10 { 156 count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121} 157 } {3 121 3} 158 do_test where-1.11 { 159 count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10} 160 } {3 100 3} 161 do_test where-1.11b { 162 count {SELECT x, y FROM t1 WHERE x IS 3 AND y IS 100 AND w<10} 163 } {3 100 3} 164 165 # New for SQLite version 2.1: Verify that that inequality constraints 166 # are used correctly. 167 # 168 do_test where-1.12 { 169 count {SELECT w FROM t1 WHERE x=3 AND y<100} 170 } {8 3} 171 do_test where-1.12b { 172 count {SELECT w FROM t1 WHERE x IS 3 AND y<100} 173 } {8 3} 174 do_test where-1.13 { 175 count {SELECT w FROM t1 WHERE x=3 AND 100>y} 176 } {8 3} 177 do_test where-1.14 { 178 count {SELECT w FROM t1 WHERE 3=x AND y<100} 179 } {8 3} 180 do_test where-1.14b { 181 count {SELECT w FROM t1 WHERE 3 IS x AND y<100} 182 } {8 3} 183 do_test where-1.15 { 184 count {SELECT w FROM t1 WHERE 3=x AND 100>y} 185 } {8 3} 186 do_test where-1.16 { 187 count {SELECT w FROM t1 WHERE x=3 AND y<=100} 188 } {8 9 5} 189 do_test where-1.17 { 190 count {SELECT w FROM t1 WHERE x=3 AND 100>=y} 191 } {8 9 5} 192 do_test where-1.18 { 193 count {SELECT w FROM t1 WHERE x=3 AND y>225} 194 } {15 3} 195 do_test where-1.18b { 196 count {SELECT w FROM t1 WHERE x IS 3 AND y>225} 197 } {15 3} 198 do_test where-1.19 { 199 count {SELECT w FROM t1 WHERE x=3 AND 225<y} 200 } {15 3} 201 do_test where-1.20 { 202 count {SELECT w FROM t1 WHERE x=3 AND y>=225} 203 } {14 15 5} 204 do_test where-1.21 { 205 count {SELECT w FROM t1 WHERE x=3 AND 225<=y} 206 } {14 15 5} 207 do_test where-1.22 { 208 count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196} 209 } {11 12 5} 210 do_test where-1.22b { 211 count {SELECT w FROM t1 WHERE x IS 3 AND y>121 AND y<196} 212 } {11 12 5} 213 do_test where-1.23 { 214 count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196} 215 } {10 11 12 13 9} 216 do_test where-1.24 { 217 count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y} 218 } {11 12 5} 219 do_test where-1.25 { 220 count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y} 221 } {10 11 12 13 9} 222 223 # Need to work on optimizing the BETWEEN operator. 224 # 225 # do_test where-1.26 { 226 # count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196} 227 # } {10 11 12 13 9} 228 229 do_test where-1.27 { 230 count {SELECT w FROM t1 WHERE x=3 AND y+1==122} 231 } {10 10} 232 233 do_test where-1.28 { 234 count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122} 235 } {10 99} 236 do_test where-1.29 { 237 count {SELECT w FROM t1 WHERE y==121} 238 } {10 99} 239 240 241 do_test where-1.30 { 242 count {SELECT w FROM t1 WHERE w>97} 243 } {98 99 100 3} 244 do_test where-1.31 { 245 count {SELECT w FROM t1 WHERE w>=97} 246 } {97 98 99 100 4} 247 do_test where-1.33 { 248 count {SELECT w FROM t1 WHERE w==97} 249 } {97 2} 250 do_test where-1.33.1 { 251 count {SELECT w FROM t1 WHERE w<=97 AND w==97} 252 } {97 2} 253 do_test where-1.33.2 { 254 count {SELECT w FROM t1 WHERE w<98 AND w==97} 255 } {97 2} 256 do_test where-1.33.3 { 257 count {SELECT w FROM t1 WHERE w>=97 AND w==97} 258 } {97 2} 259 do_test where-1.33.4 { 260 count {SELECT w FROM t1 WHERE w>96 AND w==97} 261 } {97 2} 262 do_test where-1.33.5 { 263 count {SELECT w FROM t1 WHERE w==97 AND w==97} 264 } {97 2} 265 do_test where-1.34 { 266 count {SELECT w FROM t1 WHERE w+1==98} 267 } {97 99} 268 do_test where-1.35 { 269 count {SELECT w FROM t1 WHERE w<3} 270 } {1 2 3} 271 do_test where-1.36 { 272 count {SELECT w FROM t1 WHERE w<=3} 273 } {1 2 3 4} 274 do_test where-1.37 { 275 count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w} 276 } {1 2 3 99} 277 278 do_test where-1.38 { 279 count {SELECT (w) FROM t1 WHERE (w)>(97)} 280 } {98 99 100 3} 281 do_test where-1.39 { 282 count {SELECT (w) FROM t1 WHERE (w)>=(97)} 283 } {97 98 99 100 4} 284 do_test where-1.40 { 285 count {SELECT (w) FROM t1 WHERE (w)==(97)} 286 } {97 2} 287 do_test where-1.41 { 288 count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)} 289 } {97 99} 290 291 292 # Do the same kind of thing except use a join as the data source. 293 # 294 do_test where-2.1 { 295 count { 296 SELECT w, p FROM t2, t1 297 WHERE x=q AND y=s AND r=8977 298 } 299 } {34 67 6} 300 do_test where-2.2 { 301 count { 302 SELECT w, p FROM t2, t1 303 WHERE x=q AND s=y AND r=8977 304 } 305 } {34 67 6} 306 do_test where-2.3 { 307 count { 308 SELECT w, p FROM t2, t1 309 WHERE x=q AND s=y AND r=8977 AND w>10 310 } 311 } {34 67 6} 312 do_test where-2.4 { 313 count { 314 SELECT w, p FROM t2, t1 315 WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10 316 } 317 } {34 67 6} 318 do_test where-2.5 { 319 count { 320 SELECT w, p FROM t2, t1 321 WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10 322 } 323 } {34 67 6} 324 do_test where-2.6 { 325 count { 326 SELECT w, p FROM t2, t1 327 WHERE x=q AND p=77 AND s=y AND w>5 328 } 329 } {24 77 6} 330 do_test where-2.7 { 331 count { 332 SELECT w, p FROM t1, t2 333 WHERE x=q AND p>77 AND s=y AND w=5 334 } 335 } {5 96 6} 336 337 # Lets do a 3-way join. 338 # 339 do_test where-3.1 { 340 count { 341 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 342 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11 343 } 344 } {11 90 11 8} 345 do_test where-3.2 { 346 count { 347 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 348 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12 349 } 350 } {12 89 12 8} 351 do_test where-3.3 { 352 count { 353 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 354 WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y 355 } 356 } {15 86 86 8} 357 358 # Test to see that the special case of a constant WHERE clause is 359 # handled. 360 # 361 do_test where-4.1 { 362 count { 363 SELECT * FROM t1 WHERE 0 364 } 365 } {0} 366 do_test where-4.2 { 367 count { 368 SELECT * FROM t1 WHERE 1 LIMIT 1 369 } 370 } {1 0 4 0} 371 do_test where-4.3 { 372 execsql { 373 SELECT 99 WHERE 0 374 } 375 } {} 376 do_test where-4.4 { 377 execsql { 378 SELECT 99 WHERE 1 379 } 380 } {99} 381 do_test where-4.5 { 382 execsql { 383 SELECT 99 WHERE 0.1 384 } 385 } {99} 386 do_test where-4.6 { 387 execsql { 388 SELECT 99 WHERE 0.0 389 } 390 } {} 391 do_test where-4.7 { 392 execsql { 393 SELECT count(*) FROM t1 WHERE t1.w 394 } 395 } {100} 396 397 # Verify that IN operators in a WHERE clause are handled correctly. 398 # Omit these tests if the build is not capable of sub-queries. 399 # 400 ifcapable subquery { 401 do_test where-5.1 { 402 count { 403 SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1; 404 } 405 } {1 0 4 2 1 9 3 1 16 4} 406 do_test where-5.2 { 407 count { 408 SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1; 409 } 410 } {1 0 4 2 1 9 3 1 16 102} 411 do_test where-5.3a { 412 count { 413 SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1; 414 } 415 } {1 0 4 2 1 9 3 1 16 12} 416 do_test where-5.3b { 417 count { 418 SELECT * FROM t1 WHERE w IN (3,-1,1,2) order by 1; 419 } 420 } {1 0 4 2 1 9 3 1 16 12} 421 do_test where-5.3c { 422 count { 423 SELECT * FROM t1 WHERE w IN (3,2,-1,1,2) order by 1; 424 } 425 } {1 0 4 2 1 9 3 1 16 12} 426 do_test where-5.3d { 427 count { 428 SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1 DESC; 429 } 430 } {3 1 16 2 1 9 1 0 4 11} 431 do_test where-5.4 { 432 count { 433 SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1; 434 } 435 } {1 0 4 2 1 9 3 1 16 102} 436 do_test where-5.5 { 437 count { 438 SELECT * FROM t1 WHERE rowid IN 439 (select rowid from t1 where rowid IN (-1,2,4)) 440 ORDER BY 1; 441 } 442 } {2 1 9 4 2 25 3} 443 do_test where-5.6 { 444 count { 445 SELECT * FROM t1 WHERE rowid+0 IN 446 (select rowid from t1 where rowid IN (-1,2,4)) 447 ORDER BY 1; 448 } 449 } {2 1 9 4 2 25 103} 450 do_test where-5.7 { 451 count { 452 SELECT * FROM t1 WHERE w IN 453 (select rowid from t1 where rowid IN (-1,2,4)) 454 ORDER BY 1; 455 } 456 } {2 1 9 4 2 25 9} 457 do_test where-5.8 { 458 count { 459 SELECT * FROM t1 WHERE w+0 IN 460 (select rowid from t1 where rowid IN (-1,2,4)) 461 ORDER BY 1; 462 } 463 } {2 1 9 4 2 25 103} 464 do_test where-5.9 { 465 count { 466 SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1; 467 } 468 } {2 1 9 3 1 16 6} 469 do_test where-5.10 { 470 count { 471 SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1; 472 } 473 } {2 1 9 3 1 16 199} 474 do_test where-5.11 { 475 count { 476 SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1; 477 } 478 } {79 6 6400 89 6 8100 199} 479 do_test where-5.12 { 480 count { 481 SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1; 482 } 483 } {79 6 6400 89 6 8100 7} 484 do_test where-5.13 { 485 count { 486 SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1; 487 } 488 } {2 1 9 3 1 16 6} 489 do_test where-5.14 { 490 count { 491 SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1; 492 } 493 } {2 1 9 5} 494 do_test where-5.15 { 495 count { 496 SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1; 497 } 498 } {2 1 9 3 1 16 9} 499 do_test where-5.100 { 500 db eval { 501 SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969) 502 ORDER BY x, y 503 } 504 } {2 1 9 54 5 3025 62 5 3969} 505 do_test where-5.101 { 506 db eval { 507 SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969) 508 ORDER BY x DESC, y DESC 509 } 510 } {62 5 3969 54 5 3025 2 1 9} 511 do_test where-5.102 { 512 db eval { 513 SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969) 514 ORDER BY x DESC, y 515 } 516 } {54 5 3025 62 5 3969 2 1 9} 517 do_test where-5.103 { 518 db eval { 519 SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969) 520 ORDER BY x, y DESC 521 } 522 } {2 1 9 62 5 3969 54 5 3025} 523 } 524 525 # This procedure executes the SQL. Then it checks to see if the OP_Sort 526 # opcode was executed. If an OP_Sort did occur, then "sort" is appended 527 # to the result. If no OP_Sort happened, then "nosort" is appended. 528 # 529 # This procedure is used to check to make sure sorting is or is not 530 # occurring as expected. 531 # 532 proc cksort {sql} { 533 set data [execsql $sql] 534 if {[db status sort]} {set x sort} {set x nosort} 535 lappend data $x 536 return $data 537 } 538 # Check out the logic that attempts to implement the ORDER BY clause 539 # using an index rather than by sorting. 540 # 541 do_test where-6.1 { 542 execsql { 543 CREATE TABLE t3(a,b,c); 544 CREATE INDEX t3a ON t3(a); 545 CREATE INDEX t3bc ON t3(b,c); 546 CREATE INDEX t3acb ON t3(a,c,b); 547 INSERT INTO t3 SELECT w, 101-w, y FROM t1; 548 SELECT count(*), sum(a), sum(b), sum(c) FROM t3; 549 } 550 } {100 5050 5050 348550} 551 do_test where-6.2 { 552 cksort { 553 SELECT * FROM t3 ORDER BY a LIMIT 3 554 } 555 } {1 100 4 2 99 9 3 98 16 nosort} 556 do_test where-6.3 { 557 cksort { 558 SELECT * FROM t3 ORDER BY a+1 LIMIT 3 559 } 560 } {1 100 4 2 99 9 3 98 16 sort} 561 do_test where-6.4 { 562 cksort { 563 SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3 564 } 565 } {1 100 4 2 99 9 3 98 16 nosort} 566 do_test where-6.5 { 567 cksort { 568 SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3 569 } 570 } {1 100 4 2 99 9 3 98 16 nosort} 571 do_test where-6.6 { 572 cksort { 573 SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3 574 } 575 } {1 100 4 2 99 9 3 98 16 nosort} 576 do_test where-6.7.1 { 577 cksort { 578 SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 10 579 } 580 } {/1 100 4 2 99 9 3 98 16 .* nosort/} 581 do_test where-6.7.2 { 582 cksort { 583 SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 1 584 } 585 } {1 100 4 nosort} 586 ifcapable subquery { 587 do_test where-6.8a { 588 cksort { 589 SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3 590 } 591 } {1 100 4 2 99 9 3 98 16 nosort} 592 do_test where-6.8b { 593 cksort { 594 SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a DESC LIMIT 3 595 } 596 } {9 92 100 7 94 64 5 96 36 nosort} 597 } 598 do_test where-6.9.1 { 599 cksort { 600 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 601 } 602 } {1 100 4 nosort} 603 do_test where-6.9.1.1 { 604 cksort { 605 SELECT * FROM t3 WHERE a>=1 AND a=1 AND c>0 ORDER BY a LIMIT 3 606 } 607 } {1 100 4 nosort} 608 do_test where-6.9.1.2 { 609 cksort { 610 SELECT * FROM t3 WHERE a<2 AND a=1 AND c>0 ORDER BY a LIMIT 3 611 } 612 } {1 100 4 nosort} 613 do_test where-6.9.2 { 614 cksort { 615 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 616 } 617 } {1 100 4 nosort} 618 do_test where-6.9.3 { 619 cksort { 620 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3 621 } 622 } {1 100 4 nosort} 623 do_test where-6.9.4 { 624 cksort { 625 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3 626 } 627 } {1 100 4 nosort} 628 do_test where-6.9.5 { 629 cksort { 630 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3 631 } 632 } {1 100 4 nosort} 633 do_test where-6.9.6 { 634 cksort { 635 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3 636 } 637 } {1 100 4 nosort} 638 do_test where-6.9.7 { 639 cksort { 640 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3 641 } 642 } {1 100 4 nosort} 643 do_test where-6.9.8 { 644 cksort { 645 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3 646 } 647 } {1 100 4 nosort} 648 do_test where-6.9.9 { 649 cksort { 650 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3 651 } 652 } {1 100 4 nosort} 653 do_test where-6.10 { 654 cksort { 655 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 656 } 657 } {1 100 4 nosort} 658 do_test where-6.11 { 659 cksort { 660 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 661 } 662 } {1 100 4 nosort} 663 do_test where-6.12 { 664 cksort { 665 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3 666 } 667 } {1 100 4 nosort} 668 do_test where-6.13 { 669 cksort { 670 SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3 671 } 672 } {100 1 10201 99 2 10000 98 3 9801 nosort} 673 do_test where-6.13.1 { 674 cksort { 675 SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3 676 } 677 } {100 1 10201 99 2 10000 98 3 9801 sort} 678 do_test where-6.14 { 679 cksort { 680 SELECT * FROM t3 ORDER BY b LIMIT 3 681 } 682 } {100 1 10201 99 2 10000 98 3 9801 nosort} 683 do_test where-6.15 { 684 cksort { 685 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3 686 } 687 } {1 0 2 1 3 1 nosort} 688 do_test where-6.16 { 689 cksort { 690 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3 691 } 692 } {1 0 2 1 3 1 sort} 693 do_test where-6.19 { 694 cksort { 695 SELECT y FROM t1 ORDER BY w LIMIT 3; 696 } 697 } {4 9 16 nosort} 698 do_test where-6.20 { 699 cksort { 700 SELECT y FROM t1 ORDER BY rowid LIMIT 3; 701 } 702 } {4 9 16 nosort} 703 do_test where-6.21 { 704 cksort { 705 SELECT y FROM t1 ORDER BY rowid, y LIMIT 3; 706 } 707 } {4 9 16 nosort} 708 do_test where-6.22 { 709 cksort { 710 SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3; 711 } 712 } {4 9 16 nosort} 713 do_test where-6.23 { 714 cksort { 715 SELECT y FROM t1 WHERE y>4 ORDER BY rowid, w, x LIMIT 3; 716 } 717 } {9 16 25 nosort} 718 do_test where-6.24 { 719 cksort { 720 SELECT y FROM t1 WHERE y>=9 ORDER BY rowid, x DESC, w LIMIT 3; 721 } 722 } {9 16 25 nosort} 723 do_test where-6.25 { 724 cksort { 725 SELECT y FROM t1 WHERE y>4 AND y<25 ORDER BY rowid; 726 } 727 } {9 16 nosort} 728 do_test where-6.26 { 729 cksort { 730 SELECT y FROM t1 WHERE y>=4 AND y<=25 ORDER BY oid; 731 } 732 } {4 9 16 25 nosort} 733 do_test where-6.27 { 734 cksort { 735 SELECT y FROM t1 WHERE y<=25 ORDER BY _rowid_, w+y; 736 } 737 } {4 9 16 25 nosort} 738 739 740 # Tests for reverse-order sorting. 741 # 742 do_test where-7.1 { 743 cksort { 744 SELECT w FROM t1 WHERE x=3 ORDER BY y; 745 } 746 } {8 9 10 11 12 13 14 15 nosort} 747 do_test where-7.2 { 748 cksort { 749 SELECT w FROM t1 WHERE x=3 ORDER BY y DESC; 750 } 751 } {15 14 13 12 11 10 9 8 nosort} 752 do_test where-7.3 { 753 cksort { 754 SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3; 755 } 756 } {10 11 12 nosort} 757 do_test where-7.4 { 758 cksort { 759 SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3; 760 } 761 } {15 14 13 nosort} 762 do_test where-7.5 { 763 cksort { 764 SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC; 765 } 766 } {15 14 13 12 11 nosort} 767 do_test where-7.6 { 768 cksort { 769 SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC; 770 } 771 } {15 14 13 12 11 10 nosort} 772 do_test where-7.7 { 773 cksort { 774 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC; 775 } 776 } {12 11 10 nosort} 777 do_test where-7.8 { 778 cksort { 779 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC; 780 } 781 } {13 12 11 10 nosort} 782 do_test where-7.9 { 783 cksort { 784 SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC; 785 } 786 } {13 12 11 nosort} 787 do_test where-7.10 { 788 cksort { 789 SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC; 790 } 791 } {12 11 10 nosort} 792 do_test where-7.11 { 793 cksort { 794 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y; 795 } 796 } {10 11 12 nosort} 797 do_test where-7.12 { 798 cksort { 799 SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y; 800 } 801 } {10 11 12 13 nosort} 802 do_test where-7.13 { 803 cksort { 804 SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y; 805 } 806 } {11 12 13 nosort} 807 do_test where-7.14 { 808 cksort { 809 SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y; 810 } 811 } {10 11 12 nosort} 812 do_test where-7.15 { 813 cksort { 814 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y; 815 } 816 } {nosort} 817 do_test where-7.16 { 818 cksort { 819 SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y; 820 } 821 } {8 nosort} 822 do_test where-7.17 { 823 cksort { 824 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y; 825 } 826 } {nosort} 827 do_test where-7.18 { 828 cksort { 829 SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y; 830 } 831 } {15 nosort} 832 do_test where-7.19 { 833 cksort { 834 SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC; 835 } 836 } {nosort} 837 do_test where-7.20 { 838 cksort { 839 SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC; 840 } 841 } {8 nosort} 842 do_test where-7.21 { 843 cksort { 844 SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC; 845 } 846 } {nosort} 847 do_test where-7.22 { 848 cksort { 849 SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC; 850 } 851 } {15 nosort} 852 do_test where-7.23 { 853 cksort { 854 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y; 855 } 856 } {nosort} 857 do_test where-7.24 { 858 cksort { 859 SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y; 860 } 861 } {1 nosort} 862 do_test where-7.25 { 863 cksort { 864 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y; 865 } 866 } {nosort} 867 do_test where-7.26 { 868 cksort { 869 SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y; 870 } 871 } {100 nosort} 872 do_test where-7.27 { 873 cksort { 874 SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC; 875 } 876 } {nosort} 877 do_test where-7.28 { 878 cksort { 879 SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC; 880 } 881 } {1 nosort} 882 do_test where-7.29 { 883 cksort { 884 SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC; 885 } 886 } {nosort} 887 do_test where-7.30 { 888 cksort { 889 SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC; 890 } 891 } {100 nosort} 892 do_test where-7.31 { 893 cksort { 894 SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3 895 } 896 } {10201 10000 9801 nosort} 897 do_test where-7.32 { 898 cksort { 899 SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC 900 } 901 } {16 9 4 nosort} 902 do_test where-7.33 { 903 cksort { 904 SELECT y FROM t1 WHERE y<=25 ORDER BY rowid DESC 905 } 906 } {25 16 9 4 nosort} 907 do_test where-7.34 { 908 cksort { 909 SELECT y FROM t1 WHERE y<25 AND y>4 ORDER BY rowid DESC, y DESC 910 } 911 } {16 9 nosort} 912 do_test where-7.35 { 913 cksort { 914 SELECT y FROM t1 WHERE y<25 AND y>=4 ORDER BY rowid DESC 915 } 916 } {16 9 4 nosort} 917 918 do_test where-8.1 { 919 execsql { 920 CREATE TABLE t4 AS SELECT * FROM t1; 921 CREATE INDEX i4xy ON t4(x,y); 922 } 923 cksort { 924 SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3; 925 } 926 } {30 29 28 nosort} 927 do_test where-8.2 { 928 execsql { 929 DELETE FROM t4; 930 } 931 cksort { 932 SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3; 933 } 934 } {nosort} 935 936 # Make sure searches with an index work with an empty table. 937 # 938 do_test where-9.1 { 939 execsql { 940 CREATE TABLE t5(x PRIMARY KEY); 941 SELECT * FROM t5 WHERE x<10; 942 } 943 } {} 944 do_test where-9.2 { 945 execsql { 946 SELECT * FROM t5 WHERE x<10 ORDER BY x DESC; 947 } 948 } {} 949 do_test where-9.3 { 950 execsql { 951 SELECT * FROM t5 WHERE x=10; 952 } 953 } {} 954 955 do_test where-10.1 { 956 execsql { 957 SELECT 1 WHERE abs(random())<0 958 } 959 } {} 960 do_test where-10.2 { 961 proc tclvar_func {vname} {return [set ::$vname]} 962 db function tclvar tclvar_func 963 set ::v1 0 964 execsql { 965 SELECT count(*) FROM t1 WHERE tclvar('v1'); 966 } 967 } {0} 968 do_test where-10.3 { 969 set ::v1 1 970 execsql { 971 SELECT count(*) FROM t1 WHERE tclvar('v1'); 972 } 973 } {100} 974 do_test where-10.4 { 975 set ::v1 1 976 proc tclvar_func {vname} { 977 upvar #0 $vname v 978 set v [expr {!$v}] 979 return $v 980 } 981 execsql { 982 SELECT count(*) FROM t1 WHERE tclvar('v1'); 983 } 984 } {50} 985 986 # Ticket #1376. The query below was causing a segfault. 987 # The problem was the age-old error of calling realloc() on an 988 # array while there are still pointers to individual elements of 989 # that array. 990 # 991 do_test where-11.1 { 992 execsql { 993 CREATE TABLE t99(Dte INT, X INT); 994 DELETE FROM t99 WHERE (Dte = 2451337) OR (Dte = 2451339) OR 995 (Dte BETWEEN 2451345 AND 2451347) OR (Dte = 2451351) OR 996 (Dte BETWEEN 2451355 AND 2451356) OR (Dte = 2451358) OR 997 (Dte = 2451362) OR (Dte = 2451365) OR (Dte = 2451367) OR 998 (Dte BETWEEN 2451372 AND 2451376) OR (Dte BETWEEN 2451382 AND 2451384) OR 999 (Dte = 2451387) OR (Dte BETWEEN 2451389 AND 2451391) OR 1000 (Dte BETWEEN 2451393 AND 2451395) OR (Dte = 2451400) OR 1001 (Dte = 2451402) OR (Dte = 2451404) OR (Dte BETWEEN 2451416 AND 2451418) OR 1002 (Dte = 2451422) OR (Dte = 2451426) OR (Dte BETWEEN 2451445 AND 2451446) OR 1003 (Dte = 2451456) OR (Dte = 2451458) OR (Dte BETWEEN 2451465 AND 2451467) OR 1004 (Dte BETWEEN 2451469 AND 2451471) OR (Dte = 2451474) OR 1005 (Dte BETWEEN 2451477 AND 2451501) OR (Dte BETWEEN 2451503 AND 2451509) OR 1006 (Dte BETWEEN 2451511 AND 2451514) OR (Dte BETWEEN 2451518 AND 2451521) OR 1007 (Dte BETWEEN 2451523 AND 2451531) OR (Dte BETWEEN 2451533 AND 2451537) OR 1008 (Dte BETWEEN 2451539 AND 2451544) OR (Dte BETWEEN 2451546 AND 2451551) OR 1009 (Dte BETWEEN 2451553 AND 2451555) OR (Dte = 2451557) OR 1010 (Dte BETWEEN 2451559 AND 2451561) OR (Dte = 2451563) OR 1011 (Dte BETWEEN 2451565 AND 2451566) OR (Dte BETWEEN 2451569 AND 2451571) OR 1012 (Dte = 2451573) OR (Dte = 2451575) OR (Dte = 2451577) OR (Dte = 2451581) OR 1013 (Dte BETWEEN 2451583 AND 2451586) OR (Dte BETWEEN 2451588 AND 2451592) OR 1014 (Dte BETWEEN 2451596 AND 2451598) OR (Dte = 2451600) OR 1015 (Dte BETWEEN 2451602 AND 2451603) OR (Dte = 2451606) OR (Dte = 2451611); 1016 } 1017 } {} 1018 1019 # Ticket #2116: Make sure sorting by index works well with nn INTEGER PRIMARY 1020 # KEY. 1021 # 1022 do_test where-12.1 { 1023 execsql { 1024 CREATE TABLE t6(a INTEGER PRIMARY KEY, b TEXT); 1025 INSERT INTO t6 VALUES(1,'one'); 1026 INSERT INTO t6 VALUES(4,'four'); 1027 CREATE INDEX t6i1 ON t6(b); 1028 } 1029 cksort { 1030 SELECT * FROM t6 ORDER BY b; 1031 } 1032 } {4 four 1 one nosort} 1033 do_test where-12.2 { 1034 cksort { 1035 SELECT * FROM t6 ORDER BY b, a; 1036 } 1037 } {4 four 1 one nosort} 1038 do_test where-12.3 { 1039 cksort { 1040 SELECT * FROM t6 ORDER BY a; 1041 } 1042 } {1 one 4 four nosort} 1043 do_test where-12.4 { 1044 cksort { 1045 SELECT * FROM t6 ORDER BY a, b; 1046 } 1047 } {1 one 4 four nosort} 1048 do_test where-12.5 { 1049 cksort { 1050 SELECT * FROM t6 ORDER BY b DESC; 1051 } 1052 } {1 one 4 four nosort} 1053 do_test where-12.6 { 1054 cksort { 1055 SELECT * FROM t6 ORDER BY b DESC, a DESC; 1056 } 1057 } {1 one 4 four nosort} 1058 do_test where-12.7 { 1059 cksort { 1060 SELECT * FROM t6 ORDER BY b DESC, a ASC; 1061 } 1062 } {1 one 4 four sort} 1063 do_test where-12.8 { 1064 cksort { 1065 SELECT * FROM t6 ORDER BY b ASC, a DESC; 1066 } 1067 } {4 four 1 one sort} 1068 do_test where-12.9 { 1069 cksort { 1070 SELECT * FROM t6 ORDER BY a DESC; 1071 } 1072 } {4 four 1 one nosort} 1073 do_test where-12.10 { 1074 cksort { 1075 SELECT * FROM t6 ORDER BY a DESC, b DESC; 1076 } 1077 } {4 four 1 one nosort} 1078 do_test where-12.11 { 1079 cksort { 1080 SELECT * FROM t6 ORDER BY a DESC, b ASC; 1081 } 1082 } {4 four 1 one nosort} 1083 do_test where-12.12 { 1084 cksort { 1085 SELECT * FROM t6 ORDER BY a ASC, b DESC; 1086 } 1087 } {1 one 4 four nosort} 1088 do_test where-13.1 { 1089 execsql { 1090 CREATE TABLE t7(a INTEGER PRIMARY KEY, b TEXT); 1091 INSERT INTO t7 VALUES(1,'one'); 1092 INSERT INTO t7 VALUES(4,'four'); 1093 CREATE INDEX t7i1 ON t7(b); 1094 } 1095 cksort { 1096 SELECT * FROM t7 ORDER BY b; 1097 } 1098 } {4 four 1 one nosort} 1099 do_test where-13.2 { 1100 cksort { 1101 SELECT * FROM t7 ORDER BY b, a; 1102 } 1103 } {4 four 1 one nosort} 1104 do_test where-13.3 { 1105 cksort { 1106 SELECT * FROM t7 ORDER BY a; 1107 } 1108 } {1 one 4 four nosort} 1109 do_test where-13.4 { 1110 cksort { 1111 SELECT * FROM t7 ORDER BY a, b; 1112 } 1113 } {1 one 4 four nosort} 1114 do_test where-13.5 { 1115 cksort { 1116 SELECT * FROM t7 ORDER BY b DESC; 1117 } 1118 } {1 one 4 four nosort} 1119 do_test where-13.6 { 1120 cksort { 1121 SELECT * FROM t7 ORDER BY b DESC, a DESC; 1122 } 1123 } {1 one 4 four nosort} 1124 do_test where-13.7 { 1125 cksort { 1126 SELECT * FROM t7 ORDER BY b DESC, a ASC; 1127 } 1128 } {1 one 4 four sort} 1129 do_test where-13.8 { 1130 cksort { 1131 SELECT * FROM t7 ORDER BY b ASC, a DESC; 1132 } 1133 } {4 four 1 one sort} 1134 do_test where-13.9 { 1135 cksort { 1136 SELECT * FROM t7 ORDER BY a DESC; 1137 } 1138 } {4 four 1 one nosort} 1139 do_test where-13.10 { 1140 cksort { 1141 SELECT * FROM t7 ORDER BY a DESC, b DESC; 1142 } 1143 } {4 four 1 one nosort} 1144 do_test where-13.11 { 1145 cksort { 1146 SELECT * FROM t7 ORDER BY a DESC, b ASC; 1147 } 1148 } {4 four 1 one nosort} 1149 do_test where-13.12 { 1150 cksort { 1151 SELECT * FROM t7 ORDER BY a ASC, b DESC; 1152 } 1153 } {1 one 4 four nosort} 1154 1155 # Ticket #2211. 1156 # 1157 # When optimizing out ORDER BY clauses, make sure that trailing terms 1158 # of the ORDER BY clause do not reference other tables in a join. 1159 # 1160 if {[permutation] != "no_optimization"} { 1161 do_test where-14.1 { 1162 execsql { 1163 CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT UNIQUE, c CHAR(100)); 1164 INSERT INTO t8(a,b) VALUES(1,'one'); 1165 INSERT INTO t8(a,b) VALUES(4,'four'); 1166 } 1167 cksort { 1168 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b 1169 } 1170 } {1/4 1/1 4/4 4/1 nosort} 1171 do_test where-14.2 { 1172 cksort { 1173 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b DESC 1174 } 1175 } {1/1 1/4 4/1 4/4 nosort} 1176 do_test where-14.3 { 1177 cksort { 1178 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b 1179 } 1180 } {1/4 1/1 4/4 4/1 nosort} 1181 do_test where-14.4 { 1182 cksort { 1183 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b DESC 1184 } 1185 } {1/4 1/1 4/4 4/1 nosort} 1186 do_test where-14.5 { 1187 # This test case changed from "nosort" to "sort". See ticket 2a5629202f. 1188 cksort { 1189 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b 1190 } 1191 } {/4/[14] 4/[14] 1/[14] 1/[14] sort/} 1192 do_test where-14.6 { 1193 # This test case changed from "nosort" to "sort". See ticket 2a5629202f. 1194 cksort { 1195 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC 1196 } 1197 } {/4/[14] 4/[14] 1/[14] 1/[14] sort/} 1198 do_test where-14.7 { 1199 cksort { 1200 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b 1201 } 1202 } {4/1 4/4 1/1 1/4 sort} 1203 do_test where-14.7.1 { 1204 cksort { 1205 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b 1206 } 1207 } {4/1 4/4 1/1 1/4 sort} 1208 do_test where-14.7.2 { 1209 cksort { 1210 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b 1211 } 1212 } {4/4 4/1 1/4 1/1 nosort} 1213 do_test where-14.8 { 1214 cksort { 1215 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC 1216 } 1217 } {4/4 4/1 1/4 1/1 sort} 1218 do_test where-14.9 { 1219 cksort { 1220 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b 1221 } 1222 } {4/4 4/1 1/4 1/1 sort} 1223 do_test where-14.10 { 1224 cksort { 1225 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC 1226 } 1227 } {4/1 4/4 1/1 1/4 sort} 1228 do_test where-14.11 { 1229 cksort { 1230 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b 1231 } 1232 } {4/1 4/4 1/1 1/4 sort} 1233 do_test where-14.12 { 1234 cksort { 1235 SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC 1236 } 1237 } {4/4 4/1 1/4 1/1 sort} 1238 } ;# {permutation != "no_optimization"} 1239 1240 # Ticket #2445. 1241 # 1242 # There was a crash that could occur when a where clause contains an 1243 # alias for an expression in the result set, and that expression retrieves 1244 # a column of the second or subsequent table in a join. 1245 # 1246 do_test where-15.1 { 1247 execsql { 1248 CREATE TEMP TABLE t1 (a, b, c, d, e); 1249 CREATE TEMP TABLE t2 (f); 1250 SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ; 1251 } 1252 } {} 1253 1254 # Ticket #3408. 1255 # 1256 # The branch of code in where.c that generated rowid lookups was 1257 # incorrectly deallocating a constant register, meaning that if the 1258 # vdbe code ran more than once, the second time around the constant 1259 # value may have been clobbered by some other value. 1260 # 1261 do_test where-16.1 { 1262 execsql { 1263 CREATE TABLE a1(id INTEGER PRIMARY KEY, v); 1264 CREATE TABLE a2(id INTEGER PRIMARY KEY, v); 1265 INSERT INTO a1 VALUES(1, 'one'); 1266 INSERT INTO a1 VALUES(2, 'two'); 1267 INSERT INTO a2 VALUES(1, 'one'); 1268 INSERT INTO a2 VALUES(2, 'two'); 1269 } 1270 } {} 1271 do_test where-16.2 { 1272 execsql { 1273 SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one'; 1274 } 1275 } {1 one 1 one 2 two 1 one} 1276 1277 # The actual problem reported in #3408. 1278 do_test where-16.3 { 1279 execsql { 1280 CREATE TEMP TABLE foo(idx INTEGER); 1281 INSERT INTO foo VALUES(1); 1282 INSERT INTO foo VALUES(1); 1283 INSERT INTO foo VALUES(1); 1284 INSERT INTO foo VALUES(2); 1285 INSERT INTO foo VALUES(2); 1286 CREATE TEMP TABLE bar(stuff INTEGER); 1287 INSERT INTO bar VALUES(100); 1288 INSERT INTO bar VALUES(200); 1289 INSERT INTO bar VALUES(300); 1290 } 1291 } {} 1292 do_test where-16.4 { 1293 execsql { 1294 SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2; 1295 } 1296 } {2 2} 1297 1298 integrity_check {where-99.0} 1299 1300 #--------------------------------------------------------------------- 1301 # These tests test that a bug surrounding the use of ForceInt has been 1302 # fixed in where.c. 1303 # 1304 do_test where-17.1 { 1305 execsql { 1306 CREATE TABLE tbooking ( 1307 id INTEGER PRIMARY KEY, 1308 eventtype INTEGER NOT NULL 1309 ); 1310 INSERT INTO tbooking VALUES(42, 3); 1311 INSERT INTO tbooking VALUES(43, 4); 1312 } 1313 } {} 1314 do_test where-17.2 { 1315 execsql { 1316 SELECT a.id 1317 FROM tbooking AS a 1318 WHERE a.eventtype=3; 1319 } 1320 } {42} 1321 do_test where-17.3 { 1322 execsql { 1323 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1324 FROM tbooking AS a 1325 WHERE a.eventtype=3; 1326 } 1327 } {42 43} 1328 do_test where-17.4 { 1329 execsql { 1330 SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id) 1331 FROM (SELECT 1.5 AS id) AS a 1332 } 1333 } {1.5 42} 1334 do_test where-17.5 { 1335 execsql { 1336 CREATE TABLE tother(a, b); 1337 INSERT INTO tother VALUES(1, 3.7); 1338 SELECT id, a FROM tbooking, tother WHERE id>a; 1339 } 1340 } {42 1 43 1} 1341 1342 # Ticket [be84e357c035d068135f20bcfe82761bbf95006b] 2013-09-03 1343 # Segfault during query involving LEFT JOIN column in the ORDER BY clause. 1344 # 1345 do_execsql_test where-18.1 { 1346 CREATE TABLE t181(a); 1347 CREATE TABLE t182(b,c); 1348 INSERT INTO t181 VALUES(1); 1349 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL; 1350 } {1} 1351 do_execsql_test where-18.2 { 1352 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c; 1353 } {1} 1354 do_execsql_test where-18.3 { 1355 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c; 1356 } {1} 1357 do_execsql_test where-18.4 { 1358 INSERT INTO t181 VALUES(1),(1),(1),(1); 1359 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c; 1360 } {1} 1361 do_execsql_test where-18.5 { 1362 INSERT INTO t181 VALUES(2); 1363 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL, +a; 1364 } {1 2} 1365 do_execsql_test where-18.6 { 1366 INSERT INTO t181 VALUES(2); 1367 SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +a, +c IS NULL; 1368 } {1 2} 1369 1370 # Make sure the OR optimization works on a JOIN 1371 # 1372 do_execsql_test where-19.0 { 1373 CREATE TABLE t191(a INT UNIQUE NOT NULL, b INT UNIQUE NOT NULL,c,d); 1374 CREATE INDEX t191a ON t1(a); 1375 CREATE INDEX t191b ON t1(b); 1376 CREATE TABLE t192(x INTEGER PRIMARY KEY,y INT, z INT); 1377 1378 EXPLAIN QUERY PLAN 1379 SELECT t191.rowid FROM t192, t191 WHERE (a=y OR b=y) AND x=?1; 1380 } {/.* sqlite_autoindex_t191_1 .* sqlite_autoindex_t191_2 .*/} 1381 1382 # 2018-04-24 ticket [https://www.sqlite.org/src/info/4ba5abf65c5b0f9a] 1383 # Index on expressions leads to an incorrect answer for a LEFT JOIN 1384 # 1385 do_execsql_test where-20.0 { 1386 CREATE TABLE t201(x); 1387 CREATE TABLE t202(y, z); 1388 INSERT INTO t201 VALUES('key'); 1389 INSERT INTO t202 VALUES('key', -1); 1390 CREATE INDEX t202i ON t202(y, ifnull(z, 0)); 1391 SELECT count(*) FROM t201 LEFT JOIN t202 ON (x=y) WHERE ifnull(z, 0) >=0; 1392 } {0} 1393 1394 do_execsql_test where-21.0 { 1395 CREATE TABLE t12(a, b, c); 1396 CREATE TABLE t13(x); 1397 CREATE INDEX t12ab ON t12(b, a); 1398 CREATE INDEX t12ac ON t12(c, a); 1399 1400 INSERT INTO t12 VALUES(4, 0, 1); 1401 INSERT INTO t12 VALUES(4, 1, 0); 1402 INSERT INTO t12 VALUES(5, 0, 1); 1403 INSERT INTO t12 VALUES(5, 1, 0); 1404 1405 INSERT INTO t13 VALUES(1), (2), (3), (4); 1406 } 1407 do_execsql_test where-21.1 { 1408 SELECT * FROM t12 WHERE 1409 a = (SELECT * FROM (SELECT count(*) FROM t13 LIMIT 5) ORDER BY 1 LIMIT 10) 1410 AND (b=1 OR c=1); 1411 } { 1412 4 1 0 1413 4 0 1 1414 } 1415 1416 # 2018-11-05: ticket [https://www.sqlite.org/src/tktview/65eb38f6e46de8c75e188a] 1417 # Incorrect result in LEFT JOIN when STAT4 is enabled. 1418 # 1419 sqlite3 db :memory: 1420 do_execsql_test where-22.1 { 1421 CREATE TABLE t1(a INT); 1422 CREATE INDEX t1a ON t1(a); 1423 INSERT INTO t1(a) VALUES(NULL),(NULL),(42),(NULL),(NULL); 1424 CREATE TABLE t2(dummy INT); 1425 SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; 1426 } {5} 1427 1428 # 20190-02-22: A bug introduced by checkin 1429 # https://www.sqlite.org/src/info/fa792714ae62fa98. 1430 # 1431 do_execsql_test where-23.0 { 1432 DROP TABLE IF EXISTS t1; 1433 DROP TABLE IF EXISTS t2; 1434 CREATE TABLE t1(a INTEGER PRIMARY KEY); 1435 INSERT INTO t1(a) VALUES(1),(2),(3); 1436 CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); 1437 INSERT INTO t2(y) VALUES(2),(3); 1438 SELECT * FROM t1, t2 WHERE a=y AND y=3; 1439 } {3 2 3} 1440 1441 #------------------------------------------------------------------------- 1442 # 1443 reset_db 1444 do_execsql_test where-24.0 { 1445 CREATE TABLE t1(a INTEGER PRIMARY KEY, b); 1446 INSERT INTO t1 VALUES(1, 'one'); 1447 INSERT INTO t1 VALUES(2, 'two'); 1448 INSERT INTO t1 VALUES(3, 'three'); 1449 INSERT INTO t1 VALUES(4, 'four'); 1450 } 1451 1452 foreach {tn sql res} { 1453 1 "SELECT b FROM t1" {one two three four} 1454 2 "SELECT b FROM t1 WHERE a<4" {one two three} 1455 3 "SELECT b FROM t1 WHERE a>1" {two three four} 1456 4 "SELECT b FROM t1 WHERE a>1 AND a<4" {two three} 1457 1458 5 "SELECT b FROM t1 WHERE a>? AND a<4" {} 1459 6 "SELECT b FROM t1 WHERE a>1 AND a<?" {} 1460 7 "SELECT b FROM t1 WHERE a>? AND a<?" {} 1461 1462 7 "SELECT b FROM t1 WHERE a>=? AND a<=4" {} 1463 8 "SELECT b FROM t1 WHERE a>=1 AND a<=?" {} 1464 9 "SELECT b FROM t1 WHERE a>=? AND a<=?" {} 1465 } { 1466 set rev [list] 1467 foreach r $res { set rev [concat $r $rev] } 1468 1469 do_execsql_test where-24.$tn.1 "$sql" $res 1470 do_execsql_test where-24.$tn.2 "$sql ORDER BY rowid" $res 1471 do_execsql_test where-24.$tn.3 "$sql ORDER BY rowid DESC" $rev 1472 1473 do_execsql_test where-24-$tn.4 " 1474 BEGIN; 1475 DELETE FROM t1; 1476 $sql; 1477 $sql ORDER BY rowid; 1478 $sql ORDER BY rowid DESC; 1479 ROLLBACK; 1480 " 1481 } 1482 1483 #------------------------------------------------------------------------- 1484 # 1485 reset_db 1486 do_execsql_test where-25.0 { 1487 CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); 1488 CREATE UNIQUE INDEX i1 ON t1(c); 1489 INSERT INTO t1 VALUES(1, 'one', 'i'); 1490 INSERT INTO t1 VALUES(2, 'two', 'ii'); 1491 1492 CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); 1493 CREATE UNIQUE INDEX i2 ON t2(c); 1494 INSERT INTO t2 VALUES(1, 'one', 'i'); 1495 INSERT INTO t2 VALUES(2, 'two', 'ii'); 1496 INSERT INTO t2 VALUES(3, 'three', 'iii'); 1497 1498 PRAGMA writable_schema = 1; 1499 UPDATE sqlite_schema SET rootpage = ( 1500 SELECT rootpage FROM sqlite_schema WHERE name = 'i2' 1501 ) WHERE name = 'i1'; 1502 } 1503 db close 1504 sqlite3 db test.db 1505 do_catchsql_test where-25.1 { 1506 DELETE FROM t1 WHERE c='iii' 1507 } {1 {database disk image is malformed}} 1508 do_catchsql_test where-25.2 { 1509 INSERT INTO t1 VALUES(4, 'four', 'iii') 1510 ON CONFLICT(c) DO UPDATE SET b=NULL 1511 } {1 {database disk image is malformed}} 1512 1513 reset_db 1514 do_execsql_test where-25.3 { 1515 CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID; 1516 CREATE UNIQUE INDEX i1 ON t1(c); 1517 INSERT INTO t1 VALUES(1, 'one', 'i'); 1518 INSERT INTO t1 VALUES(2, 'two', 'ii'); 1519 1520 CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c); 1521 CREATE UNIQUE INDEX i2 ON t2(c); 1522 INSERT INTO t2 VALUES(1, 'one', 'i'); 1523 INSERT INTO t2 VALUES(2, 'two', 'ii'); 1524 INSERT INTO t2 VALUES(3, 'three', 'iii'); 1525 1526 PRAGMA writable_schema = 1; 1527 UPDATE sqlite_schema SET rootpage = ( 1528 SELECT rootpage FROM sqlite_schema WHERE name = 'i2' 1529 ) WHERE name = 'i1'; 1530 } 1531 db close 1532 sqlite3 db test.db 1533 do_catchsql_test where-25.4 { 1534 SELECT * FROM t1 WHERE c='iii' 1535 } {0 {}} 1536 do_catchsql_test where-25.5 { 1537 INSERT INTO t1 VALUES(4, 'four', 'iii') 1538 ON CONFLICT(c) DO UPDATE SET b=NULL 1539 } {1 {corrupt database}} 1540 1541 # 2019-08-21 Ticket https://www.sqlite.org/src/info/d9f584e936c7a8d0 1542 # 1543 db close 1544 sqlite3 db :memory: 1545 do_execsql_test where-26.1 { 1546 CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT); 1547 INSERT INTO t0(c0, c1) VALUES (1, 'a'); 1548 CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT); 1549 INSERT INTO t1(c0, c1) VALUES (1, 'a'); 1550 SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0; 1551 } {1 a} 1552 do_execsql_test where-26.2 { 1553 SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0; 1554 } {1 a} 1555 do_execsql_test where-26.3 { 1556 SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0; 1557 } {1 a} 1558 do_execsql_test where-26.4 { 1559 SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0; 1560 } {1 a} 1561 do_execsql_test where-26.5 { 1562 SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0; 1563 } {1} 1564 do_execsql_test where-26.6 { 1565 SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1; 1566 } {1} 1567 do_execsql_test where-26.7 { 1568 SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0; 1569 } {1} 1570 do_execsql_test where-26.8 { 1571 SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1; 1572 } {1} 1573 1574 finish_test