xref: /illumos-gate/usr/src/lib/libsqlite/test/where.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# 2001 September 15
3c5c4113dSnw141292#
4c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
5c5c4113dSnw141292# a legal notice, here is a blessing:
6c5c4113dSnw141292#
7c5c4113dSnw141292#    May you do good and not evil.
8c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
9c5c4113dSnw141292#    May you share freely, never taking more than you give.
10c5c4113dSnw141292#
11c5c4113dSnw141292#***********************************************************************
12c5c4113dSnw141292# This file implements regression tests for SQLite library.  The
13c5c4113dSnw141292# focus of this file is testing the use of indices in WHERE clases.
14c5c4113dSnw141292#
15c5c4113dSnw141292# $Id: where.test,v 1.17 2003/06/15 23:42:25 drh Exp $
16c5c4113dSnw141292
17c5c4113dSnw141292set testdir [file dirname $argv0]
18c5c4113dSnw141292source $testdir/tester.tcl
19c5c4113dSnw141292
20c5c4113dSnw141292# Build some test data
21c5c4113dSnw141292#
22c5c4113dSnw141292do_test where-1.0 {
23c5c4113dSnw141292  execsql {
24c5c4113dSnw141292    CREATE TABLE t1(w int, x int, y int);
25c5c4113dSnw141292    CREATE TABLE t2(p int, q int, r int, s int);
26c5c4113dSnw141292  }
27c5c4113dSnw141292  for {set i 1} {$i<=100} {incr i} {
28c5c4113dSnw141292    set w $i
29c5c4113dSnw141292    set x [expr {int(log($i)/log(2))}]
30c5c4113dSnw141292    set y [expr {$i*$i + 2*$i + 1}]
31c5c4113dSnw141292    execsql "INSERT INTO t1 VALUES($w,$x,$y)"
32c5c4113dSnw141292  }
33c5c4113dSnw141292  execsql {
34c5c4113dSnw141292    INSERT INTO t2 SELECT 101-w, x, (SELECT max(y) FROM t1)+1-y, y FROM t1;
35c5c4113dSnw141292    CREATE INDEX i1w ON t1(w);
36c5c4113dSnw141292    CREATE INDEX i1xy ON t1(x,y);
37c5c4113dSnw141292    CREATE INDEX i2p ON t2(p);
38c5c4113dSnw141292    CREATE INDEX i2r ON t2(r);
39c5c4113dSnw141292    CREATE INDEX i2qs ON t2(q, s);
40c5c4113dSnw141292  }
41c5c4113dSnw141292} {}
42c5c4113dSnw141292
43c5c4113dSnw141292# Do an SQL statement.  Append the search count to the end of the result.
44c5c4113dSnw141292#
45c5c4113dSnw141292proc count sql {
46c5c4113dSnw141292  set ::sqlite_search_count 0
47c5c4113dSnw141292  return [concat [execsql $sql] $::sqlite_search_count]
48c5c4113dSnw141292}
49c5c4113dSnw141292
50c5c4113dSnw141292# Verify that queries use an index.  We are using the special variable
51c5c4113dSnw141292# "sqlite_search_count" which tallys the number of executions of MoveTo
52c5c4113dSnw141292# and Next operators in the VDBE.  By verifing that the search count is
53c5c4113dSnw141292# small we can be assured that indices are being used properly.
54c5c4113dSnw141292#
55c5c4113dSnw141292do_test where-1.1 {
56c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE w=10}
57c5c4113dSnw141292} {3 121 3}
58c5c4113dSnw141292do_test where-1.2 {
59c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE w=11}
60c5c4113dSnw141292} {3 144 3}
61c5c4113dSnw141292do_test where-1.3 {
62c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE 11=w}
63c5c4113dSnw141292} {3 144 3}
64c5c4113dSnw141292do_test where-1.4 {
65c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE 11=w AND x>2}
66c5c4113dSnw141292} {3 144 3}
67c5c4113dSnw141292do_test where-1.5 {
68c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2}
69c5c4113dSnw141292} {3 144 3}
70c5c4113dSnw141292do_test where-1.6 {
71c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11}
72c5c4113dSnw141292} {3 144 3}
73c5c4113dSnw141292do_test where-1.7 {
74c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2}
75c5c4113dSnw141292} {3 144 3}
76c5c4113dSnw141292do_test where-1.8 {
77c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3}
78c5c4113dSnw141292} {3 144 3}
79c5c4113dSnw141292do_test where-1.9 {
80c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3}
81c5c4113dSnw141292} {3 144 3}
82c5c4113dSnw141292do_test where-1.10 {
83c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121}
84c5c4113dSnw141292} {3 121 3}
85c5c4113dSnw141292do_test where-1.11 {
86c5c4113dSnw141292  count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10}
87c5c4113dSnw141292} {3 100 3}
88c5c4113dSnw141292
89c5c4113dSnw141292# New for SQLite version 2.1: Verify that that inequality constraints
90c5c4113dSnw141292# are used correctly.
91c5c4113dSnw141292#
92c5c4113dSnw141292do_test where-1.12 {
93c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y<100}
94c5c4113dSnw141292} {8 3}
95c5c4113dSnw141292do_test where-1.13 {
96c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 100>y}
97c5c4113dSnw141292} {8 3}
98c5c4113dSnw141292do_test where-1.14 {
99c5c4113dSnw141292  count {SELECT w FROM t1 WHERE 3=x AND y<100}
100c5c4113dSnw141292} {8 3}
101c5c4113dSnw141292do_test where-1.15 {
102c5c4113dSnw141292  count {SELECT w FROM t1 WHERE 3=x AND 100>y}
103c5c4113dSnw141292} {8 3}
104c5c4113dSnw141292do_test where-1.16 {
105c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y<=100}
106c5c4113dSnw141292} {8 9 5}
107c5c4113dSnw141292do_test where-1.17 {
108c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 100>=y}
109c5c4113dSnw141292} {8 9 5}
110c5c4113dSnw141292do_test where-1.18 {
111c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y>225}
112c5c4113dSnw141292} {15 3}
113c5c4113dSnw141292do_test where-1.19 {
114c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 225<y}
115c5c4113dSnw141292} {15 3}
116c5c4113dSnw141292do_test where-1.20 {
117c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y>=225}
118c5c4113dSnw141292} {14 15 5}
119c5c4113dSnw141292do_test where-1.21 {
120c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 225<=y}
121c5c4113dSnw141292} {14 15 5}
122c5c4113dSnw141292do_test where-1.22 {
123c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196}
124c5c4113dSnw141292} {11 12 5}
125c5c4113dSnw141292do_test where-1.23 {
126c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196}
127c5c4113dSnw141292} {10 11 12 13 9}
128c5c4113dSnw141292do_test where-1.24 {
129c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y}
130c5c4113dSnw141292} {11 12 5}
131c5c4113dSnw141292do_test where-1.25 {
132c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y}
133c5c4113dSnw141292} {10 11 12 13 9}
134c5c4113dSnw141292
135c5c4113dSnw141292# Need to work on optimizing the BETWEEN operator.
136c5c4113dSnw141292#
137c5c4113dSnw141292# do_test where-1.26 {
138c5c4113dSnw141292#   count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196}
139c5c4113dSnw141292# } {10 11 12 13 9}
140c5c4113dSnw141292
141c5c4113dSnw141292do_test where-1.27 {
142c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x=3 AND y+1==122}
143c5c4113dSnw141292} {10 17}
144c5c4113dSnw141292do_test where-1.28 {
145c5c4113dSnw141292  count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122}
146c5c4113dSnw141292} {10 99}
147c5c4113dSnw141292do_test where-1.29 {
148c5c4113dSnw141292  count {SELECT w FROM t1 WHERE y==121}
149c5c4113dSnw141292} {10 99}
150c5c4113dSnw141292
151c5c4113dSnw141292
152c5c4113dSnw141292do_test where-1.30 {
153c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w>97}
154c5c4113dSnw141292} {98 99 100 6}
155c5c4113dSnw141292do_test where-1.31 {
156c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w>=97}
157c5c4113dSnw141292} {97 98 99 100 8}
158c5c4113dSnw141292do_test where-1.33 {
159c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w==97}
160c5c4113dSnw141292} {97 3}
161c5c4113dSnw141292do_test where-1.34 {
162c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w+1==98}
163c5c4113dSnw141292} {97 99}
164c5c4113dSnw141292do_test where-1.35 {
165c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w<3}
166c5c4113dSnw141292} {1 2 4}
167c5c4113dSnw141292do_test where-1.36 {
168c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w<=3}
169c5c4113dSnw141292} {1 2 3 6}
170c5c4113dSnw141292do_test where-1.37 {
171c5c4113dSnw141292  count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w}
172c5c4113dSnw141292} {1 2 3 199}
173c5c4113dSnw141292
174c5c4113dSnw141292do_test where-1.38 {
175c5c4113dSnw141292  count {SELECT (w) FROM t1 WHERE (w)>(97)}
176c5c4113dSnw141292} {98 99 100 6}
177c5c4113dSnw141292do_test where-1.39 {
178c5c4113dSnw141292  count {SELECT (w) FROM t1 WHERE (w)>=(97)}
179c5c4113dSnw141292} {97 98 99 100 8}
180c5c4113dSnw141292do_test where-1.40 {
181c5c4113dSnw141292  count {SELECT (w) FROM t1 WHERE (w)==(97)}
182c5c4113dSnw141292} {97 3}
183c5c4113dSnw141292do_test where-1.41 {
184c5c4113dSnw141292  count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)}
185c5c4113dSnw141292} {97 99}
186c5c4113dSnw141292
187c5c4113dSnw141292
188c5c4113dSnw141292# Do the same kind of thing except use a join as the data source.
189c5c4113dSnw141292#
190c5c4113dSnw141292do_test where-2.1 {
191c5c4113dSnw141292  count {
192c5c4113dSnw141292    SELECT w, p FROM t2, t1
193c5c4113dSnw141292    WHERE x=q AND y=s AND r=8977
194c5c4113dSnw141292  }
195c5c4113dSnw141292} {34 67 6}
196c5c4113dSnw141292do_test where-2.2 {
197c5c4113dSnw141292  count {
198c5c4113dSnw141292    SELECT w, p FROM t2, t1
199c5c4113dSnw141292    WHERE x=q AND s=y AND r=8977
200c5c4113dSnw141292  }
201c5c4113dSnw141292} {34 67 6}
202c5c4113dSnw141292do_test where-2.3 {
203c5c4113dSnw141292  count {
204c5c4113dSnw141292    SELECT w, p FROM t2, t1
205c5c4113dSnw141292    WHERE x=q AND s=y AND r=8977 AND w>10
206c5c4113dSnw141292  }
207c5c4113dSnw141292} {34 67 6}
208c5c4113dSnw141292do_test where-2.4 {
209c5c4113dSnw141292  count {
210c5c4113dSnw141292    SELECT w, p FROM t2, t1
211c5c4113dSnw141292    WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10
212c5c4113dSnw141292  }
213c5c4113dSnw141292} {34 67 6}
214c5c4113dSnw141292do_test where-2.5 {
215c5c4113dSnw141292  count {
216c5c4113dSnw141292    SELECT w, p FROM t2, t1
217c5c4113dSnw141292    WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10
218c5c4113dSnw141292  }
219c5c4113dSnw141292} {34 67 6}
220c5c4113dSnw141292do_test where-2.6 {
221c5c4113dSnw141292  count {
222c5c4113dSnw141292    SELECT w, p FROM t2, t1
223c5c4113dSnw141292    WHERE x=q AND p=77 AND s=y AND w>5
224c5c4113dSnw141292  }
225c5c4113dSnw141292} {24 77 6}
226c5c4113dSnw141292do_test where-2.7 {
227c5c4113dSnw141292  count {
228c5c4113dSnw141292    SELECT w, p FROM t1, t2
229c5c4113dSnw141292    WHERE x=q AND p>77 AND s=y AND w=5
230c5c4113dSnw141292  }
231c5c4113dSnw141292} {5 96 6}
232c5c4113dSnw141292
233c5c4113dSnw141292# Lets do a 3-way join.
234c5c4113dSnw141292#
235c5c4113dSnw141292do_test where-3.1 {
236c5c4113dSnw141292  count {
237c5c4113dSnw141292    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
238c5c4113dSnw141292    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11
239c5c4113dSnw141292  }
240c5c4113dSnw141292} {11 90 11 9}
241c5c4113dSnw141292do_test where-3.2 {
242c5c4113dSnw141292  count {
243c5c4113dSnw141292    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
244c5c4113dSnw141292    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12
245c5c4113dSnw141292  }
246c5c4113dSnw141292} {12 89 12 9}
247c5c4113dSnw141292do_test where-3.3 {
248c5c4113dSnw141292  count {
249c5c4113dSnw141292    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
250c5c4113dSnw141292    WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y
251c5c4113dSnw141292  }
252c5c4113dSnw141292} {15 86 86 9}
253c5c4113dSnw141292
254c5c4113dSnw141292# Test to see that the special case of a constant WHERE clause is
255c5c4113dSnw141292# handled.
256c5c4113dSnw141292#
257c5c4113dSnw141292do_test where-4.1 {
258c5c4113dSnw141292  count {
259c5c4113dSnw141292    SELECT * FROM t1 WHERE 0
260c5c4113dSnw141292  }
261c5c4113dSnw141292} {0}
262c5c4113dSnw141292do_test where-4.2 {
263c5c4113dSnw141292  count {
264c5c4113dSnw141292    SELECT * FROM t1 WHERE 1 LIMIT 1
265c5c4113dSnw141292  }
266c5c4113dSnw141292} {1 0 4 1}
267c5c4113dSnw141292do_test where-4.3 {
268c5c4113dSnw141292  execsql {
269c5c4113dSnw141292    SELECT 99 WHERE 0
270c5c4113dSnw141292  }
271c5c4113dSnw141292} {}
272c5c4113dSnw141292do_test where-4.4 {
273c5c4113dSnw141292  execsql {
274c5c4113dSnw141292    SELECT 99 WHERE 1
275c5c4113dSnw141292  }
276c5c4113dSnw141292} {99}
277c5c4113dSnw141292
278c5c4113dSnw141292# Verify that IN operators in a WHERE clause are handled correctly.
279c5c4113dSnw141292#
280c5c4113dSnw141292do_test where-5.1 {
281c5c4113dSnw141292  count {
282c5c4113dSnw141292    SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1;
283c5c4113dSnw141292  }
284c5c4113dSnw141292} {1 0 4 2 1 9 3 1 16 0}
285c5c4113dSnw141292do_test where-5.2 {
286c5c4113dSnw141292  count {
287c5c4113dSnw141292    SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1;
288c5c4113dSnw141292  }
289c5c4113dSnw141292} {1 0 4 2 1 9 3 1 16 199}
290c5c4113dSnw141292do_test where-5.3 {
291c5c4113dSnw141292  count {
292c5c4113dSnw141292    SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1;
293c5c4113dSnw141292  }
294c5c4113dSnw141292} {1 0 4 2 1 9 3 1 16 10}
295c5c4113dSnw141292do_test where-5.4 {
296c5c4113dSnw141292  count {
297c5c4113dSnw141292    SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1;
298c5c4113dSnw141292  }
299c5c4113dSnw141292} {1 0 4 2 1 9 3 1 16 199}
300c5c4113dSnw141292do_test where-5.5 {
301c5c4113dSnw141292  count {
302c5c4113dSnw141292    SELECT * FROM t1 WHERE rowid IN
303c5c4113dSnw141292       (select rowid from t1 where rowid IN (-1,2,4))
304c5c4113dSnw141292    ORDER BY 1;
305c5c4113dSnw141292  }
306c5c4113dSnw141292} {2 1 9 4 2 25 1}
307c5c4113dSnw141292do_test where-5.6 {
308c5c4113dSnw141292  count {
309c5c4113dSnw141292    SELECT * FROM t1 WHERE rowid+0 IN
310c5c4113dSnw141292       (select rowid from t1 where rowid IN (-1,2,4))
311c5c4113dSnw141292    ORDER BY 1;
312c5c4113dSnw141292  }
313c5c4113dSnw141292} {2 1 9 4 2 25 199}
314c5c4113dSnw141292do_test where-5.7 {
315c5c4113dSnw141292  count {
316c5c4113dSnw141292    SELECT * FROM t1 WHERE w IN
317c5c4113dSnw141292       (select rowid from t1 where rowid IN (-1,2,4))
318c5c4113dSnw141292    ORDER BY 1;
319c5c4113dSnw141292  }
320c5c4113dSnw141292} {2 1 9 4 2 25 7}
321c5c4113dSnw141292do_test where-5.8 {
322c5c4113dSnw141292  count {
323c5c4113dSnw141292    SELECT * FROM t1 WHERE w+0 IN
324c5c4113dSnw141292       (select rowid from t1 where rowid IN (-1,2,4))
325c5c4113dSnw141292    ORDER BY 1;
326c5c4113dSnw141292  }
327c5c4113dSnw141292} {2 1 9 4 2 25 199}
328c5c4113dSnw141292do_test where-5.9 {
329c5c4113dSnw141292  count {
330c5c4113dSnw141292    SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1;
331c5c4113dSnw141292  }
332c5c4113dSnw141292} {2 1 9 3 1 16 6}
333c5c4113dSnw141292do_test where-5.10 {
334c5c4113dSnw141292  count {
335c5c4113dSnw141292    SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1;
336c5c4113dSnw141292  }
337c5c4113dSnw141292} {2 1 9 3 1 16 199}
338c5c4113dSnw141292do_test where-5.11 {
339c5c4113dSnw141292  count {
340c5c4113dSnw141292    SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1;
341c5c4113dSnw141292  }
342c5c4113dSnw141292} {79 6 6400 89 6 8100 199}
343c5c4113dSnw141292do_test where-5.12 {
344c5c4113dSnw141292  count {
345c5c4113dSnw141292    SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1;
346c5c4113dSnw141292  }
347c5c4113dSnw141292} {79 6 6400 89 6 8100 74}
348c5c4113dSnw141292do_test where-5.13 {
349c5c4113dSnw141292  count {
350c5c4113dSnw141292    SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1;
351c5c4113dSnw141292  }
352c5c4113dSnw141292} {2 1 9 3 1 16 6}
353c5c4113dSnw141292do_test where-5.14 {
354c5c4113dSnw141292  count {
355c5c4113dSnw141292    SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
356c5c4113dSnw141292  }
357c5c4113dSnw141292} {2 1 9 6}
358c5c4113dSnw141292
359c5c4113dSnw141292# This procedure executes the SQL.  Then it checks the generated program
360c5c4113dSnw141292# for the SQL and appends a "nosort" to the result if the program contains the
361c5c4113dSnw141292# SortCallback opcode.  If the program does not contain the SortCallback
362c5c4113dSnw141292# opcode it appends "sort"
363c5c4113dSnw141292#
364c5c4113dSnw141292proc cksort {sql} {
365c5c4113dSnw141292  set data [execsql $sql]
366c5c4113dSnw141292  set prog [execsql "EXPLAIN $sql"]
367c5c4113dSnw141292  if {[regexp SortCallback $prog]} {set x sort} {set x nosort}
368c5c4113dSnw141292  lappend data $x
369c5c4113dSnw141292  return $data
370c5c4113dSnw141292}
371c5c4113dSnw141292# Check out the logic that attempts to implement the ORDER BY clause
372c5c4113dSnw141292# using an index rather than by sorting.
373c5c4113dSnw141292#
374c5c4113dSnw141292do_test where-6.1 {
375c5c4113dSnw141292  execsql {
376c5c4113dSnw141292    CREATE TABLE t3(a,b,c);
377c5c4113dSnw141292    CREATE INDEX t3a ON t3(a);
378c5c4113dSnw141292    CREATE INDEX t3bc ON t3(b,c);
379c5c4113dSnw141292    CREATE INDEX t3acb ON t3(a,c,b);
380c5c4113dSnw141292    INSERT INTO t3 SELECT w, 101-w, y FROM t1;
381c5c4113dSnw141292    SELECT count(*), sum(a), sum(b), sum(c) FROM t3;
382c5c4113dSnw141292  }
383c5c4113dSnw141292} {100 5050 5050 348550}
384c5c4113dSnw141292do_test where-6.2 {
385c5c4113dSnw141292  cksort {
386c5c4113dSnw141292    SELECT * FROM t3 ORDER BY a LIMIT 3
387c5c4113dSnw141292  }
388c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 nosort}
389c5c4113dSnw141292do_test where-6.3 {
390c5c4113dSnw141292  cksort {
391c5c4113dSnw141292    SELECT * FROM t3 ORDER BY a+1 LIMIT 3
392c5c4113dSnw141292  }
393c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 sort}
394c5c4113dSnw141292do_test where-6.4 {
395c5c4113dSnw141292  cksort {
396c5c4113dSnw141292    SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3
397c5c4113dSnw141292  }
398c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 nosort}
399c5c4113dSnw141292do_test where-6.5 {
400c5c4113dSnw141292  cksort {
401c5c4113dSnw141292    SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3
402c5c4113dSnw141292  }
403c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 nosort}
404c5c4113dSnw141292do_test where-6.6 {
405c5c4113dSnw141292  cksort {
406c5c4113dSnw141292    SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3
407c5c4113dSnw141292  }
408c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 nosort}
409c5c4113dSnw141292do_test where-6.7 {
410c5c4113dSnw141292  cksort {
411c5c4113dSnw141292    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 3
412c5c4113dSnw141292  }
413c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 sort}
414c5c4113dSnw141292do_test where-6.8 {
415c5c4113dSnw141292  cksort {
416c5c4113dSnw141292    SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3
417c5c4113dSnw141292  }
418c5c4113dSnw141292} {1 100 4 2 99 9 3 98 16 sort}
419c5c4113dSnw141292do_test where-6.9.1 {
420c5c4113dSnw141292  cksort {
421c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
422c5c4113dSnw141292  }
423c5c4113dSnw141292} {1 100 4 nosort}
424c5c4113dSnw141292do_test where-6.9.2 {
425c5c4113dSnw141292  cksort {
426c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
427c5c4113dSnw141292  }
428c5c4113dSnw141292} {1 100 4 nosort}
429c5c4113dSnw141292do_test where-6.9.3 {
430c5c4113dSnw141292  cksort {
431c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3
432c5c4113dSnw141292  }
433c5c4113dSnw141292} {1 100 4 nosort}
434c5c4113dSnw141292do_test where-6.9.4 {
435c5c4113dSnw141292  cksort {
436c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3
437c5c4113dSnw141292  }
438c5c4113dSnw141292} {1 100 4 nosort}
439c5c4113dSnw141292do_test where-6.9.5 {
440c5c4113dSnw141292  cksort {
441c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3
442c5c4113dSnw141292  }
443c5c4113dSnw141292} {1 100 4 nosort}
444c5c4113dSnw141292do_test where-6.9.6 {
445c5c4113dSnw141292  cksort {
446c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3
447c5c4113dSnw141292  }
448c5c4113dSnw141292} {1 100 4 nosort}
449c5c4113dSnw141292do_test where-6.9.7 {
450c5c4113dSnw141292  cksort {
451c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3
452c5c4113dSnw141292  }
453c5c4113dSnw141292} {1 100 4 sort}
454c5c4113dSnw141292do_test where-6.9.8 {
455c5c4113dSnw141292  cksort {
456c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3
457c5c4113dSnw141292  }
458c5c4113dSnw141292} {1 100 4 sort}
459c5c4113dSnw141292do_test where-6.9.9 {
460c5c4113dSnw141292  cksort {
461c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3
462c5c4113dSnw141292  }
463c5c4113dSnw141292} {1 100 4 sort}
464c5c4113dSnw141292do_test where-6.10 {
465c5c4113dSnw141292  cksort {
466c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
467c5c4113dSnw141292  }
468c5c4113dSnw141292} {1 100 4 nosort}
469c5c4113dSnw141292do_test where-6.11 {
470c5c4113dSnw141292  cksort {
471c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
472c5c4113dSnw141292  }
473c5c4113dSnw141292} {1 100 4 nosort}
474c5c4113dSnw141292do_test where-6.12 {
475c5c4113dSnw141292  cksort {
476c5c4113dSnw141292    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3
477c5c4113dSnw141292  }
478c5c4113dSnw141292} {1 100 4 nosort}
479c5c4113dSnw141292do_test where-6.13 {
480c5c4113dSnw141292  cksort {
481c5c4113dSnw141292    SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3
482c5c4113dSnw141292  }
483c5c4113dSnw141292} {100 1 10201 99 2 10000 98 3 9801 nosort}
484c5c4113dSnw141292do_test where-6.13.1 {
485c5c4113dSnw141292  cksort {
486c5c4113dSnw141292    SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3
487c5c4113dSnw141292  }
488c5c4113dSnw141292} {100 1 10201 99 2 10000 98 3 9801 sort}
489c5c4113dSnw141292do_test where-6.14 {
490c5c4113dSnw141292  cksort {
491c5c4113dSnw141292    SELECT * FROM t3 ORDER BY b LIMIT 3
492c5c4113dSnw141292  }
493c5c4113dSnw141292} {100 1 10201 99 2 10000 98 3 9801 nosort}
494c5c4113dSnw141292do_test where-6.15 {
495c5c4113dSnw141292  cksort {
496c5c4113dSnw141292    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3
497c5c4113dSnw141292  }
498c5c4113dSnw141292} {1 0 2 1 3 1 nosort}
499c5c4113dSnw141292do_test where-6.16 {
500c5c4113dSnw141292  cksort {
501c5c4113dSnw141292    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3
502c5c4113dSnw141292  }
503c5c4113dSnw141292} {1 0 2 1 3 1 sort}
504c5c4113dSnw141292do_test where-6.17 {
505c5c4113dSnw141292  cksort {
506c5c4113dSnw141292    SELECT y FROM t1 ORDER BY w COLLATE text LIMIT 3;
507c5c4113dSnw141292  }
508c5c4113dSnw141292} {4 121 10201 sort}
509c5c4113dSnw141292do_test where-6.18 {
510c5c4113dSnw141292  cksort {
511c5c4113dSnw141292    SELECT y FROM t1 ORDER BY w COLLATE numeric LIMIT 3;
512c5c4113dSnw141292  }
513c5c4113dSnw141292} {4 9 16 sort}
514c5c4113dSnw141292do_test where-6.19 {
515c5c4113dSnw141292  cksort {
516c5c4113dSnw141292    SELECT y FROM t1 ORDER BY w LIMIT 3;
517c5c4113dSnw141292  }
518c5c4113dSnw141292} {4 9 16 nosort}
519c5c4113dSnw141292
520c5c4113dSnw141292# Tests for reverse-order sorting.
521c5c4113dSnw141292#
522c5c4113dSnw141292do_test where-7.1 {
523c5c4113dSnw141292  cksort {
524c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 ORDER BY y;
525c5c4113dSnw141292  }
526c5c4113dSnw141292} {8 9 10 11 12 13 14 15 nosort}
527c5c4113dSnw141292do_test where-7.2 {
528c5c4113dSnw141292  cksort {
529c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 ORDER BY y DESC;
530c5c4113dSnw141292  }
531c5c4113dSnw141292} {15 14 13 12 11 10 9 8 nosort}
532c5c4113dSnw141292do_test where-7.3 {
533c5c4113dSnw141292  cksort {
534c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3;
535c5c4113dSnw141292  }
536c5c4113dSnw141292} {10 11 12 nosort}
537c5c4113dSnw141292do_test where-7.4 {
538c5c4113dSnw141292  cksort {
539c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3;
540c5c4113dSnw141292  }
541c5c4113dSnw141292} {15 14 13 nosort}
542c5c4113dSnw141292do_test where-7.5 {
543c5c4113dSnw141292  cksort {
544c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC;
545c5c4113dSnw141292  }
546c5c4113dSnw141292} {15 14 13 12 11 nosort}
547c5c4113dSnw141292do_test where-7.6 {
548c5c4113dSnw141292  cksort {
549c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC;
550c5c4113dSnw141292  }
551c5c4113dSnw141292} {15 14 13 12 11 10 nosort}
552c5c4113dSnw141292do_test where-7.7 {
553c5c4113dSnw141292  cksort {
554c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC;
555c5c4113dSnw141292  }
556c5c4113dSnw141292} {12 11 10 nosort}
557c5c4113dSnw141292do_test where-7.8 {
558c5c4113dSnw141292  cksort {
559c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC;
560c5c4113dSnw141292  }
561c5c4113dSnw141292} {13 12 11 10 nosort}
562c5c4113dSnw141292do_test where-7.9 {
563c5c4113dSnw141292  cksort {
564c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC;
565c5c4113dSnw141292  }
566c5c4113dSnw141292} {13 12 11 nosort}
567c5c4113dSnw141292do_test where-7.10 {
568c5c4113dSnw141292  cksort {
569c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC;
570c5c4113dSnw141292  }
571c5c4113dSnw141292} {12 11 10 nosort}
572c5c4113dSnw141292do_test where-7.11 {
573c5c4113dSnw141292  cksort {
574c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y;
575c5c4113dSnw141292  }
576c5c4113dSnw141292} {10 11 12 nosort}
577c5c4113dSnw141292do_test where-7.12 {
578c5c4113dSnw141292  cksort {
579c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y;
580c5c4113dSnw141292  }
581c5c4113dSnw141292} {10 11 12 13 nosort}
582c5c4113dSnw141292do_test where-7.13 {
583c5c4113dSnw141292  cksort {
584c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y;
585c5c4113dSnw141292  }
586c5c4113dSnw141292} {11 12 13 nosort}
587c5c4113dSnw141292do_test where-7.14 {
588c5c4113dSnw141292  cksort {
589c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y;
590c5c4113dSnw141292  }
591c5c4113dSnw141292} {10 11 12 nosort}
592c5c4113dSnw141292do_test where-7.15 {
593c5c4113dSnw141292  cksort {
594c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y;
595c5c4113dSnw141292  }
596c5c4113dSnw141292} {nosort}
597c5c4113dSnw141292do_test where-7.16 {
598c5c4113dSnw141292  cksort {
599c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y;
600c5c4113dSnw141292  }
601c5c4113dSnw141292} {8 nosort}
602c5c4113dSnw141292do_test where-7.17 {
603c5c4113dSnw141292  cksort {
604c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y;
605c5c4113dSnw141292  }
606c5c4113dSnw141292} {nosort}
607c5c4113dSnw141292do_test where-7.18 {
608c5c4113dSnw141292  cksort {
609c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y;
610c5c4113dSnw141292  }
611c5c4113dSnw141292} {15 nosort}
612c5c4113dSnw141292do_test where-7.19 {
613c5c4113dSnw141292  cksort {
614c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC;
615c5c4113dSnw141292  }
616c5c4113dSnw141292} {nosort}
617c5c4113dSnw141292do_test where-7.20 {
618c5c4113dSnw141292  cksort {
619c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC;
620c5c4113dSnw141292  }
621c5c4113dSnw141292} {8 nosort}
622c5c4113dSnw141292do_test where-7.21 {
623c5c4113dSnw141292  cksort {
624c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC;
625c5c4113dSnw141292  }
626c5c4113dSnw141292} {nosort}
627c5c4113dSnw141292do_test where-7.22 {
628c5c4113dSnw141292  cksort {
629c5c4113dSnw141292    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC;
630c5c4113dSnw141292  }
631c5c4113dSnw141292} {15 nosort}
632c5c4113dSnw141292do_test where-7.23 {
633c5c4113dSnw141292  cksort {
634c5c4113dSnw141292    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y;
635c5c4113dSnw141292  }
636c5c4113dSnw141292} {nosort}
637c5c4113dSnw141292do_test where-7.24 {
638c5c4113dSnw141292  cksort {
639c5c4113dSnw141292    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y;
640c5c4113dSnw141292  }
641c5c4113dSnw141292} {1 nosort}
642c5c4113dSnw141292do_test where-7.25 {
643c5c4113dSnw141292  cksort {
644c5c4113dSnw141292    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y;
645c5c4113dSnw141292  }
646c5c4113dSnw141292} {nosort}
647c5c4113dSnw141292do_test where-7.26 {
648c5c4113dSnw141292  cksort {
649c5c4113dSnw141292    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y;
650c5c4113dSnw141292  }
651c5c4113dSnw141292} {100 nosort}
652c5c4113dSnw141292do_test where-7.27 {
653c5c4113dSnw141292  cksort {
654c5c4113dSnw141292    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC;
655c5c4113dSnw141292  }
656c5c4113dSnw141292} {nosort}
657c5c4113dSnw141292do_test where-7.28 {
658c5c4113dSnw141292  cksort {
659c5c4113dSnw141292    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC;
660c5c4113dSnw141292  }
661c5c4113dSnw141292} {1 nosort}
662c5c4113dSnw141292do_test where-7.29 {
663c5c4113dSnw141292  cksort {
664c5c4113dSnw141292    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC;
665c5c4113dSnw141292  }
666c5c4113dSnw141292} {nosort}
667c5c4113dSnw141292do_test where-7.30 {
668c5c4113dSnw141292  cksort {
669c5c4113dSnw141292    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC;
670c5c4113dSnw141292  }
671c5c4113dSnw141292} {100 nosort}
672c5c4113dSnw141292
673c5c4113dSnw141292do_test where-8.1 {
674c5c4113dSnw141292  execsql {
675c5c4113dSnw141292    CREATE TABLE t4 AS SELECT * FROM t1;
676c5c4113dSnw141292    CREATE INDEX i4xy ON t4(x,y);
677c5c4113dSnw141292  }
678c5c4113dSnw141292  cksort {
679c5c4113dSnw141292    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
680c5c4113dSnw141292  }
681c5c4113dSnw141292} {30 29 28 nosort}
682c5c4113dSnw141292do_test where-8.2 {
683c5c4113dSnw141292  execsql {
684c5c4113dSnw141292    DELETE FROM t4;
685c5c4113dSnw141292  }
686c5c4113dSnw141292  cksort {
687c5c4113dSnw141292    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
688c5c4113dSnw141292  }
689c5c4113dSnw141292} {nosort}
690c5c4113dSnw141292
691c5c4113dSnw141292# Make sure searches with an index work with an empty table.
692c5c4113dSnw141292#
693c5c4113dSnw141292do_test where-9.1 {
694c5c4113dSnw141292  execsql {
695c5c4113dSnw141292    CREATE TABLE t5(x PRIMARY KEY);
696c5c4113dSnw141292    SELECT * FROM t5 WHERE x<10;
697c5c4113dSnw141292  }
698c5c4113dSnw141292} {}
699c5c4113dSnw141292do_test where-9.2 {
700c5c4113dSnw141292  execsql {
701c5c4113dSnw141292    SELECT * FROM t5 WHERE x<10 ORDER BY x DESC;
702c5c4113dSnw141292  }
703c5c4113dSnw141292} {}
704c5c4113dSnw141292do_test where-9.3 {
705c5c4113dSnw141292  execsql {
706c5c4113dSnw141292    SELECT * FROM t5 WHERE x=10;
707c5c4113dSnw141292  }
708c5c4113dSnw141292} {}
709c5c4113dSnw141292
710c5c4113dSnw141292do_test where-10.1 {
711c5c4113dSnw141292  execsql {
712c5c4113dSnw141292    SELECT 1 WHERE abs(random())<0
713c5c4113dSnw141292  }
714c5c4113dSnw141292} {}
715c5c4113dSnw141292do_test where-10.2 {
716c5c4113dSnw141292  proc tclvar_func {vname} {return [set ::$vname]}
717c5c4113dSnw141292  db function tclvar tclvar_func
718c5c4113dSnw141292  set ::v1 0
719c5c4113dSnw141292  execsql {
720c5c4113dSnw141292    SELECT count(*) FROM t1 WHERE tclvar('v1');
721c5c4113dSnw141292  }
722c5c4113dSnw141292} {0}
723c5c4113dSnw141292do_test where-10.3 {
724c5c4113dSnw141292  set ::v1 1
725c5c4113dSnw141292  execsql {
726c5c4113dSnw141292    SELECT count(*) FROM t1 WHERE tclvar('v1');
727c5c4113dSnw141292  }
728c5c4113dSnw141292} {100}
729c5c4113dSnw141292do_test where-10.4 {
730c5c4113dSnw141292  set ::v1 1
731c5c4113dSnw141292  proc tclvar_func {vname} {
732c5c4113dSnw141292    upvar #0 $vname v
733c5c4113dSnw141292    set v [expr {!$v}]
734c5c4113dSnw141292    return $v
735c5c4113dSnw141292  }
736c5c4113dSnw141292  execsql {
737c5c4113dSnw141292    SELECT count(*) FROM t1 WHERE tclvar('v1');
738c5c4113dSnw141292  }
739c5c4113dSnw141292} {50}
740c5c4113dSnw141292
741c5c4113dSnw141292integrity_check {where-99.0}
742c5c4113dSnw141292
743c5c4113dSnw141292finish_test
744