Annotation of embedaddon/sqlite3/test/in.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 IN and BETWEEN operator.
                     13: #
                     14: # $Id: in.test,v 1.22 2008/08/04 03:51:24 danielk1977 Exp $
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: 
                     19: # Generate the test data we will need for the first squences of tests.
                     20: #
                     21: do_test in-1.0 {
                     22:   execsql {
                     23:     BEGIN;
                     24:     CREATE TABLE t1(a int, b int);
                     25:   }
                     26:   for {set i 1} {$i<=10} {incr i} {
                     27:     execsql "INSERT INTO t1 VALUES($i,[expr {1<<$i}])"
                     28:   }
                     29:   execsql {
                     30:     COMMIT;
                     31:     SELECT count(*) FROM t1;
                     32:   }
                     33: } {10}
                     34: 
                     35: # Do basic testing of BETWEEN.
                     36: #
                     37: do_test in-1.1 {
                     38:   execsql {SELECT a FROM t1 WHERE b BETWEEN 10 AND 50 ORDER BY a}
                     39: } {4 5}
                     40: do_test in-1.2 {
                     41:   execsql {SELECT a FROM t1 WHERE b NOT BETWEEN 10 AND 50 ORDER BY a}
                     42: } {1 2 3 6 7 8 9 10}
                     43: do_test in-1.3 {
                     44:   execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 ORDER BY a}
                     45: } {1 2 3 4}
                     46: do_test in-1.4 {
                     47:   execsql {SELECT a FROM t1 WHERE b NOT BETWEEN a AND a*5 ORDER BY a}
                     48: } {5 6 7 8 9 10}
                     49: do_test in-1.6 {
                     50:   execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 OR b=512 ORDER BY a}
                     51: } {1 2 3 4 9}
                     52: do_test in-1.7 {
                     53:   execsql {SELECT a+ 100*(a BETWEEN 1 and 3) FROM t1 ORDER BY b}
                     54: } {101 102 103 4 5 6 7 8 9 10}
                     55: 
                     56: # The rest of this file concentrates on testing the IN operator.
                     57: # Skip this if the library is compiled with SQLITE_OMIT_SUBQUERY 
                     58: # (because the IN operator is unavailable).
                     59: #
                     60: ifcapable !subquery {
                     61:   finish_test
                     62:   return
                     63: }
                     64: 
                     65: # Testing of the IN operator using static lists on the right-hand side.
                     66: #
                     67: do_test in-2.1 {
                     68:   execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) ORDER BY a}
                     69: } {3 4 5}
                     70: do_test in-2.2 {
                     71:   execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) ORDER BY a}
                     72: } {1 2 6 7 8 9 10}
                     73: do_test in-2.3 {
                     74:   execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) OR b=512 ORDER BY a}
                     75: } {3 4 5 9}
                     76: do_test in-2.4 {
                     77:   execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) OR b=512 ORDER BY a}
                     78: } {1 2 6 7 8 9 10}
                     79: do_test in-2.5 {
                     80:   execsql {SELECT a+100*(b IN (8,16,24)) FROM t1 ORDER BY b}
                     81: } {1 2 103 104 5 6 7 8 9 10}
                     82: 
                     83: do_test in-2.6 {
                     84:   execsql {SELECT a FROM t1 WHERE b IN (b+8,64)}
                     85: } {6}
                     86: do_test in-2.7 {
                     87:   execsql {SELECT a FROM t1 WHERE b IN (max(5,10,b),20)}
                     88: } {4 5 6 7 8 9 10}
                     89: do_test in-2.8 {
                     90:   execsql {SELECT a FROM t1 WHERE b IN (8*2,64/2) ORDER BY b}
                     91: } {4 5}
                     92: do_test in-2.9 {
                     93:   execsql {SELECT a FROM t1 WHERE b IN (max(5,10),20)}
                     94: } {}
                     95: do_test in-2.10 {
                     96:   execsql {SELECT a FROM t1 WHERE min(0,b IN (a,30))}
                     97: } {}
                     98: do_test in-2.11 {
                     99:   set v [catch {execsql {SELECT a FROM t1 WHERE c IN (10,20)}} msg]
                    100:   lappend v $msg
                    101: } {1 {no such column: c}}
                    102: 
                    103: # Testing the IN operator where the right-hand side is a SELECT
                    104: #
                    105: do_test in-3.1 {
                    106:   execsql {
                    107:     SELECT a FROM t1
                    108:     WHERE b IN (SELECT b FROM t1 WHERE a<5)
                    109:     ORDER BY a
                    110:   }
                    111: } {1 2 3 4}
                    112: do_test in-3.2 {
                    113:   execsql {
                    114:     SELECT a FROM t1
                    115:     WHERE b IN (SELECT b FROM t1 WHERE a<5) OR b==512
                    116:     ORDER BY a
                    117:   }
                    118: } {1 2 3 4 9}
                    119: do_test in-3.3 {
                    120:   execsql {
                    121:     SELECT a + 100*(b IN (SELECT b FROM t1 WHERE a<5)) FROM t1 ORDER BY b
                    122:   }
                    123: } {101 102 103 104 5 6 7 8 9 10}
                    124: 
                    125: # Make sure the UPDATE and DELETE commands work with IN-SELECT
                    126: #
                    127: do_test in-4.1 {
                    128:   execsql {
                    129:     UPDATE t1 SET b=b*2 
                    130:     WHERE b IN (SELECT b FROM t1 WHERE a>8)
                    131:   }
                    132:   execsql {SELECT b FROM t1 ORDER BY b}
                    133: } {2 4 8 16 32 64 128 256 1024 2048}
                    134: do_test in-4.2 {
                    135:   execsql {
                    136:     DELETE FROM t1 WHERE b IN (SELECT b FROM t1 WHERE a>8)
                    137:   }
                    138:   execsql {SELECT a FROM t1 ORDER BY a}
                    139: } {1 2 3 4 5 6 7 8}
                    140: do_test in-4.3 {
                    141:   execsql {
                    142:     DELETE FROM t1 WHERE b NOT IN (SELECT b FROM t1 WHERE a>4)
                    143:   }
                    144:   execsql {SELECT a FROM t1 ORDER BY a}
                    145: } {5 6 7 8}
                    146: 
                    147: # Do an IN with a constant RHS but where the RHS has many, many
                    148: # elements.  We need to test that collisions in the hash table
                    149: # are resolved properly.
                    150: #
                    151: do_test in-5.1 {
                    152:   execsql {
                    153:     INSERT INTO t1 VALUES('hello', 'world');
                    154:     SELECT * FROM t1
                    155:     WHERE a IN (
                    156:        'Do','an','IN','with','a','constant','RHS','but','where','the',
                    157:        'has','many','elements','We','need','to','test','that',
                    158:        'collisions','hash','table','are','resolved','properly',
                    159:        'This','in-set','contains','thirty','one','entries','hello');
                    160:   }
                    161: } {hello world}
                    162: 
                    163: # Make sure the IN operator works with INTEGER PRIMARY KEY fields.
                    164: #
                    165: do_test in-6.1 {
                    166:   execsql {
                    167:     CREATE TABLE ta(a INTEGER PRIMARY KEY, b);
                    168:     INSERT INTO ta VALUES(1,1);
                    169:     INSERT INTO ta VALUES(2,2);
                    170:     INSERT INTO ta VALUES(3,3);
                    171:     INSERT INTO ta VALUES(4,4);
                    172:     INSERT INTO ta VALUES(6,6);
                    173:     INSERT INTO ta VALUES(8,8);
                    174:     INSERT INTO ta VALUES(10,
                    175:        'This is a key that is long enough to require a malloc in the VDBE');
                    176:     SELECT * FROM ta WHERE a<10;
                    177:   }
                    178: } {1 1 2 2 3 3 4 4 6 6 8 8}
                    179: do_test in-6.2 {
                    180:   execsql {
                    181:     CREATE TABLE tb(a INTEGER PRIMARY KEY, b);
                    182:     INSERT INTO tb VALUES(1,1);
                    183:     INSERT INTO tb VALUES(2,2);
                    184:     INSERT INTO tb VALUES(3,3);
                    185:     INSERT INTO tb VALUES(5,5);
                    186:     INSERT INTO tb VALUES(7,7);
                    187:     INSERT INTO tb VALUES(9,9);
                    188:     INSERT INTO tb VALUES(11,
                    189:        'This is a key that is long enough to require a malloc in the VDBE');
                    190:     SELECT * FROM tb WHERE a<10;
                    191:   }
                    192: } {1 1 2 2 3 3 5 5 7 7 9 9}
                    193: do_test in-6.3 {
                    194:   execsql {
                    195:     SELECT a FROM ta WHERE b IN (SELECT a FROM tb);
                    196:   }
                    197: } {1 2 3}
                    198: do_test in-6.4 {
                    199:   execsql {
                    200:     SELECT a FROM ta WHERE b NOT IN (SELECT a FROM tb);
                    201:   }
                    202: } {4 6 8 10}
                    203: do_test in-6.5 {
                    204:   execsql {
                    205:     SELECT a FROM ta WHERE b IN (SELECT b FROM tb);
                    206:   }
                    207: } {1 2 3 10}
                    208: do_test in-6.6 {
                    209:   execsql {
                    210:     SELECT a FROM ta WHERE b NOT IN (SELECT b FROM tb);
                    211:   }
                    212: } {4 6 8}
                    213: do_test in-6.7 {
                    214:   execsql {
                    215:     SELECT a FROM ta WHERE a IN (SELECT a FROM tb);
                    216:   }
                    217: } {1 2 3}
                    218: do_test in-6.8 {
                    219:   execsql {
                    220:     SELECT a FROM ta WHERE a NOT IN (SELECT a FROM tb);
                    221:   }
                    222: } {4 6 8 10}
                    223: do_test in-6.9 {
                    224:   execsql {
                    225:     SELECT a FROM ta WHERE a IN (SELECT b FROM tb);
                    226:   }
                    227: } {1 2 3}
                    228: do_test in-6.10 {
                    229:   execsql {
                    230:     SELECT a FROM ta WHERE a NOT IN (SELECT b FROM tb);
                    231:   }
                    232: } {4 6 8 10}
                    233: 
                    234: # Tests of IN operator against empty sets.  (Ticket #185)
                    235: #
                    236: do_test in-7.1 {
                    237:   execsql {
                    238:     SELECT a FROM t1 WHERE a IN ();
                    239:   }
                    240: } {}
                    241: do_test in-7.2 {
                    242:   execsql {
                    243:     SELECT a FROM t1 WHERE a IN (5);
                    244:   }
                    245: } {5}
                    246: do_test in-7.3 {
                    247:   execsql {
                    248:     SELECT a FROM t1 WHERE a NOT IN () ORDER BY a;
                    249:   }
                    250: } {5 6 7 8 hello}
                    251: do_test in-7.4 {
                    252:   execsql {
                    253:     SELECT a FROM t1 WHERE a IN (5) AND b IN ();
                    254:   }
                    255: } {}
                    256: do_test in-7.5 {
                    257:   execsql {
                    258:     SELECT a FROM t1 WHERE a IN (5) AND b NOT IN ();
                    259:   }
                    260: } {5}
                    261: do_test in-7.6 {
                    262:   execsql {
                    263:     SELECT a FROM ta WHERE a IN ();
                    264:   }
                    265: } {}
                    266: do_test in-7.7 {
                    267:   execsql {
                    268:     SELECT a FROM ta WHERE a NOT IN ();
                    269:   }
                    270: } {1 2 3 4 6 8 10}
                    271: 
                    272: do_test in-8.1 {
                    273:   execsql {
                    274:     SELECT b FROM t1 WHERE a IN ('hello','there')
                    275:   }
                    276: } {world}
                    277: do_test in-8.2 {
                    278:   execsql {
                    279:     SELECT b FROM t1 WHERE a IN ("hello",'there')
                    280:   }
                    281: } {world}
                    282: 
                    283: # Test constructs of the form:  expr IN tablename
                    284: #
                    285: do_test in-9.1 {
                    286:   execsql {
                    287:     CREATE TABLE t4 AS SELECT a FROM tb;
                    288:     SELECT * FROM t4;    
                    289:   }
                    290: } {1 2 3 5 7 9 11}
                    291: do_test in-9.2 {
                    292:   execsql {
                    293:     SELECT b FROM t1 WHERE a IN t4;
                    294:   }
                    295: } {32 128}
                    296: do_test in-9.3 {
                    297:   execsql {
                    298:     SELECT b FROM t1 WHERE a NOT IN t4;
                    299:   }
                    300: } {64 256 world}
                    301: do_test in-9.4 {
                    302:   catchsql {
                    303:     SELECT b FROM t1 WHERE a NOT IN tb;
                    304:   }
                    305: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    306: 
                    307: # IN clauses in CHECK constraints.  Ticket #1645
                    308: #
                    309: do_test in-10.1 {
                    310:   execsql {
                    311:     CREATE TABLE t5(
                    312:       a INTEGER,
                    313:       CHECK( a IN (111,222,333) )
                    314:     );
                    315:     INSERT INTO t5 VALUES(111);
                    316:     SELECT * FROM t5;
                    317:   }
                    318: } {111}
                    319: do_test in-10.2 {
                    320:   catchsql {
                    321:     INSERT INTO t5 VALUES(4);
                    322:   }
                    323: } {1 {constraint failed}}
                    324: 
                    325: # Ticket #1821
                    326: #
                    327: # Type affinity applied to the right-hand side of an IN operator.
                    328: #
                    329: do_test in-11.1 {
                    330:   execsql {
                    331:     CREATE TABLE t6(a,b NUMERIC);
                    332:     INSERT INTO t6 VALUES(1,2);
                    333:     INSERT INTO t6 VALUES(2,3);
                    334:     SELECT * FROM t6 WHERE b IN (2);
                    335:   }
                    336: } {1 2}
                    337: do_test in-11.2 {
                    338:   # The '2' should be coerced into 2 because t6.b is NUMERIC
                    339:   execsql {
                    340:     SELECT * FROM t6 WHERE b IN ('2');
                    341:   }
                    342: } {1 2}
                    343: do_test in-11.3 {
                    344:   # No coercion should occur here because of the unary + before b.
                    345:   execsql {
                    346:     SELECT * FROM t6 WHERE +b IN ('2');
                    347:   }
                    348: } {}
                    349: do_test in-11.4 {
                    350:   # No coercion because column a as affinity NONE
                    351:   execsql {
                    352:     SELECT * FROM t6 WHERE a IN ('2');
                    353:   }
                    354: } {}
                    355: do_test in-11.5 {
                    356:   execsql {
                    357:     SELECT * FROM t6 WHERE a IN (2);
                    358:   }
                    359: } {2 3}
                    360: do_test in-11.6 {
                    361:   # No coercion because column a as affinity NONE
                    362:   execsql {
                    363:     SELECT * FROM t6 WHERE +a IN ('2');
                    364:   }
                    365: } {}
                    366: 
                    367: # Test error conditions with expressions of the form IN(<compound select>).
                    368: #
                    369: ifcapable compound {
                    370: do_test in-12.1 {
                    371:   execsql {
                    372:     CREATE TABLE t2(a, b, c);
                    373:     CREATE TABLE t3(a, b, c);
                    374:   }
                    375: } {}
                    376: do_test in-12.2 {
                    377:   catchsql {
                    378:     SELECT * FROM t2 WHERE a IN (
                    379:       SELECT a, b FROM t3 UNION ALL SELECT a, b FROM t2
                    380:     );
                    381:   }
                    382: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    383: do_test in-12.3 {
                    384:   catchsql {
                    385:     SELECT * FROM t2 WHERE a IN (
                    386:       SELECT a, b FROM t3 UNION SELECT a, b FROM t2
                    387:     );
                    388:   }
                    389: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    390: do_test in-12.4 {
                    391:   catchsql {
                    392:     SELECT * FROM t2 WHERE a IN (
                    393:       SELECT a, b FROM t3 EXCEPT SELECT a, b FROM t2
                    394:     );
                    395:   }
                    396: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    397: do_test in-12.5 {
                    398:   catchsql {
                    399:     SELECT * FROM t2 WHERE a IN (
                    400:       SELECT a, b FROM t3 INTERSECT SELECT a, b FROM t2
                    401:     );
                    402:   }
                    403: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    404: do_test in-12.6 {
                    405:   catchsql {
                    406:     SELECT * FROM t2 WHERE a IN (
                    407:       SELECT a, b FROM t3 UNION ALL SELECT a FROM t2
                    408:     );
                    409:   }
                    410: } {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
                    411: do_test in-12.7 {
                    412:   catchsql {
                    413:     SELECT * FROM t2 WHERE a IN (
                    414:       SELECT a, b FROM t3 UNION SELECT a FROM t2
                    415:     );
                    416:   }
                    417: } {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
                    418: do_test in-12.8 {
                    419:   catchsql {
                    420:     SELECT * FROM t2 WHERE a IN (
                    421:       SELECT a, b FROM t3 EXCEPT SELECT a FROM t2
                    422:     );
                    423:   }
                    424: } {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
                    425: do_test in-12.9 {
                    426:   catchsql {
                    427:     SELECT * FROM t2 WHERE a IN (
                    428:       SELECT a, b FROM t3 INTERSECT SELECT a FROM t2
                    429:     );
                    430:   }
                    431: } {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
                    432: }
                    433: 
                    434: do_test in-12.10 {
                    435:   catchsql {
                    436:     SELECT * FROM t2 WHERE a IN (
                    437:       SELECT a FROM t3 UNION ALL SELECT a, b FROM t2
                    438:     );
                    439:   }
                    440: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    441: do_test in-12.11 {
                    442:   catchsql {
                    443:     SELECT * FROM t2 WHERE a IN (
                    444:       SELECT a FROM t3 UNION SELECT a, b FROM t2
                    445:     );
                    446:   }
                    447: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    448: do_test in-12.12 {
                    449:   catchsql {
                    450:     SELECT * FROM t2 WHERE a IN (
                    451:       SELECT a FROM t3 EXCEPT SELECT a, b FROM t2
                    452:     );
                    453:   }
                    454: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    455: do_test in-12.13 {
                    456:   catchsql {
                    457:     SELECT * FROM t2 WHERE a IN (
                    458:       SELECT a FROM t3 INTERSECT SELECT a, b FROM t2
                    459:     );
                    460:   }
                    461: } {1 {only a single result allowed for a SELECT that is part of an expression}}
                    462: 
                    463: 
                    464: #------------------------------------------------------------------------
                    465: # The following tests check that NULL is handled correctly when it 
                    466: # appears as part of a set of values on the right-hand side of an
                    467: # IN or NOT IN operator.
                    468: #
                    469: # When it appears in such a set, NULL is handled as an "unknown value".
                    470: # If, because of the unknown value in the set, the result of the expression 
                    471: # cannot be determined, then it itself evaluates to NULL.
                    472: #
                    473: 
                    474: # Warm body test to demonstrate the principles being tested:
                    475: #
                    476: do_test in-13.1 {
                    477:   db nullvalue "null"
                    478:   execsql { SELECT 
                    479:     1 IN (NULL, 1, 2),     -- The value 1 is a member of the set, return true.
                    480:     3 IN (NULL, 1, 2),     -- Ambiguous, return NULL.
                    481:     1 NOT IN (NULL, 1, 2), -- The value 1 is a member of the set, return false.
                    482:     3 NOT IN (NULL, 1, 2)  -- Ambiguous, return NULL.
                    483:   }
                    484: } {1 null 0 null}
                    485: 
                    486: do_test in-13.2 {
                    487:   execsql { 
                    488:     CREATE TABLE t7(a, b, c NOT NULL);
                    489:     INSERT INTO t7 VALUES(1,    1, 1);
                    490:     INSERT INTO t7 VALUES(2,    2, 2);
                    491:     INSERT INTO t7 VALUES(3,    3, 3);
                    492:     INSERT INTO t7 VALUES(NULL, 4, 4);
                    493:     INSERT INTO t7 VALUES(NULL, 5, 5);
                    494:   }
                    495: } {}
                    496: 
                    497: do_test in-13.3 {
                    498:   execsql { SELECT 2 IN (SELECT a FROM t7) }
                    499: } {1}
                    500: do_test in-13.4 {
                    501:   execsql { SELECT 6 IN (SELECT a FROM t7) }
                    502: } {null}
                    503: 
                    504: do_test in-13.5 {
                    505:   execsql { SELECT 2 IN (SELECT b FROM t7) }
                    506: } {1}
                    507: do_test in-13.6 {
                    508:   execsql { SELECT 6 IN (SELECT b FROM t7) }
                    509: } {0}
                    510: 
                    511: do_test in-13.7 {
                    512:   execsql { SELECT 2 IN (SELECT c FROM t7) }
                    513: } {1}
                    514: do_test in-13.8 {
                    515:   execsql { SELECT 6 IN (SELECT c FROM t7) }
                    516: } {0}
                    517: 
                    518: do_test in-13.9 {
                    519:   execsql {
                    520:     SELECT
                    521:       2 NOT IN (SELECT a FROM t7),
                    522:       6 NOT IN (SELECT a FROM t7),
                    523:       2 NOT IN (SELECT b FROM t7),
                    524:       6 NOT IN (SELECT b FROM t7),
                    525:       2 NOT IN (SELECT c FROM t7),
                    526:       6 NOT IN (SELECT c FROM t7)
                    527:   } 
                    528: } {0 null 0 1 0 1}
                    529: 
                    530: do_test in-13.10 {
                    531:   execsql { 
                    532:     SELECT b IN (
                    533:       SELECT inside.a 
                    534:       FROM t7 AS inside 
                    535:       WHERE inside.b BETWEEN outside.b+1 AND outside.b+2
                    536:     )
                    537:     FROM t7 AS outside ORDER BY b;
                    538:   }
                    539: } {0 null null null 0}
                    540: 
                    541: do_test in-13.11 {
                    542:   execsql {
                    543:     SELECT b NOT IN (
                    544:       SELECT inside.a 
                    545:       FROM t7 AS inside 
                    546:       WHERE inside.b BETWEEN outside.b+1 AND outside.b+2
                    547:     )
                    548:     FROM t7 AS outside ORDER BY b;
                    549:   }
                    550: } {1 null null null 1}
                    551: 
                    552: do_test in-13.12 {
                    553:   execsql {
                    554:     CREATE INDEX i1 ON t7(a);
                    555:     CREATE INDEX i2 ON t7(b);
                    556:     CREATE INDEX i3 ON t7(c);
                    557:   }
                    558:   execsql {
                    559:     SELECT
                    560:       2 IN (SELECT a FROM t7),
                    561:       6 IN (SELECT a FROM t7),
                    562:       2 IN (SELECT b FROM t7),
                    563:       6 IN (SELECT b FROM t7),
                    564:       2 IN (SELECT c FROM t7),
                    565:       6 IN (SELECT c FROM t7)
                    566:   } 
                    567: } {1 null 1 0 1 0}
                    568: 
                    569: do_test in-13.13 {
                    570:   execsql {
                    571:     SELECT
                    572:       2 NOT IN (SELECT a FROM t7),
                    573:       6 NOT IN (SELECT a FROM t7),
                    574:       2 NOT IN (SELECT b FROM t7),
                    575:       6 NOT IN (SELECT b FROM t7),
                    576:       2 NOT IN (SELECT c FROM t7),
                    577:       6 NOT IN (SELECT c FROM t7)
                    578:   } 
                    579: } {0 null 0 1 0 1}
                    580: 
                    581: do_test in-13.14 {
                    582:   execsql {
                    583:     BEGIN TRANSACTION;
                    584:     CREATE TABLE a(id INTEGER);
                    585:     INSERT INTO a VALUES(1);
                    586:     INSERT INTO a VALUES(2);
                    587:     INSERT INTO a VALUES(3);
                    588:     CREATE TABLE b(id INTEGER);
                    589:     INSERT INTO b VALUES(NULL);
                    590:     INSERT INTO b VALUES(3);
                    591:     INSERT INTO b VALUES(4);
                    592:     INSERT INTO b VALUES(5);
                    593:     COMMIT;
                    594:     SELECT * FROM a WHERE id NOT IN (SELECT id FROM b);
                    595:   }
                    596: } {}
                    597: do_test in-13.14 {
                    598:   execsql {
                    599:     CREATE INDEX i5 ON b(id);
                    600:     SELECT * FROM a WHERE id NOT IN (SELECT id FROM b);
                    601:   }
                    602: } {}
                    603: 
                    604: 
                    605: do_test in-13.X {
                    606:   db nullvalue ""
                    607: } {}
                    608: 
                    609: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>