blob: afbff9037bdee53d73ac767202e6a08babd6a9e4 [file] [log] [blame]
drhd820cb12002-02-18 03:21:45 +00001# 2001 September 15
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. The
12# focus of this file is testing SELECT statements that contain
13# subqueries in their FROM clause.
14#
drh1b2e0322002-03-03 02:49:51 +000015# $Id: select6.test,v 1.3 2002/03/03 02:49:52 drh Exp $
drhd820cb12002-02-18 03:21:45 +000016
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
drhd820cb12002-02-18 03:21:45 +000020do_test select6-1.0 {
drhcf909502002-02-18 13:35:33 +000021 execsql {
22 BEGIN;
23 CREATE TABLE t1(x, y);
24 INSERT INTO t1 VALUES(1,1);
25 INSERT INTO t1 VALUES(2,2);
26 INSERT INTO t1 VALUES(3,2);
27 INSERT INTO t1 VALUES(4,3);
28 INSERT INTO t1 VALUES(5,3);
29 INSERT INTO t1 VALUES(6,3);
30 INSERT INTO t1 VALUES(7,3);
31 INSERT INTO t1 VALUES(8,4);
32 INSERT INTO t1 VALUES(9,4);
33 INSERT INTO t1 VALUES(10,4);
34 INSERT INTO t1 VALUES(11,4);
35 INSERT INTO t1 VALUES(12,4);
36 INSERT INTO t1 VALUES(13,4);
37 INSERT INTO t1 VALUES(14,4);
38 INSERT INTO t1 VALUES(15,4);
39 INSERT INTO t1 VALUES(16,5);
40 INSERT INTO t1 VALUES(17,5);
41 INSERT INTO t1 VALUES(18,5);
42 INSERT INTO t1 VALUES(19,5);
43 INSERT INTO t1 VALUES(20,5);
44 COMMIT;
45 SELECT DISTINCT y FROM t1 ORDER BY y;
46 }
47} {1 2 3 4 5}
drhd820cb12002-02-18 03:21:45 +000048
49do_test select6-1.1 {
drhcf909502002-02-18 13:35:33 +000050 execsql2 {SELECT * FROM (SELECT x, y FROM t1 WHERE x<2)}
51} {x 1 y 1}
drhd820cb12002-02-18 03:21:45 +000052do_test select6-1.2 {
53 execsql {SELECT count(*) FROM (SELECT y FROM t1)}
drhcf909502002-02-18 13:35:33 +000054} {20}
drhd820cb12002-02-18 03:21:45 +000055do_test select6-1.3 {
56 execsql {SELECT count(*) FROM (SELECT DISTINCT y FROM t1)}
drhcf909502002-02-18 13:35:33 +000057} {5}
drhd820cb12002-02-18 03:21:45 +000058do_test select6-1.4 {
59 execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT y FROM t1))}
drhcf909502002-02-18 13:35:33 +000060} {5}
drhd820cb12002-02-18 03:21:45 +000061do_test select6-1.5 {
62 execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT y FROM t1))}
drhcf909502002-02-18 13:35:33 +000063} {5}
drhd820cb12002-02-18 03:21:45 +000064
drhcf909502002-02-18 13:35:33 +000065do_test select6-1.6 {
66 execsql {
67 SELECT *
68 FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
69 (SELECT max(x),y FROM t1 GROUP BY y) as b
70 WHERE a.y=b.y ORDER BY a.y
71 }
72} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
73do_test select6-1.7 {
74 execsql {
75 SELECT a.y, a.[count(*)], [max(x)], [count(*)]
76 FROM (SELECT count(*),y FROM t1 GROUP BY y) AS a,
77 (SELECT max(x),y FROM t1 GROUP BY y) as b
78 WHERE a.y=b.y ORDER BY a.y
79 }
80} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
81do_test select6-1.8 {
82 execsql {
83 SELECT q, p, r
84 FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
85 (SELECT max(x) as r, y as s FROM t1 GROUP BY y) as b
86 WHERE q=s ORDER BY s
87 }
88} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
89do_test select6-1.9 {
90 execsql {
91 SELECT q, p, r, b.[min(x)+y]
92 FROM (SELECT count(*) as p , y as q FROM t1 GROUP BY y) AS a,
93 (SELECT max(x) as r, y as s, min(x)+y FROM t1 GROUP BY y) as b
94 WHERE q=s ORDER BY s
95 }
96} {1 1 1 2 2 2 3 4 3 4 7 7 4 8 15 12 5 5 20 21}
drhd820cb12002-02-18 03:21:45 +000097
drhcf909502002-02-18 13:35:33 +000098do_test select6-2.0 {
99 execsql {
100 CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
101 INSERT INTO t2 SELECT * FROM t1;
102 SELECT DISTINCT b FROM t2 ORDER BY b;
103 }
104} {1 2 3 4 5}
105do_test select6-2.1 {
106 execsql2 {SELECT * FROM (SELECT a, b FROM t2 WHERE a<2)}
107} {a 1 b 1}
108do_test select6-2.2 {
109 execsql {SELECT count(*) FROM (SELECT b FROM t2)}
110} {20}
111do_test select6-2.3 {
112 execsql {SELECT count(*) FROM (SELECT DISTINCT b FROM t2)}
113} {5}
114do_test select6-2.4 {
115 execsql {SELECT count(*) FROM (SELECT DISTINCT * FROM (SELECT b FROM t2))}
116} {5}
117do_test select6-2.5 {
118 execsql {SELECT count(*) FROM (SELECT * FROM (SELECT DISTINCT b FROM t2))}
119} {5}
drhd820cb12002-02-18 03:21:45 +0000120
drhcf909502002-02-18 13:35:33 +0000121do_test select6-2.6 {
122 execsql {
123 SELECT *
124 FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
125 (SELECT max(a),b FROM t2 GROUP BY b) as b
126 WHERE a.b=b.b ORDER BY a.b
127 }
128} {1 1 1 1 2 2 3 2 4 3 7 3 8 4 15 4 5 5 20 5}
129do_test select6-2.7 {
130 execsql {
131 SELECT a.b, a.[count(*)], [max(a)], [count(*)]
132 FROM (SELECT count(*),b FROM t2 GROUP BY b) AS a,
133 (SELECT max(a),b FROM t2 GROUP BY b) as b
134 WHERE a.b=b.b ORDER BY a.b
135 }
136} {1 1 1 1 2 2 3 2 3 4 7 4 4 8 15 8 5 5 20 5}
137do_test select6-2.8 {
138 execsql {
139 SELECT q, p, r
140 FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY b) AS a,
141 (SELECT max(a) as r, b as s FROM t2 GROUP BY b) as b
142 WHERE q=s ORDER BY s
143 }
144} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
145do_test select6-2.9 {
146 execsql {
147 SELECT a.q, a.p, b.r
148 FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
149 (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
150 WHERE a.q=b.s ORDER BY a.q
151 }
152} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
153
154do_test sqlite6-3.1 {
155 execsql2 {
156 SELECT * FROM (SELECT * FROM (SELECT * FROM t1 WHERE x=3));
157 }
158} {x 3 y 2}
159do_test sqlite6-3.2 {
160 execsql {
161 SELECT * FROM
162 (SELECT a.q, a.p, b.r
163 FROM (SELECT count(*) as p , b as q FROM t2 GROUP BY q) AS a,
164 (SELECT max(a) as r, b as s FROM t2 GROUP BY s) as b
165 WHERE a.q=b.s ORDER BY a.q)
166 ORDER BY [a.q]
167 }
168} {1 1 1 2 2 3 3 4 7 4 8 15 5 5 20}
drh1b2e0322002-03-03 02:49:51 +0000169
170do_test select6-3.3 {
171 execsql {
172 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
173 }
174} {10.5 3.7 14.2}
175do_test select6-3.4 {
176 execsql {
177 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
178 }
179} {11.5 4 15.5}
180do_test select6-3.5 {
181 execsql {
182 SELECT x,y,x+y FROM (SELECT avg(a) as 'x', avg(b) as 'y' FROM t2 WHERE a=4)
183 }
184} {4 3 7}
185do_test select6-3.6 {
186 execsql {
187 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
188 WHERE a>10
189 }
190} {10.5 3.7 14.2}
191do_test select6-3.7 {
192 execsql {
193 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1)
194 WHERE a<10
195 }
196} {}
197do_test select6-3.8 {
198 execsql {
199 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
200 WHERE a>10
201 }
202} {11.5 4 15.5}
203do_test select6-3.9 {
204 execsql {
205 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', avg(y) as 'b' FROM t1 WHERE y=4)
206 WHERE a<10
207 }
208} {}
209do_test select6-3.10 {
210 execsql {
211 SELECT a,b,a+b FROM (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
212 ORDER BY a
213 }
214} {1 1 2 2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18 5 23}
215do_test select6-3.11 {
216 execsql {
217 SELECT a,b,a+b FROM
218 (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b)
219 WHERE b<4 ORDER BY a
220 }
221} {1 1 2 2.5 2 4.5 5.5 3 8.5}
222do_test select6-3.12 {
223 execsql {
224 SELECT a,b,a+b FROM
225 (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
226 WHERE b<4 ORDER BY a
227 }
228} {2.5 2 4.5 5.5 3 8.5}
229do_test select6-3.13 {
230 execsql {
231 SELECT a,b,a+b FROM
232 (SELECT avg(x) as 'a', y as 'b' FROM t1 GROUP BY b HAVING a>1)
233 ORDER BY a
234 }
235} {2.5 2 4.5 5.5 3 8.5 11.5 4 15.5 18 5 23}
236do_test select6-3.14 {
237 execsql {
238 SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
239 ORDER BY [count(*)]
240 }
241} {1 1 2 2 4 3 5 5 8 4}
242do_test select6-3.15 {
243 execsql {
244 SELECT [count(*)],y FROM (SELECT count(*), y FROM t1 GROUP BY y)
245 ORDER BY y
246 }
247} {1 1 2 2 4 3 8 4 5 5}
248
249do_test select6-4.1 {
250 execsql {
251 SELECT a,b,c FROM
252 (SELECT x AS 'a', y AS 'b', x+y AS 'c' FROM t1 WHERE y=4)
253 WHERE a<10 ORDER BY a;
254 }
255} {8 4 12 9 4 13}
256do_test select6-4.2 {
257 execsql {
258 SELECT y FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
259 }
260} {1 2 3 4}
261do_test select6-4.3 {
262 execsql {
263 SELECT DISTINCT y FROM (SELECT y FROM t1) WHERE y<5 ORDER BY y
264 }
265} {1 2 3 4}
266
267
drhd820cb12002-02-18 03:21:45 +0000268finish_test