Annotation of embedaddon/sqlite3/test/where.test, revision 1.1
1.1 ! misho 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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>