181c16557Sdrh# 2009 December 9 281c16557Sdrh# 381c16557Sdrh# The author disclaims copyright to this source code. In place of 481c16557Sdrh# a legal notice, here is a blessing: 581c16557Sdrh# 681c16557Sdrh# May you do good and not evil. 781c16557Sdrh# May you find forgiveness for yourself and forgive others. 881c16557Sdrh# May you share freely, never taking more than you give. 981c16557Sdrh# 1081c16557Sdrh#*********************************************************************** 1181c16557Sdrh# This file implements regression tests for SQLite library. 1281c16557Sdrh# 1381c16557Sdrh# This file implements tests for N-way joins (N>2) which make 1481c16557Sdrh# use of USING or NATURAL JOIN. For such joins, the USING and 1581c16557Sdrh# NATURAL JOIN processing needs to search all tables to the left 1681c16557Sdrh# of the join looking for a match. See ticket [f74beaabde] 1781c16557Sdrh# for additional information. 1881c16557Sdrh# 1981c16557Sdrh 2081c16557Sdrhset testdir [file dirname $argv0] 2181c16557Sdrhsource $testdir/tester.tcl 2281c16557Sdrh 2381c16557Sdrh 2481c16557Sdrh# The problem as initially reported on the mailing list: 2581c16557Sdrh# 2681c16557Sdrhdo_test join6-1.1 { 2781c16557Sdrh execsql { 2881c16557Sdrh CREATE TABLE t1(a); 2981c16557Sdrh CREATE TABLE t2(a); 3081c16557Sdrh CREATE TABLE t3(a,b); 3181c16557Sdrh INSERT INTO t1 VALUES(1); 3281c16557Sdrh INSERT INTO t3 VALUES(1,2); 3381c16557Sdrh 3481c16557Sdrh SELECT * FROM t1 LEFT JOIN t2 USING(a) LEFT JOIN t3 USING(a); 3581c16557Sdrh } 3681c16557Sdrh} {1 2} 3781c16557Sdrhdo_test join6-1.2 { 3881c16557Sdrh execsql { 3981c16557Sdrh SELECT t1.a, t3.b 4081c16557Sdrh FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.a=t3.a; 4181c16557Sdrh } 4281c16557Sdrh} {1 {}} 4381c16557Sdrhdo_test join6-1.3 { 4481c16557Sdrh execsql { 4581c16557Sdrh SELECT t1.a, t3.b 4681c16557Sdrh FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t1.a=t3.a; 4781c16557Sdrh } 4881c16557Sdrh} {1 2} 4981c16557Sdrh 5081c16557Sdrh 5181c16557Sdrhdo_test join6-2.1 { 5281c16557Sdrh execsql { 5381c16557Sdrh DROP TABLE t1; 5481c16557Sdrh DROP TABLE t2; 5581c16557Sdrh DROP TABLE t3; 5681c16557Sdrh 5781c16557Sdrh CREATE TABLE t1(x,y); 5881c16557Sdrh CREATE TABLE t2(y,z); 5981c16557Sdrh CREATE TABLE t3(x,z); 6081c16557Sdrh 6181c16557Sdrh INSERT INTO t1 VALUES(1,2); 6281c16557Sdrh INSERT INTO t1 VALUES(3,4); 6381c16557Sdrh 6481c16557Sdrh INSERT INTO t2 VALUES(2,3); 6581c16557Sdrh INSERT INTO t2 VALUES(4,5); 6681c16557Sdrh 6781c16557Sdrh INSERT INTO t3 VALUES(1,3); 6881c16557Sdrh INSERT INTO t3 VALUES(3,5); 6981c16557Sdrh 7081c16557Sdrh SELECT * FROM t1 JOIN t2 USING (y) JOIN t3 USING(x); 7181c16557Sdrh } 7281c16557Sdrh} {1 2 3 3 3 4 5 5} 7381c16557Sdrhdo_test join6-2.2 { 7481c16557Sdrh execsql { 7581c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3; 7681c16557Sdrh } 7781c16557Sdrh} {1 2 3 3 4 5} 7881c16557Sdrh 7981c16557Sdrh 8081c16557Sdrhdo_test join6-3.1 { 8181c16557Sdrh execsql { 8281c16557Sdrh DROP TABLE t1; 8381c16557Sdrh DROP TABLE t2; 8481c16557Sdrh DROP TABLE t3; 8581c16557Sdrh 8681c16557Sdrh CREATE TABLE t1(a,x,y); 8781c16557Sdrh INSERT INTO t1 VALUES(1,91,92); 8881c16557Sdrh INSERT INTO t1 VALUES(2,93,94); 8981c16557Sdrh 9081c16557Sdrh CREATE TABLE t2(b,y,z); 9181c16557Sdrh INSERT INTO t2 VALUES(3,92,93); 9281c16557Sdrh INSERT INTO t2 VALUES(4,94,95); 9381c16557Sdrh 9481c16557Sdrh CREATE TABLE t3(c,x,z); 9581c16557Sdrh INSERT INTO t3 VALUES(5,91,93); 9681c16557Sdrh INSERT INTO t3 VALUES(6,99,95); 9781c16557Sdrh 9881c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3; 9981c16557Sdrh } 10081c16557Sdrh} {1 91 92 3 93 5} 10181c16557Sdrhdo_test join6-3.2 { 10281c16557Sdrh execsql { 10381c16557Sdrh SELECT * FROM t1 JOIN t2 NATURAL JOIN t3; 10481c16557Sdrh } 10581c16557Sdrh} {1 91 92 3 92 93 5} 10681c16557Sdrhdo_test join6-3.3 { 10781c16557Sdrh execsql { 10881c16557Sdrh SELECT * FROM t1 JOIN t2 USING(y) NATURAL JOIN t3; 10981c16557Sdrh } 11081c16557Sdrh} {1 91 92 3 93 5} 11181c16557Sdrhdo_test join6-3.4 { 11281c16557Sdrh execsql { 11381c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(x,z); 11481c16557Sdrh } 11581c16557Sdrh} {1 91 92 3 93 5} 11681c16557Sdrhdo_test join6-3.5 { 11781c16557Sdrh execsql { 11881c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(x); 11981c16557Sdrh } 12081c16557Sdrh} {1 91 92 3 93 5 93} 12181c16557Sdrhdo_test join6-3.6 { 12281c16557Sdrh execsql { 12381c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(z); 12481c16557Sdrh } 12581c16557Sdrh} {1 91 92 3 93 5 91 2 93 94 4 95 6 99} 12681c16557Sdrh 1272f56da3fSdanifcapable compound { 12881c16557Sdrh do_test join6-4.1 { 12981c16557Sdrh execsql { 13081c16557Sdrh SELECT * FROM 13181c16557Sdrh (SELECT 1 AS a, 91 AS x, 92 AS y UNION SELECT 2, 93, 94) 13281c16557Sdrh NATURAL JOIN t2 NATURAL JOIN t3 13381c16557Sdrh } 13481c16557Sdrh } {1 91 92 3 93 5} 13581c16557Sdrh do_test join6-4.2 { 13681c16557Sdrh execsql { 13781c16557Sdrh SELECT * FROM t1 NATURAL JOIN 13881c16557Sdrh (SELECT 3 AS b, 92 AS y, 93 AS z UNION SELECT 4, 94, 95) 13981c16557Sdrh NATURAL JOIN t3 14081c16557Sdrh } 14181c16557Sdrh } {1 91 92 3 93 5} 14281c16557Sdrh do_test join6-4.3 { 14381c16557Sdrh execsql { 14481c16557Sdrh SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN 14581c16557Sdrh (SELECT 5 AS c, 91 AS x, 93 AS z UNION SELECT 6, 99, 95) 14681c16557Sdrh } 14781c16557Sdrh } {1 91 92 3 93 5} 1482f56da3fSdan} 14981c16557Sdrh 150*b5a69238Sdando_execsql_test join6-5.1 { 151*b5a69238Sdan CREATE TABLE tx(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o PRIMARY KEY) 152*b5a69238Sdan WITHOUT ROWID; 153*b5a69238Sdan INSERT INTO tx VALUES( 154*b5a69238Sdan 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 155*b5a69238Sdan ); 156*b5a69238Sdan} {} 157*b5a69238Sdando_execsql_test joint6-5.2 { 158*b5a69238Sdan SELECT o FROM tx NATURAL JOIN tx; 159*b5a69238Sdan} {15} 160*b5a69238Sdan 161*b5a69238Sdando_execsql_test join6-5.3 { 162*b5a69238Sdan CREATE TABLE ty(a,Ñ,x6,x7,x8,Q,I,v,x1,L,E,x2,x3,x4,x5,s,g PRIMARY KEY,b,c) 163*b5a69238Sdan WITHOUT ROWID; 164*b5a69238Sdan SELECT a FROM ty NATURAL JOIN ty; 165*b5a69238Sdan} 16681c16557Sdrh 16781c16557Sdrh 16881c16557Sdrh 16981c16557Sdrh 17081c16557Sdrh 17181c16557Sdrh 17281c16557Sdrh 17381c16557Sdrh 17481c16557Sdrh 17581c16557Sdrh 17681c16557Sdrhfinish_test 177