xref: /sqlite-3.40.0/test/vtab6.test (revision 825ecf9c)
1fbbe005aSdanielk1977# 2002 May 24
2fbbe005aSdanielk1977#
3fbbe005aSdanielk1977# The author disclaims copyright to this source code.  In place of
4fbbe005aSdanielk1977# a legal notice, here is a blessing:
5fbbe005aSdanielk1977#
6fbbe005aSdanielk1977#    May you do good and not evil.
7fbbe005aSdanielk1977#    May you find forgiveness for yourself and forgive others.
8fbbe005aSdanielk1977#    May you share freely, never taking more than you give.
9fbbe005aSdanielk1977#
10fbbe005aSdanielk1977#***********************************************************************
11fbbe005aSdanielk1977# This file implements regression tests for SQLite library.
12fbbe005aSdanielk1977#
13fbbe005aSdanielk1977# This file implements tests for joins, including outer joins involving
14fbbe005aSdanielk1977# virtual tables. The test cases in this file are copied from the file
15fbbe005aSdanielk1977# join.test, and some of the comments still reflect that.
16fbbe005aSdanielk1977#
17bd1a0a4fSdanielk1977# $Id: vtab6.test,v 1.5 2009/07/01 16:12:08 danielk1977 Exp $
18fbbe005aSdanielk1977
19fbbe005aSdanielk1977set testdir [file dirname $argv0]
20fbbe005aSdanielk1977source $testdir/tester.tcl
21fbbe005aSdanielk1977
223765df48Sdrhifcapable !vtab {
233765df48Sdrh  finish_test
243765df48Sdrh  return
253765df48Sdrh}
263765df48Sdrh
27fbbe005aSdanielk1977register_echo_module [sqlite3_connection_pointer db]
28fbbe005aSdanielk1977
29fbbe005aSdanielk1977execsql {
30fbbe005aSdanielk1977  CREATE TABLE real_t1(a,b,c);
31fbbe005aSdanielk1977  CREATE TABLE real_t2(b,c,d);
32fbbe005aSdanielk1977  CREATE TABLE real_t3(c,d,e);
33fbbe005aSdanielk1977  CREATE TABLE real_t4(d,e,f);
34fbbe005aSdanielk1977  CREATE TABLE real_t5(a INTEGER PRIMARY KEY);
35fbbe005aSdanielk1977  CREATE TABLE real_t6(a INTEGER);
36fbbe005aSdanielk1977  CREATE TABLE real_t7 (x, y);
37fbbe005aSdanielk1977  CREATE TABLE real_t8 (a integer primary key, b);
38fbbe005aSdanielk1977  CREATE TABLE real_t9(a INTEGER PRIMARY KEY, b);
39fbbe005aSdanielk1977  CREATE TABLE real_t10(x INTEGER PRIMARY KEY, y);
40fbbe005aSdanielk1977  CREATE TABLE real_t11(p INTEGER PRIMARY KEY, q);
41fbbe005aSdanielk1977  CREATE TABLE real_t12(a,b);
42fbbe005aSdanielk1977  CREATE TABLE real_t13(b,c);
43fbbe005aSdanielk1977  CREATE TABLE real_t21(a,b,c);
44fbbe005aSdanielk1977  CREATE TABLE real_t22(p,q);
45fbbe005aSdanielk1977}
46fbbe005aSdanielk1977foreach t [list t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t21 t22] {
47fbbe005aSdanielk1977  execsql "CREATE VIRTUAL TABLE $t USING echo(real_$t)"
48fbbe005aSdanielk1977}
49fbbe005aSdanielk1977
50fbbe005aSdanielk1977do_test vtab6-1.1 {
51fbbe005aSdanielk1977  execsql {
52fbbe005aSdanielk1977    INSERT INTO t1 VALUES(1,2,3);
53fbbe005aSdanielk1977    INSERT INTO t1 VALUES(2,3,4);
54fbbe005aSdanielk1977    INSERT INTO t1 VALUES(3,4,5);
55fbbe005aSdanielk1977    SELECT * FROM t1;
56fbbe005aSdanielk1977  }
57fbbe005aSdanielk1977} {1 2 3 2 3 4 3 4 5}
58fbbe005aSdanielk1977do_test vtab6-1.2 {
59fbbe005aSdanielk1977  execsql {
60fbbe005aSdanielk1977    INSERT INTO t2 VALUES(1,2,3);
61fbbe005aSdanielk1977    INSERT INTO t2 VALUES(2,3,4);
62fbbe005aSdanielk1977    INSERT INTO t2 VALUES(3,4,5);
63fbbe005aSdanielk1977    SELECT * FROM t2;
64fbbe005aSdanielk1977  }
65fbbe005aSdanielk1977} {1 2 3 2 3 4 3 4 5}
66fbbe005aSdanielk1977
67fbbe005aSdanielk1977do_test vtab6-1.3 {
68fbbe005aSdanielk1977  execsql2 {
69fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL JOIN t2;
70fbbe005aSdanielk1977  }
71fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
72fbbe005aSdanielk1977do_test vtab6-1.3.1 {
73fbbe005aSdanielk1977  execsql2 {
74fbbe005aSdanielk1977    SELECT * FROM t2 NATURAL JOIN t1;
75fbbe005aSdanielk1977  }
76fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
77fbbe005aSdanielk1977do_test vtab6-1.3.2 {
78fbbe005aSdanielk1977  execsql2 {
79fbbe005aSdanielk1977    SELECT * FROM t2 AS x NATURAL JOIN t1;
80fbbe005aSdanielk1977  }
81fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
82fbbe005aSdanielk1977do_test vtab6-1.3.3 {
83fbbe005aSdanielk1977  execsql2 {
84fbbe005aSdanielk1977    SELECT * FROM t2 NATURAL JOIN t1 AS y;
85fbbe005aSdanielk1977  }
86fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2}
87fbbe005aSdanielk1977do_test vtab6-1.3.4 {
88fbbe005aSdanielk1977  execsql {
89fbbe005aSdanielk1977    SELECT b FROM t1 NATURAL JOIN t2;
90fbbe005aSdanielk1977  }
91fbbe005aSdanielk1977} {2 3}
92fbbe005aSdanielk1977do_test vtab6-1.4.1 {
93fbbe005aSdanielk1977  execsql2 {
94fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 USING(b,c);
95fbbe005aSdanielk1977  }
96fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
97fbbe005aSdanielk1977do_test vtab6-1.4.2 {
98fbbe005aSdanielk1977  execsql2 {
99fbbe005aSdanielk1977    SELECT * FROM t1 AS x INNER JOIN t2 USING(b,c);
100fbbe005aSdanielk1977  }
101fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
102fbbe005aSdanielk1977do_test vtab6-1.4.3 {
103fbbe005aSdanielk1977  execsql2 {
104fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 AS y USING(b,c);
105fbbe005aSdanielk1977  }
106fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
107fbbe005aSdanielk1977do_test vtab6-1.4.4 {
108fbbe005aSdanielk1977  execsql2 {
109fbbe005aSdanielk1977    SELECT * FROM t1 AS x INNER JOIN t2 AS y USING(b,c);
110fbbe005aSdanielk1977  }
111fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
112fbbe005aSdanielk1977do_test vtab6-1.4.5 {
113fbbe005aSdanielk1977  execsql {
114fbbe005aSdanielk1977    SELECT b FROM t1 JOIN t2 USING(b);
115fbbe005aSdanielk1977  }
116fbbe005aSdanielk1977} {2 3}
117fbbe005aSdanielk1977do_test vtab6-1.5 {
118fbbe005aSdanielk1977  execsql2 {
119fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 USING(b);
120fbbe005aSdanielk1977  }
121fbbe005aSdanielk1977} {a 1 b 2 c 3 c 3 d 4 a 2 b 3 c 4 c 4 d 5}
122fbbe005aSdanielk1977do_test vtab6-1.6 {
123fbbe005aSdanielk1977  execsql2 {
124fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 USING(c);
125fbbe005aSdanielk1977  }
126fbbe005aSdanielk1977} {a 1 b 2 c 3 b 2 d 4 a 2 b 3 c 4 b 3 d 5}
127fbbe005aSdanielk1977do_test vtab6-1.7 {
128fbbe005aSdanielk1977  execsql2 {
129fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 USING(c,b);
130fbbe005aSdanielk1977  }
131fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
132fbbe005aSdanielk1977
133fbbe005aSdanielk1977do_test vtab6-1.8 {
134fbbe005aSdanielk1977  execsql {
135fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL CROSS JOIN t2;
136fbbe005aSdanielk1977  }
137fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5}
138fbbe005aSdanielk1977do_test vtab6-1.9 {
139fbbe005aSdanielk1977  execsql {
140fbbe005aSdanielk1977    SELECT * FROM t1 CROSS JOIN t2 USING(b,c);
141fbbe005aSdanielk1977  }
142fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5}
143fbbe005aSdanielk1977do_test vtab6-1.10 {
144fbbe005aSdanielk1977  execsql {
145fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL INNER JOIN t2;
146fbbe005aSdanielk1977  }
147fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5}
148fbbe005aSdanielk1977do_test vtab6-1.11 {
149fbbe005aSdanielk1977  execsql {
150fbbe005aSdanielk1977    SELECT * FROM t1 INNER JOIN t2 USING(b,c);
151fbbe005aSdanielk1977  }
152fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5}
153fbbe005aSdanielk1977do_test vtab6-1.12 {
154fbbe005aSdanielk1977  execsql {
155fbbe005aSdanielk1977    SELECT * FROM t1 natural inner join t2;
156fbbe005aSdanielk1977  }
157fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5}
158fbbe005aSdanielk1977
159fbbe005aSdanielk1977ifcapable subquery {
160fbbe005aSdanielk1977  do_test vtab6-1.13 {
161fbbe005aSdanielk1977    execsql2 {
162fbbe005aSdanielk1977      SELECT * FROM t1 NATURAL JOIN
163fbbe005aSdanielk1977        (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as t3
164fbbe005aSdanielk1977    }
165fbbe005aSdanielk1977  } {a 1 b 2 c 3 d 4 e 5}
166fbbe005aSdanielk1977  do_test vtab6-1.14 {
167fbbe005aSdanielk1977    execsql2 {
168fbbe005aSdanielk1977      SELECT * FROM (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as 'tx'
169fbbe005aSdanielk1977          NATURAL JOIN t1
170fbbe005aSdanielk1977    }
171fbbe005aSdanielk1977  } {c 3 d 4 e 5 a 1 b 2}
172fbbe005aSdanielk1977}
173fbbe005aSdanielk1977
174fbbe005aSdanielk1977do_test vtab6-1.15 {
175fbbe005aSdanielk1977  execsql {
176fbbe005aSdanielk1977    INSERT INTO t3 VALUES(2,3,4);
177fbbe005aSdanielk1977    INSERT INTO t3 VALUES(3,4,5);
178fbbe005aSdanielk1977    INSERT INTO t3 VALUES(4,5,6);
179fbbe005aSdanielk1977    SELECT * FROM t3;
180fbbe005aSdanielk1977  }
181fbbe005aSdanielk1977} {2 3 4 3 4 5 4 5 6}
182fbbe005aSdanielk1977do_test vtab6-1.16 {
183fbbe005aSdanielk1977  execsql {
184fbbe005aSdanielk1977    SELECT * FROM t1 natural join t2 natural join t3;
185fbbe005aSdanielk1977  }
186fbbe005aSdanielk1977} {1 2 3 4 5 2 3 4 5 6}
187fbbe005aSdanielk1977do_test vtab6-1.17 {
188fbbe005aSdanielk1977  execsql2 {
189fbbe005aSdanielk1977    SELECT * FROM t1 natural join t2 natural join t3;
190fbbe005aSdanielk1977  }
191fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 e 5 a 2 b 3 c 4 d 5 e 6}
192fbbe005aSdanielk1977do_test vtab6-1.18 {
193fbbe005aSdanielk1977  execsql {
194fbbe005aSdanielk1977    INSERT INTO t4 VALUES(2,3,4);
195fbbe005aSdanielk1977    INSERT INTO t4 VALUES(3,4,5);
196fbbe005aSdanielk1977    INSERT INTO t4 VALUES(4,5,6);
197fbbe005aSdanielk1977    SELECT * FROM t4;
198fbbe005aSdanielk1977  }
199fbbe005aSdanielk1977} {2 3 4 3 4 5 4 5 6}
200fbbe005aSdanielk1977do_test vtab6-1.19.1 {
201fbbe005aSdanielk1977  execsql {
202fbbe005aSdanielk1977    SELECT * FROM t1 natural join t2 natural join t4;
203fbbe005aSdanielk1977  }
204fbbe005aSdanielk1977} {1 2 3 4 5 6}
205fbbe005aSdanielk1977do_test vtab6-1.19.2 {
206fbbe005aSdanielk1977  execsql2 {
207fbbe005aSdanielk1977    SELECT * FROM t1 natural join t2 natural join t4;
208fbbe005aSdanielk1977  }
209fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 e 5 f 6}
210fbbe005aSdanielk1977do_test vtab6-1.20 {
211fbbe005aSdanielk1977  execsql {
212fbbe005aSdanielk1977    SELECT * FROM t1 natural join t2 natural join t3 WHERE t1.a=1
213fbbe005aSdanielk1977  }
214fbbe005aSdanielk1977} {1 2 3 4 5}
215fbbe005aSdanielk1977
216fbbe005aSdanielk1977do_test vtab6-2.1 {
217fbbe005aSdanielk1977  execsql {
218fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL LEFT JOIN t2;
219fbbe005aSdanielk1977  }
220fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5 3 4 5 {}}
221fbbe005aSdanielk1977do_test vtab6-2.2 {
222fbbe005aSdanielk1977  execsql {
223fbbe005aSdanielk1977    SELECT * FROM t2 NATURAL LEFT OUTER JOIN t1;
224fbbe005aSdanielk1977  }
225fbbe005aSdanielk1977} {1 2 3 {} 2 3 4 1 3 4 5 2}
226a76ac88aSdrh#do_test vtab6-2.3 {
227a76ac88aSdrh#  catchsql {
228a76ac88aSdrh#    SELECT * FROM t1 NATURAL RIGHT OUTER JOIN t2;
229a76ac88aSdrh#  }
230a76ac88aSdrh#} {1 {RIGHT and FULL OUTER JOINs are not currently supported}}
231fbbe005aSdanielk1977do_test vtab6-2.4 {
232fbbe005aSdanielk1977  execsql {
233fbbe005aSdanielk1977    SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d
234fbbe005aSdanielk1977  }
235fbbe005aSdanielk1977} {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3}
2365d8806e0Sdrhdo_test vtab6-2.4.1 {
2375d8806e0Sdrh  execsql {
2385d8806e0Sdrh    SELECT * FROM t1 LEFT JOIN t2 ON t1.a IS t2.d
2395d8806e0Sdrh  }
2405d8806e0Sdrh} {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3}
241fbbe005aSdanielk1977do_test vtab6-2.5 {
242fbbe005aSdanielk1977  execsql {
243fbbe005aSdanielk1977    SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t1.a>1
244fbbe005aSdanielk1977  }
245fbbe005aSdanielk1977} {2 3 4 {} {} {} 3 4 5 1 2 3}
246fbbe005aSdanielk1977do_test vtab6-2.6 {
247fbbe005aSdanielk1977  execsql {
248fbbe005aSdanielk1977    SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t2.b IS NULL OR t2.b>1
249fbbe005aSdanielk1977  }
250fbbe005aSdanielk1977} {1 2 3 {} {} {} 2 3 4 {} {} {}}
251fbbe005aSdanielk1977
252fbbe005aSdanielk1977do_test vtab6-3.1 {
253fbbe005aSdanielk1977  catchsql {
254fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL JOIN t2 ON t1.a=t2.b;
255fbbe005aSdanielk1977  }
256fbbe005aSdanielk1977} {1 {a NATURAL join may not have an ON or USING clause}}
257fbbe005aSdanielk1977do_test vtab6-3.2 {
258fbbe005aSdanielk1977  catchsql {
259fbbe005aSdanielk1977    SELECT * FROM t1 NATURAL JOIN t2 USING(b);
260fbbe005aSdanielk1977  }
261fbbe005aSdanielk1977} {1 {a NATURAL join may not have an ON or USING clause}}
262fbbe005aSdanielk1977do_test vtab6-3.3 {
263fbbe005aSdanielk1977  catchsql {
264fbbe005aSdanielk1977    SELECT * FROM t1 JOIN t2 ON t1.a=t2.b USING(b);
265fbbe005aSdanielk1977  }
266d44f8b23Sdrh} {1 {near "USING": syntax error}}
267fbbe005aSdanielk1977do_test vtab6-3.4 {
268fbbe005aSdanielk1977  catchsql {
269fbbe005aSdanielk1977    SELECT * FROM t1 JOIN t2 USING(a);
270fbbe005aSdanielk1977  }
271fbbe005aSdanielk1977} {1 {cannot join using column a - column not present in both tables}}
272fbbe005aSdanielk1977do_test vtab6-3.5 {
273bd1a0a4fSdanielk1977  catchsql { SELECT * FROM t1 USING(a) }
274bd1a0a4fSdanielk1977} {1 {a JOIN clause is required before USING}}
275fbbe005aSdanielk1977do_test vtab6-3.6 {
276fbbe005aSdanielk1977  catchsql {
277fbbe005aSdanielk1977    SELECT * FROM t1 JOIN t2 ON t3.a=t2.b;
278fbbe005aSdanielk1977  }
279fbbe005aSdanielk1977} {1 {no such column: t3.a}}
280*825ecf9cSdrh
281*825ecf9cSdrh# EVIDENCE-OF: R-47973-48020 you cannot say "INNER OUTER JOIN", because
282*825ecf9cSdrh# that would be contradictory.
283fbbe005aSdanielk1977do_test vtab6-3.7 {
284fbbe005aSdanielk1977  catchsql {
285fbbe005aSdanielk1977    SELECT * FROM t1 INNER OUTER JOIN t2;
286fbbe005aSdanielk1977  }
2870879d5f9Sdrh} {1 {unknown join type: INNER OUTER}}
288*825ecf9cSdrh
289fbbe005aSdanielk1977do_test vtab6-3.7 {
290fbbe005aSdanielk1977  catchsql {
291fbbe005aSdanielk1977    SELECT * FROM t1 LEFT BOGUS JOIN t2;
292fbbe005aSdanielk1977  }
2930879d5f9Sdrh} {1 {unknown join type: LEFT BOGUS}}
294fbbe005aSdanielk1977
295fbbe005aSdanielk1977do_test vtab6-4.1 {
296fbbe005aSdanielk1977  execsql {
297fbbe005aSdanielk1977    BEGIN;
298fbbe005aSdanielk1977    INSERT INTO t6 VALUES(NULL);
299fbbe005aSdanielk1977    INSERT INTO t6 VALUES(NULL);
300fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
301fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
302fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
303fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
304fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
305fbbe005aSdanielk1977    INSERT INTO t6 SELECT * FROM t6;
306fbbe005aSdanielk1977    COMMIT;
307fbbe005aSdanielk1977  }
308fbbe005aSdanielk1977  execsql {
309fbbe005aSdanielk1977    SELECT * FROM t6 NATURAL JOIN t5;
310fbbe005aSdanielk1977  }
311fbbe005aSdanielk1977} {}
312fbbe005aSdanielk1977do_test vtab6-4.2 {
313fbbe005aSdanielk1977  execsql {
314fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a<t5.a;
315fbbe005aSdanielk1977  }
316fbbe005aSdanielk1977} {}
317fbbe005aSdanielk1977do_test vtab6-4.3 {
318fbbe005aSdanielk1977  execsql {
319fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a>t5.a;
320fbbe005aSdanielk1977  }
321fbbe005aSdanielk1977} {}
322fbbe005aSdanielk1977do_test vtab6-4.4 {
323fbbe005aSdanielk1977  execsql {
324fbbe005aSdanielk1977    UPDATE t6 SET a='xyz';
325fbbe005aSdanielk1977    SELECT * FROM t6 NATURAL JOIN t5;
326fbbe005aSdanielk1977  }
327fbbe005aSdanielk1977} {}
328fbbe005aSdanielk1977do_test vtab6-4.6 {
329fbbe005aSdanielk1977  execsql {
330fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a<t5.a;
331fbbe005aSdanielk1977  }
332fbbe005aSdanielk1977} {}
333fbbe005aSdanielk1977do_test vtab6-4.7 {
334fbbe005aSdanielk1977  execsql {
335fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a>t5.a;
336fbbe005aSdanielk1977  }
337fbbe005aSdanielk1977} {}
338fbbe005aSdanielk1977do_test vtab6-4.8 {
339fbbe005aSdanielk1977  execsql {
340fbbe005aSdanielk1977    UPDATE t6 SET a=1;
341fbbe005aSdanielk1977    SELECT * FROM t6 NATURAL JOIN t5;
342fbbe005aSdanielk1977  }
343fbbe005aSdanielk1977} {}
344fbbe005aSdanielk1977do_test vtab6-4.9 {
345fbbe005aSdanielk1977  execsql {
346fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a<t5.a;
347fbbe005aSdanielk1977  }
348fbbe005aSdanielk1977} {}
349fbbe005aSdanielk1977do_test vtab6-4.10 {
350fbbe005aSdanielk1977  execsql {
351fbbe005aSdanielk1977    SELECT * FROM t6, t5 WHERE t6.a>t5.a;
352fbbe005aSdanielk1977  }
353fbbe005aSdanielk1977} {}
354fbbe005aSdanielk1977
355fbbe005aSdanielk1977# A test for ticket #247.
356fbbe005aSdanielk1977#
357fbbe005aSdanielk1977do_test vtab6-7.1 {
3587d44b22dSdrh  sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1
359fbbe005aSdanielk1977  execsql {
360fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa1", 1);
361fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa2", NULL);
362fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa3", NULL);
363fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa4", 2);
364fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa30", 131);
365fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa31", 130);
366fbbe005aSdanielk1977    INSERT INTO t7 VALUES ("pa28", NULL);
367fbbe005aSdanielk1977
368fbbe005aSdanielk1977    INSERT INTO t8 VALUES (1, "pa1");
369fbbe005aSdanielk1977    INSERT INTO t8 VALUES (2, "pa4");
370fbbe005aSdanielk1977    INSERT INTO t8 VALUES (3, NULL);
371fbbe005aSdanielk1977    INSERT INTO t8 VALUES (4, NULL);
372fbbe005aSdanielk1977    INSERT INTO t8 VALUES (130, "pa31");
373fbbe005aSdanielk1977    INSERT INTO t8 VALUES (131, "pa30");
374fbbe005aSdanielk1977
375fbbe005aSdanielk1977    SELECT coalesce(t8.a,999) from t7 LEFT JOIN t8 on y=a;
376fbbe005aSdanielk1977  }
377fbbe005aSdanielk1977} {1 999 999 2 131 130 999}
378fbbe005aSdanielk1977
379fbbe005aSdanielk1977# Make sure a left join where the right table is really a view that
380fbbe005aSdanielk1977# is itself a join works right.  Ticket #306.
381fbbe005aSdanielk1977#
382fbbe005aSdanielk1977ifcapable view {
383fbbe005aSdanielk1977do_test vtab6-8.1 {
384fbbe005aSdanielk1977  execsql {
385fbbe005aSdanielk1977    BEGIN;
386fbbe005aSdanielk1977    INSERT INTO t9 VALUES(1,11);
387fbbe005aSdanielk1977    INSERT INTO t9 VALUES(2,22);
388fbbe005aSdanielk1977    INSERT INTO t10 VALUES(1,2);
389fbbe005aSdanielk1977    INSERT INTO t10 VALUES(3,3);
390fbbe005aSdanielk1977    INSERT INTO t11 VALUES(2,111);
391fbbe005aSdanielk1977    INSERT INTO t11 VALUES(3,333);
392fbbe005aSdanielk1977    CREATE VIEW v10_11 AS SELECT x, q FROM t10, t11 WHERE t10.y=t11.p;
393fbbe005aSdanielk1977    COMMIT;
394fbbe005aSdanielk1977    SELECT * FROM t9 LEFT JOIN v10_11 ON( a=x );
395fbbe005aSdanielk1977  }
396fbbe005aSdanielk1977} {1 11 1 111 2 22 {} {}}
397fbbe005aSdanielk1977ifcapable subquery {
398fbbe005aSdanielk1977  do_test vtab6-8.2 {
399fbbe005aSdanielk1977    execsql {
400fbbe005aSdanielk1977      SELECT * FROM t9 LEFT JOIN (SELECT x, q FROM t10, t11 WHERE t10.y=t11.p)
401fbbe005aSdanielk1977           ON( a=x);
402fbbe005aSdanielk1977    }
403fbbe005aSdanielk1977  } {1 11 1 111 2 22 {} {}}
404fbbe005aSdanielk1977}
405fbbe005aSdanielk1977do_test vtab6-8.3 {
406fbbe005aSdanielk1977  execsql {
407fbbe005aSdanielk1977    SELECT * FROM v10_11 LEFT JOIN t9 ON( a=x );
408fbbe005aSdanielk1977  }
409fbbe005aSdanielk1977} {1 111 1 11 3 333 {} {}}
410fbbe005aSdanielk1977} ;# ifcapable view
411fbbe005aSdanielk1977
412fbbe005aSdanielk1977# Ticket #350 describes a scenario where LEFT OUTER JOIN does not
413fbbe005aSdanielk1977# function correctly if the right table in the join is really
414fbbe005aSdanielk1977# subquery.
415fbbe005aSdanielk1977#
416fbbe005aSdanielk1977# To test the problem, we generate the same LEFT OUTER JOIN in two
417fbbe005aSdanielk1977# separate selects but with on using a subquery and the other calling
418fbbe005aSdanielk1977# the table directly.  Then connect the two SELECTs using an EXCEPT.
419fbbe005aSdanielk1977# Both queries should generate the same results so the answer should
420fbbe005aSdanielk1977# be an empty set.
421fbbe005aSdanielk1977#
422fbbe005aSdanielk1977ifcapable compound {
423fbbe005aSdanielk1977do_test vtab6-9.1 {
424fbbe005aSdanielk1977  execsql {
425fbbe005aSdanielk1977    BEGIN;
426fbbe005aSdanielk1977    INSERT INTO t12 VALUES(1,11);
427fbbe005aSdanielk1977    INSERT INTO t12 VALUES(2,22);
428fbbe005aSdanielk1977    INSERT INTO t13 VALUES(22,222);
429fbbe005aSdanielk1977    COMMIT;
430fbbe005aSdanielk1977  }
431fbbe005aSdanielk1977} {}
432fbbe005aSdanielk1977
433fbbe005aSdanielk1977ifcapable subquery {
434fbbe005aSdanielk1977  do_test vtab6-9.1.1 {
435fbbe005aSdanielk1977    execsql {
436fbbe005aSdanielk1977      SELECT * FROM t12 NATURAL LEFT JOIN t13
437fbbe005aSdanielk1977      EXCEPT
438fbbe005aSdanielk1977      SELECT * FROM t12 NATURAL LEFT JOIN (SELECT * FROM t13 WHERE b>0);
439fbbe005aSdanielk1977    }
440fbbe005aSdanielk1977  } {}
441fbbe005aSdanielk1977}
442fbbe005aSdanielk1977ifcapable view {
443fbbe005aSdanielk1977  do_test vtab6-9.2 {
444fbbe005aSdanielk1977    execsql {
445fbbe005aSdanielk1977      CREATE VIEW v13 AS SELECT * FROM t13 WHERE b>0;
446fbbe005aSdanielk1977      SELECT * FROM t12 NATURAL LEFT JOIN t13
447fbbe005aSdanielk1977        EXCEPT
448fbbe005aSdanielk1977        SELECT * FROM t12 NATURAL LEFT JOIN v13;
449fbbe005aSdanielk1977    }
450fbbe005aSdanielk1977  } {}
451fbbe005aSdanielk1977} ;# ifcapable view
452fbbe005aSdanielk1977} ;# ifcapable compound
453fbbe005aSdanielk1977
454fbbe005aSdanielk1977ifcapable subquery {
455fbbe005aSdanielk1977do_test vtab6-10.1 {
456fbbe005aSdanielk1977  execsql {
457fbbe005aSdanielk1977    CREATE INDEX i22 ON real_t22(q);
458fbbe005aSdanielk1977    SELECT a FROM t21 LEFT JOIN t22 ON b=p WHERE q=
459fbbe005aSdanielk1977       (SELECT max(m.q) FROM t22 m JOIN t21 n ON n.b=m.p WHERE n.c=1);
460fbbe005aSdanielk1977  }
461fbbe005aSdanielk1977} {}
462fbbe005aSdanielk1977} ;# ifcapable subquery
463fbbe005aSdanielk1977
46439359dc0Sdanielk1977do_test vtab6-11.1.0 {
46539359dc0Sdanielk1977  execsql {
46639359dc0Sdanielk1977    CREATE TABLE ab_r(a, b);
46739359dc0Sdanielk1977    CREATE TABLE bc_r(b, c);
46839359dc0Sdanielk1977
46939359dc0Sdanielk1977    CREATE VIRTUAL TABLE ab USING echo(ab_r);
47039359dc0Sdanielk1977    CREATE VIRTUAL TABLE bc USING echo(bc_r);
47139359dc0Sdanielk1977
47239359dc0Sdanielk1977    INSERT INTO ab VALUES(1, 2);
47339359dc0Sdanielk1977    INSERT INTO bc VALUES(2, 3);
47439359dc0Sdanielk1977  }
47539359dc0Sdanielk1977} {}
47639359dc0Sdanielk1977
47739359dc0Sdanielk1977do_test vtab6-11.1.1 {
47839359dc0Sdanielk1977  execsql {
47939359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
48039359dc0Sdanielk1977  }
48139359dc0Sdanielk1977} {1 2 3}
48239359dc0Sdanielk1977do_test vtab6-11.1.2 {
48339359dc0Sdanielk1977  execsql {
48439359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
48539359dc0Sdanielk1977  }
48639359dc0Sdanielk1977} {1 2 3}
48739359dc0Sdanielk1977
48839359dc0Sdanielk1977set ::echo_module_cost 1.0
48939359dc0Sdanielk1977
49039359dc0Sdanielk1977do_test vtab6-11.1.3 {
49139359dc0Sdanielk1977  execsql {
49239359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
49339359dc0Sdanielk1977  }
49439359dc0Sdanielk1977} {1 2 3}
49539359dc0Sdanielk1977do_test vtab6-11.1.4 {
49639359dc0Sdanielk1977  execsql {
49739359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
49839359dc0Sdanielk1977  }
49939359dc0Sdanielk1977} {1 2 3}
50039359dc0Sdanielk1977
50139359dc0Sdanielk1977
50239359dc0Sdanielk1977do_test vtab6-11.2.0 {
50339359dc0Sdanielk1977  execsql {
50439359dc0Sdanielk1977    CREATE INDEX ab_i ON ab_r(b);
5055236ac1dSdan    CREATE INDEX bc_i ON bc_r(b);
50639359dc0Sdanielk1977  }
50739359dc0Sdanielk1977} {}
50839359dc0Sdanielk1977
50939359dc0Sdanielk1977unset ::echo_module_cost
51039359dc0Sdanielk1977
51139359dc0Sdanielk1977do_test vtab6-11.2.1 {
51239359dc0Sdanielk1977  execsql {
51339359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
51439359dc0Sdanielk1977  }
51539359dc0Sdanielk1977} {1 2 3}
51639359dc0Sdanielk1977do_test vtab6-11.2.2 {
51739359dc0Sdanielk1977  execsql {
51839359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
51939359dc0Sdanielk1977  }
52039359dc0Sdanielk1977} {1 2 3}
52139359dc0Sdanielk1977
52239359dc0Sdanielk1977set ::echo_module_cost 1.0
52339359dc0Sdanielk1977
52439359dc0Sdanielk1977do_test vtab6-11.2.3 {
52539359dc0Sdanielk1977  execsql {
52639359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
52739359dc0Sdanielk1977  }
52839359dc0Sdanielk1977} {1 2 3}
52939359dc0Sdanielk1977do_test vtab6-11.2.4 {
53039359dc0Sdanielk1977  execsql {
53139359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
53239359dc0Sdanielk1977  }
53339359dc0Sdanielk1977} {1 2 3}
53439359dc0Sdanielk1977
53539359dc0Sdanielk1977unset ::echo_module_cost
53639359dc0Sdanielk1977db close
53739359dc0Sdanielk1977sqlite3 db test.db
53839359dc0Sdanielk1977register_echo_module [sqlite3_connection_pointer db]
53939359dc0Sdanielk1977
54039359dc0Sdanielk1977do_test vtab6-11.3.1 {
54139359dc0Sdanielk1977  execsql {
54239359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
54339359dc0Sdanielk1977  }
54439359dc0Sdanielk1977} {1 2 3}
54539359dc0Sdanielk1977
54639359dc0Sdanielk1977do_test vtab6-11.3.2 {
54739359dc0Sdanielk1977  execsql {
54839359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
54939359dc0Sdanielk1977  }
55039359dc0Sdanielk1977} {1 2 3}
55139359dc0Sdanielk1977
55239359dc0Sdanielk1977set ::echo_module_cost 1.0
55339359dc0Sdanielk1977
55439359dc0Sdanielk1977do_test vtab6-11.3.3 {
55539359dc0Sdanielk1977  execsql {
55639359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
55739359dc0Sdanielk1977  }
55839359dc0Sdanielk1977} {1 2 3}
55939359dc0Sdanielk1977do_test vtab6-11.3.4 {
56039359dc0Sdanielk1977  execsql {
56139359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
56239359dc0Sdanielk1977  }
56339359dc0Sdanielk1977} {1 2 3}
56439359dc0Sdanielk1977
56539359dc0Sdanielk1977unset ::echo_module_cost
56639359dc0Sdanielk1977
56739359dc0Sdanielk1977set ::echo_module_ignore_usable 1
56839359dc0Sdanielk1977db cache flush
56939359dc0Sdanielk1977
57039359dc0Sdanielk1977do_test vtab6-11.4.1 {
57139359dc0Sdanielk1977  catchsql {
57239359dc0Sdanielk1977    SELECT a, b, c FROM ab NATURAL JOIN bc;
57339359dc0Sdanielk1977  }
5746de32e7cSdrh} {1 {ab.xBestIndex malfunction}}
57539359dc0Sdanielk1977do_test vtab6-11.4.2 {
57639359dc0Sdanielk1977  catchsql {
57739359dc0Sdanielk1977    SELECT a, b, c FROM bc NATURAL JOIN ab;
57839359dc0Sdanielk1977  }
5796de32e7cSdrh} {1 {bc.xBestIndex malfunction}}
58039359dc0Sdanielk1977
58139359dc0Sdanielk1977unset ::echo_module_ignore_usable
58239359dc0Sdanielk1977
583fbbe005aSdanielk1977finish_test
584