blob: 73b0e40fe4e73b3422421b933c39600b7f3b01b3 [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh3aadb2e2000-05-31 17:59:25 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh3aadb2e2000-05-31 17:59:25 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drh3aadb2e2000-05-31 17:59:25 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is testing the SELECT statement.
13#
drh33e619f2009-05-28 01:00:55 +000014# $Id: select1.test,v 1.70 2009/05/28 01:00:56 drh Exp $
drh3aadb2e2000-05-31 17:59:25 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Try to select on a non-existant table.
20#
drh22827922000-06-06 17:27:05 +000021do_test select1-1.1 {
drh3aadb2e2000-05-31 17:59:25 +000022 set v [catch {execsql {SELECT * FROM test1}} msg]
23 lappend v $msg
24} {1 {no such table: test1}}
25
danielk197713a68c32005-12-15 10:11:30 +000026
drh3aadb2e2000-05-31 17:59:25 +000027execsql {CREATE TABLE test1(f1 int, f2 int)}
28
drh22827922000-06-06 17:27:05 +000029do_test select1-1.2 {
drh3aadb2e2000-05-31 17:59:25 +000030 set v [catch {execsql {SELECT * FROM test1, test2}} msg]
31 lappend v $msg
32} {1 {no such table: test2}}
drh22827922000-06-06 17:27:05 +000033do_test select1-1.3 {
drh3aadb2e2000-05-31 17:59:25 +000034 set v [catch {execsql {SELECT * FROM test2, test1}} msg]
35 lappend v $msg
36} {1 {no such table: test2}}
37
38execsql {INSERT INTO test1(f1,f2) VALUES(11,22)}
39
40
drh967e8b72000-06-21 13:59:10 +000041# Make sure the columns are extracted correctly.
drh3aadb2e2000-05-31 17:59:25 +000042#
drh22827922000-06-06 17:27:05 +000043do_test select1-1.4 {
drh3aadb2e2000-05-31 17:59:25 +000044 execsql {SELECT f1 FROM test1}
45} {11}
drh22827922000-06-06 17:27:05 +000046do_test select1-1.5 {
drh3aadb2e2000-05-31 17:59:25 +000047 execsql {SELECT f2 FROM test1}
48} {22}
drh22827922000-06-06 17:27:05 +000049do_test select1-1.6 {
drh3aadb2e2000-05-31 17:59:25 +000050 execsql {SELECT f2, f1 FROM test1}
51} {22 11}
drh22827922000-06-06 17:27:05 +000052do_test select1-1.7 {
drh3aadb2e2000-05-31 17:59:25 +000053 execsql {SELECT f1, f2 FROM test1}
54} {11 22}
drh22827922000-06-06 17:27:05 +000055do_test select1-1.8 {
drh3aadb2e2000-05-31 17:59:25 +000056 execsql {SELECT * FROM test1}
57} {11 22}
drh7c917d12001-12-16 20:05:05 +000058do_test select1-1.8.1 {
59 execsql {SELECT *, * FROM test1}
60} {11 22 11 22}
61do_test select1-1.8.2 {
62 execsql {SELECT *, min(f1,f2), max(f1,f2) FROM test1}
63} {11 22 11 22}
64do_test select1-1.8.3 {
65 execsql {SELECT 'one', *, 'two', * FROM test1}
66} {one 11 22 two 11 22}
drh3aadb2e2000-05-31 17:59:25 +000067
68execsql {CREATE TABLE test2(r1 real, r2 real)}
69execsql {INSERT INTO test2(r1,r2) VALUES(1.1,2.2)}
70
drh22827922000-06-06 17:27:05 +000071do_test select1-1.9 {
drh3aadb2e2000-05-31 17:59:25 +000072 execsql {SELECT * FROM test1, test2}
73} {11 22 1.1 2.2}
drh7c917d12001-12-16 20:05:05 +000074do_test select1-1.9.1 {
75 execsql {SELECT *, 'hi' FROM test1, test2}
76} {11 22 1.1 2.2 hi}
77do_test select1-1.9.2 {
78 execsql {SELECT 'one', *, 'two', * FROM test1, test2}
79} {one 11 22 1.1 2.2 two 11 22 1.1 2.2}
drh22827922000-06-06 17:27:05 +000080do_test select1-1.10 {
drh3aadb2e2000-05-31 17:59:25 +000081 execsql {SELECT test1.f1, test2.r1 FROM test1, test2}
82} {11 1.1}
drh22827922000-06-06 17:27:05 +000083do_test select1-1.11 {
drh3aadb2e2000-05-31 17:59:25 +000084 execsql {SELECT test1.f1, test2.r1 FROM test2, test1}
85} {11 1.1}
drh17e24df2001-11-06 14:10:41 +000086do_test select1-1.11.1 {
87 execsql {SELECT * FROM test2, test1}
88} {1.1 2.2 11 22}
89do_test select1-1.11.2 {
90 execsql {SELECT * FROM test1 AS a, test1 AS b}
91} {11 22 11 22}
drh22827922000-06-06 17:27:05 +000092do_test select1-1.12 {
drh3aadb2e2000-05-31 17:59:25 +000093 execsql {SELECT max(test1.f1,test2.r1), min(test1.f2,test2.r2)
94 FROM test2, test1}
95} {11 2.2}
drh22827922000-06-06 17:27:05 +000096do_test select1-1.13 {
drh3aadb2e2000-05-31 17:59:25 +000097 execsql {SELECT min(test1.f1,test2.r1), max(test1.f2,test2.r2)
98 FROM test1, test2}
99} {1.1 22}
100
drh832508b2002-03-02 17:04:07 +0000101set long {This is a string that is too big to fit inside a NBFS buffer}
102do_test select1-2.0 {
103 execsql "
104 DROP TABLE test2;
105 DELETE FROM test1;
106 INSERT INTO test1 VALUES(11,22);
107 INSERT INTO test1 VALUES(33,44);
108 CREATE TABLE t3(a,b);
109 INSERT INTO t3 VALUES('abc',NULL);
110 INSERT INTO t3 VALUES(NULL,'xyz');
111 INSERT INTO t3 SELECT * FROM test1;
112 CREATE TABLE t4(a,b);
113 INSERT INTO t4 VALUES(NULL,'$long');
114 SELECT * FROM t3;
115 "
116} {abc {} {} xyz 11 22 33 44}
drh3aadb2e2000-05-31 17:59:25 +0000117
118# Error messges from sqliteExprCheck
119#
drh22827922000-06-06 17:27:05 +0000120do_test select1-2.1 {
drh3aadb2e2000-05-31 17:59:25 +0000121 set v [catch {execsql {SELECT count(f1,f2) FROM test1}} msg]
122 lappend v $msg
drh89425d52002-02-28 03:04:48 +0000123} {1 {wrong number of arguments to function count()}}
drh22827922000-06-06 17:27:05 +0000124do_test select1-2.2 {
drh3aadb2e2000-05-31 17:59:25 +0000125 set v [catch {execsql {SELECT count(f1) FROM test1}} msg]
126 lappend v $msg
127} {0 2}
drh22827922000-06-06 17:27:05 +0000128do_test select1-2.3 {
drh3aadb2e2000-05-31 17:59:25 +0000129 set v [catch {execsql {SELECT Count() FROM test1}} msg]
130 lappend v $msg
131} {0 2}
drh22827922000-06-06 17:27:05 +0000132do_test select1-2.4 {
drh3aadb2e2000-05-31 17:59:25 +0000133 set v [catch {execsql {SELECT COUNT(*) FROM test1}} msg]
134 lappend v $msg
135} {0 2}
drh22827922000-06-06 17:27:05 +0000136do_test select1-2.5 {
drh3aadb2e2000-05-31 17:59:25 +0000137 set v [catch {execsql {SELECT COUNT(*)+1 FROM test1}} msg]
138 lappend v $msg
drh22827922000-06-06 17:27:05 +0000139} {0 3}
drh832508b2002-03-02 17:04:07 +0000140do_test select1-2.5.1 {
141 execsql {SELECT count(*),count(a),count(b) FROM t3}
142} {4 3 3}
143do_test select1-2.5.2 {
144 execsql {SELECT count(*),count(a),count(b) FROM t4}
145} {1 0 1}
146do_test select1-2.5.3 {
147 execsql {SELECT count(*),count(a),count(b) FROM t4 WHERE b=5}
148} {0 0 0}
drh22827922000-06-06 17:27:05 +0000149do_test select1-2.6 {
drh3aadb2e2000-05-31 17:59:25 +0000150 set v [catch {execsql {SELECT min(*) FROM test1}} msg]
151 lappend v $msg
drhfbc99082002-02-28 03:14:18 +0000152} {1 {wrong number of arguments to function min()}}
drh22827922000-06-06 17:27:05 +0000153do_test select1-2.7 {
drh3aadb2e2000-05-31 17:59:25 +0000154 set v [catch {execsql {SELECT Min(f1) FROM test1}} msg]
155 lappend v $msg
156} {0 11}
drh22827922000-06-06 17:27:05 +0000157do_test select1-2.8 {
drh3aadb2e2000-05-31 17:59:25 +0000158 set v [catch {execsql {SELECT MIN(f1,f2) FROM test1}} msg]
159 lappend v [lsort $msg]
160} {0 {11 33}}
drh832508b2002-03-02 17:04:07 +0000161do_test select1-2.8.1 {
162 execsql {SELECT coalesce(min(a),'xyzzy') FROM t3}
drh9eb516c2004-07-18 20:52:32 +0000163} {11}
drh832508b2002-03-02 17:04:07 +0000164do_test select1-2.8.2 {
165 execsql {SELECT min(coalesce(a,'xyzzy')) FROM t3}
166} {11}
167do_test select1-2.8.3 {
168 execsql {SELECT min(b), min(b) FROM t4}
169} [list $long $long]
drh22827922000-06-06 17:27:05 +0000170do_test select1-2.9 {
drh3aadb2e2000-05-31 17:59:25 +0000171 set v [catch {execsql {SELECT MAX(*) FROM test1}} msg]
172 lappend v $msg
drhfbc99082002-02-28 03:14:18 +0000173} {1 {wrong number of arguments to function MAX()}}
drh22827922000-06-06 17:27:05 +0000174do_test select1-2.10 {
drh3aadb2e2000-05-31 17:59:25 +0000175 set v [catch {execsql {SELECT Max(f1) FROM test1}} msg]
176 lappend v $msg
177} {0 33}
drh22827922000-06-06 17:27:05 +0000178do_test select1-2.11 {
drh3aadb2e2000-05-31 17:59:25 +0000179 set v [catch {execsql {SELECT max(f1,f2) FROM test1}} msg]
180 lappend v [lsort $msg]
181} {0 {22 44}}
drh22827922000-06-06 17:27:05 +0000182do_test select1-2.12 {
drh3aadb2e2000-05-31 17:59:25 +0000183 set v [catch {execsql {SELECT MAX(f1,f2)+1 FROM test1}} msg]
184 lappend v [lsort $msg]
185} {0 {23 45}}
drh22827922000-06-06 17:27:05 +0000186do_test select1-2.13 {
drh3aadb2e2000-05-31 17:59:25 +0000187 set v [catch {execsql {SELECT MAX(f1)+1 FROM test1}} msg]
188 lappend v $msg
drh22827922000-06-06 17:27:05 +0000189} {0 34}
drh832508b2002-03-02 17:04:07 +0000190do_test select1-2.13.1 {
191 execsql {SELECT coalesce(max(a),'xyzzy') FROM t3}
drh739105c2002-05-29 23:22:23 +0000192} {abc}
drhbb113512002-05-27 01:04:51 +0000193do_test select1-2.13.2 {
drh832508b2002-03-02 17:04:07 +0000194 execsql {SELECT max(coalesce(a,'xyzzy')) FROM t3}
195} {xyzzy}
drh22827922000-06-06 17:27:05 +0000196do_test select1-2.14 {
drh3aadb2e2000-05-31 17:59:25 +0000197 set v [catch {execsql {SELECT SUM(*) FROM test1}} msg]
198 lappend v $msg
drh89425d52002-02-28 03:04:48 +0000199} {1 {wrong number of arguments to function SUM()}}
drh22827922000-06-06 17:27:05 +0000200do_test select1-2.15 {
drh3aadb2e2000-05-31 17:59:25 +0000201 set v [catch {execsql {SELECT Sum(f1) FROM test1}} msg]
202 lappend v $msg
drh3d1d95e2005-09-08 10:37:01 +0000203} {0 44}
drh22827922000-06-06 17:27:05 +0000204do_test select1-2.16 {
drh3aadb2e2000-05-31 17:59:25 +0000205 set v [catch {execsql {SELECT sum(f1,f2) FROM test1}} msg]
206 lappend v $msg
drh89425d52002-02-28 03:04:48 +0000207} {1 {wrong number of arguments to function sum()}}
drh22827922000-06-06 17:27:05 +0000208do_test select1-2.17 {
drh3aadb2e2000-05-31 17:59:25 +0000209 set v [catch {execsql {SELECT SUM(f1)+1 FROM test1}} msg]
210 lappend v $msg
drh3d1d95e2005-09-08 10:37:01 +0000211} {0 45}
drh832508b2002-03-02 17:04:07 +0000212do_test select1-2.17.1 {
213 execsql {SELECT sum(a) FROM t3}
drh29d72102006-02-09 22:13:41 +0000214} {44.0}
drh22827922000-06-06 17:27:05 +0000215do_test select1-2.18 {
drh3aadb2e2000-05-31 17:59:25 +0000216 set v [catch {execsql {SELECT XYZZY(f1) FROM test1}} msg]
217 lappend v $msg
218} {1 {no such function: XYZZY}}
drh22827922000-06-06 17:27:05 +0000219do_test select1-2.19 {
drh3aadb2e2000-05-31 17:59:25 +0000220 set v [catch {execsql {SELECT SUM(min(f1,f2)) FROM test1}} msg]
221 lappend v $msg
drh3d1d95e2005-09-08 10:37:01 +0000222} {0 44}
drh22827922000-06-06 17:27:05 +0000223do_test select1-2.20 {
drh3aadb2e2000-05-31 17:59:25 +0000224 set v [catch {execsql {SELECT SUM(min(f1)) FROM test1}} msg]
225 lappend v $msg
drh8e0a2f92002-02-23 23:45:45 +0000226} {1 {misuse of aggregate function min()}}
drh3aadb2e2000-05-31 17:59:25 +0000227
drh36379e92007-07-23 22:51:15 +0000228# Ticket #2526
229#
230do_test select1-2.21 {
231 catchsql {
232 SELECT min(f1) AS m FROM test1 GROUP BY f1 HAVING max(m+5)<10
233 }
234} {1 {misuse of aliased aggregate m}}
235do_test select1-2.22 {
236 catchsql {
237 SELECT coalesce(min(f1)+5,11) AS m FROM test1
238 GROUP BY f1
239 HAVING max(m+5)<10
240 }
241} {1 {misuse of aliased aggregate m}}
242do_test select1-2.23 {
243 execsql {
244 CREATE TABLE tkt2526(a,b,c PRIMARY KEY);
245 INSERT INTO tkt2526 VALUES('x','y',NULL);
246 INSERT INTO tkt2526 VALUES('x','z',NULL);
247 }
248 catchsql {
249 SELECT count(a) AS cn FROM tkt2526 GROUP BY a HAVING cn<max(cn)
250 }
251} {1 {misuse of aliased aggregate cn}}
252
drh3aadb2e2000-05-31 17:59:25 +0000253# WHERE clause expressions
254#
drh22827922000-06-06 17:27:05 +0000255do_test select1-3.1 {
drh3aadb2e2000-05-31 17:59:25 +0000256 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1<11}} msg]
257 lappend v $msg
258} {0 {}}
drh22827922000-06-06 17:27:05 +0000259do_test select1-3.2 {
drh3aadb2e2000-05-31 17:59:25 +0000260 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1<=11}} msg]
261 lappend v $msg
262} {0 11}
drh22827922000-06-06 17:27:05 +0000263do_test select1-3.3 {
drh3aadb2e2000-05-31 17:59:25 +0000264 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1=11}} msg]
265 lappend v $msg
266} {0 11}
drh22827922000-06-06 17:27:05 +0000267do_test select1-3.4 {
drh3aadb2e2000-05-31 17:59:25 +0000268 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1>=11}} msg]
269 lappend v [lsort $msg]
270} {0 {11 33}}
drh22827922000-06-06 17:27:05 +0000271do_test select1-3.5 {
drh3aadb2e2000-05-31 17:59:25 +0000272 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1>11}} msg]
273 lappend v [lsort $msg]
274} {0 33}
drh22827922000-06-06 17:27:05 +0000275do_test select1-3.6 {
drh3aadb2e2000-05-31 17:59:25 +0000276 set v [catch {execsql {SELECT f1 FROM test1 WHERE f1!=11}} msg]
277 lappend v [lsort $msg]
278} {0 33}
drh22827922000-06-06 17:27:05 +0000279do_test select1-3.7 {
drh3aadb2e2000-05-31 17:59:25 +0000280 set v [catch {execsql {SELECT f1 FROM test1 WHERE min(f1,f2)!=11}} msg]
281 lappend v [lsort $msg]
282} {0 33}
drh22827922000-06-06 17:27:05 +0000283do_test select1-3.8 {
drh3aadb2e2000-05-31 17:59:25 +0000284 set v [catch {execsql {SELECT f1 FROM test1 WHERE max(f1,f2)!=11}} msg]
285 lappend v [lsort $msg]
286} {0 {11 33}}
drh22827922000-06-06 17:27:05 +0000287do_test select1-3.9 {
drh3aadb2e2000-05-31 17:59:25 +0000288 set v [catch {execsql {SELECT f1 FROM test1 WHERE count(f1,f2)!=11}} msg]
289 lappend v $msg
drh89425d52002-02-28 03:04:48 +0000290} {1 {wrong number of arguments to function count()}}
drh3aadb2e2000-05-31 17:59:25 +0000291
292# ORDER BY expressions
293#
drh22827922000-06-06 17:27:05 +0000294do_test select1-4.1 {
drh3aadb2e2000-05-31 17:59:25 +0000295 set v [catch {execsql {SELECT f1 FROM test1 ORDER BY f1}} msg]
296 lappend v $msg
297} {0 {11 33}}
drh22827922000-06-06 17:27:05 +0000298do_test select1-4.2 {
drh3aadb2e2000-05-31 17:59:25 +0000299 set v [catch {execsql {SELECT f1 FROM test1 ORDER BY -f1}} msg]
300 lappend v $msg
301} {0 {33 11}}
drh22827922000-06-06 17:27:05 +0000302do_test select1-4.3 {
drh3aadb2e2000-05-31 17:59:25 +0000303 set v [catch {execsql {SELECT f1 FROM test1 ORDER BY min(f1,f2)}} msg]
304 lappend v $msg
305} {0 {11 33}}
drh22827922000-06-06 17:27:05 +0000306do_test select1-4.4 {
drh3aadb2e2000-05-31 17:59:25 +0000307 set v [catch {execsql {SELECT f1 FROM test1 ORDER BY min(f1)}} msg]
308 lappend v $msg
drhb7916a72009-05-27 10:31:29 +0000309} {1 {misuse of aggregate: min()}}
drh18e87cf2006-04-11 14:16:21 +0000310
311# The restriction not allowing constants in the ORDER BY clause
312# has been removed. See ticket #1768
313#do_test select1-4.5 {
314# catchsql {
315# SELECT f1 FROM test1 ORDER BY 8.4;
316# }
317#} {1 {ORDER BY terms must not be non-integer constants}}
318#do_test select1-4.6 {
319# catchsql {
320# SELECT f1 FROM test1 ORDER BY '8.4';
321# }
322#} {1 {ORDER BY terms must not be non-integer constants}}
323#do_test select1-4.7.1 {
324# catchsql {
325# SELECT f1 FROM test1 ORDER BY 'xyz';
326# }
327#} {1 {ORDER BY terms must not be non-integer constants}}
328#do_test select1-4.7.2 {
329# catchsql {
330# SELECT f1 FROM test1 ORDER BY -8.4;
331# }
332#} {1 {ORDER BY terms must not be non-integer constants}}
333#do_test select1-4.7.3 {
334# catchsql {
335# SELECT f1 FROM test1 ORDER BY +8.4;
336# }
337#} {1 {ORDER BY terms must not be non-integer constants}}
338#do_test select1-4.7.4 {
339# catchsql {
340# SELECT f1 FROM test1 ORDER BY 4294967296; -- constant larger than 32 bits
341# }
342#} {1 {ORDER BY terms must not be non-integer constants}}
343
drh92086432002-01-22 14:11:29 +0000344do_test select1-4.5 {
drh18e87cf2006-04-11 14:16:21 +0000345 execsql {
346 SELECT f1 FROM test1 ORDER BY 8.4
drh92086432002-01-22 14:11:29 +0000347 }
drh18e87cf2006-04-11 14:16:21 +0000348} {11 33}
drhe4de1fe2002-06-02 16:09:01 +0000349do_test select1-4.6 {
drh18e87cf2006-04-11 14:16:21 +0000350 execsql {
351 SELECT f1 FROM test1 ORDER BY '8.4'
drhe4de1fe2002-06-02 16:09:01 +0000352 }
drh18e87cf2006-04-11 14:16:21 +0000353} {11 33}
354
drhe4de1fe2002-06-02 16:09:01 +0000355do_test select1-4.8 {
356 execsql {
357 CREATE TABLE t5(a,b);
358 INSERT INTO t5 VALUES(1,10);
359 INSERT INTO t5 VALUES(2,9);
360 SELECT * FROM t5 ORDER BY 1;
361 }
362} {1 10 2 9}
drh018d1a42005-01-15 01:52:31 +0000363do_test select1-4.9.1 {
drhe4de1fe2002-06-02 16:09:01 +0000364 execsql {
365 SELECT * FROM t5 ORDER BY 2;
366 }
367} {2 9 1 10}
drh018d1a42005-01-15 01:52:31 +0000368do_test select1-4.9.2 {
369 execsql {
370 SELECT * FROM t5 ORDER BY +2;
371 }
372} {2 9 1 10}
373do_test select1-4.10.1 {
drhe4de1fe2002-06-02 16:09:01 +0000374 catchsql {
375 SELECT * FROM t5 ORDER BY 3;
376 }
danielk197701874bf2007-12-13 07:58:50 +0000377} {1 {1st ORDER BY term out of range - should be between 1 and 2}}
drh018d1a42005-01-15 01:52:31 +0000378do_test select1-4.10.2 {
379 catchsql {
380 SELECT * FROM t5 ORDER BY -1;
381 }
danielk197701874bf2007-12-13 07:58:50 +0000382} {1 {1st ORDER BY term out of range - should be between 1 and 2}}
drhe4de1fe2002-06-02 16:09:01 +0000383do_test select1-4.11 {
384 execsql {
385 INSERT INTO t5 VALUES(3,10);
386 SELECT * FROM t5 ORDER BY 2, 1 DESC;
387 }
388} {2 9 3 10 1 10}
389do_test select1-4.12 {
390 execsql {
391 SELECT * FROM t5 ORDER BY 1 DESC, b;
392 }
393} {3 10 2 9 1 10}
394do_test select1-4.13 {
395 execsql {
396 SELECT * FROM t5 ORDER BY b DESC, 1;
397 }
398} {1 10 3 10 2 9}
399
drh3aadb2e2000-05-31 17:59:25 +0000400
401# ORDER BY ignored on an aggregate query
402#
drh22827922000-06-06 17:27:05 +0000403do_test select1-5.1 {
drh3aadb2e2000-05-31 17:59:25 +0000404 set v [catch {execsql {SELECT max(f1) FROM test1 ORDER BY f2}} msg]
405 lappend v $msg
406} {0 33}
407
drh85e9e222008-07-15 00:27:34 +0000408execsql {CREATE TABLE test2(t1 text, t2 text)}
drh3aadb2e2000-05-31 17:59:25 +0000409execsql {INSERT INTO test2 VALUES('abc','xyz')}
410
drh967e8b72000-06-21 13:59:10 +0000411# Check for column naming
drh3aadb2e2000-05-31 17:59:25 +0000412#
drh22827922000-06-06 17:27:05 +0000413do_test select1-6.1 {
drh3aadb2e2000-05-31 17:59:25 +0000414 set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
415 lappend v $msg
416} {0 {f1 11 f1 33}}
drh382c0242001-10-06 16:33:02 +0000417do_test select1-6.1.1 {
drhafed0862006-03-14 13:10:42 +0000418 db eval {PRAGMA full_column_names=on}
drh382c0242001-10-06 16:33:02 +0000419 set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
420 lappend v $msg
drh1bee3d72001-10-15 00:44:35 +0000421} {0 {test1.f1 11 test1.f1 33}}
drh382c0242001-10-06 16:33:02 +0000422do_test select1-6.1.2 {
drh1bee3d72001-10-15 00:44:35 +0000423 set v [catch {execsql2 {SELECT f1 as 'f1' FROM test1 ORDER BY f2}} msg]
424 lappend v $msg
425} {0 {f1 11 f1 33}}
426do_test select1-6.1.3 {
drh382c0242001-10-06 16:33:02 +0000427 set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
drh382c0242001-10-06 16:33:02 +0000428 lappend v $msg
drh79d5f632005-01-18 17:20:10 +0000429} {0 {f1 11 f2 22}}
drh1bee3d72001-10-15 00:44:35 +0000430do_test select1-6.1.4 {
drh98808ba2001-10-18 12:34:46 +0000431 set v [catch {execsql2 {SELECT DISTINCT * FROM test1 WHERE f1==11}} msg]
drhafed0862006-03-14 13:10:42 +0000432 db eval {PRAGMA full_column_names=off}
drh98808ba2001-10-18 12:34:46 +0000433 lappend v $msg
drh79d5f632005-01-18 17:20:10 +0000434} {0 {f1 11 f2 22}}
drh98808ba2001-10-18 12:34:46 +0000435do_test select1-6.1.5 {
drh382c0242001-10-06 16:33:02 +0000436 set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
437 lappend v $msg
438} {0 {f1 11 f2 22}}
drh98808ba2001-10-18 12:34:46 +0000439do_test select1-6.1.6 {
440 set v [catch {execsql2 {SELECT DISTINCT * FROM test1 WHERE f1==11}} msg]
441 lappend v $msg
442} {0 {f1 11 f2 22}}
drh22827922000-06-06 17:27:05 +0000443do_test select1-6.2 {
drh3aadb2e2000-05-31 17:59:25 +0000444 set v [catch {execsql2 {SELECT f1 as xyzzy FROM test1 ORDER BY f2}} msg]
445 lappend v $msg
446} {0 {xyzzy 11 xyzzy 33}}
drh22827922000-06-06 17:27:05 +0000447do_test select1-6.3 {
drh3aadb2e2000-05-31 17:59:25 +0000448 set v [catch {execsql2 {SELECT f1 as "xyzzy" FROM test1 ORDER BY f2}} msg]
449 lappend v $msg
450} {0 {xyzzy 11 xyzzy 33}}
drhd4007282001-04-12 23:21:58 +0000451do_test select1-6.3.1 {
452 set v [catch {execsql2 {SELECT f1 as 'xyzzy ' FROM test1 ORDER BY f2}} msg]
453 lappend v $msg
454} {0 {{xyzzy } 11 {xyzzy } 33}}
drh22827922000-06-06 17:27:05 +0000455do_test select1-6.4 {
drh3aadb2e2000-05-31 17:59:25 +0000456 set v [catch {execsql2 {SELECT f1+F2 as xyzzy FROM test1 ORDER BY f2}} msg]
457 lappend v $msg
458} {0 {xyzzy 33 xyzzy 77}}
drhc4a3c772001-04-04 11:48:57 +0000459do_test select1-6.4a {
460 set v [catch {execsql2 {SELECT f1+F2 FROM test1 ORDER BY f2}} msg]
461 lappend v $msg
462} {0 {f1+F2 33 f1+F2 77}}
drh22827922000-06-06 17:27:05 +0000463do_test select1-6.5 {
drh3aadb2e2000-05-31 17:59:25 +0000464 set v [catch {execsql2 {SELECT test1.f1+F2 FROM test1 ORDER BY f2}} msg]
465 lappend v $msg
drhe1b6a5b2000-07-29 13:06:59 +0000466} {0 {test1.f1+F2 33 test1.f1+F2 77}}
drh1bee3d72001-10-15 00:44:35 +0000467do_test select1-6.5.1 {
468 execsql2 {PRAGMA full_column_names=on}
469 set v [catch {execsql2 {SELECT test1.f1+F2 FROM test1 ORDER BY f2}} msg]
470 execsql2 {PRAGMA full_column_names=off}
471 lappend v $msg
472} {0 {test1.f1+F2 33 test1.f1+F2 77}}
drh22827922000-06-06 17:27:05 +0000473do_test select1-6.6 {
drh3aadb2e2000-05-31 17:59:25 +0000474 set v [catch {execsql2 {SELECT test1.f1+F2, t1 FROM test1, test2
475 ORDER BY f2}} msg]
476 lappend v $msg
drhe1b6a5b2000-07-29 13:06:59 +0000477} {0 {test1.f1+F2 33 t1 abc test1.f1+F2 77 t1 abc}}
drh22827922000-06-06 17:27:05 +0000478do_test select1-6.7 {
drhda9d6c42000-05-31 18:20:14 +0000479 set v [catch {execsql2 {SELECT A.f1, t1 FROM test1 as A, test2
480 ORDER BY f2}} msg]
481 lappend v $msg
drh47a6db22005-01-18 16:02:40 +0000482} {0 {f1 11 t1 abc f1 33 t1 abc}}
drh22827922000-06-06 17:27:05 +0000483do_test select1-6.8 {
drhda9d6c42000-05-31 18:20:14 +0000484 set v [catch {execsql2 {SELECT A.f1, f1 FROM test1 as A, test1 as B
485 ORDER BY f2}} msg]
486 lappend v $msg
drh967e8b72000-06-21 13:59:10 +0000487} {1 {ambiguous column name: f1}}
drhcc85b412000-06-07 15:11:27 +0000488do_test select1-6.8b {
drhda9d6c42000-05-31 18:20:14 +0000489 set v [catch {execsql2 {SELECT A.f1, B.f1 FROM test1 as A, test1 as B
490 ORDER BY f2}} msg]
491 lappend v $msg
drh967e8b72000-06-21 13:59:10 +0000492} {1 {ambiguous column name: f2}}
drhcc85b412000-06-07 15:11:27 +0000493do_test select1-6.8c {
494 set v [catch {execsql2 {SELECT A.f1, f1 FROM test1 as A, test1 as A
495 ORDER BY f2}} msg]
496 lappend v $msg
drh967e8b72000-06-21 13:59:10 +0000497} {1 {ambiguous column name: A.f1}}
drh47a6db22005-01-18 16:02:40 +0000498do_test select1-6.9.1 {
499 set v [catch {execsql {SELECT A.f1, B.f1 FROM test1 as A, test1 as B
500 ORDER BY A.f1, B.f1}} msg]
501 lappend v $msg
502} {0 {11 11 11 33 33 11 33 33}}
503do_test select1-6.9.2 {
drhda9d6c42000-05-31 18:20:14 +0000504 set v [catch {execsql2 {SELECT A.f1, B.f1 FROM test1 as A, test1 as B
505 ORDER BY A.f1, B.f1}} msg]
506 lappend v $msg
drh47a6db22005-01-18 16:02:40 +0000507} {0 {f1 11 f1 11 f1 33 f1 33 f1 11 f1 11 f1 33 f1 33}}
danielk197727c77432004-11-22 13:35:41 +0000508
drhe49b1462008-07-09 01:39:44 +0000509do_test select1-6.9.3 {
510 db eval {
511 PRAGMA short_column_names=OFF;
512 PRAGMA full_column_names=OFF;
513 }
514 execsql2 {
515 SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
516 }
517} {{test1 . f1} 11 {test1 . f2} 22}
518do_test select1-6.9.4 {
519 db eval {
520 PRAGMA short_column_names=OFF;
521 PRAGMA full_column_names=ON;
522 }
523 execsql2 {
524 SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
525 }
526} {test1.f1 11 test1.f2 22}
527do_test select1-6.9.5 {
528 db eval {
529 PRAGMA short_column_names=OFF;
530 PRAGMA full_column_names=ON;
531 }
532 execsql2 {
533 SELECT 123.45;
534 }
535} {123.45 123.45}
drh93a960a2008-07-10 00:32:42 +0000536do_test select1-6.9.6 {
537 execsql2 {
538 SELECT * FROM test1 a, test1 b LIMIT 1
539 }
540} {a.f1 11 a.f2 22 b.f1 11 b.f2 22}
541do_test select1-6.9.7 {
542 set x [execsql2 {
543 SELECT * FROM test1 a, (select 5, 6) LIMIT 1
544 }]
545 regsub -all {subquery_[0-9a-fA-F]+_} $x {subquery} x
546 set x
547} {a.f1 11 a.f2 22 sqlite_subquery.5 5 sqlite_subquery.6 6}
548do_test select1-6.9.8 {
549 set x [execsql2 {
550 SELECT * FROM test1 a, (select 5 AS x, 6 AS y) AS b LIMIT 1
551 }]
552 regsub -all {subquery_[0-9a-fA-F]+_} $x {subquery} x
553 set x
554} {a.f1 11 a.f2 22 b.x 5 b.y 6}
drh85e9e222008-07-15 00:27:34 +0000555do_test select1-6.9.9 {
556 execsql2 {
557 SELECT a.f1, b.f2 FROM test1 a, test1 b LIMIT 1
558 }
559} {test1.f1 11 test1.f2 22}
560do_test select1-6.9.10 {
561 execsql2 {
562 SELECT f1, t1 FROM test1, test2 LIMIT 1
563 }
564} {test1.f1 11 test2.t1 abc}
565do_test select1-6.9.11 {
566 db eval {
567 PRAGMA short_column_names=ON;
568 PRAGMA full_column_names=ON;
569 }
570 execsql2 {
571 SELECT a.f1, b.f2 FROM test1 a, test1 b LIMIT 1
572 }
573} {test1.f1 11 test1.f2 22}
574do_test select1-6.9.12 {
575 execsql2 {
576 SELECT f1, t1 FROM test1, test2 LIMIT 1
577 }
578} {test1.f1 11 test2.t1 abc}
579do_test select1-6.9.13 {
580 db eval {
581 PRAGMA short_column_names=ON;
582 PRAGMA full_column_names=OFF;
583 }
584 execsql2 {
585 SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
586 }
587} {f1 11 f1 11}
588do_test select1-6.9.14 {
589 execsql2 {
590 SELECT f1, t1 FROM test1, test2 LIMIT 1
591 }
592} {f1 11 t1 abc}
593do_test select1-6.9.15 {
594 db eval {
595 PRAGMA short_column_names=OFF;
596 PRAGMA full_column_names=ON;
597 }
598 execsql2 {
599 SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
600 }
601} {test1.f1 11 test1.f1 11}
602do_test select1-6.9.16 {
603 execsql2 {
604 SELECT f1, t1 FROM test1, test2 LIMIT 1
605 }
606} {test1.f1 11 test2.t1 abc}
607
drh93a960a2008-07-10 00:32:42 +0000608
drhe49b1462008-07-09 01:39:44 +0000609db eval {
610 PRAGMA short_column_names=ON;
611 PRAGMA full_column_names=OFF;
612}
613
danielk197727c77432004-11-22 13:35:41 +0000614ifcapable compound {
drhc4a3c772001-04-04 11:48:57 +0000615do_test select1-6.10 {
616 set v [catch {execsql2 {
617 SELECT f1 FROM test1 UNION SELECT f2 FROM test1
618 ORDER BY f2;
619 }} msg]
620 lappend v $msg
drh92378252006-03-26 01:21:22 +0000621} {0 {f1 11 f1 22 f1 33 f1 44}}
drhc4a3c772001-04-04 11:48:57 +0000622do_test select1-6.11 {
623 set v [catch {execsql2 {
624 SELECT f1 FROM test1 UNION SELECT f2+100 FROM test1
drh4c774312007-12-08 21:10:20 +0000625 ORDER BY f2+101;
drhc4a3c772001-04-04 11:48:57 +0000626 }} msg]
627 lappend v $msg
danielk197701874bf2007-12-13 07:58:50 +0000628} {1 {1st ORDER BY term does not match any column in the result set}}
drh94ccde52007-04-13 16:06:32 +0000629
630# Ticket #2296
danielk1977de3e41e2008-08-04 03:51:24 +0000631ifcapable subquery&&compound {
drh94ccde52007-04-13 16:06:32 +0000632do_test select1-6.20 {
633 execsql {
634 CREATE TABLE t6(a TEXT, b TEXT);
635 INSERT INTO t6 VALUES('a','0');
636 INSERT INTO t6 VALUES('b','1');
637 INSERT INTO t6 VALUES('c','2');
638 INSERT INTO t6 VALUES('d','3');
639 SELECT a FROM t6 WHERE b IN
640 (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
641 ORDER BY 1 LIMIT 1)
642 }
643} {a}
644do_test select1-6.21 {
645 execsql {
646 SELECT a FROM t6 WHERE b IN
647 (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
648 ORDER BY 1 DESC LIMIT 1)
649 }
650} {d}
651do_test select1-6.22 {
652 execsql {
653 SELECT a FROM t6 WHERE b IN
654 (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
655 ORDER BY b LIMIT 2)
656 ORDER BY a;
657 }
658} {a b}
659do_test select1-6.23 {
660 execsql {
661 SELECT a FROM t6 WHERE b IN
662 (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
663 ORDER BY x DESC LIMIT 2)
664 ORDER BY a;
665 }
666} {b d}
danielk1977284f4ac2007-12-10 05:03:46 +0000667}
drh94ccde52007-04-13 16:06:32 +0000668
danielk197727c77432004-11-22 13:35:41 +0000669} ;#ifcapable compound
drh3aadb2e2000-05-31 17:59:25 +0000670
drhd4007282001-04-12 23:21:58 +0000671do_test select1-7.1 {
672 set v [catch {execsql {
673 SELECT f1 FROM test1 WHERE f2=;
674 }} msg]
675 lappend v $msg
676} {1 {near ";": syntax error}}
danielk197727c77432004-11-22 13:35:41 +0000677ifcapable compound {
drhd4007282001-04-12 23:21:58 +0000678do_test select1-7.2 {
679 set v [catch {execsql {
680 SELECT f1 FROM test1 UNION SELECT WHERE;
681 }} msg]
682 lappend v $msg
683} {1 {near "WHERE": syntax error}}
danielk197727c77432004-11-22 13:35:41 +0000684} ;# ifcapable compound
drhd4007282001-04-12 23:21:58 +0000685do_test select1-7.3 {
686 set v [catch {execsql {SELECT f1 FROM test1 as 'hi', test2 as}} msg]
687 lappend v $msg
688} {1 {near "as": syntax error}}
689do_test select1-7.4 {
690 set v [catch {execsql {
691 SELECT f1 FROM test1 ORDER BY;
692 }} msg]
693 lappend v $msg
694} {1 {near ";": syntax error}}
695do_test select1-7.5 {
696 set v [catch {execsql {
697 SELECT f1 FROM test1 ORDER BY f1 desc, f2 where;
698 }} msg]
699 lappend v $msg
700} {1 {near "where": syntax error}}
701do_test select1-7.6 {
702 set v [catch {execsql {
703 SELECT count(f1,f2 FROM test1;
704 }} msg]
705 lappend v $msg
706} {1 {near "FROM": syntax error}}
707do_test select1-7.7 {
708 set v [catch {execsql {
709 SELECT count(f1,f2+) FROM test1;
710 }} msg]
711 lappend v $msg
712} {1 {near ")": syntax error}}
713do_test select1-7.8 {
714 set v [catch {execsql {
715 SELECT f1 FROM test1 ORDER BY f2, f1+;
716 }} msg]
717 lappend v $msg
718} {1 {near ";": syntax error}}
drh15926592007-04-06 15:02:13 +0000719do_test select1-7.9 {
720 catchsql {
721 SELECT f1 FROM test1 LIMIT 5+3 OFFSET 11 ORDER BY f2;
722 }
723} {1 {near "ORDER": syntax error}}
drhd4007282001-04-12 23:21:58 +0000724
725do_test select1-8.1 {
726 execsql {SELECT f1 FROM test1 WHERE 4.3+2.4 OR 1 ORDER BY f1}
727} {11 33}
728do_test select1-8.2 {
729 execsql {
730 SELECT f1 FROM test1 WHERE ('x' || f1) BETWEEN 'x10' AND 'x20'
731 ORDER BY f1
732 }
733} {11}
734do_test select1-8.3 {
735 execsql {
736 SELECT f1 FROM test1 WHERE 5-3==2
737 ORDER BY f1
738 }
739} {11 33}
danielk19778d059842004-05-12 11:24:02 +0000740
741# TODO: This test is failing because f1 is now being loaded off the
742# disk as a vdbe integer, not a string. Hence the value of f1/(f1-11)
743# changes because of rounding. Disable the test for now.
744if 0 {
drhd4007282001-04-12 23:21:58 +0000745do_test select1-8.4 {
746 execsql {
drhbb113512002-05-27 01:04:51 +0000747 SELECT coalesce(f1/(f1-11),'x'),
748 coalesce(min(f1/(f1-11),5),'y'),
749 coalesce(max(f1/(f1-33),6),'z')
drhd4007282001-04-12 23:21:58 +0000750 FROM test1 ORDER BY f1
751 }
drhbb113512002-05-27 01:04:51 +0000752} {x y 6 1.5 1.5 z}
danielk19778d059842004-05-12 11:24:02 +0000753}
drhd4007282001-04-12 23:21:58 +0000754do_test select1-8.5 {
755 execsql {
756 SELECT min(1,2,3), -max(1,2,3)
757 FROM test1 ORDER BY f1
758 }
759} {1 -3 1 -3}
760
drh6a535342001-10-19 16:44:56 +0000761
762# Check the behavior when the result set is empty
763#
danielk1977cbb18d22004-05-28 11:37:27 +0000764# SQLite v3 always sets r(*).
765#
766# do_test select1-9.1 {
767# catch {unset r}
768# set r(*) {}
769# db eval {SELECT * FROM test1 WHERE f1<0} r {}
770# set r(*)
771# } {}
drh6a535342001-10-19 16:44:56 +0000772do_test select1-9.2 {
773 execsql {PRAGMA empty_result_callbacks=on}
danielk1977cbb18d22004-05-28 11:37:27 +0000774 catch {unset r}
drh6a535342001-10-19 16:44:56 +0000775 set r(*) {}
776 db eval {SELECT * FROM test1 WHERE f1<0} r {}
777 set r(*)
778} {f1 f2}
danielk19773e8c37e2005-01-21 03:12:14 +0000779ifcapable subquery {
780 do_test select1-9.3 {
781 set r(*) {}
782 db eval {SELECT * FROM test1 WHERE f1<(select count(*) from test2)} r {}
783 set r(*)
784 } {f1 f2}
785}
drh6a535342001-10-19 16:44:56 +0000786do_test select1-9.4 {
787 set r(*) {}
788 db eval {SELECT * FROM test1 ORDER BY f1} r {}
789 set r(*)
790} {f1 f2}
791do_test select1-9.5 {
792 set r(*) {}
793 db eval {SELECT * FROM test1 WHERE f1<0 ORDER BY f1} r {}
794 set r(*)
795} {f1 f2}
796unset r
797
drha2e00042002-01-22 03:13:42 +0000798# Check for ORDER BY clauses that refer to an AS name in the column list
799#
800do_test select1-10.1 {
801 execsql {
802 SELECT f1 AS x FROM test1 ORDER BY x
803 }
804} {11 33}
805do_test select1-10.2 {
806 execsql {
807 SELECT f1 AS x FROM test1 ORDER BY -x
808 }
809} {33 11}
810do_test select1-10.3 {
811 execsql {
812 SELECT f1-23 AS x FROM test1 ORDER BY abs(x)
813 }
814} {10 -12}
815do_test select1-10.4 {
816 execsql {
817 SELECT f1-23 AS x FROM test1 ORDER BY -abs(x)
818 }
819} {-12 10}
820do_test select1-10.5 {
821 execsql {
822 SELECT f1-22 AS x, f2-22 as y FROM test1
823 }
824} {-11 0 11 22}
825do_test select1-10.6 {
826 execsql {
827 SELECT f1-22 AS x, f2-22 as y FROM test1 WHERE x>0 AND y<50
828 }
829} {11 22}
drh93a960a2008-07-10 00:32:42 +0000830do_test select1-10.7 {
831 execsql {
832 SELECT f1 COLLATE nocase AS x FROM test1 ORDER BY x
833 }
834} {11 33}
drha2e00042002-01-22 03:13:42 +0000835
drh54473222002-04-04 02:10:55 +0000836# Check the ability to specify "TABLE.*" in the result set of a SELECT
837#
838do_test select1-11.1 {
839 execsql {
840 DELETE FROM t3;
841 DELETE FROM t4;
842 INSERT INTO t3 VALUES(1,2);
843 INSERT INTO t4 VALUES(3,4);
844 SELECT * FROM t3, t4;
845 }
846} {1 2 3 4}
drh47a6db22005-01-18 16:02:40 +0000847do_test select1-11.2.1 {
848 execsql {
849 SELECT * FROM t3, t4;
850 }
851} {1 2 3 4}
852do_test select1-11.2.2 {
drh54473222002-04-04 02:10:55 +0000853 execsql2 {
854 SELECT * FROM t3, t4;
855 }
drh47a6db22005-01-18 16:02:40 +0000856} {a 3 b 4 a 3 b 4}
drhcf55b7a2004-07-20 01:45:19 +0000857do_test select1-11.4.1 {
drh54473222002-04-04 02:10:55 +0000858 execsql {
859 SELECT t3.*, t4.b FROM t3, t4;
860 }
861} {1 2 4}
drhcf55b7a2004-07-20 01:45:19 +0000862do_test select1-11.4.2 {
863 execsql {
864 SELECT "t3".*, t4.b FROM t3, t4;
865 }
866} {1 2 4}
drh47a6db22005-01-18 16:02:40 +0000867do_test select1-11.5.1 {
drh54473222002-04-04 02:10:55 +0000868 execsql2 {
869 SELECT t3.*, t4.b FROM t3, t4;
870 }
drh47a6db22005-01-18 16:02:40 +0000871} {a 1 b 4 b 4}
drh54473222002-04-04 02:10:55 +0000872do_test select1-11.6 {
873 execsql2 {
874 SELECT x.*, y.b FROM t3 AS x, t4 AS y;
875 }
drh47a6db22005-01-18 16:02:40 +0000876} {a 1 b 4 b 4}
drh54473222002-04-04 02:10:55 +0000877do_test select1-11.7 {
878 execsql {
879 SELECT t3.b, t4.* FROM t3, t4;
880 }
881} {2 3 4}
882do_test select1-11.8 {
883 execsql2 {
884 SELECT t3.b, t4.* FROM t3, t4;
885 }
drh47a6db22005-01-18 16:02:40 +0000886} {b 4 a 3 b 4}
drh54473222002-04-04 02:10:55 +0000887do_test select1-11.9 {
888 execsql2 {
889 SELECT x.b, y.* FROM t3 AS x, t4 AS y;
890 }
drh47a6db22005-01-18 16:02:40 +0000891} {b 4 a 3 b 4}
drh54473222002-04-04 02:10:55 +0000892do_test select1-11.10 {
893 catchsql {
894 SELECT t5.* FROM t3, t4;
895 }
896} {1 {no such table: t5}}
897do_test select1-11.11 {
898 catchsql {
899 SELECT t3.* FROM t3 AS x, t4;
900 }
901} {1 {no such table: t3}}
danielk19773e8c37e2005-01-21 03:12:14 +0000902ifcapable subquery {
903 do_test select1-11.12 {
904 execsql2 {
905 SELECT t3.* FROM t3, (SELECT max(a), max(b) FROM t4)
906 }
907 } {a 1 b 2}
908 do_test select1-11.13 {
909 execsql2 {
910 SELECT t3.* FROM (SELECT max(a), max(b) FROM t4), t3
911 }
912 } {a 1 b 2}
913 do_test select1-11.14 {
914 execsql2 {
915 SELECT * FROM t3, (SELECT max(a), max(b) FROM t4) AS 'tx'
916 }
917 } {a 1 b 2 max(a) 3 max(b) 4}
918 do_test select1-11.15 {
919 execsql2 {
920 SELECT y.*, t3.* FROM t3, (SELECT max(a), max(b) FROM t4) AS y
921 }
922 } {max(a) 3 max(b) 4 a 1 b 2}
923}
drhc754fa52002-05-27 03:25:51 +0000924do_test select1-11.16 {
925 execsql2 {
926 SELECT y.* FROM t3 as y, t4 as z
927 }
drh47a6db22005-01-18 16:02:40 +0000928} {a 1 b 2}
drha2e00042002-01-22 03:13:42 +0000929
drhbf3a4fa2002-04-06 13:57:42 +0000930# Tests of SELECT statements without a FROM clause.
931#
932do_test select1-12.1 {
933 execsql2 {
934 SELECT 1+2+3
935 }
936} {1+2+3 6}
937do_test select1-12.2 {
938 execsql2 {
939 SELECT 1,'hello',2
940 }
941} {1 1 'hello' hello 2 2}
942do_test select1-12.3 {
943 execsql2 {
944 SELECT 1 AS 'a','hello' AS 'b',2 AS 'c'
945 }
946} {a 1 b hello c 2}
947do_test select1-12.4 {
948 execsql {
949 DELETE FROM t3;
950 INSERT INTO t3 VALUES(1,2);
danielk197727c77432004-11-22 13:35:41 +0000951 }
952} {}
953
954ifcapable compound {
955do_test select1-12.5 {
956 execsql {
drhbf3a4fa2002-04-06 13:57:42 +0000957 SELECT * FROM t3 UNION SELECT 3 AS 'a', 4 ORDER BY a;
958 }
959} {1 2 3 4}
danielk197727c77432004-11-22 13:35:41 +0000960
961do_test select1-12.6 {
drhbf3a4fa2002-04-06 13:57:42 +0000962 execsql {
963 SELECT 3, 4 UNION SELECT * FROM t3;
964 }
965} {1 2 3 4}
danielk197727c77432004-11-22 13:35:41 +0000966} ;# ifcapable compound
967
danielk19773e8c37e2005-01-21 03:12:14 +0000968ifcapable subquery {
969 do_test select1-12.7 {
970 execsql {
971 SELECT * FROM t3 WHERE a=(SELECT 1);
972 }
973 } {1 2}
974 do_test select1-12.8 {
975 execsql {
976 SELECT * FROM t3 WHERE a=(SELECT 2);
977 }
978 } {}
979}
danielk197727c77432004-11-22 13:35:41 +0000980
danielk1977e61b9f42005-01-21 04:25:47 +0000981ifcapable {compound && subquery} {
982 do_test select1-12.9 {
983 execsql2 {
984 SELECT x FROM (
drh92378252006-03-26 01:21:22 +0000985 SELECT a AS x, b AS y FROM t3 UNION SELECT a,b FROM t4 ORDER BY a,b
danielk1977e61b9f42005-01-21 04:25:47 +0000986 ) ORDER BY x;
987 }
988 } {x 1 x 3}
989 do_test select1-12.10 {
990 execsql2 {
991 SELECT z.x FROM (
drh92378252006-03-26 01:21:22 +0000992 SELECT a AS x,b AS y FROM t3 UNION SELECT a, b FROM t4 ORDER BY a,b
danielk1977e61b9f42005-01-21 04:25:47 +0000993 ) AS 'z' ORDER BY x;
994 }
995 } {x 1 x 3}
danielk197727c77432004-11-22 13:35:41 +0000996} ;# ifcapable compound
drhd5feede2002-05-08 21:46:14 +0000997
danielk197713a68c32005-12-15 10:11:30 +0000998
danielk1977327bd592006-01-13 13:01:19 +0000999# Check for a VDBE stack growth problem that existed at one point.
1000#
danielk19771576cd92006-01-14 08:02:28 +00001001ifcapable subquery {
1002 do_test select1-13.1 {
danielk1977327bd592006-01-13 13:01:19 +00001003 execsql {
danielk19771576cd92006-01-14 08:02:28 +00001004 BEGIN;
1005 create TABLE abc(a, b, c, PRIMARY KEY(a, b));
1006 INSERT INTO abc VALUES(1, 1, 1);
danielk1977327bd592006-01-13 13:01:19 +00001007 }
danielk19771576cd92006-01-14 08:02:28 +00001008 for {set i 0} {$i<10} {incr i} {
1009 execsql {
1010 INSERT INTO abc SELECT a+(select max(a) FROM abc),
1011 b+(select max(a) FROM abc), c+(select max(a) FROM abc) FROM abc;
1012 }
1013 }
1014 execsql {COMMIT}
1015
1016 # This used to seg-fault when the problem existed.
1017 execsql {
1018 SELECT count(
1019 (SELECT a FROM abc WHERE a = NULL AND b >= upper.c)
1020 ) FROM abc AS upper;
1021 }
1022 } {0}
1023}
danielk1977327bd592006-01-13 13:01:19 +00001024
danielk1977a3f06592009-04-23 14:58:39 +00001025foreach tab [db eval {SELECT name FROM sqlite_master WHERE type = 'table'}] {
1026 db eval "DROP TABLE $tab"
1027}
danielk1977f7b9d662008-06-23 18:49:43 +00001028db close
danielk1977f7b9d662008-06-23 18:49:43 +00001029sqlite3 db test.db
danielk1977a3f06592009-04-23 14:58:39 +00001030
danielk1977f7b9d662008-06-23 18:49:43 +00001031do_test select1-14.1 {
1032 execsql {
1033 SELECT * FROM sqlite_master WHERE rowid>10;
1034 SELECT * FROM sqlite_master WHERE rowid=10;
1035 SELECT * FROM sqlite_master WHERE rowid<10;
1036 SELECT * FROM sqlite_master WHERE rowid<=10;
1037 SELECT * FROM sqlite_master WHERE rowid>=10;
1038 SELECT * FROM sqlite_master;
1039 }
1040} {}
1041do_test select1-14.2 {
1042 execsql {
1043 SELECT 10 IN (SELECT rowid FROM sqlite_master);
1044 }
1045} {0}
1046
drh01e61ee2009-04-10 15:38:42 +00001047if {[db one {PRAGMA locking_mode}]=="normal"} {
1048 # Check that ticket #3771 has been fixed. This test does not
1049 # work with locking_mode=EXCLUSIVE so disable in that case.
1050 #
1051 do_test select1-15.1 {
1052 execsql {
1053 CREATE TABLE t1(a);
1054 CREATE INDEX i1 ON t1(a);
1055 INSERT INTO t1 VALUES(1);
1056 INSERT INTO t1 VALUES(2);
1057 INSERT INTO t1 VALUES(3);
1058 }
1059 } {}
1060 do_test select1-15.2 {
1061 sqlite3 db2 test.db
1062 execsql { DROP INDEX i1 } db2
1063 db2 close
1064 } {}
1065 do_test select1-15.3 {
1066 execsql { SELECT 2 IN (SELECT a FROM t1) }
1067 } {1}
1068}
1069
drh3aadb2e2000-05-31 17:59:25 +00001070finish_test