Annotation of embedaddon/sqlite3/test/join.test, revision 1.1.1.1

1.1       misho       1: # 2002 May 24
                      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.
                     12: #
                     13: # This file implements tests for joins, including outer joins.
                     14: #
                     15: # $Id: join.test,v 1.27 2009/07/01 16:12:08 danielk1977 Exp $
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: 
                     20: do_test join-1.1 {
                     21:   execsql {
                     22:     CREATE TABLE t1(a,b,c);
                     23:     INSERT INTO t1 VALUES(1,2,3);
                     24:     INSERT INTO t1 VALUES(2,3,4);
                     25:     INSERT INTO t1 VALUES(3,4,5);
                     26:     SELECT * FROM t1;
                     27:   }  
                     28: } {1 2 3 2 3 4 3 4 5}
                     29: do_test join-1.2 {
                     30:   execsql {
                     31:     CREATE TABLE t2(b,c,d);
                     32:     INSERT INTO t2 VALUES(1,2,3);
                     33:     INSERT INTO t2 VALUES(2,3,4);
                     34:     INSERT INTO t2 VALUES(3,4,5);
                     35:     SELECT * FROM t2;
                     36:   }  
                     37: } {1 2 3 2 3 4 3 4 5}
                     38: 
                     39: do_test join-1.3 {
                     40:   execsql2 {
                     41:     SELECT * FROM t1 NATURAL JOIN t2;
                     42:   }
                     43: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                     44: do_test join-1.3.1 {
                     45:   execsql2 {
                     46:     SELECT * FROM t2 NATURAL JOIN t1;
                     47:   }
                     48: } {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
                     49: do_test join-1.3.2 {
                     50:   execsql2 {
                     51:     SELECT * FROM t2 AS x NATURAL JOIN t1;
                     52:   }
                     53: } {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
                     54: do_test join-1.3.3 {
                     55:   execsql2 {
                     56:     SELECT * FROM t2 NATURAL JOIN t1 AS y;
                     57:   }
                     58: } {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
                     59: do_test join-1.3.4 {
                     60:   execsql {
                     61:     SELECT b FROM t1 NATURAL JOIN t2;
                     62:   }
                     63: } {2 3}
                     64: 
                     65: # ticket #3522
                     66: do_test join-1.3.5 {
                     67:   execsql2 {
                     68:     SELECT t2.* FROM t2 NATURAL JOIN t1
                     69:   }
                     70: } {b 2 c 3 d 4 b 3 c 4 d 5}
                     71: do_test join-1.3.6 {
                     72:   execsql2 {
                     73:     SELECT xyzzy.* FROM t2 AS xyzzy NATURAL JOIN t1
                     74:   }
                     75: } {b 2 c 3 d 4 b 3 c 4 d 5}
                     76: do_test join-1.3.7 {
                     77:   execsql2 {
                     78:     SELECT t1.* FROM t2 NATURAL JOIN t1
                     79:   }
                     80: } {a 1 b 2 c 3 a 2 b 3 c 4}
                     81: do_test join-1.3.8 {
                     82:   execsql2 {
                     83:     SELECT xyzzy.* FROM t2 NATURAL JOIN t1 AS xyzzy
                     84:   }
                     85: } {a 1 b 2 c 3 a 2 b 3 c 4}
                     86: do_test join-1.3.9 {
                     87:   execsql2 {
                     88:     SELECT aaa.*, bbb.* FROM t2 AS aaa NATURAL JOIN t1 AS bbb
                     89:   }
                     90: } {b 2 c 3 d 4 a 1 b 2 c 3 b 3 c 4 d 5 a 2 b 3 c 4}
                     91: do_test join-1.3.10 {
                     92:   execsql2 {
                     93:     SELECT t1.*, t2.* FROM t2 NATURAL JOIN t1
                     94:   }
                     95: } {a 1 b 2 c 3 b 2 c 3 d 4 a 2 b 3 c 4 b 3 c 4 d 5}
                     96: 
                     97: 
                     98: do_test join-1.4.1 {
                     99:   execsql2 {
                    100:     SELECT * FROM t1 INNER JOIN t2 USING(b,c);
                    101:   }
                    102: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                    103: do_test join-1.4.2 {
                    104:   execsql2 {
                    105:     SELECT * FROM t1 AS x INNER JOIN t2 USING(b,c);
                    106:   }
                    107: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                    108: do_test join-1.4.3 {
                    109:   execsql2 {
                    110:     SELECT * FROM t1 INNER JOIN t2 AS y USING(b,c);
                    111:   }
                    112: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                    113: do_test join-1.4.4 {
                    114:   execsql2 {
                    115:     SELECT * FROM t1 AS x INNER JOIN t2 AS y USING(b,c);
                    116:   }
                    117: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                    118: do_test join-1.4.5 {
                    119:   execsql {
                    120:     SELECT b FROM t1 JOIN t2 USING(b);
                    121:   }
                    122: } {2 3}
                    123: 
                    124: # Ticket #3522
                    125: do_test join-1.4.6 {
                    126:   execsql2 {
                    127:     SELECT t1.* FROM t1 JOIN t2 USING(b);
                    128:   }
                    129: } {a 1 b 2 c 3 a 2 b 3 c 4}
                    130: do_test join-1.4.7 {
                    131:   execsql2 {
                    132:     SELECT t2.* FROM t1 JOIN t2 USING(b);
                    133:   }
                    134: } {b 2 c 3 d 4 b 3 c 4 d 5}
                    135: 
                    136: do_test join-1.5 {
                    137:   execsql2 {
                    138:     SELECT * FROM t1 INNER JOIN t2 USING(b);
                    139:   }
                    140: } {a 1 b 2 c 3 c 3 d 4 a 2 b 3 c 4 c 4 d 5}
                    141: do_test join-1.6 {
                    142:   execsql2 {
                    143:     SELECT * FROM t1 INNER JOIN t2 USING(c);
                    144:   }
                    145: } {a 1 b 2 c 3 b 2 d 4 a 2 b 3 c 4 b 3 d 5}
                    146: do_test join-1.7 {
                    147:   execsql2 {
                    148:     SELECT * FROM t1 INNER JOIN t2 USING(c,b);
                    149:   }
                    150: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
                    151: 
                    152: do_test join-1.8 {
                    153:   execsql {
                    154:     SELECT * FROM t1 NATURAL CROSS JOIN t2;
                    155:   }
                    156: } {1 2 3 4 2 3 4 5}
                    157: do_test join-1.9 {
                    158:   execsql {
                    159:     SELECT * FROM t1 CROSS JOIN t2 USING(b,c);
                    160:   }
                    161: } {1 2 3 4 2 3 4 5}
                    162: do_test join-1.10 {
                    163:   execsql {
                    164:     SELECT * FROM t1 NATURAL INNER JOIN t2;
                    165:   }
                    166: } {1 2 3 4 2 3 4 5}
                    167: do_test join-1.11 {
                    168:   execsql {
                    169:     SELECT * FROM t1 INNER JOIN t2 USING(b,c);
                    170:   }
                    171: } {1 2 3 4 2 3 4 5}
                    172: do_test join-1.12 {
                    173:   execsql {
                    174:     SELECT * FROM t1 natural inner join t2;
                    175:   }
                    176: } {1 2 3 4 2 3 4 5}
                    177: 
                    178: ifcapable subquery {
                    179:   do_test join-1.13 {
                    180:     execsql2 {
                    181:       SELECT * FROM t1 NATURAL JOIN 
                    182:         (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as t3
                    183:     }
                    184:   } {a 1 b 2 c 3 d 4 e 5}
                    185:   do_test join-1.14 {
                    186:     execsql2 {
                    187:       SELECT * FROM (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as 'tx'
                    188:           NATURAL JOIN t1
                    189:     }
                    190:   } {c 3 d 4 e 5 a 1 b 2}
                    191: }
                    192: 
                    193: do_test join-1.15 {
                    194:   execsql {
                    195:     CREATE TABLE t3(c,d,e);
                    196:     INSERT INTO t3 VALUES(2,3,4);
                    197:     INSERT INTO t3 VALUES(3,4,5);
                    198:     INSERT INTO t3 VALUES(4,5,6);
                    199:     SELECT * FROM t3;
                    200:   }  
                    201: } {2 3 4 3 4 5 4 5 6}
                    202: do_test join-1.16 {
                    203:   execsql {
                    204:     SELECT * FROM t1 natural join t2 natural join t3;
                    205:   }
                    206: } {1 2 3 4 5 2 3 4 5 6}
                    207: do_test join-1.17 {
                    208:   execsql2 {
                    209:     SELECT * FROM t1 natural join t2 natural join t3;
                    210:   }
                    211: } {a 1 b 2 c 3 d 4 e 5 a 2 b 3 c 4 d 5 e 6}
                    212: do_test join-1.18 {
                    213:   execsql {
                    214:     CREATE TABLE t4(d,e,f);
                    215:     INSERT INTO t4 VALUES(2,3,4);
                    216:     INSERT INTO t4 VALUES(3,4,5);
                    217:     INSERT INTO t4 VALUES(4,5,6);
                    218:     SELECT * FROM t4;
                    219:   }  
                    220: } {2 3 4 3 4 5 4 5 6}
                    221: do_test join-1.19.1 {
                    222:   execsql {
                    223:     SELECT * FROM t1 natural join t2 natural join t4;
                    224:   }
                    225: } {1 2 3 4 5 6}
                    226: do_test join-1.19.2 {
                    227:   execsql2 {
                    228:     SELECT * FROM t1 natural join t2 natural join t4;
                    229:   }
                    230: } {a 1 b 2 c 3 d 4 e 5 f 6}
                    231: do_test join-1.20 {
                    232:   execsql {
                    233:     SELECT * FROM t1 natural join t2 natural join t3 WHERE t1.a=1
                    234:   }
                    235: } {1 2 3 4 5}
                    236: 
                    237: do_test join-2.1 {
                    238:   execsql {
                    239:     SELECT * FROM t1 NATURAL LEFT JOIN t2;
                    240:   }
                    241: } {1 2 3 4 2 3 4 5 3 4 5 {}}
                    242: 
                    243: # ticket #3522
                    244: do_test join-2.1.1 {
                    245:   execsql2 {
                    246:     SELECT * FROM t1 NATURAL LEFT JOIN t2;
                    247:   }
                    248: } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5 a 3 b 4 c 5 d {}}
                    249: do_test join-2.1.2 {
                    250:   execsql2 {
                    251:     SELECT t1.* FROM t1 NATURAL LEFT JOIN t2;
                    252:   }
                    253: } {a 1 b 2 c 3 a 2 b 3 c 4 a 3 b 4 c 5}
                    254: do_test join-2.1.3 {
                    255:   execsql2 {
                    256:     SELECT t2.* FROM t1 NATURAL LEFT JOIN t2;
                    257:   }
                    258: } {b 2 c 3 d 4 b 3 c 4 d 5 b {} c {} d {}}
                    259: 
                    260: do_test join-2.2 {
                    261:   execsql {
                    262:     SELECT * FROM t2 NATURAL LEFT OUTER JOIN t1;
                    263:   }
                    264: } {1 2 3 {} 2 3 4 1 3 4 5 2}
                    265: do_test join-2.3 {
                    266:   catchsql {
                    267:     SELECT * FROM t1 NATURAL RIGHT OUTER JOIN t2;
                    268:   }
                    269: } {1 {RIGHT and FULL OUTER JOINs are not currently supported}}
                    270: do_test join-2.4 {
                    271:   execsql {
                    272:     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d
                    273:   }
                    274: } {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3}
                    275: do_test join-2.5 {
                    276:   execsql {
                    277:     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t1.a>1
                    278:   }
                    279: } {2 3 4 {} {} {} 3 4 5 1 2 3}
                    280: do_test join-2.6 {
                    281:   execsql {
                    282:     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t2.b IS NULL OR t2.b>1
                    283:   }
                    284: } {1 2 3 {} {} {} 2 3 4 {} {} {}}
                    285: 
                    286: do_test join-3.1 {
                    287:   catchsql {
                    288:     SELECT * FROM t1 NATURAL JOIN t2 ON t1.a=t2.b;
                    289:   }
                    290: } {1 {a NATURAL join may not have an ON or USING clause}}
                    291: do_test join-3.2 {
                    292:   catchsql {
                    293:     SELECT * FROM t1 NATURAL JOIN t2 USING(b);
                    294:   }
                    295: } {1 {a NATURAL join may not have an ON or USING clause}}
                    296: do_test join-3.3 {
                    297:   catchsql {
                    298:     SELECT * FROM t1 JOIN t2 ON t1.a=t2.b USING(b);
                    299:   }
                    300: } {1 {cannot have both ON and USING clauses in the same join}}
                    301: do_test join-3.4.1 {
                    302:   catchsql {
                    303:     SELECT * FROM t1 JOIN t2 USING(a);
                    304:   }
                    305: } {1 {cannot join using column a - column not present in both tables}}
                    306: do_test join-3.4.2 {
                    307:   catchsql {
                    308:     SELECT * FROM t1 JOIN t2 USING(d);
                    309:   }
                    310: } {1 {cannot join using column d - column not present in both tables}}
                    311: do_test join-3.5 {
                    312:   catchsql { SELECT * FROM t1 USING(a) }
                    313: } {1 {a JOIN clause is required before USING}}
                    314: do_test join-3.6 {
                    315:   catchsql {
                    316:     SELECT * FROM t1 JOIN t2 ON t3.a=t2.b;
                    317:   }
                    318: } {1 {no such column: t3.a}}
                    319: do_test join-3.7 {
                    320:   catchsql {
                    321:     SELECT * FROM t1 INNER OUTER JOIN t2;
                    322:   }
                    323: } {1 {unknown or unsupported join type: INNER OUTER}}
                    324: do_test join-3.8 {
                    325:   catchsql {
                    326:     SELECT * FROM t1 INNER OUTER CROSS JOIN t2;
                    327:   }
                    328: } {1 {unknown or unsupported join type: INNER OUTER CROSS}}
                    329: do_test join-3.9 {
                    330:   catchsql {
                    331:     SELECT * FROM t1 OUTER NATURAL INNER JOIN t2;
                    332:   }
                    333: } {1 {unknown or unsupported join type: OUTER NATURAL INNER}}
                    334: do_test join-3.10 {
                    335:   catchsql {
                    336:     SELECT * FROM t1 LEFT BOGUS JOIN t2;
                    337:   }
                    338: } {1 {unknown or unsupported join type: LEFT BOGUS}}
                    339: do_test join-3.11 {
                    340:   catchsql {
                    341:     SELECT * FROM t1 INNER BOGUS CROSS JOIN t2;
                    342:   }
                    343: } {1 {unknown or unsupported join type: INNER BOGUS CROSS}}
                    344: do_test join-3.12 {
                    345:   catchsql {
                    346:     SELECT * FROM t1 NATURAL AWK SED JOIN t2;
                    347:   }
                    348: } {1 {unknown or unsupported join type: NATURAL AWK SED}}
                    349: 
                    350: do_test join-4.1 {
                    351:   execsql {
                    352:     BEGIN;
                    353:     CREATE TABLE t5(a INTEGER PRIMARY KEY);
                    354:     CREATE TABLE t6(a INTEGER);
                    355:     INSERT INTO t6 VALUES(NULL);
                    356:     INSERT INTO t6 VALUES(NULL);
                    357:     INSERT INTO t6 SELECT * FROM t6;
                    358:     INSERT INTO t6 SELECT * FROM t6;
                    359:     INSERT INTO t6 SELECT * FROM t6;
                    360:     INSERT INTO t6 SELECT * FROM t6;
                    361:     INSERT INTO t6 SELECT * FROM t6;
                    362:     INSERT INTO t6 SELECT * FROM t6;
                    363:     COMMIT;
                    364:   }
                    365:   execsql {
                    366:     SELECT * FROM t6 NATURAL JOIN t5;
                    367:   }
                    368: } {}
                    369: do_test join-4.2 {
                    370:   execsql {
                    371:     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
                    372:   }
                    373: } {}
                    374: do_test join-4.3 {
                    375:   execsql {
                    376:     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
                    377:   }
                    378: } {}
                    379: do_test join-4.4 {
                    380:   execsql {
                    381:     UPDATE t6 SET a='xyz';
                    382:     SELECT * FROM t6 NATURAL JOIN t5;
                    383:   }
                    384: } {}
                    385: do_test join-4.6 {
                    386:   execsql {
                    387:     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
                    388:   }
                    389: } {}
                    390: do_test join-4.7 {
                    391:   execsql {
                    392:     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
                    393:   }
                    394: } {}
                    395: do_test join-4.8 {
                    396:   execsql {
                    397:     UPDATE t6 SET a=1;
                    398:     SELECT * FROM t6 NATURAL JOIN t5;
                    399:   }
                    400: } {}
                    401: do_test join-4.9 {
                    402:   execsql {
                    403:     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
                    404:   }
                    405: } {}
                    406: do_test join-4.10 {
                    407:   execsql {
                    408:     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
                    409:   }
                    410: } {}
                    411: 
                    412: do_test join-5.1 {
                    413:   execsql {
                    414:     BEGIN;
                    415:     create table centros (id integer primary key, centro);
                    416:     INSERT INTO centros VALUES(1,'xxx');
                    417:     create table usuarios (id integer primary key, nombre, apellidos,
                    418:     idcentro integer);
                    419:     INSERT INTO usuarios VALUES(1,'a','aa',1);
                    420:     INSERT INTO usuarios VALUES(2,'b','bb',1);
                    421:     INSERT INTO usuarios VALUES(3,'c','cc',NULL);
                    422:     create index idcentro on usuarios (idcentro);
                    423:     END;
                    424:     select usuarios.id, usuarios.nombre, centros.centro from
                    425:     usuarios left outer join centros on usuarios.idcentro = centros.id;
                    426:   }
                    427: } {1 a xxx 2 b xxx 3 c {}}
                    428: 
                    429: # A test for ticket #247.
                    430: #
                    431: do_test join-7.1 {
                    432:   execsql {
                    433:     CREATE TABLE t7 (x, y);
                    434:     INSERT INTO t7 VALUES ("pa1", 1);
                    435:     INSERT INTO t7 VALUES ("pa2", NULL);
                    436:     INSERT INTO t7 VALUES ("pa3", NULL);
                    437:     INSERT INTO t7 VALUES ("pa4", 2);
                    438:     INSERT INTO t7 VALUES ("pa30", 131);
                    439:     INSERT INTO t7 VALUES ("pa31", 130);
                    440:     INSERT INTO t7 VALUES ("pa28", NULL);
                    441: 
                    442:     CREATE TABLE t8 (a integer primary key, b);
                    443:     INSERT INTO t8 VALUES (1, "pa1");
                    444:     INSERT INTO t8 VALUES (2, "pa4");
                    445:     INSERT INTO t8 VALUES (3, NULL);
                    446:     INSERT INTO t8 VALUES (4, NULL);
                    447:     INSERT INTO t8 VALUES (130, "pa31");
                    448:     INSERT INTO t8 VALUES (131, "pa30");
                    449: 
                    450:     SELECT coalesce(t8.a,999) from t7 LEFT JOIN t8 on y=a;
                    451:   }
                    452: } {1 999 999 2 131 130 999}
                    453: 
                    454: # Make sure a left join where the right table is really a view that
                    455: # is itself a join works right.  Ticket #306.
                    456: #
                    457: ifcapable view {
                    458: do_test join-8.1 {
                    459:   execsql {
                    460:     BEGIN;
                    461:     CREATE TABLE t9(a INTEGER PRIMARY KEY, b);
                    462:     INSERT INTO t9 VALUES(1,11);
                    463:     INSERT INTO t9 VALUES(2,22);
                    464:     CREATE TABLE t10(x INTEGER PRIMARY KEY, y);
                    465:     INSERT INTO t10 VALUES(1,2);
                    466:     INSERT INTO t10 VALUES(3,3);    
                    467:     CREATE TABLE t11(p INTEGER PRIMARY KEY, q);
                    468:     INSERT INTO t11 VALUES(2,111);
                    469:     INSERT INTO t11 VALUES(3,333);    
                    470:     CREATE VIEW v10_11 AS SELECT x, q FROM t10, t11 WHERE t10.y=t11.p;
                    471:     COMMIT;
                    472:     SELECT * FROM t9 LEFT JOIN v10_11 ON( a=x );
                    473:   }
                    474: } {1 11 1 111 2 22 {} {}}
                    475: ifcapable subquery {
                    476:   do_test join-8.2 {
                    477:     execsql {
                    478:       SELECT * FROM t9 LEFT JOIN (SELECT x, q FROM t10, t11 WHERE t10.y=t11.p)
                    479:            ON( a=x);
                    480:     }
                    481:   } {1 11 1 111 2 22 {} {}}
                    482: }
                    483: do_test join-8.3 {
                    484:   execsql {
                    485:     SELECT * FROM v10_11 LEFT JOIN t9 ON( a=x );
                    486:   }
                    487: } {1 111 1 11 3 333 {} {}}
                    488: ifcapable subquery {
                    489:   # Constant expressions in a subquery that is the right element of a
                    490:   # LEFT JOIN evaluate to NULL for rows where the LEFT JOIN does not
                    491:   # match.  Ticket #3300
                    492:   do_test join-8.4 {
                    493:     execsql {
                    494:       SELECT * FROM t9 LEFT JOIN (SELECT 44, p, q FROM t11) AS sub1 ON p=a
                    495:     }
                    496:   } {1 11 {} {} {} 2 22 44 2 111}
                    497: }
                    498: } ;# ifcapable view
                    499: 
                    500: # Ticket #350 describes a scenario where LEFT OUTER JOIN does not
                    501: # function correctly if the right table in the join is really
                    502: # subquery.
                    503: #
                    504: # To test the problem, we generate the same LEFT OUTER JOIN in two
                    505: # separate selects but with on using a subquery and the other calling
                    506: # the table directly.  Then connect the two SELECTs using an EXCEPT.
                    507: # Both queries should generate the same results so the answer should
                    508: # be an empty set.
                    509: #
                    510: ifcapable compound {
                    511: do_test join-9.1 {
                    512:   execsql {
                    513:     BEGIN;
                    514:     CREATE TABLE t12(a,b);
                    515:     INSERT INTO t12 VALUES(1,11);
                    516:     INSERT INTO t12 VALUES(2,22);
                    517:     CREATE TABLE t13(b,c);
                    518:     INSERT INTO t13 VALUES(22,222);
                    519:     COMMIT;
                    520:   }
                    521: } {}
                    522: 
                    523: ifcapable subquery {
                    524:   do_test join-9.1.1 {
                    525:     execsql {
                    526:       SELECT * FROM t12 NATURAL LEFT JOIN t13
                    527:       EXCEPT
                    528:       SELECT * FROM t12 NATURAL LEFT JOIN (SELECT * FROM t13 WHERE b>0);
                    529:     }
                    530:   } {}
                    531: }
                    532: ifcapable view {
                    533:   do_test join-9.2 {
                    534:     execsql {
                    535:       CREATE VIEW v13 AS SELECT * FROM t13 WHERE b>0;
                    536:       SELECT * FROM t12 NATURAL LEFT JOIN t13
                    537:         EXCEPT
                    538:         SELECT * FROM t12 NATURAL LEFT JOIN v13;
                    539:     }
                    540:   } {}
                    541: } ;# ifcapable view
                    542: } ;# ifcapable compound
                    543: 
                    544: ifcapable subquery {
                    545:   # Ticket #1697:  Left Join WHERE clause terms that contain an
                    546:   # aggregate subquery.
                    547:   #
                    548:   do_test join-10.1 {
                    549:     execsql {
                    550:       CREATE TABLE t21(a,b,c);
                    551:       CREATE TABLE t22(p,q);
                    552:       CREATE INDEX i22 ON t22(q);
                    553:       SELECT a FROM t21 LEFT JOIN t22 ON b=p WHERE q=
                    554:          (SELECT max(m.q) FROM t22 m JOIN t21 n ON n.b=m.p WHERE n.c=1);
                    555:     }  
                    556:   } {}
                    557: 
                    558:   # Test a LEFT JOIN when the right-hand side of hte join is an empty
                    559:   # sub-query. Seems fine.
                    560:   #
                    561:   do_test join-10.2 {
                    562:     execsql {
                    563:       CREATE TABLE t23(a, b, c);
                    564:       CREATE TABLE t24(a, b, c);
                    565:       INSERT INTO t23 VALUES(1, 2, 3);
                    566:     }
                    567:     execsql {
                    568:       SELECT * FROM t23 LEFT JOIN t24;
                    569:     }
                    570:   } {1 2 3 {} {} {}}
                    571:   do_test join-10.3 {
                    572:     execsql {
                    573:       SELECT * FROM t23 LEFT JOIN (SELECT * FROM t24);
                    574:     }
                    575:   } {1 2 3 {} {} {}}
                    576: 
                    577: } ;# ifcapable subquery
                    578: 
                    579: #-------------------------------------------------------------------------
                    580: # The following tests are to ensure that bug b73fb0bd64 is fixed.
                    581: #
                    582: do_test join-11.1 {
                    583:   drop_all_tables
                    584:   execsql {
                    585:     CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT);
                    586:     CREATE TABLE t2(a INTEGER PRIMARY KEY, b TEXT);
                    587:     INSERT INTO t1 VALUES(1,'abc');
                    588:     INSERT INTO t1 VALUES(2,'def');
                    589:     INSERT INTO t2 VALUES(1,'abc');
                    590:     INSERT INTO t2 VALUES(2,'def');
                    591:     SELECT * FROM t1 NATURAL JOIN t2;
                    592:   }
                    593: } {1 abc 2 def}
                    594: 
                    595: do_test join-11.2 {
                    596:   execsql { SELECT a FROM t1 JOIN t1 USING (a)}
                    597: } {1 2}
                    598: do_test join-11.3 {
                    599:   execsql { SELECT a FROM t1 JOIN t1 AS t2 USING (a)}
                    600: } {1 2}
                    601: do_test join-11.3 {
                    602:   execsql { SELECT * FROM t1 NATURAL JOIN t1 AS t2}
                    603: } {1 abc 2 def}
                    604: do_test join-11.4 {
                    605:   execsql { SELECT * FROM t1 NATURAL JOIN t1 }
                    606: } {1 abc 2 def}
                    607: 
                    608: do_test join-11.5 {
                    609:   drop_all_tables
                    610:   execsql {
                    611:     CREATE TABLE t1(a COLLATE nocase, b);
                    612:     CREATE TABLE t2(a, b);
                    613:     INSERT INTO t1 VALUES('ONE', 1);
                    614:     INSERT INTO t1 VALUES('two', 2);
                    615:     INSERT INTO t2 VALUES('one', 1);
                    616:     INSERT INTO t2 VALUES('two', 2);
                    617:   }
                    618: } {}
                    619: do_test join-11.6 {
                    620:   execsql { SELECT * FROM t1 NATURAL JOIN t2 }
                    621: } {ONE 1 two 2}
                    622: do_test join-11.7 {
                    623:   execsql { SELECT * FROM t2 NATURAL JOIN t1 }
                    624: } {two 2}
                    625: 
                    626: do_test join-11.8 {
                    627:   drop_all_tables
                    628:   execsql {
                    629:     CREATE TABLE t1(a, b TEXT);
                    630:     CREATE TABLE t2(b INTEGER, a);
                    631:     INSERT INTO t1 VALUES('one', '1.0');
                    632:     INSERT INTO t1 VALUES('two', '2');
                    633:     INSERT INTO t2 VALUES(1, 'one');
                    634:     INSERT INTO t2 VALUES(2, 'two');
                    635:   }
                    636: } {}
                    637: do_test join-11.9 {
                    638:   execsql { SELECT * FROM t1 NATURAL JOIN t2 }
                    639: } {one 1.0 two 2}
                    640: do_test join-11.10 {
                    641:   execsql { SELECT * FROM t2 NATURAL JOIN t1 }
                    642: } {1 one 2 two}
                    643: 
                    644: finish_test

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