Annotation of embedaddon/sqlite3/test/where.test, revision 1.1.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>