Thou shall use an IPTR as storage variable for GetAttr()
[AROS-Contrib.git] / sqlite3 / test / join.test
blob138633aaea2c0ff329fb08e25d7b4ae471a810f8
1 # 2002 May 24
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 joins, including outer joins.
15 # $Id: join.test,v 1.20 2005/06/06 17:11:46 drh Exp $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
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}
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 do_test join-1.4.1 {
65   execsql2 {
66     SELECT * FROM t1 INNER JOIN t2 USING(b,c);
67   }
68 } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
69 do_test join-1.4.2 {
70   execsql2 {
71     SELECT * FROM t1 AS x INNER JOIN t2 USING(b,c);
72   }
73 } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
74 do_test join-1.4.3 {
75   execsql2 {
76     SELECT * FROM t1 INNER JOIN t2 AS y USING(b,c);
77   }
78 } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
79 do_test join-1.4.4 {
80   execsql2 {
81     SELECT * FROM t1 AS x INNER JOIN t2 AS y USING(b,c);
82   }
83 } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
84 do_test join-1.4.5 {
85   execsql {
86     SELECT b FROM t1 JOIN t2 USING(b);
87   }
88 } {2 3}
89 do_test join-1.5 {
90   execsql2 {
91     SELECT * FROM t1 INNER JOIN t2 USING(b);
92   }
93 } {a 1 b 2 c 3 c 3 d 4 a 2 b 3 c 4 c 4 d 5}
94 do_test join-1.6 {
95   execsql2 {
96     SELECT * FROM t1 INNER JOIN t2 USING(c);
97   }
98 } {a 1 b 2 c 3 b 2 d 4 a 2 b 3 c 4 b 3 d 5}
99 do_test join-1.7 {
100   execsql2 {
101     SELECT * FROM t1 INNER JOIN t2 USING(c,b);
102   }
103 } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5}
105 do_test join-1.8 {
106   execsql {
107     SELECT * FROM t1 NATURAL CROSS JOIN t2;
108   }
109 } {1 2 3 4 2 3 4 5}
110 do_test join-1.9 {
111   execsql {
112     SELECT * FROM t1 CROSS JOIN t2 USING(b,c);
113   }
114 } {1 2 3 4 2 3 4 5}
115 do_test join-1.10 {
116   execsql {
117     SELECT * FROM t1 NATURAL INNER JOIN t2;
118   }
119 } {1 2 3 4 2 3 4 5}
120 do_test join-1.11 {
121   execsql {
122     SELECT * FROM t1 INNER JOIN t2 USING(b,c);
123   }
124 } {1 2 3 4 2 3 4 5}
125 do_test join-1.12 {
126   execsql {
127     SELECT * FROM t1 natural inner join t2;
128   }
129 } {1 2 3 4 2 3 4 5}
131 ifcapable subquery {
132   do_test join-1.13 {
133     execsql2 {
134       SELECT * FROM t1 NATURAL JOIN 
135         (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as t3
136     }
137   } {a 1 b 2 c 3 d 4 e 5}
138   do_test join-1.14 {
139     execsql2 {
140       SELECT * FROM (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as 'tx'
141           NATURAL JOIN t1
142     }
143   } {c 3 d 4 e 5 a 1 b 2}
146 do_test join-1.15 {
147   execsql {
148     CREATE TABLE t3(c,d,e);
149     INSERT INTO t3 VALUES(2,3,4);
150     INSERT INTO t3 VALUES(3,4,5);
151     INSERT INTO t3 VALUES(4,5,6);
152     SELECT * FROM t3;
153   }  
154 } {2 3 4 3 4 5 4 5 6}
155 do_test join-1.16 {
156   execsql {
157     SELECT * FROM t1 natural join t2 natural join t3;
158   }
159 } {1 2 3 4 5 2 3 4 5 6}
160 do_test join-1.17 {
161   execsql2 {
162     SELECT * FROM t1 natural join t2 natural join t3;
163   }
164 } {a 1 b 2 c 3 d 4 e 5 a 2 b 3 c 4 d 5 e 6}
165 do_test join-1.18 {
166   execsql {
167     CREATE TABLE t4(d,e,f);
168     INSERT INTO t4 VALUES(2,3,4);
169     INSERT INTO t4 VALUES(3,4,5);
170     INSERT INTO t4 VALUES(4,5,6);
171     SELECT * FROM t4;
172   }  
173 } {2 3 4 3 4 5 4 5 6}
174 do_test join-1.19.1 {
175   execsql {
176     SELECT * FROM t1 natural join t2 natural join t4;
177   }
178 } {1 2 3 4 5 6}
179 do_test join-1.19.2 {
180   execsql2 {
181     SELECT * FROM t1 natural join t2 natural join t4;
182   }
183 } {a 1 b 2 c 3 d 4 e 5 f 6}
184 do_test join-1.20 {
185   execsql {
186     SELECT * FROM t1 natural join t2 natural join t3 WHERE t1.a=1
187   }
188 } {1 2 3 4 5}
190 do_test join-2.1 {
191   execsql {
192     SELECT * FROM t1 NATURAL LEFT JOIN t2;
193   }
194 } {1 2 3 4 2 3 4 5 3 4 5 {}}
195 do_test join-2.2 {
196   execsql {
197     SELECT * FROM t2 NATURAL LEFT OUTER JOIN t1;
198   }
199 } {1 2 3 {} 2 3 4 1 3 4 5 2}
200 do_test join-2.3 {
201   catchsql {
202     SELECT * FROM t1 NATURAL RIGHT OUTER JOIN t2;
203   }
204 } {1 {RIGHT and FULL OUTER JOINs are not currently supported}}
205 do_test join-2.4 {
206   execsql {
207     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d
208   }
209 } {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3}
210 do_test join-2.5 {
211   execsql {
212     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t1.a>1
213   }
214 } {2 3 4 {} {} {} 3 4 5 1 2 3}
215 do_test join-2.6 {
216   execsql {
217     SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t2.b IS NULL OR t2.b>1
218   }
219 } {1 2 3 {} {} {} 2 3 4 {} {} {}}
221 do_test join-3.1 {
222   catchsql {
223     SELECT * FROM t1 NATURAL JOIN t2 ON t1.a=t2.b;
224   }
225 } {1 {a NATURAL join may not have an ON or USING clause}}
226 do_test join-3.2 {
227   catchsql {
228     SELECT * FROM t1 NATURAL JOIN t2 USING(b);
229   }
230 } {1 {a NATURAL join may not have an ON or USING clause}}
231 do_test join-3.3 {
232   catchsql {
233     SELECT * FROM t1 JOIN t2 ON t1.a=t2.b USING(b);
234   }
235 } {1 {cannot have both ON and USING clauses in the same join}}
236 do_test join-3.4 {
237   catchsql {
238     SELECT * FROM t1 JOIN t2 USING(a);
239   }
240 } {1 {cannot join using column a - column not present in both tables}}
241 do_test join-3.5 {
242   catchsql {
243     SELECT * FROM t1 USING(a);
244   }
245 } {0 {1 2 3 2 3 4 3 4 5}}
246 do_test join-3.6 {
247   catchsql {
248     SELECT * FROM t1 JOIN t2 ON t3.a=t2.b;
249   }
250 } {1 {no such column: t3.a}}
251 do_test join-3.7 {
252   catchsql {
253     SELECT * FROM t1 INNER OUTER JOIN t2;
254   }
255 } {1 {unknown or unsupported join type: INNER OUTER}}
256 do_test join-3.7 {
257   catchsql {
258     SELECT * FROM t1 LEFT BOGUS JOIN t2;
259   }
260 } {1 {unknown or unsupported join type: LEFT BOGUS}}
262 do_test join-4.1 {
263   execsql {
264     BEGIN;
265     CREATE TABLE t5(a INTEGER PRIMARY KEY);
266     CREATE TABLE t6(a INTEGER);
267     INSERT INTO t6 VALUES(NULL);
268     INSERT INTO t6 VALUES(NULL);
269     INSERT INTO t6 SELECT * FROM t6;
270     INSERT INTO t6 SELECT * FROM t6;
271     INSERT INTO t6 SELECT * FROM t6;
272     INSERT INTO t6 SELECT * FROM t6;
273     INSERT INTO t6 SELECT * FROM t6;
274     INSERT INTO t6 SELECT * FROM t6;
275     COMMIT;
276   }
277   execsql {
278     SELECT * FROM t6 NATURAL JOIN t5;
279   }
280 } {}
281 do_test join-4.2 {
282   execsql {
283     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
284   }
285 } {}
286 do_test join-4.3 {
287   execsql {
288     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
289   }
290 } {}
291 do_test join-4.4 {
292   execsql {
293     UPDATE t6 SET a='xyz';
294     SELECT * FROM t6 NATURAL JOIN t5;
295   }
296 } {}
297 do_test join-4.6 {
298   execsql {
299     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
300   }
301 } {}
302 do_test join-4.7 {
303   execsql {
304     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
305   }
306 } {}
307 do_test join-4.8 {
308   execsql {
309     UPDATE t6 SET a=1;
310     SELECT * FROM t6 NATURAL JOIN t5;
311   }
312 } {}
313 do_test join-4.9 {
314   execsql {
315     SELECT * FROM t6, t5 WHERE t6.a<t5.a;
316   }
317 } {}
318 do_test join-4.10 {
319   execsql {
320     SELECT * FROM t6, t5 WHERE t6.a>t5.a;
321   }
322 } {}
324 do_test join-5.1 {
325   execsql {
326     BEGIN;
327     create table centros (id integer primary key, centro);
328     INSERT INTO centros VALUES(1,'xxx');
329     create table usuarios (id integer primary key, nombre, apellidos,
330     idcentro integer);
331     INSERT INTO usuarios VALUES(1,'a','aa',1);
332     INSERT INTO usuarios VALUES(2,'b','bb',1);
333     INSERT INTO usuarios VALUES(3,'c','cc',NULL);
334     create index idcentro on usuarios (idcentro);
335     END;
336     select usuarios.id, usuarios.nombre, centros.centro from
337     usuarios left outer join centros on usuarios.idcentro = centros.id;
338   }
339 } {1 a xxx 2 b xxx 3 c {}}
341 # A test for ticket #247.
343 do_test join-7.1 {
344   execsql {
345     CREATE TABLE t7 (x, y);
346     INSERT INTO t7 VALUES ("pa1", 1);
347     INSERT INTO t7 VALUES ("pa2", NULL);
348     INSERT INTO t7 VALUES ("pa3", NULL);
349     INSERT INTO t7 VALUES ("pa4", 2);
350     INSERT INTO t7 VALUES ("pa30", 131);
351     INSERT INTO t7 VALUES ("pa31", 130);
352     INSERT INTO t7 VALUES ("pa28", NULL);
354     CREATE TABLE t8 (a integer primary key, b);
355     INSERT INTO t8 VALUES (1, "pa1");
356     INSERT INTO t8 VALUES (2, "pa4");
357     INSERT INTO t8 VALUES (3, NULL);
358     INSERT INTO t8 VALUES (4, NULL);
359     INSERT INTO t8 VALUES (130, "pa31");
360     INSERT INTO t8 VALUES (131, "pa30");
362     SELECT coalesce(t8.a,999) from t7 LEFT JOIN t8 on y=a;
363   }
364 } {1 999 999 2 131 130 999}
366 # Make sure a left join where the right table is really a view that
367 # is itself a join works right.  Ticket #306.
369 ifcapable view {
370 do_test join-8.1 {
371   execsql {
372     BEGIN;
373     CREATE TABLE t9(a INTEGER PRIMARY KEY, b);
374     INSERT INTO t9 VALUES(1,11);
375     INSERT INTO t9 VALUES(2,22);
376     CREATE TABLE t10(x INTEGER PRIMARY KEY, y);
377     INSERT INTO t10 VALUES(1,2);
378     INSERT INTO t10 VALUES(3,3);    
379     CREATE TABLE t11(p INTEGER PRIMARY KEY, q);
380     INSERT INTO t11 VALUES(2,111);
381     INSERT INTO t11 VALUES(3,333);    
382     CREATE VIEW v10_11 AS SELECT x, q FROM t10, t11 WHERE t10.y=t11.p;
383     COMMIT;
384     SELECT * FROM t9 LEFT JOIN v10_11 ON( a=x );
385   }
386 } {1 11 1 111 2 22 {} {}}
387 ifcapable subquery {
388   do_test join-8.2 {
389     execsql {
390       SELECT * FROM t9 LEFT JOIN (SELECT x, q FROM t10, t11 WHERE t10.y=t11.p)
391            ON( a=x);
392     }
393   } {1 11 1 111 2 22 {} {}}
395 do_test join-8.3 {
396   execsql {
397     SELECT * FROM v10_11 LEFT JOIN t9 ON( a=x );
398   }
399 } {1 111 1 11 3 333 {} {}}
400 } ;# ifcapable view
402 # Ticket #350 describes a scenario where LEFT OUTER JOIN does not
403 # function correctly if the right table in the join is really
404 # subquery.
406 # To test the problem, we generate the same LEFT OUTER JOIN in two
407 # separate selects but with on using a subquery and the other calling
408 # the table directly.  Then connect the two SELECTs using an EXCEPT.
409 # Both queries should generate the same results so the answer should
410 # be an empty set.
412 ifcapable compound {
413 do_test join-9.1 {
414   execsql {
415     BEGIN;
416     CREATE TABLE t12(a,b);
417     INSERT INTO t12 VALUES(1,11);
418     INSERT INTO t12 VALUES(2,22);
419     CREATE TABLE t13(b,c);
420     INSERT INTO t13 VALUES(22,222);
421     COMMIT;
422   }
423 } {}
425 ifcapable subquery {
426   do_test join-9.1.1 {
427     execsql {
428       SELECT * FROM t12 NATURAL LEFT JOIN t13
429       EXCEPT
430       SELECT * FROM t12 NATURAL LEFT JOIN (SELECT * FROM t13 WHERE b>0);
431     }
432   } {}
434 ifcapable view {
435   do_test join-9.2 {
436     execsql {
437       CREATE VIEW v13 AS SELECT * FROM t13 WHERE b>0;
438       SELECT * FROM t12 NATURAL LEFT JOIN t13
439         EXCEPT
440         SELECT * FROM t12 NATURAL LEFT JOIN v13;
441     }
442   } {}
443 } ;# ifcapable view
444 } ;# ifcapable compound
446 finish_test