• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 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 the use of indices in WHERE clases.
13#
14# $Id: where.test,v 1.50 2008/11/03 09:06:06 danielk1977 Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Build some test data
20#
21do_test where-1.0 {
22  execsql {
23    CREATE TABLE t1(w int, x int, y int);
24    CREATE TABLE t2(p int, q int, r int, s int);
25  }
26  for {set i 1} {$i<=100} {incr i} {
27    set w $i
28    set x [expr {int(log($i)/log(2))}]
29    set y [expr {$i*$i + 2*$i + 1}]
30    execsql "INSERT INTO t1 VALUES($w,$x,$y)"
31  }
32
33  ifcapable subquery {
34    execsql {
35      INSERT INTO t2 SELECT 101-w, x, (SELECT max(y) FROM t1)+1-y, y FROM t1;
36    }
37  } else {
38    set maxy [execsql {select max(y) from t1}]
39    execsql "
40      INSERT INTO t2 SELECT 101-w, x, $maxy+1-y, y FROM t1;
41    "
42  }
43
44  execsql {
45    CREATE INDEX i1w ON t1(w);
46    CREATE INDEX i1xy ON t1(x,y);
47    CREATE INDEX i2p ON t2(p);
48    CREATE INDEX i2r ON t2(r);
49    CREATE INDEX i2qs ON t2(q, s);
50  }
51} {}
52
53# Do an SQL statement.  Append the search count to the end of the result.
54#
55proc count sql {
56  set ::sqlite_search_count 0
57  return [concat [execsql $sql] $::sqlite_search_count]
58}
59
60# Verify that queries use an index.  We are using the special variable
61# "sqlite_search_count" which tallys the number of executions of MoveTo
62# and Next operators in the VDBE.  By verifing that the search count is
63# small we can be assured that indices are being used properly.
64#
65do_test where-1.1.1 {
66  count {SELECT x, y, w FROM t1 WHERE w=10}
67} {3 121 10 3}
68do_test where-1.1.2 {
69  set sqlite_query_plan
70} {t1 i1w}
71do_test where-1.1.3 {
72  db status step
73} {0}
74do_test where-1.1.4 {
75  db eval {SELECT x, y, w FROM t1 WHERE +w=10}
76} {3 121 10}
77do_test where-1.1.5 {
78  db status step
79} {99}
80do_test where-1.1.6 {
81  set sqlite_query_plan
82} {t1 {}}
83do_test where-1.1.7 {
84  count {SELECT x, y, w AS abc FROM t1 WHERE abc=10}
85} {3 121 10 3}
86do_test where-1.1.8 {
87  set sqlite_query_plan
88} {t1 i1w}
89do_test where-1.1.9 {
90  db status step
91} {0}
92do_test where-1.2.1 {
93  count {SELECT x, y, w FROM t1 WHERE w=11}
94} {3 144 11 3}
95do_test where-1.2.2 {
96  count {SELECT x, y, w AS abc FROM t1 WHERE abc=11}
97} {3 144 11 3}
98do_test where-1.3.1 {
99  count {SELECT x, y, w AS abc FROM t1 WHERE 11=w}
100} {3 144 11 3}
101do_test where-1.3.2 {
102  count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc}
103} {3 144 11 3}
104do_test where-1.4.1 {
105  count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2}
106} {11 3 144 3}
107do_test where-1.4.2 {
108  set sqlite_query_plan
109} {t1 i1w}
110do_test where-1.4.3 {
111  count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2}
112} {11 3 144 3}
113do_test where-1.4.4 {
114  set sqlite_query_plan
115} {t1 i1w}
116do_test where-1.5 {
117  count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2}
118} {3 144 3}
119do_test where-1.5.2 {
120  set sqlite_query_plan
121} {t1 i1w}
122do_test where-1.6 {
123  count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11}
124} {3 144 3}
125do_test where-1.7 {
126  count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2}
127} {3 144 3}
128do_test where-1.8 {
129  count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3}
130} {3 144 3}
131do_test where-1.8.2 {
132  set sqlite_query_plan
133} {t1 i1xy}
134do_test where-1.8.3 {
135  count {SELECT x, y FROM t1 WHERE y=144 AND x=3}
136  set sqlite_query_plan
137} {{} i1xy}
138do_test where-1.9 {
139  count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3}
140} {3 144 3}
141do_test where-1.10 {
142  count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121}
143} {3 121 3}
144do_test where-1.11 {
145  count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10}
146} {3 100 3}
147
148# New for SQLite version 2.1: Verify that that inequality constraints
149# are used correctly.
150#
151do_test where-1.12 {
152  count {SELECT w FROM t1 WHERE x=3 AND y<100}
153} {8 3}
154do_test where-1.13 {
155  count {SELECT w FROM t1 WHERE x=3 AND 100>y}
156} {8 3}
157do_test where-1.14 {
158  count {SELECT w FROM t1 WHERE 3=x AND y<100}
159} {8 3}
160do_test where-1.15 {
161  count {SELECT w FROM t1 WHERE 3=x AND 100>y}
162} {8 3}
163do_test where-1.16 {
164  count {SELECT w FROM t1 WHERE x=3 AND y<=100}
165} {8 9 5}
166do_test where-1.17 {
167  count {SELECT w FROM t1 WHERE x=3 AND 100>=y}
168} {8 9 5}
169do_test where-1.18 {
170  count {SELECT w FROM t1 WHERE x=3 AND y>225}
171} {15 3}
172do_test where-1.19 {
173  count {SELECT w FROM t1 WHERE x=3 AND 225<y}
174} {15 3}
175do_test where-1.20 {
176  count {SELECT w FROM t1 WHERE x=3 AND y>=225}
177} {14 15 5}
178do_test where-1.21 {
179  count {SELECT w FROM t1 WHERE x=3 AND 225<=y}
180} {14 15 5}
181do_test where-1.22 {
182  count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196}
183} {11 12 5}
184do_test where-1.23 {
185  count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196}
186} {10 11 12 13 9}
187do_test where-1.24 {
188  count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y}
189} {11 12 5}
190do_test where-1.25 {
191  count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y}
192} {10 11 12 13 9}
193
194# Need to work on optimizing the BETWEEN operator.
195#
196# do_test where-1.26 {
197#   count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196}
198# } {10 11 12 13 9}
199
200do_test where-1.27 {
201  count {SELECT w FROM t1 WHERE x=3 AND y+1==122}
202} {10 10}
203
204do_test where-1.28 {
205  count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122}
206} {10 99}
207do_test where-1.29 {
208  count {SELECT w FROM t1 WHERE y==121}
209} {10 99}
210
211
212do_test where-1.30 {
213  count {SELECT w FROM t1 WHERE w>97}
214} {98 99 100 3}
215do_test where-1.31 {
216  count {SELECT w FROM t1 WHERE w>=97}
217} {97 98 99 100 4}
218do_test where-1.33 {
219  count {SELECT w FROM t1 WHERE w==97}
220} {97 2}
221do_test where-1.33.1  {
222  count {SELECT w FROM t1 WHERE w<=97 AND w==97}
223} {97 2}
224do_test where-1.33.2  {
225  count {SELECT w FROM t1 WHERE w<98 AND w==97}
226} {97 2}
227do_test where-1.33.3  {
228  count {SELECT w FROM t1 WHERE w>=97 AND w==97}
229} {97 2}
230do_test where-1.33.4  {
231  count {SELECT w FROM t1 WHERE w>96 AND w==97}
232} {97 2}
233do_test where-1.33.5  {
234  count {SELECT w FROM t1 WHERE w==97 AND w==97}
235} {97 2}
236do_test where-1.34 {
237  count {SELECT w FROM t1 WHERE w+1==98}
238} {97 99}
239do_test where-1.35 {
240  count {SELECT w FROM t1 WHERE w<3}
241} {1 2 2}
242do_test where-1.36 {
243  count {SELECT w FROM t1 WHERE w<=3}
244} {1 2 3 3}
245do_test where-1.37 {
246  count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w}
247} {1 2 3 99}
248
249do_test where-1.38 {
250  count {SELECT (w) FROM t1 WHERE (w)>(97)}
251} {98 99 100 3}
252do_test where-1.39 {
253  count {SELECT (w) FROM t1 WHERE (w)>=(97)}
254} {97 98 99 100 4}
255do_test where-1.40 {
256  count {SELECT (w) FROM t1 WHERE (w)==(97)}
257} {97 2}
258do_test where-1.41 {
259  count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)}
260} {97 99}
261
262
263# Do the same kind of thing except use a join as the data source.
264#
265do_test where-2.1 {
266  count {
267    SELECT w, p FROM t2, t1
268    WHERE x=q AND y=s AND r=8977
269  }
270} {34 67 6}
271do_test where-2.2 {
272  count {
273    SELECT w, p FROM t2, t1
274    WHERE x=q AND s=y AND r=8977
275  }
276} {34 67 6}
277do_test where-2.3 {
278  count {
279    SELECT w, p FROM t2, t1
280    WHERE x=q AND s=y AND r=8977 AND w>10
281  }
282} {34 67 6}
283do_test where-2.4 {
284  count {
285    SELECT w, p FROM t2, t1
286    WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10
287  }
288} {34 67 6}
289do_test where-2.5 {
290  count {
291    SELECT w, p FROM t2, t1
292    WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10
293  }
294} {34 67 6}
295do_test where-2.6 {
296  count {
297    SELECT w, p FROM t2, t1
298    WHERE x=q AND p=77 AND s=y AND w>5
299  }
300} {24 77 6}
301do_test where-2.7 {
302  count {
303    SELECT w, p FROM t1, t2
304    WHERE x=q AND p>77 AND s=y AND w=5
305  }
306} {5 96 6}
307
308# Lets do a 3-way join.
309#
310do_test where-3.1 {
311  count {
312    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
313    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11
314  }
315} {11 90 11 8}
316do_test where-3.2 {
317  count {
318    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
319    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12
320  }
321} {12 89 12 8}
322do_test where-3.3 {
323  count {
324    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
325    WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y
326  }
327} {15 86 86 8}
328
329# Test to see that the special case of a constant WHERE clause is
330# handled.
331#
332do_test where-4.1 {
333  count {
334    SELECT * FROM t1 WHERE 0
335  }
336} {0}
337do_test where-4.2 {
338  count {
339    SELECT * FROM t1 WHERE 1 LIMIT 1
340  }
341} {1 0 4 0}
342do_test where-4.3 {
343  execsql {
344    SELECT 99 WHERE 0
345  }
346} {}
347do_test where-4.4 {
348  execsql {
349    SELECT 99 WHERE 1
350  }
351} {99}
352do_test where-4.5 {
353  execsql {
354    SELECT 99 WHERE 0.1
355  }
356} {99}
357do_test where-4.6 {
358  execsql {
359    SELECT 99 WHERE 0.0
360  }
361} {}
362do_test where-4.7 {
363  execsql {
364    SELECT count(*) FROM t1 WHERE t1.w
365  }
366} {100}
367
368# Verify that IN operators in a WHERE clause are handled correctly.
369# Omit these tests if the build is not capable of sub-queries.
370#
371ifcapable subquery {
372  do_test where-5.1 {
373    count {
374      SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1;
375    }
376  } {1 0 4 2 1 9 3 1 16 4}
377  do_test where-5.2 {
378    count {
379      SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1;
380    }
381  } {1 0 4 2 1 9 3 1 16 102}
382  do_test where-5.3 {
383    count {
384      SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1;
385    }
386  } {1 0 4 2 1 9 3 1 16 14}
387  do_test where-5.4 {
388    count {
389      SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1;
390    }
391  } {1 0 4 2 1 9 3 1 16 102}
392  do_test where-5.5 {
393    count {
394      SELECT * FROM t1 WHERE rowid IN
395         (select rowid from t1 where rowid IN (-1,2,4))
396      ORDER BY 1;
397    }
398  } {2 1 9 4 2 25 3}
399  do_test where-5.6 {
400    count {
401      SELECT * FROM t1 WHERE rowid+0 IN
402         (select rowid from t1 where rowid IN (-1,2,4))
403      ORDER BY 1;
404    }
405  } {2 1 9 4 2 25 103}
406  do_test where-5.7 {
407    count {
408      SELECT * FROM t1 WHERE w IN
409         (select rowid from t1 where rowid IN (-1,2,4))
410      ORDER BY 1;
411    }
412  } {2 1 9 4 2 25 9}
413  do_test where-5.8 {
414    count {
415      SELECT * FROM t1 WHERE w+0 IN
416         (select rowid from t1 where rowid IN (-1,2,4))
417      ORDER BY 1;
418    }
419  } {2 1 9 4 2 25 103}
420  do_test where-5.9 {
421    count {
422      SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1;
423    }
424  } {2 1 9 3 1 16 7}
425  do_test where-5.10 {
426    count {
427      SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1;
428    }
429  } {2 1 9 3 1 16 199}
430  do_test where-5.11 {
431    count {
432      SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1;
433    }
434  } {79 6 6400 89 6 8100 199}
435  do_test where-5.12 {
436    count {
437      SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1;
438    }
439  } {79 6 6400 89 6 8100 7}
440  do_test where-5.13 {
441    count {
442      SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1;
443    }
444  } {2 1 9 3 1 16 7}
445  do_test where-5.14 {
446    count {
447      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
448    }
449  } {2 1 9 8}
450  do_test where-5.15 {
451    count {
452      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1;
453    }
454  } {2 1 9 3 1 16 11}
455}
456
457# This procedure executes the SQL.  Then it checks to see if the OP_Sort
458# opcode was executed.  If an OP_Sort did occur, then "sort" is appended
459# to the result.  If no OP_Sort happened, then "nosort" is appended.
460#
461# This procedure is used to check to make sure sorting is or is not
462# occurring as expected.
463#
464proc cksort {sql} {
465  set data [execsql $sql]
466  if {[db status sort]} {set x sort} {set x nosort}
467  lappend data $x
468  return $data
469}
470# Check out the logic that attempts to implement the ORDER BY clause
471# using an index rather than by sorting.
472#
473do_test where-6.1 {
474  execsql {
475    CREATE TABLE t3(a,b,c);
476    CREATE INDEX t3a ON t3(a);
477    CREATE INDEX t3bc ON t3(b,c);
478    CREATE INDEX t3acb ON t3(a,c,b);
479    INSERT INTO t3 SELECT w, 101-w, y FROM t1;
480    SELECT count(*), sum(a), sum(b), sum(c) FROM t3;
481  }
482} {100 5050 5050 348550}
483do_test where-6.2 {
484  cksort {
485    SELECT * FROM t3 ORDER BY a LIMIT 3
486  }
487} {1 100 4 2 99 9 3 98 16 nosort}
488do_test where-6.3 {
489  cksort {
490    SELECT * FROM t3 ORDER BY a+1 LIMIT 3
491  }
492} {1 100 4 2 99 9 3 98 16 sort}
493do_test where-6.4 {
494  cksort {
495    SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3
496  }
497} {1 100 4 2 99 9 3 98 16 nosort}
498do_test where-6.5 {
499  cksort {
500    SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3
501  }
502} {1 100 4 2 99 9 3 98 16 nosort}
503do_test where-6.6 {
504  cksort {
505    SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3
506  }
507} {1 100 4 2 99 9 3 98 16 nosort}
508do_test where-6.7 {
509  cksort {
510    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 3
511  }
512} {1 100 4 2 99 9 3 98 16 nosort}
513ifcapable subquery {
514  do_test where-6.8 {
515    cksort {
516      SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3
517    }
518  } {1 100 4 2 99 9 3 98 16 sort}
519}
520do_test where-6.9.1 {
521  cksort {
522    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
523  }
524} {1 100 4 nosort}
525do_test where-6.9.1.1 {
526  cksort {
527    SELECT * FROM t3 WHERE a>=1 AND a=1 AND c>0 ORDER BY a LIMIT 3
528  }
529} {1 100 4 nosort}
530do_test where-6.9.1.2 {
531  cksort {
532    SELECT * FROM t3 WHERE a<2 AND a=1 AND c>0 ORDER BY a LIMIT 3
533  }
534} {1 100 4 nosort}
535do_test where-6.9.2 {
536  cksort {
537    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
538  }
539} {1 100 4 nosort}
540do_test where-6.9.3 {
541  cksort {
542    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3
543  }
544} {1 100 4 nosort}
545do_test where-6.9.4 {
546  cksort {
547    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3
548  }
549} {1 100 4 nosort}
550do_test where-6.9.5 {
551  cksort {
552    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3
553  }
554} {1 100 4 nosort}
555do_test where-6.9.6 {
556  cksort {
557    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3
558  }
559} {1 100 4 nosort}
560do_test where-6.9.7 {
561  cksort {
562    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3
563  }
564} {1 100 4 sort}
565do_test where-6.9.8 {
566  cksort {
567    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3
568  }
569} {1 100 4 nosort}
570do_test where-6.9.9 {
571  cksort {
572    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3
573  }
574} {1 100 4 nosort}
575do_test where-6.10 {
576  cksort {
577    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
578  }
579} {1 100 4 nosort}
580do_test where-6.11 {
581  cksort {
582    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
583  }
584} {1 100 4 nosort}
585do_test where-6.12 {
586  cksort {
587    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3
588  }
589} {1 100 4 nosort}
590do_test where-6.13 {
591  cksort {
592    SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3
593  }
594} {100 1 10201 99 2 10000 98 3 9801 nosort}
595do_test where-6.13.1 {
596  cksort {
597    SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3
598  }
599} {100 1 10201 99 2 10000 98 3 9801 sort}
600do_test where-6.14 {
601  cksort {
602    SELECT * FROM t3 ORDER BY b LIMIT 3
603  }
604} {100 1 10201 99 2 10000 98 3 9801 nosort}
605do_test where-6.15 {
606  cksort {
607    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3
608  }
609} {1 0 2 1 3 1 nosort}
610do_test where-6.16 {
611  cksort {
612    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3
613  }
614} {1 0 2 1 3 1 sort}
615do_test where-6.19 {
616  cksort {
617    SELECT y FROM t1 ORDER BY w LIMIT 3;
618  }
619} {4 9 16 nosort}
620do_test where-6.20 {
621  cksort {
622    SELECT y FROM t1 ORDER BY rowid LIMIT 3;
623  }
624} {4 9 16 nosort}
625do_test where-6.21 {
626  cksort {
627    SELECT y FROM t1 ORDER BY rowid, y LIMIT 3;
628  }
629} {4 9 16 nosort}
630do_test where-6.22 {
631  cksort {
632    SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3;
633  }
634} {4 9 16 nosort}
635do_test where-6.23 {
636  cksort {
637    SELECT y FROM t1 WHERE y>4 ORDER BY rowid, w, x LIMIT 3;
638  }
639} {9 16 25 nosort}
640do_test where-6.24 {
641  cksort {
642    SELECT y FROM t1 WHERE y>=9 ORDER BY rowid, x DESC, w LIMIT 3;
643  }
644} {9 16 25 nosort}
645do_test where-6.25 {
646  cksort {
647    SELECT y FROM t1 WHERE y>4 AND y<25 ORDER BY rowid;
648  }
649} {9 16 nosort}
650do_test where-6.26 {
651  cksort {
652    SELECT y FROM t1 WHERE y>=4 AND y<=25 ORDER BY oid;
653  }
654} {4 9 16 25 nosort}
655do_test where-6.27 {
656  cksort {
657    SELECT y FROM t1 WHERE y<=25 ORDER BY _rowid_, w+y;
658  }
659} {4 9 16 25 nosort}
660
661
662# Tests for reverse-order sorting.
663#
664do_test where-7.1 {
665  cksort {
666    SELECT w FROM t1 WHERE x=3 ORDER BY y;
667  }
668} {8 9 10 11 12 13 14 15 nosort}
669do_test where-7.2 {
670  cksort {
671    SELECT w FROM t1 WHERE x=3 ORDER BY y DESC;
672  }
673} {15 14 13 12 11 10 9 8 nosort}
674do_test where-7.3 {
675  cksort {
676    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3;
677  }
678} {10 11 12 nosort}
679do_test where-7.4 {
680  cksort {
681    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3;
682  }
683} {15 14 13 nosort}
684do_test where-7.5 {
685  cksort {
686    SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC;
687  }
688} {15 14 13 12 11 nosort}
689do_test where-7.6 {
690  cksort {
691    SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC;
692  }
693} {15 14 13 12 11 10 nosort}
694do_test where-7.7 {
695  cksort {
696    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC;
697  }
698} {12 11 10 nosort}
699do_test where-7.8 {
700  cksort {
701    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC;
702  }
703} {13 12 11 10 nosort}
704do_test where-7.9 {
705  cksort {
706    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC;
707  }
708} {13 12 11 nosort}
709do_test where-7.10 {
710  cksort {
711    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC;
712  }
713} {12 11 10 nosort}
714do_test where-7.11 {
715  cksort {
716    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y;
717  }
718} {10 11 12 nosort}
719do_test where-7.12 {
720  cksort {
721    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y;
722  }
723} {10 11 12 13 nosort}
724do_test where-7.13 {
725  cksort {
726    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y;
727  }
728} {11 12 13 nosort}
729do_test where-7.14 {
730  cksort {
731    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y;
732  }
733} {10 11 12 nosort}
734do_test where-7.15 {
735  cksort {
736    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y;
737  }
738} {nosort}
739do_test where-7.16 {
740  cksort {
741    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y;
742  }
743} {8 nosort}
744do_test where-7.17 {
745  cksort {
746    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y;
747  }
748} {nosort}
749do_test where-7.18 {
750  cksort {
751    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y;
752  }
753} {15 nosort}
754do_test where-7.19 {
755  cksort {
756    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC;
757  }
758} {nosort}
759do_test where-7.20 {
760  cksort {
761    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC;
762  }
763} {8 nosort}
764do_test where-7.21 {
765  cksort {
766    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC;
767  }
768} {nosort}
769do_test where-7.22 {
770  cksort {
771    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC;
772  }
773} {15 nosort}
774do_test where-7.23 {
775  cksort {
776    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y;
777  }
778} {nosort}
779do_test where-7.24 {
780  cksort {
781    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y;
782  }
783} {1 nosort}
784do_test where-7.25 {
785  cksort {
786    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y;
787  }
788} {nosort}
789do_test where-7.26 {
790  cksort {
791    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y;
792  }
793} {100 nosort}
794do_test where-7.27 {
795  cksort {
796    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC;
797  }
798} {nosort}
799do_test where-7.28 {
800  cksort {
801    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC;
802  }
803} {1 nosort}
804do_test where-7.29 {
805  cksort {
806    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC;
807  }
808} {nosort}
809do_test where-7.30 {
810  cksort {
811    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC;
812  }
813} {100 nosort}
814do_test where-7.31 {
815  cksort {
816    SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3
817  }
818} {10201 10000 9801 nosort}
819do_test where-7.32 {
820  cksort {
821    SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC
822  }
823} {16 9 4 nosort}
824do_test where-7.33 {
825  cksort {
826    SELECT y FROM t1 WHERE y<=25 ORDER BY rowid DESC
827  }
828} {25 16 9 4 nosort}
829do_test where-7.34 {
830  cksort {
831    SELECT y FROM t1 WHERE y<25 AND y>4 ORDER BY rowid DESC, y DESC
832  }
833} {16 9 nosort}
834do_test where-7.35 {
835  cksort {
836    SELECT y FROM t1 WHERE y<25 AND y>=4 ORDER BY rowid DESC
837  }
838} {16 9 4 nosort}
839
840do_test where-8.1 {
841  execsql {
842    CREATE TABLE t4 AS SELECT * FROM t1;
843    CREATE INDEX i4xy ON t4(x,y);
844  }
845  cksort {
846    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
847  }
848} {30 29 28 nosort}
849do_test where-8.2 {
850  execsql {
851    DELETE FROM t4;
852  }
853  cksort {
854    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
855  }
856} {nosort}
857
858# Make sure searches with an index work with an empty table.
859#
860do_test where-9.1 {
861  execsql {
862    CREATE TABLE t5(x PRIMARY KEY);
863    SELECT * FROM t5 WHERE x<10;
864  }
865} {}
866do_test where-9.2 {
867  execsql {
868    SELECT * FROM t5 WHERE x<10 ORDER BY x DESC;
869  }
870} {}
871do_test where-9.3 {
872  execsql {
873    SELECT * FROM t5 WHERE x=10;
874  }
875} {}
876
877do_test where-10.1 {
878  execsql {
879    SELECT 1 WHERE abs(random())<0
880  }
881} {}
882do_test where-10.2 {
883  proc tclvar_func {vname} {return [set ::$vname]}
884  db function tclvar tclvar_func
885  set ::v1 0
886  execsql {
887    SELECT count(*) FROM t1 WHERE tclvar('v1');
888  }
889} {0}
890do_test where-10.3 {
891  set ::v1 1
892  execsql {
893    SELECT count(*) FROM t1 WHERE tclvar('v1');
894  }
895} {100}
896do_test where-10.4 {
897  set ::v1 1
898  proc tclvar_func {vname} {
899    upvar #0 $vname v
900    set v [expr {!$v}]
901    return $v
902  }
903  execsql {
904    SELECT count(*) FROM t1 WHERE tclvar('v1');
905  }
906} {50}
907
908# Ticket #1376.  The query below was causing a segfault.
909# The problem was the age-old error of calling realloc() on an
910# array while there are still pointers to individual elements of
911# that array.
912#
913do_test where-11.1 {
914  execsql {
915   CREATE TABLE t99(Dte INT, X INT);
916   DELETE FROM t99 WHERE (Dte = 2451337) OR (Dte = 2451339) OR
917     (Dte BETWEEN 2451345 AND 2451347) OR (Dte = 2451351) OR
918     (Dte BETWEEN 2451355 AND 2451356) OR (Dte = 2451358) OR
919     (Dte = 2451362) OR (Dte = 2451365) OR (Dte = 2451367) OR
920     (Dte BETWEEN 2451372 AND 2451376) OR (Dte BETWEEN 2451382 AND 2451384) OR
921     (Dte = 2451387) OR (Dte BETWEEN 2451389 AND 2451391) OR
922     (Dte BETWEEN 2451393 AND 2451395) OR (Dte = 2451400) OR
923     (Dte = 2451402) OR (Dte = 2451404) OR (Dte BETWEEN 2451416 AND 2451418) OR
924     (Dte = 2451422) OR (Dte = 2451426) OR (Dte BETWEEN 2451445 AND 2451446) OR
925     (Dte = 2451456) OR (Dte = 2451458) OR (Dte BETWEEN 2451465 AND 2451467) OR
926     (Dte BETWEEN 2451469 AND 2451471) OR (Dte = 2451474) OR
927     (Dte BETWEEN 2451477 AND 2451501) OR (Dte BETWEEN 2451503 AND 2451509) OR
928     (Dte BETWEEN 2451511 AND 2451514) OR (Dte BETWEEN 2451518 AND 2451521) OR
929     (Dte BETWEEN 2451523 AND 2451531) OR (Dte BETWEEN 2451533 AND 2451537) OR
930     (Dte BETWEEN 2451539 AND 2451544) OR (Dte BETWEEN 2451546 AND 2451551) OR
931     (Dte BETWEEN 2451553 AND 2451555) OR (Dte = 2451557) OR
932     (Dte BETWEEN 2451559 AND 2451561) OR (Dte = 2451563) OR
933     (Dte BETWEEN 2451565 AND 2451566) OR (Dte BETWEEN 2451569 AND 2451571) OR
934     (Dte = 2451573) OR (Dte = 2451575) OR (Dte = 2451577) OR (Dte = 2451581) OR
935     (Dte BETWEEN 2451583 AND 2451586) OR (Dte BETWEEN 2451588 AND 2451592) OR
936     (Dte BETWEEN 2451596 AND 2451598) OR (Dte = 2451600) OR
937     (Dte BETWEEN 2451602 AND 2451603) OR (Dte = 2451606) OR (Dte = 2451611);
938  }
939} {}
940
941# Ticket #2116:  Make sure sorting by index works well with nn INTEGER PRIMARY
942# KEY.
943#
944do_test where-12.1 {
945  execsql {
946    CREATE TABLE t6(a INTEGER PRIMARY KEY, b TEXT);
947    INSERT INTO t6 VALUES(1,'one');
948    INSERT INTO t6 VALUES(4,'four');
949    CREATE INDEX t6i1 ON t6(b);
950  }
951  cksort {
952    SELECT * FROM t6 ORDER BY b;
953  }
954} {4 four 1 one nosort}
955do_test where-12.2 {
956  cksort {
957    SELECT * FROM t6 ORDER BY b, a;
958  }
959} {4 four 1 one nosort}
960do_test where-12.3 {
961  cksort {
962    SELECT * FROM t6 ORDER BY a;
963  }
964} {1 one 4 four nosort}
965do_test where-12.4 {
966  cksort {
967    SELECT * FROM t6 ORDER BY a, b;
968  }
969} {1 one 4 four nosort}
970do_test where-12.5 {
971  cksort {
972    SELECT * FROM t6 ORDER BY b DESC;
973  }
974} {1 one 4 four nosort}
975do_test where-12.6 {
976  cksort {
977    SELECT * FROM t6 ORDER BY b DESC, a DESC;
978  }
979} {1 one 4 four nosort}
980do_test where-12.7 {
981  cksort {
982    SELECT * FROM t6 ORDER BY b DESC, a ASC;
983  }
984} {1 one 4 four sort}
985do_test where-12.8 {
986  cksort {
987    SELECT * FROM t6 ORDER BY b ASC, a DESC;
988  }
989} {4 four 1 one sort}
990do_test where-12.9 {
991  cksort {
992    SELECT * FROM t6 ORDER BY a DESC;
993  }
994} {4 four 1 one nosort}
995do_test where-12.10 {
996  cksort {
997    SELECT * FROM t6 ORDER BY a DESC, b DESC;
998  }
999} {4 four 1 one nosort}
1000do_test where-12.11 {
1001  cksort {
1002    SELECT * FROM t6 ORDER BY a DESC, b ASC;
1003  }
1004} {4 four 1 one nosort}
1005do_test where-12.12 {
1006  cksort {
1007    SELECT * FROM t6 ORDER BY a ASC, b DESC;
1008  }
1009} {1 one 4 four nosort}
1010do_test where-13.1 {
1011  execsql {
1012    CREATE TABLE t7(a INTEGER PRIMARY KEY, b TEXT);
1013    INSERT INTO t7 VALUES(1,'one');
1014    INSERT INTO t7 VALUES(4,'four');
1015    CREATE INDEX t7i1 ON t7(b);
1016  }
1017  cksort {
1018    SELECT * FROM t7 ORDER BY b;
1019  }
1020} {4 four 1 one nosort}
1021do_test where-13.2 {
1022  cksort {
1023    SELECT * FROM t7 ORDER BY b, a;
1024  }
1025} {4 four 1 one nosort}
1026do_test where-13.3 {
1027  cksort {
1028    SELECT * FROM t7 ORDER BY a;
1029  }
1030} {1 one 4 four nosort}
1031do_test where-13.4 {
1032  cksort {
1033    SELECT * FROM t7 ORDER BY a, b;
1034  }
1035} {1 one 4 four nosort}
1036do_test where-13.5 {
1037  cksort {
1038    SELECT * FROM t7 ORDER BY b DESC;
1039  }
1040} {1 one 4 four nosort}
1041do_test where-13.6 {
1042  cksort {
1043    SELECT * FROM t7 ORDER BY b DESC, a DESC;
1044  }
1045} {1 one 4 four nosort}
1046do_test where-13.7 {
1047  cksort {
1048    SELECT * FROM t7 ORDER BY b DESC, a ASC;
1049  }
1050} {1 one 4 four sort}
1051do_test where-13.8 {
1052  cksort {
1053    SELECT * FROM t7 ORDER BY b ASC, a DESC;
1054  }
1055} {4 four 1 one sort}
1056do_test where-13.9 {
1057  cksort {
1058    SELECT * FROM t7 ORDER BY a DESC;
1059  }
1060} {4 four 1 one nosort}
1061do_test where-13.10 {
1062  cksort {
1063    SELECT * FROM t7 ORDER BY a DESC, b DESC;
1064  }
1065} {4 four 1 one nosort}
1066do_test where-13.11 {
1067  cksort {
1068    SELECT * FROM t7 ORDER BY a DESC, b ASC;
1069  }
1070} {4 four 1 one nosort}
1071do_test where-13.12 {
1072  cksort {
1073    SELECT * FROM t7 ORDER BY a ASC, b DESC;
1074  }
1075} {1 one 4 four nosort}
1076
1077# Ticket #2211.
1078#
1079# When optimizing out ORDER BY clauses, make sure that trailing terms
1080# of the ORDER BY clause do not reference other tables in a join.
1081#
1082do_test where-14.1 {
1083  execsql {
1084    CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT UNIQUE);
1085    INSERT INTO t8 VALUES(1,'one');
1086    INSERT INTO t8 VALUES(4,'four');
1087  }
1088  cksort {
1089    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b
1090  }
1091} {1/4 1/1 4/4 4/1 sort}
1092do_test where-14.2 {
1093  cksort {
1094    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b DESC
1095  }
1096} {1/1 1/4 4/1 4/4 sort}
1097do_test where-14.3 {
1098  cksort {
1099    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b
1100  }
1101} {1/1 1/4 4/1 4/4 nosort}
1102do_test where-14.4 {
1103  cksort {
1104    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b DESC
1105  }
1106} {1/1 1/4 4/1 4/4 nosort}
1107do_test where-14.5 {
1108  cksort {
1109    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b
1110  }
1111} {4/1 4/4 1/1 1/4 nosort}
1112do_test where-14.6 {
1113  cksort {
1114    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC
1115  }
1116} {4/1 4/4 1/1 1/4 nosort}
1117do_test where-14.7 {
1118  cksort {
1119    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b
1120  }
1121} {4/1 4/4 1/1 1/4 sort}
1122do_test where-14.7.1 {
1123  cksort {
1124    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b
1125  }
1126} {4/1 4/4 1/1 1/4 sort}
1127do_test where-14.7.2 {
1128  cksort {
1129    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b
1130  }
1131} {4/1 4/4 1/1 1/4 nosort}
1132do_test where-14.8 {
1133  cksort {
1134    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC
1135  }
1136} {4/4 4/1 1/4 1/1 sort}
1137do_test where-14.9 {
1138  cksort {
1139    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b
1140  }
1141} {4/4 4/1 1/4 1/1 sort}
1142do_test where-14.10 {
1143  cksort {
1144    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC
1145  }
1146} {4/1 4/4 1/1 1/4 sort}
1147do_test where-14.11 {
1148  cksort {
1149    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b
1150  }
1151} {4/1 4/4 1/1 1/4 sort}
1152do_test where-14.12 {
1153  cksort {
1154    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC
1155  }
1156} {4/4 4/1 1/4 1/1 sort}
1157
1158# Ticket #2445.
1159#
1160# There was a crash that could occur when a where clause contains an
1161# alias for an expression in the result set, and that expression retrieves
1162# a column of the second or subsequent table in a join.
1163#
1164do_test where-15.1 {
1165  execsql {
1166    CREATE TEMP TABLE t1 (a, b, c, d, e);
1167    CREATE TEMP TABLE t2 (f);
1168    SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ;
1169  }
1170} {}
1171
1172# Ticket #3408.
1173#
1174# The branch of code in where.c that generated rowid lookups was
1175# incorrectly deallocating a constant register, meaning that if the
1176# vdbe code ran more than once, the second time around the constant
1177# value may have been clobbered by some other value.
1178#
1179do_test where-16.1 {
1180  execsql {
1181    CREATE TABLE a1(id INTEGER PRIMARY KEY, v);
1182    CREATE TABLE a2(id INTEGER PRIMARY KEY, v);
1183    INSERT INTO a1 VALUES(1, 'one');
1184    INSERT INTO a1 VALUES(2, 'two');
1185    INSERT INTO a2 VALUES(1, 'one');
1186    INSERT INTO a2 VALUES(2, 'two');
1187  }
1188} {}
1189do_test where-16.2 {
1190  execsql {
1191    SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one';
1192  }
1193} {1 one 1 one 2 two 1 one}
1194
1195# The actual problem reported in #3408.
1196do_test where-16.3 {
1197  execsql {
1198    CREATE TEMP TABLE foo(idx INTEGER);
1199    INSERT INTO foo VALUES(1);
1200    INSERT INTO foo VALUES(1);
1201    INSERT INTO foo VALUES(1);
1202    INSERT INTO foo VALUES(2);
1203    INSERT INTO foo VALUES(2);
1204    CREATE TEMP TABLE bar(stuff INTEGER);
1205    INSERT INTO bar VALUES(100);
1206    INSERT INTO bar VALUES(200);
1207    INSERT INTO bar VALUES(300);
1208  }
1209} {}
1210do_test where-16.4 {
1211  execsql {
1212    SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2;
1213  }
1214} {2 2}
1215
1216integrity_check {where-99.0}
1217
1218#---------------------------------------------------------------------
1219# These tests test that a bug surrounding the use of ForceInt has been
1220# fixed in where.c.
1221#
1222do_test where-17.1 {
1223  execsql {
1224    CREATE TABLE tbooking (
1225      id INTEGER PRIMARY KEY,
1226      eventtype INTEGER NOT NULL
1227    );
1228    INSERT INTO tbooking VALUES(42, 3);
1229    INSERT INTO tbooking VALUES(43, 4);
1230  }
1231} {}
1232do_test where-17.2 {
1233  execsql {
1234    SELECT a.id
1235    FROM tbooking AS a
1236    WHERE a.eventtype=3;
1237  }
1238} {42}
1239do_test where-17.3 {
1240  execsql {
1241    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
1242    FROM tbooking AS a
1243    WHERE a.eventtype=3;
1244  }
1245} {42 43}
1246do_test where-17.4 {
1247  execsql {
1248    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
1249    FROM (SELECT 1.5 AS id) AS a
1250  }
1251} {1.5 42}
1252do_test where-17.5 {
1253  execsql {
1254    CREATE TABLE tother(a, b);
1255    INSERT INTO tother VALUES(1, 3.7);
1256    SELECT id, a FROM tbooking, tother WHERE id>a;
1257  }
1258} {42 1 43 1}
1259
1260finish_test
1261