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