xref: /sqlite-3.40.0/test/where.test (revision aeb4e6ee)
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");  -- Verify quoted identifier names
46    CREATE INDEX i1xy ON t1(`x`,'y' ASC); -- Old MySQL compatibility
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.1b {
69  count {SELECT x, y, w FROM t1 WHERE w IS 10}
70} {3 121 10 3}
71do_eqp_test where-1.1.2 {
72  SELECT x, y, w FROM t1 WHERE w=10
73} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
74do_eqp_test where-1.1.2b {
75  SELECT x, y, w FROM t1 WHERE w IS 10
76} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
77do_test where-1.1.3 {
78  db status step
79} {0}
80do_test where-1.1.4 {
81  db eval {SELECT x, y, w FROM t1 WHERE +w=10}
82} {3 121 10}
83do_test where-1.1.5 {
84  db status step
85} {99}
86do_eqp_test where-1.1.6 {
87  SELECT x, y, w FROM t1 WHERE +w=10
88} {*SCAN TABLE t1*}
89do_test where-1.1.7 {
90  count {SELECT x, y, w AS abc FROM t1 WHERE abc=10}
91} {3 121 10 3}
92do_eqp_test where-1.1.8 {
93  SELECT x, y, w AS abc FROM t1 WHERE abc=10
94} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
95do_test where-1.1.9 {
96  db status step
97} {0}
98do_test where-1.2.1 {
99  count {SELECT x, y, w FROM t1 WHERE w=11}
100} {3 144 11 3}
101do_test where-1.2.2 {
102  count {SELECT x, y, w AS abc FROM t1 WHERE abc=11}
103} {3 144 11 3}
104do_test where-1.3.1 {
105  count {SELECT x, y, w AS abc FROM t1 WHERE 11=w}
106} {3 144 11 3}
107do_test where-1.3.2 {
108  count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc}
109} {3 144 11 3}
110do_test where-1.3.3 {
111  count {SELECT x, y, w AS abc FROM t1 WHERE 11 IS abc}
112} {3 144 11 3}
113do_test where-1.4.1 {
114  count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2}
115} {11 3 144 3}
116do_test where-1.4.1b {
117  count {SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2}
118} {11 3 144 3}
119do_eqp_test where-1.4.2 {
120  SELECT w, x, y FROM t1 WHERE 11=w AND x>2
121} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
122do_eqp_test where-1.4.2b {
123  SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2
124} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
125do_test where-1.4.3 {
126  count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2}
127} {11 3 144 3}
128do_eqp_test where-1.4.4 {
129  SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2
130} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
131do_test where-1.5 {
132  count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2}
133} {3 144 3}
134do_eqp_test where-1.5.2 {
135  SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2
136} {*SEARCH TABLE t1 USING INDEX i1w (w=?)*}
137do_test where-1.6 {
138  count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11}
139} {3 144 3}
140do_test where-1.7 {
141  count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2}
142} {3 144 3}
143do_test where-1.8 {
144  count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3}
145} {3 144 3}
146do_eqp_test where-1.8.2 {
147  SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3
148} {*SEARCH TABLE t1 USING INDEX i1xy (x=? AND y=?)*}
149do_eqp_test where-1.8.3 {
150  SELECT x, y FROM t1 WHERE y=144 AND x=3
151} {*SEARCH TABLE t1 USING COVERING INDEX i1xy (x=? AND y=?)*}
152do_test where-1.9 {
153  count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3}
154} {3 144 3}
155do_test where-1.10 {
156  count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121}
157} {3 121 3}
158do_test where-1.11 {
159  count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10}
160} {3 100 3}
161do_test where-1.11b {
162  count {SELECT x, y FROM t1 WHERE x IS 3 AND y IS 100 AND w<10}
163} {3 100 3}
164
165# New for SQLite version 2.1: Verify that that inequality constraints
166# are used correctly.
167#
168do_test where-1.12 {
169  count {SELECT w FROM t1 WHERE x=3 AND y<100}
170} {8 3}
171do_test where-1.12b {
172  count {SELECT w FROM t1 WHERE x IS 3 AND y<100}
173} {8 3}
174do_test where-1.13 {
175  count {SELECT w FROM t1 WHERE x=3 AND 100>y}
176} {8 3}
177do_test where-1.14 {
178  count {SELECT w FROM t1 WHERE 3=x AND y<100}
179} {8 3}
180do_test where-1.14b {
181  count {SELECT w FROM t1 WHERE 3 IS x AND y<100}
182} {8 3}
183do_test where-1.15 {
184  count {SELECT w FROM t1 WHERE 3=x AND 100>y}
185} {8 3}
186do_test where-1.16 {
187  count {SELECT w FROM t1 WHERE x=3 AND y<=100}
188} {8 9 5}
189do_test where-1.17 {
190  count {SELECT w FROM t1 WHERE x=3 AND 100>=y}
191} {8 9 5}
192do_test where-1.18 {
193  count {SELECT w FROM t1 WHERE x=3 AND y>225}
194} {15 3}
195do_test where-1.18b {
196  count {SELECT w FROM t1 WHERE x IS 3 AND y>225}
197} {15 3}
198do_test where-1.19 {
199  count {SELECT w FROM t1 WHERE x=3 AND 225<y}
200} {15 3}
201do_test where-1.20 {
202  count {SELECT w FROM t1 WHERE x=3 AND y>=225}
203} {14 15 5}
204do_test where-1.21 {
205  count {SELECT w FROM t1 WHERE x=3 AND 225<=y}
206} {14 15 5}
207do_test where-1.22 {
208  count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196}
209} {11 12 5}
210do_test where-1.22b {
211  count {SELECT w FROM t1 WHERE x IS 3 AND y>121 AND y<196}
212} {11 12 5}
213do_test where-1.23 {
214  count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196}
215} {10 11 12 13 9}
216do_test where-1.24 {
217  count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y}
218} {11 12 5}
219do_test where-1.25 {
220  count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y}
221} {10 11 12 13 9}
222
223# Need to work on optimizing the BETWEEN operator.
224#
225# do_test where-1.26 {
226#   count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196}
227# } {10 11 12 13 9}
228
229do_test where-1.27 {
230  count {SELECT w FROM t1 WHERE x=3 AND y+1==122}
231} {10 10}
232
233do_test where-1.28 {
234  count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122}
235} {10 99}
236do_test where-1.29 {
237  count {SELECT w FROM t1 WHERE y==121}
238} {10 99}
239
240
241do_test where-1.30 {
242  count {SELECT w FROM t1 WHERE w>97}
243} {98 99 100 3}
244do_test where-1.31 {
245  count {SELECT w FROM t1 WHERE w>=97}
246} {97 98 99 100 4}
247do_test where-1.33 {
248  count {SELECT w FROM t1 WHERE w==97}
249} {97 2}
250do_test where-1.33.1  {
251  count {SELECT w FROM t1 WHERE w<=97 AND w==97}
252} {97 2}
253do_test where-1.33.2  {
254  count {SELECT w FROM t1 WHERE w<98 AND w==97}
255} {97 2}
256do_test where-1.33.3  {
257  count {SELECT w FROM t1 WHERE w>=97 AND w==97}
258} {97 2}
259do_test where-1.33.4  {
260  count {SELECT w FROM t1 WHERE w>96 AND w==97}
261} {97 2}
262do_test where-1.33.5  {
263  count {SELECT w FROM t1 WHERE w==97 AND w==97}
264} {97 2}
265do_test where-1.34 {
266  count {SELECT w FROM t1 WHERE w+1==98}
267} {97 99}
268do_test where-1.35 {
269  count {SELECT w FROM t1 WHERE w<3}
270} {1 2 3}
271do_test where-1.36 {
272  count {SELECT w FROM t1 WHERE w<=3}
273} {1 2 3 4}
274do_test where-1.37 {
275  count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w}
276} {1 2 3 99}
277
278do_test where-1.38 {
279  count {SELECT (w) FROM t1 WHERE (w)>(97)}
280} {98 99 100 3}
281do_test where-1.39 {
282  count {SELECT (w) FROM t1 WHERE (w)>=(97)}
283} {97 98 99 100 4}
284do_test where-1.40 {
285  count {SELECT (w) FROM t1 WHERE (w)==(97)}
286} {97 2}
287do_test where-1.41 {
288  count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)}
289} {97 99}
290
291
292# Do the same kind of thing except use a join as the data source.
293#
294do_test where-2.1 {
295  count {
296    SELECT w, p FROM t2, t1
297    WHERE x=q AND y=s AND r=8977
298  }
299} {34 67 6}
300do_test where-2.2 {
301  count {
302    SELECT w, p FROM t2, t1
303    WHERE x=q AND s=y AND r=8977
304  }
305} {34 67 6}
306do_test where-2.3 {
307  count {
308    SELECT w, p FROM t2, t1
309    WHERE x=q AND s=y AND r=8977 AND w>10
310  }
311} {34 67 6}
312do_test where-2.4 {
313  count {
314    SELECT w, p FROM t2, t1
315    WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10
316  }
317} {34 67 6}
318do_test where-2.5 {
319  count {
320    SELECT w, p FROM t2, t1
321    WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10
322  }
323} {34 67 6}
324do_test where-2.6 {
325  count {
326    SELECT w, p FROM t2, t1
327    WHERE x=q AND p=77 AND s=y AND w>5
328  }
329} {24 77 6}
330do_test where-2.7 {
331  count {
332    SELECT w, p FROM t1, t2
333    WHERE x=q AND p>77 AND s=y AND w=5
334  }
335} {5 96 6}
336
337# Lets do a 3-way join.
338#
339do_test where-3.1 {
340  count {
341    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
342    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11
343  }
344} {11 90 11 8}
345do_test where-3.2 {
346  count {
347    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
348    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12
349  }
350} {12 89 12 8}
351do_test where-3.3 {
352  count {
353    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
354    WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y
355  }
356} {15 86 86 8}
357
358# Test to see that the special case of a constant WHERE clause is
359# handled.
360#
361do_test where-4.1 {
362  count {
363    SELECT * FROM t1 WHERE 0
364  }
365} {0}
366do_test where-4.2 {
367  count {
368    SELECT * FROM t1 WHERE 1 LIMIT 1
369  }
370} {1 0 4 0}
371do_test where-4.3 {
372  execsql {
373    SELECT 99 WHERE 0
374  }
375} {}
376do_test where-4.4 {
377  execsql {
378    SELECT 99 WHERE 1
379  }
380} {99}
381do_test where-4.5 {
382  execsql {
383    SELECT 99 WHERE 0.1
384  }
385} {99}
386do_test where-4.6 {
387  execsql {
388    SELECT 99 WHERE 0.0
389  }
390} {}
391do_test where-4.7 {
392  execsql {
393    SELECT count(*) FROM t1 WHERE t1.w
394  }
395} {100}
396
397# Verify that IN operators in a WHERE clause are handled correctly.
398# Omit these tests if the build is not capable of sub-queries.
399#
400ifcapable subquery {
401  do_test where-5.1 {
402    count {
403      SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1;
404    }
405  } {1 0 4 2 1 9 3 1 16 4}
406  do_test where-5.2 {
407    count {
408      SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1;
409    }
410  } {1 0 4 2 1 9 3 1 16 102}
411  do_test where-5.3a {
412    count {
413      SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1;
414    }
415  } {1 0 4 2 1 9 3 1 16 12}
416  do_test where-5.3b {
417    count {
418      SELECT * FROM t1 WHERE w IN (3,-1,1,2) order by 1;
419    }
420  } {1 0 4 2 1 9 3 1 16 12}
421  do_test where-5.3c {
422    count {
423      SELECT * FROM t1 WHERE w IN (3,2,-1,1,2) order by 1;
424    }
425  } {1 0 4 2 1 9 3 1 16 12}
426  do_test where-5.3d {
427    count {
428      SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1 DESC;
429    }
430  } {3 1 16 2 1 9 1 0 4 11}
431  do_test where-5.4 {
432    count {
433      SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1;
434    }
435  } {1 0 4 2 1 9 3 1 16 102}
436  do_test where-5.5 {
437    count {
438      SELECT * FROM t1 WHERE rowid IN
439         (select rowid from t1 where rowid IN (-1,2,4))
440      ORDER BY 1;
441    }
442  } {2 1 9 4 2 25 3}
443  do_test where-5.6 {
444    count {
445      SELECT * FROM t1 WHERE rowid+0 IN
446         (select rowid from t1 where rowid IN (-1,2,4))
447      ORDER BY 1;
448    }
449  } {2 1 9 4 2 25 103}
450  do_test where-5.7 {
451    count {
452      SELECT * FROM t1 WHERE w IN
453         (select rowid from t1 where rowid IN (-1,2,4))
454      ORDER BY 1;
455    }
456  } {2 1 9 4 2 25 9}
457  do_test where-5.8 {
458    count {
459      SELECT * FROM t1 WHERE w+0 IN
460         (select rowid from t1 where rowid IN (-1,2,4))
461      ORDER BY 1;
462    }
463  } {2 1 9 4 2 25 103}
464  do_test where-5.9 {
465    count {
466      SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1;
467    }
468  } {2 1 9 3 1 16 6}
469  do_test where-5.10 {
470    count {
471      SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1;
472    }
473  } {2 1 9 3 1 16 199}
474  do_test where-5.11 {
475    count {
476      SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1;
477    }
478  } {79 6 6400 89 6 8100 199}
479  do_test where-5.12 {
480    count {
481      SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1;
482    }
483  } {79 6 6400 89 6 8100 7}
484  do_test where-5.13 {
485    count {
486      SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1;
487    }
488  } {2 1 9 3 1 16 6}
489  do_test where-5.14 {
490    count {
491      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
492    }
493  } {2 1 9 5}
494  do_test where-5.15 {
495    count {
496      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1;
497    }
498  } {2 1 9 3 1 16 9}
499  do_test where-5.100 {
500    db eval {
501      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
502       ORDER BY x, y
503    }
504  } {2 1 9 54 5 3025 62 5 3969}
505  do_test where-5.101 {
506    db eval {
507      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
508       ORDER BY x DESC, y DESC
509    }
510  } {62 5 3969 54 5 3025 2 1 9}
511  do_test where-5.102 {
512    db eval {
513      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
514       ORDER BY x DESC, y
515    }
516  } {54 5 3025 62 5 3969 2 1 9}
517  do_test where-5.103 {
518    db eval {
519      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
520       ORDER BY x, y DESC
521    }
522  } {2 1 9 62 5 3969 54 5 3025}
523}
524
525# This procedure executes the SQL.  Then it checks to see if the OP_Sort
526# opcode was executed.  If an OP_Sort did occur, then "sort" is appended
527# to the result.  If no OP_Sort happened, then "nosort" is appended.
528#
529# This procedure is used to check to make sure sorting is or is not
530# occurring as expected.
531#
532proc cksort {sql} {
533  set data [execsql $sql]
534  if {[db status sort]} {set x sort} {set x nosort}
535  lappend data $x
536  return $data
537}
538# Check out the logic that attempts to implement the ORDER BY clause
539# using an index rather than by sorting.
540#
541do_test where-6.1 {
542  execsql {
543    CREATE TABLE t3(a,b,c);
544    CREATE INDEX t3a ON t3(a);
545    CREATE INDEX t3bc ON t3(b,c);
546    CREATE INDEX t3acb ON t3(a,c,b);
547    INSERT INTO t3 SELECT w, 101-w, y FROM t1;
548    SELECT count(*), sum(a), sum(b), sum(c) FROM t3;
549  }
550} {100 5050 5050 348550}
551do_test where-6.2 {
552  cksort {
553    SELECT * FROM t3 ORDER BY a LIMIT 3
554  }
555} {1 100 4 2 99 9 3 98 16 nosort}
556do_test where-6.3 {
557  cksort {
558    SELECT * FROM t3 ORDER BY a+1 LIMIT 3
559  }
560} {1 100 4 2 99 9 3 98 16 sort}
561do_test where-6.4 {
562  cksort {
563    SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3
564  }
565} {1 100 4 2 99 9 3 98 16 nosort}
566do_test where-6.5 {
567  cksort {
568    SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3
569  }
570} {1 100 4 2 99 9 3 98 16 nosort}
571do_test where-6.6 {
572  cksort {
573    SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3
574  }
575} {1 100 4 2 99 9 3 98 16 nosort}
576do_test where-6.7.1 {
577  cksort {
578    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 10
579  }
580} {/1 100 4 2 99 9 3 98 16 .* nosort/}
581do_test where-6.7.2 {
582  cksort {
583    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 1
584  }
585} {1 100 4 nosort}
586ifcapable subquery {
587  do_test where-6.8a {
588    cksort {
589      SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3
590    }
591  } {1 100 4 2 99 9 3 98 16 nosort}
592  do_test where-6.8b {
593    cksort {
594      SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a DESC LIMIT 3
595    }
596  } {9 92 100 7 94 64 5 96 36 nosort}
597}
598do_test where-6.9.1 {
599  cksort {
600    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
601  }
602} {1 100 4 nosort}
603do_test where-6.9.1.1 {
604  cksort {
605    SELECT * FROM t3 WHERE a>=1 AND a=1 AND c>0 ORDER BY a LIMIT 3
606  }
607} {1 100 4 nosort}
608do_test where-6.9.1.2 {
609  cksort {
610    SELECT * FROM t3 WHERE a<2 AND a=1 AND c>0 ORDER BY a LIMIT 3
611  }
612} {1 100 4 nosort}
613do_test where-6.9.2 {
614  cksort {
615    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
616  }
617} {1 100 4 nosort}
618do_test where-6.9.3 {
619  cksort {
620    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3
621  }
622} {1 100 4 nosort}
623do_test where-6.9.4 {
624  cksort {
625    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3
626  }
627} {1 100 4 nosort}
628do_test where-6.9.5 {
629  cksort {
630    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3
631  }
632} {1 100 4 nosort}
633do_test where-6.9.6 {
634  cksort {
635    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3
636  }
637} {1 100 4 nosort}
638do_test where-6.9.7 {
639  cksort {
640    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3
641  }
642} {1 100 4 nosort}
643do_test where-6.9.8 {
644  cksort {
645    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3
646  }
647} {1 100 4 nosort}
648do_test where-6.9.9 {
649  cksort {
650    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3
651  }
652} {1 100 4 nosort}
653do_test where-6.10 {
654  cksort {
655    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
656  }
657} {1 100 4 nosort}
658do_test where-6.11 {
659  cksort {
660    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
661  }
662} {1 100 4 nosort}
663do_test where-6.12 {
664  cksort {
665    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3
666  }
667} {1 100 4 nosort}
668do_test where-6.13 {
669  cksort {
670    SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3
671  }
672} {100 1 10201 99 2 10000 98 3 9801 nosort}
673do_test where-6.13.1 {
674  cksort {
675    SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3
676  }
677} {100 1 10201 99 2 10000 98 3 9801 sort}
678do_test where-6.14 {
679  cksort {
680    SELECT * FROM t3 ORDER BY b LIMIT 3
681  }
682} {100 1 10201 99 2 10000 98 3 9801 nosort}
683do_test where-6.15 {
684  cksort {
685    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3
686  }
687} {1 0 2 1 3 1 nosort}
688do_test where-6.16 {
689  cksort {
690    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3
691  }
692} {1 0 2 1 3 1 sort}
693do_test where-6.19 {
694  cksort {
695    SELECT y FROM t1 ORDER BY w LIMIT 3;
696  }
697} {4 9 16 nosort}
698do_test where-6.20 {
699  cksort {
700    SELECT y FROM t1 ORDER BY rowid LIMIT 3;
701  }
702} {4 9 16 nosort}
703do_test where-6.21 {
704  cksort {
705    SELECT y FROM t1 ORDER BY rowid, y LIMIT 3;
706  }
707} {4 9 16 nosort}
708do_test where-6.22 {
709  cksort {
710    SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3;
711  }
712} {4 9 16 nosort}
713do_test where-6.23 {
714  cksort {
715    SELECT y FROM t1 WHERE y>4 ORDER BY rowid, w, x LIMIT 3;
716  }
717} {9 16 25 nosort}
718do_test where-6.24 {
719  cksort {
720    SELECT y FROM t1 WHERE y>=9 ORDER BY rowid, x DESC, w LIMIT 3;
721  }
722} {9 16 25 nosort}
723do_test where-6.25 {
724  cksort {
725    SELECT y FROM t1 WHERE y>4 AND y<25 ORDER BY rowid;
726  }
727} {9 16 nosort}
728do_test where-6.26 {
729  cksort {
730    SELECT y FROM t1 WHERE y>=4 AND y<=25 ORDER BY oid;
731  }
732} {4 9 16 25 nosort}
733do_test where-6.27 {
734  cksort {
735    SELECT y FROM t1 WHERE y<=25 ORDER BY _rowid_, w+y;
736  }
737} {4 9 16 25 nosort}
738
739
740# Tests for reverse-order sorting.
741#
742do_test where-7.1 {
743  cksort {
744    SELECT w FROM t1 WHERE x=3 ORDER BY y;
745  }
746} {8 9 10 11 12 13 14 15 nosort}
747do_test where-7.2 {
748  cksort {
749    SELECT w FROM t1 WHERE x=3 ORDER BY y DESC;
750  }
751} {15 14 13 12 11 10 9 8 nosort}
752do_test where-7.3 {
753  cksort {
754    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3;
755  }
756} {10 11 12 nosort}
757do_test where-7.4 {
758  cksort {
759    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3;
760  }
761} {15 14 13 nosort}
762do_test where-7.5 {
763  cksort {
764    SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC;
765  }
766} {15 14 13 12 11 nosort}
767do_test where-7.6 {
768  cksort {
769    SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC;
770  }
771} {15 14 13 12 11 10 nosort}
772do_test where-7.7 {
773  cksort {
774    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC;
775  }
776} {12 11 10 nosort}
777do_test where-7.8 {
778  cksort {
779    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC;
780  }
781} {13 12 11 10 nosort}
782do_test where-7.9 {
783  cksort {
784    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC;
785  }
786} {13 12 11 nosort}
787do_test where-7.10 {
788  cksort {
789    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC;
790  }
791} {12 11 10 nosort}
792do_test where-7.11 {
793  cksort {
794    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y;
795  }
796} {10 11 12 nosort}
797do_test where-7.12 {
798  cksort {
799    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y;
800  }
801} {10 11 12 13 nosort}
802do_test where-7.13 {
803  cksort {
804    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y;
805  }
806} {11 12 13 nosort}
807do_test where-7.14 {
808  cksort {
809    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y;
810  }
811} {10 11 12 nosort}
812do_test where-7.15 {
813  cksort {
814    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y;
815  }
816} {nosort}
817do_test where-7.16 {
818  cksort {
819    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y;
820  }
821} {8 nosort}
822do_test where-7.17 {
823  cksort {
824    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y;
825  }
826} {nosort}
827do_test where-7.18 {
828  cksort {
829    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y;
830  }
831} {15 nosort}
832do_test where-7.19 {
833  cksort {
834    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC;
835  }
836} {nosort}
837do_test where-7.20 {
838  cksort {
839    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC;
840  }
841} {8 nosort}
842do_test where-7.21 {
843  cksort {
844    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC;
845  }
846} {nosort}
847do_test where-7.22 {
848  cksort {
849    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC;
850  }
851} {15 nosort}
852do_test where-7.23 {
853  cksort {
854    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y;
855  }
856} {nosort}
857do_test where-7.24 {
858  cksort {
859    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y;
860  }
861} {1 nosort}
862do_test where-7.25 {
863  cksort {
864    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y;
865  }
866} {nosort}
867do_test where-7.26 {
868  cksort {
869    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y;
870  }
871} {100 nosort}
872do_test where-7.27 {
873  cksort {
874    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC;
875  }
876} {nosort}
877do_test where-7.28 {
878  cksort {
879    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC;
880  }
881} {1 nosort}
882do_test where-7.29 {
883  cksort {
884    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC;
885  }
886} {nosort}
887do_test where-7.30 {
888  cksort {
889    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC;
890  }
891} {100 nosort}
892do_test where-7.31 {
893  cksort {
894    SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3
895  }
896} {10201 10000 9801 nosort}
897do_test where-7.32 {
898  cksort {
899    SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC
900  }
901} {16 9 4 nosort}
902do_test where-7.33 {
903  cksort {
904    SELECT y FROM t1 WHERE y<=25 ORDER BY rowid DESC
905  }
906} {25 16 9 4 nosort}
907do_test where-7.34 {
908  cksort {
909    SELECT y FROM t1 WHERE y<25 AND y>4 ORDER BY rowid DESC, y DESC
910  }
911} {16 9 nosort}
912do_test where-7.35 {
913  cksort {
914    SELECT y FROM t1 WHERE y<25 AND y>=4 ORDER BY rowid DESC
915  }
916} {16 9 4 nosort}
917
918do_test where-8.1 {
919  execsql {
920    CREATE TABLE t4 AS SELECT * FROM t1;
921    CREATE INDEX i4xy ON t4(x,y);
922  }
923  cksort {
924    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
925  }
926} {30 29 28 nosort}
927do_test where-8.2 {
928  execsql {
929    DELETE FROM t4;
930  }
931  cksort {
932    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
933  }
934} {nosort}
935
936# Make sure searches with an index work with an empty table.
937#
938do_test where-9.1 {
939  execsql {
940    CREATE TABLE t5(x PRIMARY KEY);
941    SELECT * FROM t5 WHERE x<10;
942  }
943} {}
944do_test where-9.2 {
945  execsql {
946    SELECT * FROM t5 WHERE x<10 ORDER BY x DESC;
947  }
948} {}
949do_test where-9.3 {
950  execsql {
951    SELECT * FROM t5 WHERE x=10;
952  }
953} {}
954
955do_test where-10.1 {
956  execsql {
957    SELECT 1 WHERE abs(random())<0
958  }
959} {}
960do_test where-10.2 {
961  proc tclvar_func {vname} {return [set ::$vname]}
962  db function tclvar tclvar_func
963  set ::v1 0
964  execsql {
965    SELECT count(*) FROM t1 WHERE tclvar('v1');
966  }
967} {0}
968do_test where-10.3 {
969  set ::v1 1
970  execsql {
971    SELECT count(*) FROM t1 WHERE tclvar('v1');
972  }
973} {100}
974do_test where-10.4 {
975  set ::v1 1
976  proc tclvar_func {vname} {
977    upvar #0 $vname v
978    set v [expr {!$v}]
979    return $v
980  }
981  execsql {
982    SELECT count(*) FROM t1 WHERE tclvar('v1');
983  }
984} {50}
985
986# Ticket #1376.  The query below was causing a segfault.
987# The problem was the age-old error of calling realloc() on an
988# array while there are still pointers to individual elements of
989# that array.
990#
991do_test where-11.1 {
992  execsql {
993   CREATE TABLE t99(Dte INT, X INT);
994   DELETE FROM t99 WHERE (Dte = 2451337) OR (Dte = 2451339) OR
995     (Dte BETWEEN 2451345 AND 2451347) OR (Dte = 2451351) OR
996     (Dte BETWEEN 2451355 AND 2451356) OR (Dte = 2451358) OR
997     (Dte = 2451362) OR (Dte = 2451365) OR (Dte = 2451367) OR
998     (Dte BETWEEN 2451372 AND 2451376) OR (Dte BETWEEN 2451382 AND 2451384) OR
999     (Dte = 2451387) OR (Dte BETWEEN 2451389 AND 2451391) OR
1000     (Dte BETWEEN 2451393 AND 2451395) OR (Dte = 2451400) OR
1001     (Dte = 2451402) OR (Dte = 2451404) OR (Dte BETWEEN 2451416 AND 2451418) OR
1002     (Dte = 2451422) OR (Dte = 2451426) OR (Dte BETWEEN 2451445 AND 2451446) OR
1003     (Dte = 2451456) OR (Dte = 2451458) OR (Dte BETWEEN 2451465 AND 2451467) OR
1004     (Dte BETWEEN 2451469 AND 2451471) OR (Dte = 2451474) OR
1005     (Dte BETWEEN 2451477 AND 2451501) OR (Dte BETWEEN 2451503 AND 2451509) OR
1006     (Dte BETWEEN 2451511 AND 2451514) OR (Dte BETWEEN 2451518 AND 2451521) OR
1007     (Dte BETWEEN 2451523 AND 2451531) OR (Dte BETWEEN 2451533 AND 2451537) OR
1008     (Dte BETWEEN 2451539 AND 2451544) OR (Dte BETWEEN 2451546 AND 2451551) OR
1009     (Dte BETWEEN 2451553 AND 2451555) OR (Dte = 2451557) OR
1010     (Dte BETWEEN 2451559 AND 2451561) OR (Dte = 2451563) OR
1011     (Dte BETWEEN 2451565 AND 2451566) OR (Dte BETWEEN 2451569 AND 2451571) OR
1012     (Dte = 2451573) OR (Dte = 2451575) OR (Dte = 2451577) OR (Dte = 2451581) OR
1013     (Dte BETWEEN 2451583 AND 2451586) OR (Dte BETWEEN 2451588 AND 2451592) OR
1014     (Dte BETWEEN 2451596 AND 2451598) OR (Dte = 2451600) OR
1015     (Dte BETWEEN 2451602 AND 2451603) OR (Dte = 2451606) OR (Dte = 2451611);
1016  }
1017} {}
1018
1019# Ticket #2116:  Make sure sorting by index works well with nn INTEGER PRIMARY
1020# KEY.
1021#
1022do_test where-12.1 {
1023  execsql {
1024    CREATE TABLE t6(a INTEGER PRIMARY KEY, b TEXT);
1025    INSERT INTO t6 VALUES(1,'one');
1026    INSERT INTO t6 VALUES(4,'four');
1027    CREATE INDEX t6i1 ON t6(b);
1028  }
1029  cksort {
1030    SELECT * FROM t6 ORDER BY b;
1031  }
1032} {4 four 1 one nosort}
1033do_test where-12.2 {
1034  cksort {
1035    SELECT * FROM t6 ORDER BY b, a;
1036  }
1037} {4 four 1 one nosort}
1038do_test where-12.3 {
1039  cksort {
1040    SELECT * FROM t6 ORDER BY a;
1041  }
1042} {1 one 4 four nosort}
1043do_test where-12.4 {
1044  cksort {
1045    SELECT * FROM t6 ORDER BY a, b;
1046  }
1047} {1 one 4 four nosort}
1048do_test where-12.5 {
1049  cksort {
1050    SELECT * FROM t6 ORDER BY b DESC;
1051  }
1052} {1 one 4 four nosort}
1053do_test where-12.6 {
1054  cksort {
1055    SELECT * FROM t6 ORDER BY b DESC, a DESC;
1056  }
1057} {1 one 4 four nosort}
1058do_test where-12.7 {
1059  cksort {
1060    SELECT * FROM t6 ORDER BY b DESC, a ASC;
1061  }
1062} {1 one 4 four sort}
1063do_test where-12.8 {
1064  cksort {
1065    SELECT * FROM t6 ORDER BY b ASC, a DESC;
1066  }
1067} {4 four 1 one sort}
1068do_test where-12.9 {
1069  cksort {
1070    SELECT * FROM t6 ORDER BY a DESC;
1071  }
1072} {4 four 1 one nosort}
1073do_test where-12.10 {
1074  cksort {
1075    SELECT * FROM t6 ORDER BY a DESC, b DESC;
1076  }
1077} {4 four 1 one nosort}
1078do_test where-12.11 {
1079  cksort {
1080    SELECT * FROM t6 ORDER BY a DESC, b ASC;
1081  }
1082} {4 four 1 one nosort}
1083do_test where-12.12 {
1084  cksort {
1085    SELECT * FROM t6 ORDER BY a ASC, b DESC;
1086  }
1087} {1 one 4 four nosort}
1088do_test where-13.1 {
1089  execsql {
1090    CREATE TABLE t7(a INTEGER PRIMARY KEY, b TEXT);
1091    INSERT INTO t7 VALUES(1,'one');
1092    INSERT INTO t7 VALUES(4,'four');
1093    CREATE INDEX t7i1 ON t7(b);
1094  }
1095  cksort {
1096    SELECT * FROM t7 ORDER BY b;
1097  }
1098} {4 four 1 one nosort}
1099do_test where-13.2 {
1100  cksort {
1101    SELECT * FROM t7 ORDER BY b, a;
1102  }
1103} {4 four 1 one nosort}
1104do_test where-13.3 {
1105  cksort {
1106    SELECT * FROM t7 ORDER BY a;
1107  }
1108} {1 one 4 four nosort}
1109do_test where-13.4 {
1110  cksort {
1111    SELECT * FROM t7 ORDER BY a, b;
1112  }
1113} {1 one 4 four nosort}
1114do_test where-13.5 {
1115  cksort {
1116    SELECT * FROM t7 ORDER BY b DESC;
1117  }
1118} {1 one 4 four nosort}
1119do_test where-13.6 {
1120  cksort {
1121    SELECT * FROM t7 ORDER BY b DESC, a DESC;
1122  }
1123} {1 one 4 four nosort}
1124do_test where-13.7 {
1125  cksort {
1126    SELECT * FROM t7 ORDER BY b DESC, a ASC;
1127  }
1128} {1 one 4 four sort}
1129do_test where-13.8 {
1130  cksort {
1131    SELECT * FROM t7 ORDER BY b ASC, a DESC;
1132  }
1133} {4 four 1 one sort}
1134do_test where-13.9 {
1135  cksort {
1136    SELECT * FROM t7 ORDER BY a DESC;
1137  }
1138} {4 four 1 one nosort}
1139do_test where-13.10 {
1140  cksort {
1141    SELECT * FROM t7 ORDER BY a DESC, b DESC;
1142  }
1143} {4 four 1 one nosort}
1144do_test where-13.11 {
1145  cksort {
1146    SELECT * FROM t7 ORDER BY a DESC, b ASC;
1147  }
1148} {4 four 1 one nosort}
1149do_test where-13.12 {
1150  cksort {
1151    SELECT * FROM t7 ORDER BY a ASC, b DESC;
1152  }
1153} {1 one 4 four nosort}
1154
1155# Ticket #2211.
1156#
1157# When optimizing out ORDER BY clauses, make sure that trailing terms
1158# of the ORDER BY clause do not reference other tables in a join.
1159#
1160if {[permutation] != "no_optimization"} {
1161do_test where-14.1 {
1162  execsql {
1163    CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT UNIQUE, c CHAR(100));
1164    INSERT INTO t8(a,b) VALUES(1,'one');
1165    INSERT INTO t8(a,b) VALUES(4,'four');
1166  }
1167  cksort {
1168    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b
1169  }
1170} {1/4 1/1 4/4 4/1 nosort}
1171do_test where-14.2 {
1172  cksort {
1173    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b DESC
1174  }
1175} {1/1 1/4 4/1 4/4 nosort}
1176do_test where-14.3 {
1177  cksort {
1178    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b
1179  }
1180} {1/4 1/1 4/4 4/1 nosort}
1181do_test where-14.4 {
1182  cksort {
1183    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b DESC
1184  }
1185} {1/4 1/1 4/4 4/1 nosort}
1186do_test where-14.5 {
1187  # This test case changed from "nosort" to "sort". See ticket 2a5629202f.
1188  cksort {
1189    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b
1190  }
1191} {/4/[14] 4/[14] 1/[14] 1/[14] sort/}
1192do_test where-14.6 {
1193  # This test case changed from "nosort" to "sort". See ticket 2a5629202f.
1194  cksort {
1195    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC
1196  }
1197} {/4/[14] 4/[14] 1/[14] 1/[14] sort/}
1198do_test where-14.7 {
1199  cksort {
1200    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b
1201  }
1202} {4/1 4/4 1/1 1/4 sort}
1203do_test where-14.7.1 {
1204  cksort {
1205    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b
1206  }
1207} {4/1 4/4 1/1 1/4 sort}
1208do_test where-14.7.2 {
1209  cksort {
1210    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b
1211  }
1212} {4/4 4/1 1/4 1/1 nosort}
1213do_test where-14.8 {
1214  cksort {
1215    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC
1216  }
1217} {4/4 4/1 1/4 1/1 sort}
1218do_test where-14.9 {
1219  cksort {
1220    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b
1221  }
1222} {4/4 4/1 1/4 1/1 sort}
1223do_test where-14.10 {
1224  cksort {
1225    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC
1226  }
1227} {4/1 4/4 1/1 1/4 sort}
1228do_test where-14.11 {
1229  cksort {
1230    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b
1231  }
1232} {4/1 4/4 1/1 1/4 sort}
1233do_test where-14.12 {
1234  cksort {
1235    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC
1236  }
1237} {4/4 4/1 1/4 1/1 sort}
1238} ;# {permutation != "no_optimization"}
1239
1240# Ticket #2445.
1241#
1242# There was a crash that could occur when a where clause contains an
1243# alias for an expression in the result set, and that expression retrieves
1244# a column of the second or subsequent table in a join.
1245#
1246do_test where-15.1 {
1247  execsql {
1248    CREATE TEMP TABLE t1 (a, b, c, d, e);
1249    CREATE TEMP TABLE t2 (f);
1250    SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ;
1251  }
1252} {}
1253
1254# Ticket #3408.
1255#
1256# The branch of code in where.c that generated rowid lookups was
1257# incorrectly deallocating a constant register, meaning that if the
1258# vdbe code ran more than once, the second time around the constant
1259# value may have been clobbered by some other value.
1260#
1261do_test where-16.1 {
1262  execsql {
1263    CREATE TABLE a1(id INTEGER PRIMARY KEY, v);
1264    CREATE TABLE a2(id INTEGER PRIMARY KEY, v);
1265    INSERT INTO a1 VALUES(1, 'one');
1266    INSERT INTO a1 VALUES(2, 'two');
1267    INSERT INTO a2 VALUES(1, 'one');
1268    INSERT INTO a2 VALUES(2, 'two');
1269  }
1270} {}
1271do_test where-16.2 {
1272  execsql {
1273    SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one';
1274  }
1275} {1 one 1 one 2 two 1 one}
1276
1277# The actual problem reported in #3408.
1278do_test where-16.3 {
1279  execsql {
1280    CREATE TEMP TABLE foo(idx INTEGER);
1281    INSERT INTO foo VALUES(1);
1282    INSERT INTO foo VALUES(1);
1283    INSERT INTO foo VALUES(1);
1284    INSERT INTO foo VALUES(2);
1285    INSERT INTO foo VALUES(2);
1286    CREATE TEMP TABLE bar(stuff INTEGER);
1287    INSERT INTO bar VALUES(100);
1288    INSERT INTO bar VALUES(200);
1289    INSERT INTO bar VALUES(300);
1290  }
1291} {}
1292do_test where-16.4 {
1293  execsql {
1294    SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2;
1295  }
1296} {2 2}
1297
1298integrity_check {where-99.0}
1299
1300#---------------------------------------------------------------------
1301# These tests test that a bug surrounding the use of ForceInt has been
1302# fixed in where.c.
1303#
1304do_test where-17.1 {
1305  execsql {
1306    CREATE TABLE tbooking (
1307      id INTEGER PRIMARY KEY,
1308      eventtype INTEGER NOT NULL
1309    );
1310    INSERT INTO tbooking VALUES(42, 3);
1311    INSERT INTO tbooking VALUES(43, 4);
1312  }
1313} {}
1314do_test where-17.2 {
1315  execsql {
1316    SELECT a.id
1317    FROM tbooking AS a
1318    WHERE a.eventtype=3;
1319  }
1320} {42}
1321do_test where-17.3 {
1322  execsql {
1323    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
1324    FROM tbooking AS a
1325    WHERE a.eventtype=3;
1326  }
1327} {42 43}
1328do_test where-17.4 {
1329  execsql {
1330    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
1331    FROM (SELECT 1.5 AS id) AS a
1332  }
1333} {1.5 42}
1334do_test where-17.5 {
1335  execsql {
1336    CREATE TABLE tother(a, b);
1337    INSERT INTO tother VALUES(1, 3.7);
1338    SELECT id, a FROM tbooking, tother WHERE id>a;
1339  }
1340} {42 1 43 1}
1341
1342# Ticket [be84e357c035d068135f20bcfe82761bbf95006b]  2013-09-03
1343# Segfault during query involving LEFT JOIN column in the ORDER BY clause.
1344#
1345do_execsql_test where-18.1 {
1346  CREATE TABLE t181(a);
1347  CREATE TABLE t182(b,c);
1348  INSERT INTO t181 VALUES(1);
1349  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL;
1350} {1}
1351do_execsql_test where-18.2 {
1352  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c;
1353} {1}
1354do_execsql_test where-18.3 {
1355  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c;
1356} {1}
1357do_execsql_test where-18.4 {
1358  INSERT INTO t181 VALUES(1),(1),(1),(1);
1359  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c;
1360} {1}
1361do_execsql_test where-18.5 {
1362  INSERT INTO t181 VALUES(2);
1363  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL, +a;
1364} {1 2}
1365do_execsql_test where-18.6 {
1366  INSERT INTO t181 VALUES(2);
1367  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +a, +c IS NULL;
1368} {1 2}
1369
1370# Make sure the OR optimization works on a JOIN
1371#
1372do_execsql_test where-19.0 {
1373  CREATE TABLE t191(a INT UNIQUE NOT NULL, b INT UNIQUE NOT NULL,c,d);
1374  CREATE INDEX t191a ON t1(a);
1375  CREATE INDEX t191b ON t1(b);
1376  CREATE TABLE t192(x INTEGER PRIMARY KEY,y INT, z INT);
1377
1378  EXPLAIN QUERY PLAN
1379  SELECT t191.rowid FROM t192, t191 WHERE (a=y OR b=y) AND x=?1;
1380} {/.* sqlite_autoindex_t191_1 .* sqlite_autoindex_t191_2 .*/}
1381
1382# 2018-04-24 ticket [https://www.sqlite.org/src/info/4ba5abf65c5b0f9a]
1383# Index on expressions leads to an incorrect answer for a LEFT JOIN
1384#
1385do_execsql_test where-20.0 {
1386  CREATE TABLE t201(x);
1387  CREATE TABLE t202(y, z);
1388  INSERT INTO t201 VALUES('key');
1389  INSERT INTO t202 VALUES('key', -1);
1390  CREATE INDEX t202i ON t202(y, ifnull(z, 0));
1391  SELECT count(*) FROM t201 LEFT JOIN t202 ON (x=y) WHERE ifnull(z, 0) >=0;
1392} {0}
1393
1394do_execsql_test where-21.0 {
1395  CREATE TABLE t12(a, b, c);
1396  CREATE TABLE t13(x);
1397  CREATE INDEX t12ab ON t12(b, a);
1398  CREATE INDEX t12ac ON t12(c, a);
1399
1400  INSERT INTO t12 VALUES(4, 0, 1);
1401  INSERT INTO t12 VALUES(4, 1, 0);
1402  INSERT INTO t12 VALUES(5, 0, 1);
1403  INSERT INTO t12 VALUES(5, 1, 0);
1404
1405  INSERT INTO t13 VALUES(1), (2), (3), (4);
1406}
1407do_execsql_test where-21.1 {
1408  SELECT * FROM t12 WHERE
1409  a = (SELECT * FROM (SELECT count(*) FROM t13 LIMIT 5) ORDER BY 1 LIMIT 10)
1410  AND (b=1 OR c=1);
1411} {
1412  4 1 0
1413  4 0 1
1414}
1415
1416# 2018-11-05: ticket [https://www.sqlite.org/src/tktview/65eb38f6e46de8c75e188a]
1417# Incorrect result in LEFT JOIN when STAT4 is enabled.
1418#
1419sqlite3 db :memory:
1420do_execsql_test where-22.1 {
1421  CREATE TABLE t1(a INT);
1422  CREATE INDEX t1a ON t1(a);
1423  INSERT INTO t1(a) VALUES(NULL),(NULL),(42),(NULL),(NULL);
1424  CREATE TABLE t2(dummy INT);
1425  SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL;
1426} {5}
1427
1428# 20190-02-22:  A bug introduced by checkin
1429# https://www.sqlite.org/src/info/fa792714ae62fa98.
1430#
1431do_execsql_test where-23.0 {
1432  DROP TABLE IF EXISTS t1;
1433  DROP TABLE IF EXISTS t2;
1434  CREATE TABLE t1(a INTEGER PRIMARY KEY);
1435  INSERT INTO t1(a) VALUES(1),(2),(3);
1436  CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT);
1437  INSERT INTO t2(y) VALUES(2),(3);
1438  SELECT * FROM t1, t2 WHERE a=y AND y=3;
1439} {3 2 3}
1440
1441#-------------------------------------------------------------------------
1442#
1443reset_db
1444do_execsql_test where-24.0 {
1445  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
1446  INSERT INTO t1 VALUES(1, 'one');
1447  INSERT INTO t1 VALUES(2, 'two');
1448  INSERT INTO t1 VALUES(3, 'three');
1449  INSERT INTO t1 VALUES(4, 'four');
1450}
1451
1452foreach {tn sql res} {
1453  1 "SELECT b FROM t1"                   {one two three four}
1454  2 "SELECT b FROM t1 WHERE a<4"         {one two three}
1455  3 "SELECT b FROM t1 WHERE a>1"         {two three four}
1456  4 "SELECT b FROM t1 WHERE a>1 AND a<4" {two three}
1457
1458  5 "SELECT b FROM t1 WHERE a>? AND a<4" {}
1459  6 "SELECT b FROM t1 WHERE a>1 AND a<?" {}
1460  7 "SELECT b FROM t1 WHERE a>? AND a<?" {}
1461
1462  7 "SELECT b FROM t1 WHERE a>=? AND a<=4" {}
1463  8 "SELECT b FROM t1 WHERE a>=1 AND a<=?" {}
1464  9 "SELECT b FROM t1 WHERE a>=? AND a<=?" {}
1465} {
1466  set rev [list]
1467  foreach r $res { set rev [concat $r $rev] }
1468
1469  do_execsql_test where-24.$tn.1 "$sql"                     $res
1470  do_execsql_test where-24.$tn.2 "$sql ORDER BY rowid"      $res
1471  do_execsql_test where-24.$tn.3 "$sql ORDER BY rowid DESC" $rev
1472
1473  do_execsql_test where-24-$tn.4 "
1474    BEGIN;
1475      DELETE FROM t1;
1476      $sql;
1477      $sql ORDER BY rowid;
1478      $sql ORDER BY rowid DESC;
1479    ROLLBACK;
1480  "
1481}
1482
1483#-------------------------------------------------------------------------
1484#
1485reset_db
1486do_execsql_test where-25.0 {
1487  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
1488  CREATE UNIQUE INDEX i1 ON t1(c);
1489  INSERT INTO t1 VALUES(1, 'one', 'i');
1490  INSERT INTO t1 VALUES(2, 'two', 'ii');
1491
1492  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
1493  CREATE UNIQUE INDEX i2 ON t2(c);
1494  INSERT INTO t2 VALUES(1, 'one', 'i');
1495  INSERT INTO t2 VALUES(2, 'two', 'ii');
1496  INSERT INTO t2 VALUES(3, 'three', 'iii');
1497
1498  PRAGMA writable_schema = 1;
1499  UPDATE sqlite_schema SET rootpage = (
1500    SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
1501  ) WHERE name = 'i1';
1502}
1503db close
1504sqlite3 db test.db
1505do_catchsql_test where-25.1 {
1506  DELETE FROM t1 WHERE c='iii'
1507} {1 {database disk image is malformed}}
1508do_catchsql_test where-25.2 {
1509  INSERT INTO t1 VALUES(4, 'four', 'iii')
1510    ON CONFLICT(c) DO UPDATE SET b=NULL
1511} {1 {database disk image is malformed}}
1512
1513reset_db
1514do_execsql_test where-25.3 {
1515  CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID;
1516  CREATE UNIQUE INDEX i1 ON t1(c);
1517  INSERT INTO t1 VALUES(1, 'one', 'i');
1518  INSERT INTO t1 VALUES(2, 'two', 'ii');
1519
1520  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
1521  CREATE UNIQUE INDEX i2 ON t2(c);
1522  INSERT INTO t2 VALUES(1, 'one', 'i');
1523  INSERT INTO t2 VALUES(2, 'two', 'ii');
1524  INSERT INTO t2 VALUES(3, 'three', 'iii');
1525
1526  PRAGMA writable_schema = 1;
1527  UPDATE sqlite_schema SET rootpage = (
1528    SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
1529  ) WHERE name = 'i1';
1530}
1531db close
1532sqlite3 db test.db
1533do_catchsql_test where-25.4 {
1534  SELECT * FROM t1 WHERE c='iii'
1535} {0 {}}
1536do_catchsql_test where-25.5 {
1537  INSERT INTO t1 VALUES(4, 'four', 'iii')
1538    ON CONFLICT(c) DO UPDATE SET b=NULL
1539} {1 {corrupt database}}
1540
1541# 2019-08-21 Ticket https://www.sqlite.org/src/info/d9f584e936c7a8d0
1542#
1543db close
1544sqlite3 db :memory:
1545do_execsql_test where-26.1 {
1546  CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT);
1547  INSERT INTO t0(c0, c1) VALUES (1, 'a');
1548  CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT);
1549  INSERT INTO t1(c0, c1) VALUES (1, 'a');
1550  SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0;
1551} {1 a}
1552do_execsql_test where-26.2 {
1553  SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0;
1554} {1 a}
1555do_execsql_test where-26.3 {
1556  SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0;
1557} {1 a}
1558do_execsql_test where-26.4 {
1559  SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0;
1560} {1 a}
1561do_execsql_test where-26.5 {
1562  SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0;
1563} {1}
1564do_execsql_test where-26.6 {
1565  SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1;
1566} {1}
1567do_execsql_test where-26.7 {
1568  SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0;
1569} {1}
1570do_execsql_test where-26.8 {
1571  SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1;
1572} {1}
1573
1574finish_test
1575