In the Makefile for MSVC, the default target should not include binaries that link...
[sqlite.git] / test / join6.test
blob7fbf508e57f6ab6bb25eabcc77826fb3c5380d1b
1 # 2009 December 9
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file implements tests for N-way joins (N>2) which make
14 # use of USING or NATURAL JOIN.  For such joins, the USING and
15 # NATURAL JOIN processing needs to search all tables to the left
16 # of the join looking for a match.  See ticket [f74beaabde]
17 # for additional information.
20 set testdir [file dirname $argv0]
21 source $testdir/tester.tcl
24 # The problem as initially reported on the mailing list:
26 do_test join6-1.1 {
27   execsql {
28     CREATE TABLE t1(a);
29     CREATE TABLE t2(a);
30     CREATE TABLE t3(a,b);
31     INSERT INTO t1 VALUES(1);
32     INSERT INTO t3 VALUES(1,2);
34     SELECT * FROM t1 LEFT JOIN t2 USING(a) LEFT JOIN t3 USING(a);
35   }
36 } {1 2}
37 do_test join6-1.2 {
38   execsql {
39     SELECT t1.a, t3.b 
40       FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.a=t3.a;
41   }
42 } {1 {}}
43 do_test join6-1.3 {
44   execsql {
45     SELECT t1.a, t3.b
46       FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t1.a=t3.a;
47   }
48 } {1 2}
51 do_test join6-2.1 {
52   execsql {
53     DROP TABLE t1;
54     DROP TABLE t2;
55     DROP TABLE t3;
57     CREATE TABLE t1(x,y);
58     CREATE TABLE t2(y,z);
59     CREATE TABLE t3(x,z);
61     INSERT INTO t1 VALUES(1,2);
62     INSERT INTO t1 VALUES(3,4);
64     INSERT INTO t2 VALUES(2,3);
65     INSERT INTO t2 VALUES(4,5);
67     INSERT INTO t3 VALUES(1,3);
68     INSERT INTO t3 VALUES(3,5);
70     SELECT * FROM t1 JOIN t2 USING (y) JOIN t3 USING(x);
71   }
72 } {1 2 3 3 3 4 5 5}
73 do_test join6-2.2 {
74   execsql {
75     SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3;
76   }
77 } {1 2 3 3 4 5}
80 do_test join6-3.1 {
81   execsql {
82     DROP TABLE t1;
83     DROP TABLE t2;
84     DROP TABLE t3;
86     CREATE TABLE t1(a,x,y);
87     INSERT INTO t1 VALUES(1,91,92);
88     INSERT INTO t1 VALUES(2,93,94);
89     
90     CREATE TABLE t2(b,y,z);
91     INSERT INTO t2 VALUES(3,92,93);
92     INSERT INTO t2 VALUES(4,94,95);
93     
94     CREATE TABLE t3(c,x,z);
95     INSERT INTO t3 VALUES(5,91,93);
96     INSERT INTO t3 VALUES(6,99,95);
97     
98     SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN t3;
99   }
100 } {1 91 92 3 93 5}
101 do_test join6-3.2 {
102   execsql {
103     SELECT * FROM t1 JOIN t2 NATURAL JOIN t3;
104   }
105 } {1 91 92 3 92 93 5}
106 do_test join6-3.3 {
107   execsql {
108     SELECT * FROM t1 JOIN t2 USING(y) NATURAL JOIN t3;
109   }
110 } {1 91 92 3 93 5}
111 do_test join6-3.4 {
112   execsql {
113     SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(x,z);
114   }
115 } {1 91 92 3 93 5}
116 do_test join6-3.5 {
117   execsql {
118     SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(x);
119   }
120 } {1 91 92 3 93 5 93}
121 do_test join6-3.6 {
122   execsql {
123     SELECT * FROM t1 NATURAL JOIN t2 JOIN t3 USING(z);
124   }
125 } {1 91 92 3 93 5 91 2 93 94 4 95 6 99}
127 ifcapable compound {
128   do_test join6-4.1 {
129     execsql {
130       SELECT * FROM
131          (SELECT 1 AS a, 91 AS x, 92 AS y UNION SELECT 2, 93, 94)
132          NATURAL JOIN t2 NATURAL JOIN t3
133     }
134   } {1 91 92 3 93 5}
135   do_test join6-4.2 {
136     execsql {
137       SELECT * FROM t1 NATURAL JOIN
138          (SELECT 3 AS b, 92 AS y, 93 AS z UNION SELECT 4, 94, 95)
139          NATURAL JOIN t3
140     }
141   } {1 91 92 3 93 5}
142   do_test join6-4.3 {
143     execsql {
144       SELECT * FROM t1 NATURAL JOIN t2 NATURAL JOIN
145          (SELECT 5 AS c, 91 AS x, 93 AS z UNION SELECT 6, 99, 95)
146     }
147   } {1 91 92 3 93 5}
160 finish_test