join.test 16 KB

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