xref: /sqlite-3.40.0/test/where.test (revision cc212e44)
1588a9a1aSdrh# 2001 September 15
26de4f4caSdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
56de4f4caSdrh#
6b19a2bc6Sdrh#    May you do good and not evil.
7b19a2bc6Sdrh#    May you find forgiveness for yourself and forgive others.
8b19a2bc6Sdrh#    May you share freely, never taking more than you give.
96de4f4caSdrh#
106de4f4caSdrh#***********************************************************************
116de4f4caSdrh# This file implements regression tests for SQLite library.  The
126de4f4caSdrh# focus of this file is testing the use of indices in WHERE clases.
136de4f4caSdrh#
146de4f4caSdrh
156de4f4caSdrhset testdir [file dirname $argv0]
166de4f4caSdrhsource $testdir/tester.tcl
176de4f4caSdrh
186de4f4caSdrh# Build some test data
196de4f4caSdrh#
206de4f4caSdrhdo_test where-1.0 {
216de4f4caSdrh  execsql {
226de4f4caSdrh    CREATE TABLE t1(w int, x int, y int);
236de4f4caSdrh    CREATE TABLE t2(p int, q int, r int, s int);
246de4f4caSdrh  }
256de4f4caSdrh  for {set i 1} {$i<=100} {incr i} {
266de4f4caSdrh    set w $i
276de4f4caSdrh    set x [expr {int(log($i)/log(2))}]
286de4f4caSdrh    set y [expr {$i*$i + 2*$i + 1}]
296de4f4caSdrh    execsql "INSERT INTO t1 VALUES($w,$x,$y)"
306de4f4caSdrh  }
313e8c37e7Sdanielk1977
323e8c37e7Sdanielk1977  ifcapable subquery {
336de4f4caSdrh    execsql {
346de4f4caSdrh      INSERT INTO t2 SELECT 101-w, x, (SELECT max(y) FROM t1)+1-y, y FROM t1;
353e8c37e7Sdanielk1977    }
363e8c37e7Sdanielk1977  } else {
373e8c37e7Sdanielk1977    set maxy [execsql {select max(y) from t1}]
383e8c37e7Sdanielk1977    execsql "
393e8c37e7Sdanielk1977      INSERT INTO t2 SELECT 101-w, x, $maxy+1-y, y FROM t1;
403e8c37e7Sdanielk1977    "
413e8c37e7Sdanielk1977  }
423e8c37e7Sdanielk1977
433e8c37e7Sdanielk1977  execsql {
44edb04ed9Sdrh    CREATE INDEX i1w ON t1("w");  -- Verify quoted identifier names
45edb04ed9Sdrh    CREATE INDEX i1xy ON t1(`x`,'y' ASC); -- Old MySQL compatibility
466de4f4caSdrh    CREATE INDEX i2p ON t2(p);
476de4f4caSdrh    CREATE INDEX i2r ON t2(r);
486de4f4caSdrh    CREATE INDEX i2qs ON t2(q, s);
496de4f4caSdrh  }
506de4f4caSdrh} {}
516de4f4caSdrh
52487ab3caSdrh# Do an SQL statement.  Append the search count to the end of the result.
53487ab3caSdrh#
54487ab3caSdrhproc count sql {
55487ab3caSdrh  set ::sqlite_search_count 0
56487ab3caSdrh  return [concat [execsql $sql] $::sqlite_search_count]
57487ab3caSdrh}
58487ab3caSdrh
59487ab3caSdrh# Verify that queries use an index.  We are using the special variable
60487ab3caSdrh# "sqlite_search_count" which tallys the number of executions of MoveTo
61487ab3caSdrh# and Next operators in the VDBE.  By verifing that the search count is
62487ab3caSdrh# small we can be assured that indices are being used properly.
636de4f4caSdrh#
644f07e5fbSdrhdo_test where-1.1.1 {
654f07e5fbSdrh  count {SELECT x, y, w FROM t1 WHERE w=10}
664f07e5fbSdrh} {3 121 10 3}
67e0cc3c29Sdrhdo_test where-1.1.1b {
68e0cc3c29Sdrh  count {SELECT x, y, w FROM t1 WHERE w IS 10}
69e0cc3c29Sdrh} {3 121 10 3}
706fa978daSdrhdo_eqp_test where-1.1.2 {
716fa978daSdrh  SELECT x, y, w FROM t1 WHERE w=10
728210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
73e0cc3c29Sdrhdo_eqp_test where-1.1.2b {
74e0cc3c29Sdrh  SELECT x, y, w FROM t1 WHERE w IS 10
758210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
764f07e5fbSdrhdo_test where-1.1.3 {
77d1d38488Sdrh  db status step
78d1d38488Sdrh} {0}
79d1d38488Sdrhdo_test where-1.1.4 {
80d1d38488Sdrh  db eval {SELECT x, y, w FROM t1 WHERE +w=10}
81d1d38488Sdrh} {3 121 10}
82d1d38488Sdrhdo_test where-1.1.5 {
83d1d38488Sdrh  db status step
84d1d38488Sdrh} {99}
856fa978daSdrhdo_eqp_test where-1.1.6 {
866fa978daSdrh  SELECT x, y, w FROM t1 WHERE +w=10
878210233cSdrh} {*SCAN t1*}
88d1d38488Sdrhdo_test where-1.1.7 {
894f07e5fbSdrh  count {SELECT x, y, w AS abc FROM t1 WHERE abc=10}
904f07e5fbSdrh} {3 121 10 3}
916fa978daSdrhdo_eqp_test where-1.1.8 {
926fa978daSdrh  SELECT x, y, w AS abc FROM t1 WHERE abc=10
938210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
94d1d38488Sdrhdo_test where-1.1.9 {
95d1d38488Sdrh  db status step
96d1d38488Sdrh} {0}
974f07e5fbSdrhdo_test where-1.2.1 {
984f07e5fbSdrh  count {SELECT x, y, w FROM t1 WHERE w=11}
994f07e5fbSdrh} {3 144 11 3}
1004f07e5fbSdrhdo_test where-1.2.2 {
1014f07e5fbSdrh  count {SELECT x, y, w AS abc FROM t1 WHERE abc=11}
1024f07e5fbSdrh} {3 144 11 3}
1034f07e5fbSdrhdo_test where-1.3.1 {
1044f07e5fbSdrh  count {SELECT x, y, w AS abc FROM t1 WHERE 11=w}
1054f07e5fbSdrh} {3 144 11 3}
1064f07e5fbSdrhdo_test where-1.3.2 {
1074f07e5fbSdrh  count {SELECT x, y, w AS abc FROM t1 WHERE 11=abc}
1084f07e5fbSdrh} {3 144 11 3}
109e0cc3c29Sdrhdo_test where-1.3.3 {
110e0cc3c29Sdrh  count {SELECT x, y, w AS abc FROM t1 WHERE 11 IS abc}
111e0cc3c29Sdrh} {3 144 11 3}
1124f07e5fbSdrhdo_test where-1.4.1 {
1134f07e5fbSdrh  count {SELECT w, x, y FROM t1 WHERE 11=w AND x>2}
1144f07e5fbSdrh} {11 3 144 3}
115e0cc3c29Sdrhdo_test where-1.4.1b {
116e0cc3c29Sdrh  count {SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2}
117e0cc3c29Sdrh} {11 3 144 3}
1186fa978daSdrhdo_eqp_test where-1.4.2 {
1196fa978daSdrh  SELECT w, x, y FROM t1 WHERE 11=w AND x>2
1208210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
121e0cc3c29Sdrhdo_eqp_test where-1.4.2b {
122e0cc3c29Sdrh  SELECT w, x, y FROM t1 WHERE 11 IS w AND x>2
1238210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
1244f07e5fbSdrhdo_test where-1.4.3 {
1254f07e5fbSdrh  count {SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2}
1264f07e5fbSdrh} {11 3 144 3}
1276fa978daSdrhdo_eqp_test where-1.4.4 {
1286fa978daSdrh  SELECT w AS a, x AS b, y FROM t1 WHERE 11=a AND b>2
1298210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
1306de4f4caSdrhdo_test where-1.5 {
131487ab3caSdrh  count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2}
132487ab3caSdrh} {3 144 3}
1336fa978daSdrhdo_eqp_test where-1.5.2 {
1346fa978daSdrh  SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2
1358210233cSdrh} {*SEARCH t1 USING INDEX i1w (w=?)*}
1366de4f4caSdrhdo_test where-1.6 {
137487ab3caSdrh  count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11}
138487ab3caSdrh} {3 144 3}
1396de4f4caSdrhdo_test where-1.7 {
140487ab3caSdrh  count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2}
141487ab3caSdrh} {3 144 3}
1426de4f4caSdrhdo_test where-1.8 {
143487ab3caSdrh  count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3}
144487ab3caSdrh} {3 144 3}
1456fa978daSdrhdo_eqp_test where-1.8.2 {
1466fa978daSdrh  SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3
1478210233cSdrh} {*SEARCH t1 USING INDEX i1xy (x=? AND y=?)*}
1486fa978daSdrhdo_eqp_test where-1.8.3 {
1496fa978daSdrh  SELECT x, y FROM t1 WHERE y=144 AND x=3
1508210233cSdrh} {*SEARCH t1 USING COVERING INDEX i1xy (x=? AND y=?)*}
1516de4f4caSdrhdo_test where-1.9 {
152487ab3caSdrh  count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3}
153487ab3caSdrh} {3 144 3}
1546de4f4caSdrhdo_test where-1.10 {
155487ab3caSdrh  count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121}
156487ab3caSdrh} {3 121 3}
1576de4f4caSdrhdo_test where-1.11 {
158487ab3caSdrh  count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10}
159487ab3caSdrh} {3 100 3}
160e0cc3c29Sdrhdo_test where-1.11b {
161e0cc3c29Sdrh  count {SELECT x, y FROM t1 WHERE x IS 3 AND y IS 100 AND w<10}
162e0cc3c29Sdrh} {3 100 3}
163487ab3caSdrh
164487ab3caSdrh# New for SQLite version 2.1: Verify that that inequality constraints
165487ab3caSdrh# are used correctly.
166487ab3caSdrh#
167487ab3caSdrhdo_test where-1.12 {
168487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y<100}
169487ab3caSdrh} {8 3}
170e0cc3c29Sdrhdo_test where-1.12b {
171e0cc3c29Sdrh  count {SELECT w FROM t1 WHERE x IS 3 AND y<100}
172e0cc3c29Sdrh} {8 3}
173487ab3caSdrhdo_test where-1.13 {
174487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 100>y}
175487ab3caSdrh} {8 3}
176487ab3caSdrhdo_test where-1.14 {
177487ab3caSdrh  count {SELECT w FROM t1 WHERE 3=x AND y<100}
178487ab3caSdrh} {8 3}
179e0cc3c29Sdrhdo_test where-1.14b {
180e0cc3c29Sdrh  count {SELECT w FROM t1 WHERE 3 IS x AND y<100}
181e0cc3c29Sdrh} {8 3}
182487ab3caSdrhdo_test where-1.15 {
183487ab3caSdrh  count {SELECT w FROM t1 WHERE 3=x AND 100>y}
184487ab3caSdrh} {8 3}
185487ab3caSdrhdo_test where-1.16 {
186487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y<=100}
187487ab3caSdrh} {8 9 5}
188487ab3caSdrhdo_test where-1.17 {
189487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 100>=y}
190487ab3caSdrh} {8 9 5}
191487ab3caSdrhdo_test where-1.18 {
192487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y>225}
193487ab3caSdrh} {15 3}
194e0cc3c29Sdrhdo_test where-1.18b {
195e0cc3c29Sdrh  count {SELECT w FROM t1 WHERE x IS 3 AND y>225}
196e0cc3c29Sdrh} {15 3}
197487ab3caSdrhdo_test where-1.19 {
198487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 225<y}
199487ab3caSdrh} {15 3}
200487ab3caSdrhdo_test where-1.20 {
201487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y>=225}
202487ab3caSdrh} {14 15 5}
203487ab3caSdrhdo_test where-1.21 {
204487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 225<=y}
205487ab3caSdrh} {14 15 5}
206487ab3caSdrhdo_test where-1.22 {
207487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196}
208487ab3caSdrh} {11 12 5}
209e0cc3c29Sdrhdo_test where-1.22b {
210e0cc3c29Sdrh  count {SELECT w FROM t1 WHERE x IS 3 AND y>121 AND y<196}
211e0cc3c29Sdrh} {11 12 5}
212487ab3caSdrhdo_test where-1.23 {
213487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196}
214487ab3caSdrh} {10 11 12 13 9}
215487ab3caSdrhdo_test where-1.24 {
216487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y}
217487ab3caSdrh} {11 12 5}
218487ab3caSdrhdo_test where-1.25 {
219487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y}
220487ab3caSdrh} {10 11 12 13 9}
221487ab3caSdrh
222487ab3caSdrh# Need to work on optimizing the BETWEEN operator.
223487ab3caSdrh#
224487ab3caSdrh# do_test where-1.26 {
225487ab3caSdrh#   count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196}
226487ab3caSdrh# } {10 11 12 13 9}
227487ab3caSdrh
228487ab3caSdrhdo_test where-1.27 {
229487ab3caSdrh  count {SELECT w FROM t1 WHERE x=3 AND y+1==122}
23021de2e75Sdanielk1977} {10 10}
2317cf6e4deSdrh
232487ab3caSdrhdo_test where-1.28 {
233487ab3caSdrh  count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122}
234487ab3caSdrh} {10 99}
235487ab3caSdrhdo_test where-1.29 {
236487ab3caSdrh  count {SELECT w FROM t1 WHERE y==121}
237487ab3caSdrh} {10 99}
238487ab3caSdrh
239487ab3caSdrh
240487ab3caSdrhdo_test where-1.30 {
241487ab3caSdrh  count {SELECT w FROM t1 WHERE w>97}
2429012bcbcSdrh} {98 99 100 3}
243487ab3caSdrhdo_test where-1.31 {
244487ab3caSdrh  count {SELECT w FROM t1 WHERE w>=97}
2459012bcbcSdrh} {97 98 99 100 4}
246487ab3caSdrhdo_test where-1.33 {
247487ab3caSdrh  count {SELECT w FROM t1 WHERE w==97}
2489012bcbcSdrh} {97 2}
249ac931eb9Sdrhdo_test where-1.33.1  {
250ac931eb9Sdrh  count {SELECT w FROM t1 WHERE w<=97 AND w==97}
251ac931eb9Sdrh} {97 2}
252ac931eb9Sdrhdo_test where-1.33.2  {
253ac931eb9Sdrh  count {SELECT w FROM t1 WHERE w<98 AND w==97}
254ac931eb9Sdrh} {97 2}
255ac931eb9Sdrhdo_test where-1.33.3  {
256ac931eb9Sdrh  count {SELECT w FROM t1 WHERE w>=97 AND w==97}
257ac931eb9Sdrh} {97 2}
258ac931eb9Sdrhdo_test where-1.33.4  {
259ac931eb9Sdrh  count {SELECT w FROM t1 WHERE w>96 AND w==97}
260ac931eb9Sdrh} {97 2}
261ac931eb9Sdrhdo_test where-1.33.5  {
262ac931eb9Sdrh  count {SELECT w FROM t1 WHERE w==97 AND w==97}
263ac931eb9Sdrh} {97 2}
264487ab3caSdrhdo_test where-1.34 {
265487ab3caSdrh  count {SELECT w FROM t1 WHERE w+1==98}
266487ab3caSdrh} {97 99}
267487ab3caSdrhdo_test where-1.35 {
268487ab3caSdrh  count {SELECT w FROM t1 WHERE w<3}
269cfc6ca41Sdrh} {1 2 3}
270487ab3caSdrhdo_test where-1.36 {
271487ab3caSdrh  count {SELECT w FROM t1 WHERE w<=3}
272cfc6ca41Sdrh} {1 2 3 4}
273487ab3caSdrhdo_test where-1.37 {
2748aff1015Sdrh  count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w}
2759012bcbcSdrh} {1 2 3 99}
276487ab3caSdrh
2776977fea8Sdrhdo_test where-1.38 {
2786977fea8Sdrh  count {SELECT (w) FROM t1 WHERE (w)>(97)}
2799012bcbcSdrh} {98 99 100 3}
2806977fea8Sdrhdo_test where-1.39 {
2816977fea8Sdrh  count {SELECT (w) FROM t1 WHERE (w)>=(97)}
2829012bcbcSdrh} {97 98 99 100 4}
2836977fea8Sdrhdo_test where-1.40 {
2846977fea8Sdrh  count {SELECT (w) FROM t1 WHERE (w)==(97)}
2859012bcbcSdrh} {97 2}
2866977fea8Sdrhdo_test where-1.41 {
2876977fea8Sdrh  count {SELECT (w) FROM t1 WHERE ((w)+(1))==(98)}
2886977fea8Sdrh} {97 99}
2896977fea8Sdrh
2906de4f4caSdrh
2916de4f4caSdrh# Do the same kind of thing except use a join as the data source.
2926de4f4caSdrh#
2936de4f4caSdrhdo_test where-2.1 {
294487ab3caSdrh  count {
295487ab3caSdrh    SELECT w, p FROM t2, t1
2966de4f4caSdrh    WHERE x=q AND y=s AND r=8977
2976de4f4caSdrh  }
298487ab3caSdrh} {34 67 6}
2996de4f4caSdrhdo_test where-2.2 {
300487ab3caSdrh  count {
301487ab3caSdrh    SELECT w, p FROM t2, t1
3026de4f4caSdrh    WHERE x=q AND s=y AND r=8977
3036de4f4caSdrh  }
304487ab3caSdrh} {34 67 6}
3056de4f4caSdrhdo_test where-2.3 {
306487ab3caSdrh  count {
307487ab3caSdrh    SELECT w, p FROM t2, t1
3086de4f4caSdrh    WHERE x=q AND s=y AND r=8977 AND w>10
3096de4f4caSdrh  }
310487ab3caSdrh} {34 67 6}
3116de4f4caSdrhdo_test where-2.4 {
312487ab3caSdrh  count {
313487ab3caSdrh    SELECT w, p FROM t2, t1
3146de4f4caSdrh    WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10
3156de4f4caSdrh  }
316487ab3caSdrh} {34 67 6}
3176de4f4caSdrhdo_test where-2.5 {
318487ab3caSdrh  count {
319487ab3caSdrh    SELECT w, p FROM t2, t1
3206de4f4caSdrh    WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10
3216de4f4caSdrh  }
322487ab3caSdrh} {34 67 6}
3236de4f4caSdrhdo_test where-2.6 {
324487ab3caSdrh  count {
325487ab3caSdrh    SELECT w, p FROM t2, t1
3266de4f4caSdrh    WHERE x=q AND p=77 AND s=y AND w>5
3276de4f4caSdrh  }
328487ab3caSdrh} {24 77 6}
3296de4f4caSdrhdo_test where-2.7 {
330487ab3caSdrh  count {
331487ab3caSdrh    SELECT w, p FROM t1, t2
3326de4f4caSdrh    WHERE x=q AND p>77 AND s=y AND w=5
3336de4f4caSdrh  }
334487ab3caSdrh} {5 96 6}
3356de4f4caSdrh
3366de4f4caSdrh# Lets do a 3-way join.
3376de4f4caSdrh#
3386de4f4caSdrhdo_test where-3.1 {
339487ab3caSdrh  count {
340487ab3caSdrh    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
3416de4f4caSdrh    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11
3426de4f4caSdrh  }
3439012bcbcSdrh} {11 90 11 8}
3446de4f4caSdrhdo_test where-3.2 {
345487ab3caSdrh  count {
346487ab3caSdrh    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
3476de4f4caSdrh    WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12
3486de4f4caSdrh  }
3499012bcbcSdrh} {12 89 12 8}
3506de4f4caSdrhdo_test where-3.3 {
351487ab3caSdrh  count {
352487ab3caSdrh    SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C
3536de4f4caSdrh    WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y
3546de4f4caSdrh  }
3559012bcbcSdrh} {15 86 86 8}
3566de4f4caSdrh
35708192d5fSdrh# Test to see that the special case of a constant WHERE clause is
35808192d5fSdrh# handled.
35908192d5fSdrh#
36008192d5fSdrhdo_test where-4.1 {
36108192d5fSdrh  count {
36208192d5fSdrh    SELECT * FROM t1 WHERE 0
36308192d5fSdrh  }
36408192d5fSdrh} {0}
36508192d5fSdrhdo_test where-4.2 {
36608192d5fSdrh  count {
36708192d5fSdrh    SELECT * FROM t1 WHERE 1 LIMIT 1
36808192d5fSdrh  }
369ec7429aeSdrh} {1 0 4 0}
37008192d5fSdrhdo_test where-4.3 {
37108192d5fSdrh  execsql {
37208192d5fSdrh    SELECT 99 WHERE 0
37308192d5fSdrh  }
37408192d5fSdrh} {}
37508192d5fSdrhdo_test where-4.4 {
37608192d5fSdrh  execsql {
37708192d5fSdrh    SELECT 99 WHERE 1
37808192d5fSdrh  }
37908192d5fSdrh} {99}
380ba0232a0Sdrhdo_test where-4.5 {
381ba0232a0Sdrh  execsql {
382ba0232a0Sdrh    SELECT 99 WHERE 0.1
383ba0232a0Sdrh  }
384ba0232a0Sdrh} {99}
385ba0232a0Sdrhdo_test where-4.6 {
386ba0232a0Sdrh  execsql {
387ba0232a0Sdrh    SELECT 99 WHERE 0.0
388ba0232a0Sdrh  }
389ba0232a0Sdrh} {}
39085e9e22bSdrhdo_test where-4.7 {
39185e9e22bSdrh  execsql {
39285e9e22bSdrh    SELECT count(*) FROM t1 WHERE t1.w
39385e9e22bSdrh  }
39485e9e22bSdrh} {100}
39508192d5fSdrh
39648185c15Sdrh# Verify that IN operators in a WHERE clause are handled correctly.
3973e8c37e7Sdanielk1977# Omit these tests if the build is not capable of sub-queries.
39848185c15Sdrh#
3993e8c37e7Sdanielk1977ifcapable subquery {
40048185c15Sdrh  do_test where-5.1 {
40148185c15Sdrh    count {
40248185c15Sdrh      SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1;
40348185c15Sdrh    }
4044db38a70Sdrh  } {1 0 4 2 1 9 3 1 16 4}
40548185c15Sdrh  do_test where-5.2 {
40648185c15Sdrh    count {
40748185c15Sdrh      SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1;
40848185c15Sdrh    }
40921de2e75Sdanielk1977  } {1 0 4 2 1 9 3 1 16 102}
4101b8fc65bSdrh  do_test where-5.3a {
41148185c15Sdrh    count {
41248185c15Sdrh      SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1;
41348185c15Sdrh    }
414b1d607deSdrh  } {1 0 4 2 1 9 3 1 16 12}
4151b8fc65bSdrh  do_test where-5.3b {
4161b8fc65bSdrh    count {
4171b8fc65bSdrh      SELECT * FROM t1 WHERE w IN (3,-1,1,2) order by 1;
4181b8fc65bSdrh    }
419b1d607deSdrh  } {1 0 4 2 1 9 3 1 16 12}
4201b8fc65bSdrh  do_test where-5.3c {
4211b8fc65bSdrh    count {
4221b8fc65bSdrh      SELECT * FROM t1 WHERE w IN (3,2,-1,1,2) order by 1;
4231b8fc65bSdrh    }
424b1d607deSdrh  } {1 0 4 2 1 9 3 1 16 12}
4251b8fc65bSdrh  do_test where-5.3d {
4261b8fc65bSdrh    count {
4271b8fc65bSdrh      SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1 DESC;
4281b8fc65bSdrh    }
429b1d607deSdrh  } {3 1 16 2 1 9 1 0 4 11}
43048185c15Sdrh  do_test where-5.4 {
43148185c15Sdrh    count {
43248185c15Sdrh      SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1;
43348185c15Sdrh    }
43421de2e75Sdanielk1977  } {1 0 4 2 1 9 3 1 16 102}
43548185c15Sdrh  do_test where-5.5 {
43648185c15Sdrh    count {
43748185c15Sdrh      SELECT * FROM t1 WHERE rowid IN
43848185c15Sdrh         (select rowid from t1 where rowid IN (-1,2,4))
43948185c15Sdrh      ORDER BY 1;
44048185c15Sdrh    }
441772ae62aSdrh  } {2 1 9 4 2 25 3}
44248185c15Sdrh  do_test where-5.6 {
44348185c15Sdrh    count {
44448185c15Sdrh      SELECT * FROM t1 WHERE rowid+0 IN
44548185c15Sdrh         (select rowid from t1 where rowid IN (-1,2,4))
44648185c15Sdrh      ORDER BY 1;
44748185c15Sdrh    }
44821de2e75Sdanielk1977  } {2 1 9 4 2 25 103}
44948185c15Sdrh  do_test where-5.7 {
45048185c15Sdrh    count {
45148185c15Sdrh      SELECT * FROM t1 WHERE w IN
45248185c15Sdrh         (select rowid from t1 where rowid IN (-1,2,4))
45348185c15Sdrh      ORDER BY 1;
45448185c15Sdrh    }
455772ae62aSdrh  } {2 1 9 4 2 25 9}
45648185c15Sdrh  do_test where-5.8 {
45748185c15Sdrh    count {
45848185c15Sdrh      SELECT * FROM t1 WHERE w+0 IN
45948185c15Sdrh         (select rowid from t1 where rowid IN (-1,2,4))
46048185c15Sdrh      ORDER BY 1;
46148185c15Sdrh    }
46221de2e75Sdanielk1977  } {2 1 9 4 2 25 103}
46348185c15Sdrh  do_test where-5.9 {
46448185c15Sdrh    count {
46548185c15Sdrh      SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1;
46648185c15Sdrh    }
467b1d607deSdrh  } {2 1 9 3 1 16 6}
46848185c15Sdrh  do_test where-5.10 {
46948185c15Sdrh    count {
47048185c15Sdrh      SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1;
47148185c15Sdrh    }
472e3184744Sdrh  } {2 1 9 3 1 16 199}
47348185c15Sdrh  do_test where-5.11 {
47448185c15Sdrh    count {
47548185c15Sdrh      SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1;
47648185c15Sdrh    }
477e3184744Sdrh  } {79 6 6400 89 6 8100 199}
47848185c15Sdrh  do_test where-5.12 {
47948185c15Sdrh    count {
48048185c15Sdrh      SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1;
48148185c15Sdrh    }
4823adc9cedSdrh  } {79 6 6400 89 6 8100 7}
48348185c15Sdrh  do_test where-5.13 {
48448185c15Sdrh    count {
48548185c15Sdrh      SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1;
48648185c15Sdrh    }
487b1d607deSdrh  } {2 1 9 3 1 16 6}
48848185c15Sdrh  do_test where-5.14 {
48948185c15Sdrh    count {
49048185c15Sdrh      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1;
49148185c15Sdrh    }
492fa17e134Sdrh  } {2 1 9 5}
4933adc9cedSdrh  do_test where-5.15 {
4943adc9cedSdrh    count {
4953adc9cedSdrh      SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,16) ORDER BY 1;
4963adc9cedSdrh    }
497fa17e134Sdrh  } {2 1 9 3 1 16 9}
4982d96b934Sdrh  do_test where-5.100 {
4992d96b934Sdrh    db eval {
5002d96b934Sdrh      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
5012d96b934Sdrh       ORDER BY x, y
5022d96b934Sdrh    }
5032d96b934Sdrh  } {2 1 9 54 5 3025 62 5 3969}
5042d96b934Sdrh  do_test where-5.101 {
5052d96b934Sdrh    db eval {
5062d96b934Sdrh      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
5072d96b934Sdrh       ORDER BY x DESC, y DESC
5082d96b934Sdrh    }
5092d96b934Sdrh  } {62 5 3969 54 5 3025 2 1 9}
5102d96b934Sdrh  do_test where-5.102 {
5112d96b934Sdrh    db eval {
5122d96b934Sdrh      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
5132d96b934Sdrh       ORDER BY x DESC, y
5142d96b934Sdrh    }
5152d96b934Sdrh  } {54 5 3025 62 5 3969 2 1 9}
5162d96b934Sdrh  do_test where-5.103 {
5172d96b934Sdrh    db eval {
5182d96b934Sdrh      SELECT w, x, y FROM t1 WHERE x IN (1,5) AND y IN (9,8,3025,1000,3969)
5192d96b934Sdrh       ORDER BY x, y DESC
5202d96b934Sdrh    }
5212d96b934Sdrh  } {2 1 9 62 5 3969 54 5 3025}
5223e8c37e7Sdanielk1977}
52348185c15Sdrh
5246bf89570Sdrh# This procedure executes the SQL.  Then it checks to see if the OP_Sort
5256bf89570Sdrh# opcode was executed.  If an OP_Sort did occur, then "sort" is appended
5266bf89570Sdrh# to the result.  If no OP_Sort happened, then "nosort" is appended.
5276bf89570Sdrh#
5286bf89570Sdrh# This procedure is used to check to make sure sorting is or is not
5296bf89570Sdrh# occurring as expected.
530e3184744Sdrh#
531e3184744Sdrhproc cksort {sql} {
532e3184744Sdrh  set data [execsql $sql]
533d1d38488Sdrh  if {[db status sort]} {set x sort} {set x nosort}
534e3184744Sdrh  lappend data $x
535e3184744Sdrh  return $data
536e3184744Sdrh}
537e3184744Sdrh# Check out the logic that attempts to implement the ORDER BY clause
538e3184744Sdrh# using an index rather than by sorting.
539e3184744Sdrh#
540e3184744Sdrhdo_test where-6.1 {
541e3184744Sdrh  execsql {
542e3184744Sdrh    CREATE TABLE t3(a,b,c);
543e3184744Sdrh    CREATE INDEX t3a ON t3(a);
544e3184744Sdrh    CREATE INDEX t3bc ON t3(b,c);
545e3184744Sdrh    CREATE INDEX t3acb ON t3(a,c,b);
546e3184744Sdrh    INSERT INTO t3 SELECT w, 101-w, y FROM t1;
547e3184744Sdrh    SELECT count(*), sum(a), sum(b), sum(c) FROM t3;
548e3184744Sdrh  }
5493d1d95e6Sdrh} {100 5050 5050 348550}
550e3184744Sdrhdo_test where-6.2 {
551e3184744Sdrh  cksort {
552e3184744Sdrh    SELECT * FROM t3 ORDER BY a LIMIT 3
553e3184744Sdrh  }
554e3184744Sdrh} {1 100 4 2 99 9 3 98 16 nosort}
555e3184744Sdrhdo_test where-6.3 {
556e3184744Sdrh  cksort {
557e3184744Sdrh    SELECT * FROM t3 ORDER BY a+1 LIMIT 3
558e3184744Sdrh  }
559e3184744Sdrh} {1 100 4 2 99 9 3 98 16 sort}
560e3184744Sdrhdo_test where-6.4 {
561e3184744Sdrh  cksort {
562e3184744Sdrh    SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3
563e3184744Sdrh  }
564e3184744Sdrh} {1 100 4 2 99 9 3 98 16 nosort}
565e3184744Sdrhdo_test where-6.5 {
566e3184744Sdrh  cksort {
567e3184744Sdrh    SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3
568e3184744Sdrh  }
569e3184744Sdrh} {1 100 4 2 99 9 3 98 16 nosort}
570e3184744Sdrhdo_test where-6.6 {
571e3184744Sdrh  cksort {
572e3184744Sdrh    SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3
573e3184744Sdrh  }
574e3184744Sdrh} {1 100 4 2 99 9 3 98 16 nosort}
5758c098e61Sdrhdo_test where-6.7.1 {
576e3184744Sdrh  cksort {
5778c098e61Sdrh    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 10
578e3184744Sdrh  }
5798c098e61Sdrh} {/1 100 4 2 99 9 3 98 16 .* nosort/}
5808c098e61Sdrhdo_test where-6.7.2 {
5818c098e61Sdrh  cksort {
5828c098e61Sdrh    SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 1
5838c098e61Sdrh  }
584f559ed34Sdrh} {1 100 4 nosort}
5853e8c37e7Sdanielk1977ifcapable subquery {
5861b8fc65bSdrh  do_test where-6.8a {
587e3184744Sdrh    cksort {
588e3184744Sdrh      SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3
589e3184744Sdrh    }
5901b8fc65bSdrh  } {1 100 4 2 99 9 3 98 16 nosort}
5911b8fc65bSdrh  do_test where-6.8b {
5921b8fc65bSdrh    cksort {
5931b8fc65bSdrh      SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a DESC LIMIT 3
5941b8fc65bSdrh    }
5952d96b934Sdrh  } {9 92 100 7 94 64 5 96 36 nosort}
5963e8c37e7Sdanielk1977}
597dd4852c3Sdrhdo_test where-6.9.1 {
598e3184744Sdrh  cksort {
599e3184744Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
600e3184744Sdrh  }
601e3184744Sdrh} {1 100 4 nosort}
602ac931eb9Sdrhdo_test where-6.9.1.1 {
603ac931eb9Sdrh  cksort {
604ac931eb9Sdrh    SELECT * FROM t3 WHERE a>=1 AND a=1 AND c>0 ORDER BY a LIMIT 3
605ac931eb9Sdrh  }
606ac931eb9Sdrh} {1 100 4 nosort}
607ac931eb9Sdrhdo_test where-6.9.1.2 {
608ac931eb9Sdrh  cksort {
609ac931eb9Sdrh    SELECT * FROM t3 WHERE a<2 AND a=1 AND c>0 ORDER BY a LIMIT 3
610ac931eb9Sdrh  }
611ac931eb9Sdrh} {1 100 4 nosort}
612dd4852c3Sdrhdo_test where-6.9.2 {
613dd4852c3Sdrh  cksort {
614dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
615dd4852c3Sdrh  }
616dd4852c3Sdrh} {1 100 4 nosort}
617dd4852c3Sdrhdo_test where-6.9.3 {
618dd4852c3Sdrh  cksort {
619dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c LIMIT 3
620dd4852c3Sdrh  }
621dd4852c3Sdrh} {1 100 4 nosort}
622dd4852c3Sdrhdo_test where-6.9.4 {
623dd4852c3Sdrh  cksort {
624dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC LIMIT 3
625dd4852c3Sdrh  }
626dd4852c3Sdrh} {1 100 4 nosort}
627dd4852c3Sdrhdo_test where-6.9.5 {
628dd4852c3Sdrh  cksort {
629dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c DESC LIMIT 3
630dd4852c3Sdrh  }
631dd4852c3Sdrh} {1 100 4 nosort}
632dd4852c3Sdrhdo_test where-6.9.6 {
633dd4852c3Sdrh  cksort {
634dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c DESC LIMIT 3
635dd4852c3Sdrh  }
636dd4852c3Sdrh} {1 100 4 nosort}
637dd4852c3Sdrhdo_test where-6.9.7 {
638dd4852c3Sdrh  cksort {
639dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY c,a LIMIT 3
640dd4852c3Sdrh  }
6414fe425adSdrh} {1 100 4 nosort}
642dd4852c3Sdrhdo_test where-6.9.8 {
643dd4852c3Sdrh  cksort {
644dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a DESC, c ASC LIMIT 3
645dd4852c3Sdrh  }
6469012bcbcSdrh} {1 100 4 nosort}
647dd4852c3Sdrhdo_test where-6.9.9 {
648dd4852c3Sdrh  cksort {
649dd4852c3Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a ASC, c DESC LIMIT 3
650dd4852c3Sdrh  }
6519012bcbcSdrh} {1 100 4 nosort}
652e3184744Sdrhdo_test where-6.10 {
653e3184744Sdrh  cksort {
654e3184744Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3
655e3184744Sdrh  }
656e3184744Sdrh} {1 100 4 nosort}
657e3184744Sdrhdo_test where-6.11 {
658e3184744Sdrh  cksort {
659e3184744Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3
660e3184744Sdrh  }
661e3184744Sdrh} {1 100 4 nosort}
662e3184744Sdrhdo_test where-6.12 {
663e3184744Sdrh  cksort {
664e3184744Sdrh    SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3
665e3184744Sdrh  }
666e3184744Sdrh} {1 100 4 nosort}
667e3184744Sdrhdo_test where-6.13 {
668e3184744Sdrh  cksort {
669e3184744Sdrh    SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3
670e3184744Sdrh  }
671dd4852c3Sdrh} {100 1 10201 99 2 10000 98 3 9801 nosort}
672dd4852c3Sdrhdo_test where-6.13.1 {
673dd4852c3Sdrh  cksort {
674dd4852c3Sdrh    SELECT * FROM t3 WHERE a>0 ORDER BY -a LIMIT 3
675dd4852c3Sdrh  }
676e3184744Sdrh} {100 1 10201 99 2 10000 98 3 9801 sort}
677e3184744Sdrhdo_test where-6.14 {
678e3184744Sdrh  cksort {
679e3184744Sdrh    SELECT * FROM t3 ORDER BY b LIMIT 3
680e3184744Sdrh  }
681e3184744Sdrh} {100 1 10201 99 2 10000 98 3 9801 nosort}
682e3184744Sdrhdo_test where-6.15 {
683e3184744Sdrh  cksort {
684e3184744Sdrh    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3
685e3184744Sdrh  }
686e3184744Sdrh} {1 0 2 1 3 1 nosort}
687e3184744Sdrhdo_test where-6.16 {
688e3184744Sdrh  cksort {
689e3184744Sdrh    SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3
690e3184744Sdrh  }
691e3184744Sdrh} {1 0 2 1 3 1 sort}
692c330af1dSdrhdo_test where-6.19 {
693c330af1dSdrh  cksort {
694c330af1dSdrh    SELECT y FROM t1 ORDER BY w LIMIT 3;
695c330af1dSdrh  }
696c330af1dSdrh} {4 9 16 nosort}
697b6c29897Sdrhdo_test where-6.20 {
698b6c29897Sdrh  cksort {
699b6c29897Sdrh    SELECT y FROM t1 ORDER BY rowid LIMIT 3;
700b6c29897Sdrh  }
701b6c29897Sdrh} {4 9 16 nosort}
702b6c29897Sdrhdo_test where-6.21 {
703b6c29897Sdrh  cksort {
704b6c29897Sdrh    SELECT y FROM t1 ORDER BY rowid, y LIMIT 3;
705b6c29897Sdrh  }
706cc19254dSdrh} {4 9 16 nosort}
707b6c29897Sdrhdo_test where-6.22 {
708b6c29897Sdrh  cksort {
709b6c29897Sdrh    SELECT y FROM t1 ORDER BY rowid, y DESC LIMIT 3;
710b6c29897Sdrh  }
711cc19254dSdrh} {4 9 16 nosort}
712b6c29897Sdrhdo_test where-6.23 {
713b6c29897Sdrh  cksort {
714b6c29897Sdrh    SELECT y FROM t1 WHERE y>4 ORDER BY rowid, w, x LIMIT 3;
715b6c29897Sdrh  }
716cc19254dSdrh} {9 16 25 nosort}
717b6c29897Sdrhdo_test where-6.24 {
718b6c29897Sdrh  cksort {
719b6c29897Sdrh    SELECT y FROM t1 WHERE y>=9 ORDER BY rowid, x DESC, w LIMIT 3;
720b6c29897Sdrh  }
721cc19254dSdrh} {9 16 25 nosort}
722b6c29897Sdrhdo_test where-6.25 {
723b6c29897Sdrh  cksort {
724b6c29897Sdrh    SELECT y FROM t1 WHERE y>4 AND y<25 ORDER BY rowid;
725b6c29897Sdrh  }
726b6c29897Sdrh} {9 16 nosort}
727b6c29897Sdrhdo_test where-6.26 {
728b6c29897Sdrh  cksort {
729b6c29897Sdrh    SELECT y FROM t1 WHERE y>=4 AND y<=25 ORDER BY oid;
730b6c29897Sdrh  }
731b6c29897Sdrh} {4 9 16 25 nosort}
732b6c29897Sdrhdo_test where-6.27 {
733b6c29897Sdrh  cksort {
734b6c29897Sdrh    SELECT y FROM t1 WHERE y<=25 ORDER BY _rowid_, w+y;
735b6c29897Sdrh  }
736cc19254dSdrh} {4 9 16 25 nosort}
737b6c29897Sdrh
738c330af1dSdrh
739dd4852c3Sdrh# Tests for reverse-order sorting.
740dd4852c3Sdrh#
741dd4852c3Sdrhdo_test where-7.1 {
742dd4852c3Sdrh  cksort {
743dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 ORDER BY y;
744dd4852c3Sdrh  }
745dd4852c3Sdrh} {8 9 10 11 12 13 14 15 nosort}
746dd4852c3Sdrhdo_test where-7.2 {
747dd4852c3Sdrh  cksort {
748dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 ORDER BY y DESC;
749dd4852c3Sdrh  }
750dd4852c3Sdrh} {15 14 13 12 11 10 9 8 nosort}
751dd4852c3Sdrhdo_test where-7.3 {
752dd4852c3Sdrh  cksort {
753dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y LIMIT 3;
754dd4852c3Sdrh  }
755dd4852c3Sdrh} {10 11 12 nosort}
756dd4852c3Sdrhdo_test where-7.4 {
757dd4852c3Sdrh  cksort {
758dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>100 ORDER BY y DESC LIMIT 3;
759dd4852c3Sdrh  }
760dd4852c3Sdrh} {15 14 13 nosort}
761dd4852c3Sdrhdo_test where-7.5 {
762dd4852c3Sdrh  cksort {
763dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>121 ORDER BY y DESC;
764dd4852c3Sdrh  }
765dd4852c3Sdrh} {15 14 13 12 11 nosort}
766dd4852c3Sdrhdo_test where-7.6 {
767dd4852c3Sdrh  cksort {
768dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=121 ORDER BY y DESC;
769dd4852c3Sdrh  }
770dd4852c3Sdrh} {15 14 13 12 11 10 nosort}
771dd4852c3Sdrhdo_test where-7.7 {
772dd4852c3Sdrh  cksort {
773dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y DESC;
774dd4852c3Sdrh  }
775dd4852c3Sdrh} {12 11 10 nosort}
776dd4852c3Sdrhdo_test where-7.8 {
777dd4852c3Sdrh  cksort {
778dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y DESC;
779dd4852c3Sdrh  }
780dd4852c3Sdrh} {13 12 11 10 nosort}
781dd4852c3Sdrhdo_test where-7.9 {
782dd4852c3Sdrh  cksort {
783dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y DESC;
784dd4852c3Sdrh  }
785dd4852c3Sdrh} {13 12 11 nosort}
786dd4852c3Sdrhdo_test where-7.10 {
787dd4852c3Sdrh  cksort {
788dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y DESC;
789dd4852c3Sdrh  }
790dd4852c3Sdrh} {12 11 10 nosort}
791dd4852c3Sdrhdo_test where-7.11 {
792dd4852c3Sdrh  cksort {
793dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<196 ORDER BY y;
794dd4852c3Sdrh  }
795dd4852c3Sdrh} {10 11 12 nosort}
796dd4852c3Sdrhdo_test where-7.12 {
797dd4852c3Sdrh  cksort {
798dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196 ORDER BY y;
799dd4852c3Sdrh  }
800dd4852c3Sdrh} {10 11 12 13 nosort}
801dd4852c3Sdrhdo_test where-7.13 {
802dd4852c3Sdrh  cksort {
803dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>121 AND y<=196 ORDER BY y;
804dd4852c3Sdrh  }
805dd4852c3Sdrh} {11 12 13 nosort}
806dd4852c3Sdrhdo_test where-7.14 {
807dd4852c3Sdrh  cksort {
808dd4852c3Sdrh    SELECT w FROM t1 WHERE x=3 AND y>100 AND y<196 ORDER BY y;
809dd4852c3Sdrh  }
810dd4852c3Sdrh} {10 11 12 nosort}
8111a844c38Sdrhdo_test where-7.15 {
8121a844c38Sdrh  cksort {
8131a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y;
8141a844c38Sdrh  }
8151a844c38Sdrh} {nosort}
8161a844c38Sdrhdo_test where-7.16 {
8171a844c38Sdrh  cksort {
8181a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y;
8191a844c38Sdrh  }
8201a844c38Sdrh} {8 nosort}
8211a844c38Sdrhdo_test where-7.17 {
8221a844c38Sdrh  cksort {
8231a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y;
8241a844c38Sdrh  }
8251a844c38Sdrh} {nosort}
8261a844c38Sdrhdo_test where-7.18 {
8271a844c38Sdrh  cksort {
8281a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y;
8291a844c38Sdrh  }
8301a844c38Sdrh} {15 nosort}
8311a844c38Sdrhdo_test where-7.19 {
8321a844c38Sdrh  cksort {
8331a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y<81 ORDER BY y DESC;
8341a844c38Sdrh  }
8351a844c38Sdrh} {nosort}
8361a844c38Sdrhdo_test where-7.20 {
8371a844c38Sdrh  cksort {
8381a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y<=81 ORDER BY y DESC;
8391a844c38Sdrh  }
8401a844c38Sdrh} {8 nosort}
8411a844c38Sdrhdo_test where-7.21 {
8421a844c38Sdrh  cksort {
8431a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y>256 ORDER BY y DESC;
8441a844c38Sdrh  }
8451a844c38Sdrh} {nosort}
8461a844c38Sdrhdo_test where-7.22 {
8471a844c38Sdrh  cksort {
8481a844c38Sdrh    SELECT w FROM t1 WHERE x=3 AND y>=256 ORDER BY y DESC;
8491a844c38Sdrh  }
8501a844c38Sdrh} {15 nosort}
8511a844c38Sdrhdo_test where-7.23 {
8521a844c38Sdrh  cksort {
8531a844c38Sdrh    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y;
8541a844c38Sdrh  }
8551a844c38Sdrh} {nosort}
8561a844c38Sdrhdo_test where-7.24 {
8571a844c38Sdrh  cksort {
8581a844c38Sdrh    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y;
8591a844c38Sdrh  }
8601a844c38Sdrh} {1 nosort}
8611a844c38Sdrhdo_test where-7.25 {
8621a844c38Sdrh  cksort {
8631a844c38Sdrh    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y;
8641a844c38Sdrh  }
8651a844c38Sdrh} {nosort}
8661a844c38Sdrhdo_test where-7.26 {
8671a844c38Sdrh  cksort {
8681a844c38Sdrh    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y;
8691a844c38Sdrh  }
8701a844c38Sdrh} {100 nosort}
8711a844c38Sdrhdo_test where-7.27 {
8721a844c38Sdrh  cksort {
8731a844c38Sdrh    SELECT w FROM t1 WHERE x=0 AND y<4 ORDER BY y DESC;
8741a844c38Sdrh  }
8751a844c38Sdrh} {nosort}
8761a844c38Sdrhdo_test where-7.28 {
8771a844c38Sdrh  cksort {
8781a844c38Sdrh    SELECT w FROM t1 WHERE x=0 AND y<=4 ORDER BY y DESC;
8791a844c38Sdrh  }
8801a844c38Sdrh} {1 nosort}
8811a844c38Sdrhdo_test where-7.29 {
8821a844c38Sdrh  cksort {
8831a844c38Sdrh    SELECT w FROM t1 WHERE x=6 AND y>10201 ORDER BY y DESC;
8841a844c38Sdrh  }
8851a844c38Sdrh} {nosort}
8861a844c38Sdrhdo_test where-7.30 {
8871a844c38Sdrh  cksort {
8881a844c38Sdrh    SELECT w FROM t1 WHERE x=6 AND y>=10201 ORDER BY y DESC;
8891a844c38Sdrh  }
8901a844c38Sdrh} {100 nosort}
891b6c29897Sdrhdo_test where-7.31 {
892b6c29897Sdrh  cksort {
893b6c29897Sdrh    SELECT y FROM t1 ORDER BY rowid DESC LIMIT 3
894b6c29897Sdrh  }
895b6c29897Sdrh} {10201 10000 9801 nosort}
896b6c29897Sdrhdo_test where-7.32 {
897b6c29897Sdrh  cksort {
898a21c8495Sdrh    SELECT y FROM t1 WHERE y<25 ORDER BY rowid DESC
899b6c29897Sdrh  }
900b6c29897Sdrh} {16 9 4 nosort}
901b6c29897Sdrhdo_test where-7.33 {
902b6c29897Sdrh  cksort {
903a21c8495Sdrh    SELECT y FROM t1 WHERE y<=25 ORDER BY rowid DESC
904b6c29897Sdrh  }
905b6c29897Sdrh} {25 16 9 4 nosort}
906b6c29897Sdrhdo_test where-7.34 {
907b6c29897Sdrh  cksort {
908b6c29897Sdrh    SELECT y FROM t1 WHERE y<25 AND y>4 ORDER BY rowid DESC, y DESC
909b6c29897Sdrh  }
910cc19254dSdrh} {16 9 nosort}
911b6c29897Sdrhdo_test where-7.35 {
912b6c29897Sdrh  cksort {
913b6c29897Sdrh    SELECT y FROM t1 WHERE y<25 AND y>=4 ORDER BY rowid DESC
914b6c29897Sdrh  }
915b6c29897Sdrh} {16 9 4 nosort}
9161a844c38Sdrh
9171a844c38Sdrhdo_test where-8.1 {
9181a844c38Sdrh  execsql {
9191a844c38Sdrh    CREATE TABLE t4 AS SELECT * FROM t1;
9201a844c38Sdrh    CREATE INDEX i4xy ON t4(x,y);
9211a844c38Sdrh  }
9221a844c38Sdrh  cksort {
9231a844c38Sdrh    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
9241a844c38Sdrh  }
9251a844c38Sdrh} {30 29 28 nosort}
9261a844c38Sdrhdo_test where-8.2 {
9271a844c38Sdrh  execsql {
9281a844c38Sdrh    DELETE FROM t4;
9291a844c38Sdrh  }
9301a844c38Sdrh  cksort {
9311a844c38Sdrh    SELECT w FROM t4 WHERE x=4 and y<1000 ORDER BY y DESC limit 3;
9321a844c38Sdrh  }
9331a844c38Sdrh} {nosort}
9341a844c38Sdrh
935d4d595f9Sdrh# Make sure searches with an index work with an empty table.
936d4d595f9Sdrh#
937d4d595f9Sdrhdo_test where-9.1 {
938d4d595f9Sdrh  execsql {
939d4d595f9Sdrh    CREATE TABLE t5(x PRIMARY KEY);
940d4d595f9Sdrh    SELECT * FROM t5 WHERE x<10;
941d4d595f9Sdrh  }
942d4d595f9Sdrh} {}
943d4d595f9Sdrhdo_test where-9.2 {
944d4d595f9Sdrh  execsql {
945d4d595f9Sdrh    SELECT * FROM t5 WHERE x<10 ORDER BY x DESC;
946d4d595f9Sdrh  }
947d4d595f9Sdrh} {}
948d4d595f9Sdrhdo_test where-9.3 {
949d4d595f9Sdrh  execsql {
950d4d595f9Sdrh    SELECT * FROM t5 WHERE x=10;
951d4d595f9Sdrh  }
952d4d595f9Sdrh} {}
953d4d595f9Sdrh
95437ea94b8Sdrhdo_test where-10.1 {
95537ea94b8Sdrh  execsql {
95637ea94b8Sdrh    SELECT 1 WHERE abs(random())<0
95737ea94b8Sdrh  }
95837ea94b8Sdrh} {}
9597bdc0c1dSdrhdo_test where-10.2 {
9607bdc0c1dSdrh  proc tclvar_func {vname} {return [set ::$vname]}
9617bdc0c1dSdrh  db function tclvar tclvar_func
9627bdc0c1dSdrh  set ::v1 0
9637bdc0c1dSdrh  execsql {
9647bdc0c1dSdrh    SELECT count(*) FROM t1 WHERE tclvar('v1');
9657bdc0c1dSdrh  }
9667bdc0c1dSdrh} {0}
9677bdc0c1dSdrhdo_test where-10.3 {
9687bdc0c1dSdrh  set ::v1 1
9697bdc0c1dSdrh  execsql {
9707bdc0c1dSdrh    SELECT count(*) FROM t1 WHERE tclvar('v1');
9717bdc0c1dSdrh  }
9727bdc0c1dSdrh} {100}
9737bdc0c1dSdrhdo_test where-10.4 {
9747bdc0c1dSdrh  set ::v1 1
9757bdc0c1dSdrh  proc tclvar_func {vname} {
9767bdc0c1dSdrh    upvar #0 $vname v
9777bdc0c1dSdrh    set v [expr {!$v}]
9787bdc0c1dSdrh    return $v
9797bdc0c1dSdrh  }
9807bdc0c1dSdrh  execsql {
9817bdc0c1dSdrh    SELECT count(*) FROM t1 WHERE tclvar('v1');
9827bdc0c1dSdrh  }
9837bdc0c1dSdrh} {50}
9847bdc0c1dSdrh
9859eb2028fSdrh# Ticket #1376.  The query below was causing a segfault.
9869eb2028fSdrh# The problem was the age-old error of calling realloc() on an
9879eb2028fSdrh# array while there are still pointers to individual elements of
9889eb2028fSdrh# that array.
9899eb2028fSdrh#
9909eb2028fSdrhdo_test where-11.1 {
9919eb2028fSdrh  execsql {
9929eb2028fSdrh   CREATE TABLE t99(Dte INT, X INT);
9939eb2028fSdrh   DELETE FROM t99 WHERE (Dte = 2451337) OR (Dte = 2451339) OR
9949eb2028fSdrh     (Dte BETWEEN 2451345 AND 2451347) OR (Dte = 2451351) OR
9959eb2028fSdrh     (Dte BETWEEN 2451355 AND 2451356) OR (Dte = 2451358) OR
9969eb2028fSdrh     (Dte = 2451362) OR (Dte = 2451365) OR (Dte = 2451367) OR
9979eb2028fSdrh     (Dte BETWEEN 2451372 AND 2451376) OR (Dte BETWEEN 2451382 AND 2451384) OR
9989eb2028fSdrh     (Dte = 2451387) OR (Dte BETWEEN 2451389 AND 2451391) OR
9999eb2028fSdrh     (Dte BETWEEN 2451393 AND 2451395) OR (Dte = 2451400) OR
10009eb2028fSdrh     (Dte = 2451402) OR (Dte = 2451404) OR (Dte BETWEEN 2451416 AND 2451418) OR
10019eb2028fSdrh     (Dte = 2451422) OR (Dte = 2451426) OR (Dte BETWEEN 2451445 AND 2451446) OR
10029eb2028fSdrh     (Dte = 2451456) OR (Dte = 2451458) OR (Dte BETWEEN 2451465 AND 2451467) OR
10039eb2028fSdrh     (Dte BETWEEN 2451469 AND 2451471) OR (Dte = 2451474) OR
10049eb2028fSdrh     (Dte BETWEEN 2451477 AND 2451501) OR (Dte BETWEEN 2451503 AND 2451509) OR
10059eb2028fSdrh     (Dte BETWEEN 2451511 AND 2451514) OR (Dte BETWEEN 2451518 AND 2451521) OR
10069eb2028fSdrh     (Dte BETWEEN 2451523 AND 2451531) OR (Dte BETWEEN 2451533 AND 2451537) OR
10079eb2028fSdrh     (Dte BETWEEN 2451539 AND 2451544) OR (Dte BETWEEN 2451546 AND 2451551) OR
10089eb2028fSdrh     (Dte BETWEEN 2451553 AND 2451555) OR (Dte = 2451557) OR
10099eb2028fSdrh     (Dte BETWEEN 2451559 AND 2451561) OR (Dte = 2451563) OR
10109eb2028fSdrh     (Dte BETWEEN 2451565 AND 2451566) OR (Dte BETWEEN 2451569 AND 2451571) OR
10119eb2028fSdrh     (Dte = 2451573) OR (Dte = 2451575) OR (Dte = 2451577) OR (Dte = 2451581) OR
10129eb2028fSdrh     (Dte BETWEEN 2451583 AND 2451586) OR (Dte BETWEEN 2451588 AND 2451592) OR
10139eb2028fSdrh     (Dte BETWEEN 2451596 AND 2451598) OR (Dte = 2451600) OR
10149eb2028fSdrh     (Dte BETWEEN 2451602 AND 2451603) OR (Dte = 2451606) OR (Dte = 2451611);
10159eb2028fSdrh  }
10169eb2028fSdrh} {}
10179eb2028fSdrh
1018cc19254dSdrh# Ticket #2116:  Make sure sorting by index works well with nn INTEGER PRIMARY
1019cc19254dSdrh# KEY.
1020cc19254dSdrh#
1021cc19254dSdrhdo_test where-12.1 {
1022cc19254dSdrh  execsql {
1023cc19254dSdrh    CREATE TABLE t6(a INTEGER PRIMARY KEY, b TEXT);
1024cc19254dSdrh    INSERT INTO t6 VALUES(1,'one');
1025cc19254dSdrh    INSERT INTO t6 VALUES(4,'four');
1026cc19254dSdrh    CREATE INDEX t6i1 ON t6(b);
1027cc19254dSdrh  }
1028cc19254dSdrh  cksort {
1029cc19254dSdrh    SELECT * FROM t6 ORDER BY b;
1030cc19254dSdrh  }
1031cc19254dSdrh} {4 four 1 one nosort}
1032cc19254dSdrhdo_test where-12.2 {
1033cc19254dSdrh  cksort {
1034cc19254dSdrh    SELECT * FROM t6 ORDER BY b, a;
1035cc19254dSdrh  }
1036cc19254dSdrh} {4 four 1 one nosort}
1037cc19254dSdrhdo_test where-12.3 {
1038cc19254dSdrh  cksort {
1039cc19254dSdrh    SELECT * FROM t6 ORDER BY a;
1040cc19254dSdrh  }
1041cc19254dSdrh} {1 one 4 four nosort}
1042cc19254dSdrhdo_test where-12.4 {
1043cc19254dSdrh  cksort {
1044cc19254dSdrh    SELECT * FROM t6 ORDER BY a, b;
1045cc19254dSdrh  }
1046cc19254dSdrh} {1 one 4 four nosort}
1047cc19254dSdrhdo_test where-12.5 {
1048cc19254dSdrh  cksort {
1049cc19254dSdrh    SELECT * FROM t6 ORDER BY b DESC;
1050cc19254dSdrh  }
1051cc19254dSdrh} {1 one 4 four nosort}
1052cc19254dSdrhdo_test where-12.6 {
1053cc19254dSdrh  cksort {
1054cc19254dSdrh    SELECT * FROM t6 ORDER BY b DESC, a DESC;
1055cc19254dSdrh  }
1056cc19254dSdrh} {1 one 4 four nosort}
1057cc19254dSdrhdo_test where-12.7 {
1058cc19254dSdrh  cksort {
1059cc19254dSdrh    SELECT * FROM t6 ORDER BY b DESC, a ASC;
1060cc19254dSdrh  }
1061cc19254dSdrh} {1 one 4 four sort}
1062cc19254dSdrhdo_test where-12.8 {
1063cc19254dSdrh  cksort {
1064cc19254dSdrh    SELECT * FROM t6 ORDER BY b ASC, a DESC;
1065cc19254dSdrh  }
1066cc19254dSdrh} {4 four 1 one sort}
1067cc19254dSdrhdo_test where-12.9 {
1068cc19254dSdrh  cksort {
1069cc19254dSdrh    SELECT * FROM t6 ORDER BY a DESC;
1070cc19254dSdrh  }
1071cc19254dSdrh} {4 four 1 one nosort}
1072cc19254dSdrhdo_test where-12.10 {
1073cc19254dSdrh  cksort {
1074cc19254dSdrh    SELECT * FROM t6 ORDER BY a DESC, b DESC;
1075cc19254dSdrh  }
1076cc19254dSdrh} {4 four 1 one nosort}
1077cc19254dSdrhdo_test where-12.11 {
1078cc19254dSdrh  cksort {
1079cc19254dSdrh    SELECT * FROM t6 ORDER BY a DESC, b ASC;
1080cc19254dSdrh  }
1081cc19254dSdrh} {4 four 1 one nosort}
1082cc19254dSdrhdo_test where-12.12 {
1083cc19254dSdrh  cksort {
1084cc19254dSdrh    SELECT * FROM t6 ORDER BY a ASC, b DESC;
1085cc19254dSdrh  }
1086cc19254dSdrh} {1 one 4 four nosort}
1087cc19254dSdrhdo_test where-13.1 {
1088cc19254dSdrh  execsql {
1089cc19254dSdrh    CREATE TABLE t7(a INTEGER PRIMARY KEY, b TEXT);
1090cc19254dSdrh    INSERT INTO t7 VALUES(1,'one');
1091cc19254dSdrh    INSERT INTO t7 VALUES(4,'four');
1092cc19254dSdrh    CREATE INDEX t7i1 ON t7(b);
1093cc19254dSdrh  }
1094cc19254dSdrh  cksort {
1095cc19254dSdrh    SELECT * FROM t7 ORDER BY b;
1096cc19254dSdrh  }
1097cc19254dSdrh} {4 four 1 one nosort}
1098cc19254dSdrhdo_test where-13.2 {
1099cc19254dSdrh  cksort {
1100cc19254dSdrh    SELECT * FROM t7 ORDER BY b, a;
1101cc19254dSdrh  }
1102cc19254dSdrh} {4 four 1 one nosort}
1103cc19254dSdrhdo_test where-13.3 {
1104cc19254dSdrh  cksort {
1105cc19254dSdrh    SELECT * FROM t7 ORDER BY a;
1106cc19254dSdrh  }
1107cc19254dSdrh} {1 one 4 four nosort}
1108cc19254dSdrhdo_test where-13.4 {
1109cc19254dSdrh  cksort {
1110cc19254dSdrh    SELECT * FROM t7 ORDER BY a, b;
1111cc19254dSdrh  }
1112cc19254dSdrh} {1 one 4 four nosort}
1113cc19254dSdrhdo_test where-13.5 {
1114cc19254dSdrh  cksort {
1115cc19254dSdrh    SELECT * FROM t7 ORDER BY b DESC;
1116cc19254dSdrh  }
1117cc19254dSdrh} {1 one 4 four nosort}
1118cc19254dSdrhdo_test where-13.6 {
1119cc19254dSdrh  cksort {
1120cc19254dSdrh    SELECT * FROM t7 ORDER BY b DESC, a DESC;
1121cc19254dSdrh  }
1122cc19254dSdrh} {1 one 4 four nosort}
1123cc19254dSdrhdo_test where-13.7 {
1124cc19254dSdrh  cksort {
1125cc19254dSdrh    SELECT * FROM t7 ORDER BY b DESC, a ASC;
1126cc19254dSdrh  }
1127cc19254dSdrh} {1 one 4 four sort}
1128cc19254dSdrhdo_test where-13.8 {
1129cc19254dSdrh  cksort {
1130cc19254dSdrh    SELECT * FROM t7 ORDER BY b ASC, a DESC;
1131cc19254dSdrh  }
1132cc19254dSdrh} {4 four 1 one sort}
1133cc19254dSdrhdo_test where-13.9 {
1134cc19254dSdrh  cksort {
1135cc19254dSdrh    SELECT * FROM t7 ORDER BY a DESC;
1136cc19254dSdrh  }
1137cc19254dSdrh} {4 four 1 one nosort}
1138cc19254dSdrhdo_test where-13.10 {
1139cc19254dSdrh  cksort {
1140cc19254dSdrh    SELECT * FROM t7 ORDER BY a DESC, b DESC;
1141cc19254dSdrh  }
1142cc19254dSdrh} {4 four 1 one nosort}
1143cc19254dSdrhdo_test where-13.11 {
1144cc19254dSdrh  cksort {
1145cc19254dSdrh    SELECT * FROM t7 ORDER BY a DESC, b ASC;
1146cc19254dSdrh  }
1147cc19254dSdrh} {4 four 1 one nosort}
1148cc19254dSdrhdo_test where-13.12 {
1149cc19254dSdrh  cksort {
1150cc19254dSdrh    SELECT * FROM t7 ORDER BY a ASC, b DESC;
1151cc19254dSdrh  }
1152cc19254dSdrh} {1 one 4 four nosort}
1153cc19254dSdrh
11547b4fc6a8Sdrh# Ticket #2211.
11557b4fc6a8Sdrh#
11567b4fc6a8Sdrh# When optimizing out ORDER BY clauses, make sure that trailing terms
11577b4fc6a8Sdrh# of the ORDER BY clause do not reference other tables in a join.
11587b4fc6a8Sdrh#
1159e825831eSdanif {[permutation] != "no_optimization"} {
11607b4fc6a8Sdrhdo_test where-14.1 {
11617b4fc6a8Sdrh  execsql {
1162165674d8Sdrh    CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT UNIQUE, c CHAR(100));
1163165674d8Sdrh    INSERT INTO t8(a,b) VALUES(1,'one');
1164165674d8Sdrh    INSERT INTO t8(a,b) VALUES(4,'four');
11657b4fc6a8Sdrh  }
11667b4fc6a8Sdrh  cksort {
11677b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b
11687b4fc6a8Sdrh  }
11696f0e400cSdrh} {1/4 1/1 4/4 4/1 nosort}
11707b4fc6a8Sdrhdo_test where-14.2 {
11717b4fc6a8Sdrh  cksort {
11727b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, y.b DESC
11737b4fc6a8Sdrh  }
11746f0e400cSdrh} {1/1 1/4 4/1 4/4 nosort}
11757b4fc6a8Sdrhdo_test where-14.3 {
11767b4fc6a8Sdrh  cksort {
11777b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b
11787b4fc6a8Sdrh  }
11793f4d1d1bSdrh} {1/4 1/1 4/4 4/1 nosort}
11807b4fc6a8Sdrhdo_test where-14.4 {
11817b4fc6a8Sdrh  cksort {
11827b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.a, x.b DESC
11837b4fc6a8Sdrh  }
11843f4d1d1bSdrh} {1/4 1/1 4/4 4/1 nosort}
11857b4fc6a8Sdrhdo_test where-14.5 {
118699f8fb66Sdan  # This test case changed from "nosort" to "sort". See ticket 2a5629202f.
11877b4fc6a8Sdrh  cksort {
11887b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b
11897b4fc6a8Sdrh  }
11905343b2d4Sdrh} {/4/[14] 4/[14] 1/[14] 1/[14] sort/}
11917b4fc6a8Sdrhdo_test where-14.6 {
119299f8fb66Sdan  # This test case changed from "nosort" to "sort". See ticket 2a5629202f.
11937b4fc6a8Sdrh  cksort {
11947b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||x.b DESC
11957b4fc6a8Sdrh  }
11965343b2d4Sdrh} {/4/[14] 4/[14] 1/[14] 1/[14] sort/}
11977b4fc6a8Sdrhdo_test where-14.7 {
11987b4fc6a8Sdrh  cksort {
11997b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b
12007b4fc6a8Sdrh  }
12017b4fc6a8Sdrh} {4/1 4/4 1/1 1/4 sort}
120232ffdb73Sdrhdo_test where-14.7.1 {
120332ffdb73Sdrh  cksort {
120432ffdb73Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, y.a||y.b
120532ffdb73Sdrh  }
120632ffdb73Sdrh} {4/1 4/4 1/1 1/4 sort}
120732ffdb73Sdrhdo_test where-14.7.2 {
120832ffdb73Sdrh  cksort {
120932ffdb73Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a, x.a||x.b
121032ffdb73Sdrh  }
12113f4d1d1bSdrh} {4/4 4/1 1/4 1/1 nosort}
12127b4fc6a8Sdrhdo_test where-14.8 {
12137b4fc6a8Sdrh  cksort {
12147b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||y.b DESC
12157b4fc6a8Sdrh  }
12167b4fc6a8Sdrh} {4/4 4/1 1/4 1/1 sort}
12177b4fc6a8Sdrhdo_test where-14.9 {
12187b4fc6a8Sdrh  cksort {
12197b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b
12207b4fc6a8Sdrh  }
12217b4fc6a8Sdrh} {4/4 4/1 1/4 1/1 sort}
12227b4fc6a8Sdrhdo_test where-14.10 {
12237b4fc6a8Sdrh  cksort {
12247b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, x.a||y.b DESC
12257b4fc6a8Sdrh  }
12267b4fc6a8Sdrh} {4/1 4/4 1/1 1/4 sort}
12277b4fc6a8Sdrhdo_test where-14.11 {
12287b4fc6a8Sdrh  cksort {
12297b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b
12307b4fc6a8Sdrh  }
12317b4fc6a8Sdrh} {4/1 4/4 1/1 1/4 sort}
12327b4fc6a8Sdrhdo_test where-14.12 {
12337b4fc6a8Sdrh  cksort {
12347b4fc6a8Sdrh    SELECT x.a || '/' || y.a FROM t8 x, t8 y ORDER BY x.b, y.a||x.b DESC
12357b4fc6a8Sdrh  }
12367b4fc6a8Sdrh} {4/4 4/1 1/4 1/1 sort}
1237e825831eSdan} ;# {permutation != "no_optimization"}
1238cc19254dSdrh
1239c9cf6e3dSdanielk1977# Ticket #2445.
1240c9cf6e3dSdanielk1977#
1241c9cf6e3dSdanielk1977# There was a crash that could occur when a where clause contains an
1242c9cf6e3dSdanielk1977# alias for an expression in the result set, and that expression retrieves
1243c9cf6e3dSdanielk1977# a column of the second or subsequent table in a join.
1244c9cf6e3dSdanielk1977#
1245c9cf6e3dSdanielk1977do_test where-15.1 {
1246c9cf6e3dSdanielk1977  execsql {
1247c9cf6e3dSdanielk1977    CREATE TEMP TABLE t1 (a, b, c, d, e);
1248c9cf6e3dSdanielk1977    CREATE TEMP TABLE t2 (f);
1249c9cf6e3dSdanielk1977    SELECT t1.e AS alias FROM t2, t1 WHERE alias = 1 ;
1250c9cf6e3dSdanielk1977  }
1251c9cf6e3dSdanielk1977} {}
12529eb2028fSdrh
12532d605499Sdanielk1977# Ticket #3408.
12542d605499Sdanielk1977#
12552d605499Sdanielk1977# The branch of code in where.c that generated rowid lookups was
12562d605499Sdanielk1977# incorrectly deallocating a constant register, meaning that if the
12572d605499Sdanielk1977# vdbe code ran more than once, the second time around the constant
12582d605499Sdanielk1977# value may have been clobbered by some other value.
12592d605499Sdanielk1977#
12602d605499Sdanielk1977do_test where-16.1 {
12612d605499Sdanielk1977  execsql {
12622d605499Sdanielk1977    CREATE TABLE a1(id INTEGER PRIMARY KEY, v);
12632d605499Sdanielk1977    CREATE TABLE a2(id INTEGER PRIMARY KEY, v);
12642d605499Sdanielk1977    INSERT INTO a1 VALUES(1, 'one');
12652d605499Sdanielk1977    INSERT INTO a1 VALUES(2, 'two');
12662d605499Sdanielk1977    INSERT INTO a2 VALUES(1, 'one');
12672d605499Sdanielk1977    INSERT INTO a2 VALUES(2, 'two');
12682d605499Sdanielk1977  }
12692d605499Sdanielk1977} {}
12702d605499Sdanielk1977do_test where-16.2 {
12712d605499Sdanielk1977  execsql {
12722d605499Sdanielk1977    SELECT * FROM a2 CROSS JOIN a1 WHERE a1.id=1 AND a1.v='one';
12732d605499Sdanielk1977  }
12742d605499Sdanielk1977} {1 one 1 one 2 two 1 one}
12752d605499Sdanielk1977
12762d605499Sdanielk1977# The actual problem reported in #3408.
12772d605499Sdanielk1977do_test where-16.3 {
12782d605499Sdanielk1977  execsql {
12792d605499Sdanielk1977    CREATE TEMP TABLE foo(idx INTEGER);
12802d605499Sdanielk1977    INSERT INTO foo VALUES(1);
12812d605499Sdanielk1977    INSERT INTO foo VALUES(1);
12822d605499Sdanielk1977    INSERT INTO foo VALUES(1);
12832d605499Sdanielk1977    INSERT INTO foo VALUES(2);
12842d605499Sdanielk1977    INSERT INTO foo VALUES(2);
12852d605499Sdanielk1977    CREATE TEMP TABLE bar(stuff INTEGER);
12862d605499Sdanielk1977    INSERT INTO bar VALUES(100);
12872d605499Sdanielk1977    INSERT INTO bar VALUES(200);
12882d605499Sdanielk1977    INSERT INTO bar VALUES(300);
12892d605499Sdanielk1977  }
12902d605499Sdanielk1977} {}
12912d605499Sdanielk1977do_test where-16.4 {
12922d605499Sdanielk1977  execsql {
12932d605499Sdanielk1977    SELECT bar.RowID id FROM foo, bar WHERE foo.idx = bar.RowID AND id = 2;
12942d605499Sdanielk1977  }
12952d605499Sdanielk1977} {2 2}
12962d605499Sdanielk1977
1297ed717fe3Sdrhintegrity_check {where-99.0}
129808192d5fSdrh
12993072c5eaSdanielk1977#---------------------------------------------------------------------
13003072c5eaSdanielk1977# These tests test that a bug surrounding the use of ForceInt has been
13013072c5eaSdanielk1977# fixed in where.c.
13023072c5eaSdanielk1977#
13033072c5eaSdanielk1977do_test where-17.1 {
13043072c5eaSdanielk1977  execsql {
13053072c5eaSdanielk1977    CREATE TABLE tbooking (
13063072c5eaSdanielk1977      id INTEGER PRIMARY KEY,
13073072c5eaSdanielk1977      eventtype INTEGER NOT NULL
13083072c5eaSdanielk1977    );
13093072c5eaSdanielk1977    INSERT INTO tbooking VALUES(42, 3);
13103072c5eaSdanielk1977    INSERT INTO tbooking VALUES(43, 4);
13113072c5eaSdanielk1977  }
13123072c5eaSdanielk1977} {}
13133072c5eaSdanielk1977do_test where-17.2 {
13143072c5eaSdanielk1977  execsql {
13153072c5eaSdanielk1977    SELECT a.id
13163072c5eaSdanielk1977    FROM tbooking AS a
13173072c5eaSdanielk1977    WHERE a.eventtype=3;
13183072c5eaSdanielk1977  }
13193072c5eaSdanielk1977} {42}
13203072c5eaSdanielk1977do_test where-17.3 {
13213072c5eaSdanielk1977  execsql {
13223072c5eaSdanielk1977    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
13233072c5eaSdanielk1977    FROM tbooking AS a
13243072c5eaSdanielk1977    WHERE a.eventtype=3;
13253072c5eaSdanielk1977  }
13263072c5eaSdanielk1977} {42 43}
13273072c5eaSdanielk1977do_test where-17.4 {
13283072c5eaSdanielk1977  execsql {
13293072c5eaSdanielk1977    SELECT a.id, (SELECT b.id FROM tbooking AS b WHERE b.id>a.id)
13303072c5eaSdanielk1977    FROM (SELECT 1.5 AS id) AS a
13313072c5eaSdanielk1977  }
13323072c5eaSdanielk1977} {1.5 42}
13333072c5eaSdanielk1977do_test where-17.5 {
13343072c5eaSdanielk1977  execsql {
13353072c5eaSdanielk1977    CREATE TABLE tother(a, b);
13363072c5eaSdanielk1977    INSERT INTO tother VALUES(1, 3.7);
13373072c5eaSdanielk1977    SELECT id, a FROM tbooking, tother WHERE id>a;
13383072c5eaSdanielk1977  }
13393072c5eaSdanielk1977} {42 1 43 1}
13403072c5eaSdanielk1977
134167a5ec7bSdrh# Ticket [be84e357c035d068135f20bcfe82761bbf95006b]  2013-09-03
134267a5ec7bSdrh# Segfault during query involving LEFT JOIN column in the ORDER BY clause.
134367a5ec7bSdrh#
134467a5ec7bSdrhdo_execsql_test where-18.1 {
134567a5ec7bSdrh  CREATE TABLE t181(a);
134667a5ec7bSdrh  CREATE TABLE t182(b,c);
134767a5ec7bSdrh  INSERT INTO t181 VALUES(1);
134867a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL;
134967a5ec7bSdrh} {1}
13506134b2dfSdrhdo_execsql_test where-18.1rj {
13516134b2dfSdrh  SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY c IS NULL;
13526134b2dfSdrh} {1}
135367a5ec7bSdrhdo_execsql_test where-18.2 {
135467a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c;
135567a5ec7bSdrh} {1}
135667a5ec7bSdrhdo_execsql_test where-18.3 {
135767a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c;
135867a5ec7bSdrh} {1}
13596134b2dfSdrhdo_execsql_test where-18.3rj {
13606134b2dfSdrh  SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY c;
13616134b2dfSdrh} {1}
136267a5ec7bSdrhdo_execsql_test where-18.4 {
136367a5ec7bSdrh  INSERT INTO t181 VALUES(1),(1),(1),(1);
136467a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +c;
136567a5ec7bSdrh} {1}
13666134b2dfSdrhdo_execsql_test where-18.4rj {
13676134b2dfSdrh  SELECT DISTINCT a FROM t182 RIGHT JOIN t181 ON a=b ORDER BY +c;
13686134b2dfSdrh} {1}
136967a5ec7bSdrhdo_execsql_test where-18.5 {
137067a5ec7bSdrh  INSERT INTO t181 VALUES(2);
137167a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY c IS NULL, +a;
137267a5ec7bSdrh} {1 2}
137367a5ec7bSdrhdo_execsql_test where-18.6 {
137467a5ec7bSdrh  INSERT INTO t181 VALUES(2);
137567a5ec7bSdrh  SELECT DISTINCT a FROM t181 LEFT JOIN t182 ON a=b ORDER BY +a, +c IS NULL;
137667a5ec7bSdrh} {1 2}
137767a5ec7bSdrh
1378cb23e5d5Sdrh# Make sure the OR optimization works on a JOIN
1379cb23e5d5Sdrh#
1380cb23e5d5Sdrhdo_execsql_test where-19.0 {
1381cb23e5d5Sdrh  CREATE TABLE t191(a INT UNIQUE NOT NULL, b INT UNIQUE NOT NULL,c,d);
1382cb23e5d5Sdrh  CREATE INDEX t191a ON t1(a);
1383cb23e5d5Sdrh  CREATE INDEX t191b ON t1(b);
1384cb23e5d5Sdrh  CREATE TABLE t192(x INTEGER PRIMARY KEY,y INT, z INT);
1385cb23e5d5Sdrh
1386cb23e5d5Sdrh  EXPLAIN QUERY PLAN
1387cb23e5d5Sdrh  SELECT t191.rowid FROM t192, t191 WHERE (a=y OR b=y) AND x=?1;
1388cb23e5d5Sdrh} {/.* sqlite_autoindex_t191_1 .* sqlite_autoindex_t191_2 .*/}
1389cb23e5d5Sdrh
1390c447595dSdrh# 2018-04-24 ticket [https://www.sqlite.org/src/info/4ba5abf65c5b0f9a]
1391c447595dSdrh# Index on expressions leads to an incorrect answer for a LEFT JOIN
1392c447595dSdrh#
1393c447595dSdrhdo_execsql_test where-20.0 {
1394c447595dSdrh  CREATE TABLE t201(x);
1395c447595dSdrh  CREATE TABLE t202(y, z);
1396c447595dSdrh  INSERT INTO t201 VALUES('key');
1397c447595dSdrh  INSERT INTO t202 VALUES('key', -1);
1398c447595dSdrh  CREATE INDEX t202i ON t202(y, ifnull(z, 0));
1399c447595dSdrh  SELECT count(*) FROM t201 LEFT JOIN t202 ON (x=y) WHERE ifnull(z, 0) >=0;
1400c447595dSdrh} {0}
1401c447595dSdrh
1402ccb9eb78Sdando_execsql_test where-21.0 {
1403ccb9eb78Sdan  CREATE TABLE t12(a, b, c);
1404ccb9eb78Sdan  CREATE TABLE t13(x);
1405ccb9eb78Sdan  CREATE INDEX t12ab ON t12(b, a);
1406ccb9eb78Sdan  CREATE INDEX t12ac ON t12(c, a);
1407ccb9eb78Sdan
1408ccb9eb78Sdan  INSERT INTO t12 VALUES(4, 0, 1);
1409ccb9eb78Sdan  INSERT INTO t12 VALUES(4, 1, 0);
1410ccb9eb78Sdan  INSERT INTO t12 VALUES(5, 0, 1);
1411ccb9eb78Sdan  INSERT INTO t12 VALUES(5, 1, 0);
1412ccb9eb78Sdan
1413ccb9eb78Sdan  INSERT INTO t13 VALUES(1), (2), (3), (4);
1414ccb9eb78Sdan}
1415ccb9eb78Sdando_execsql_test where-21.1 {
1416ccb9eb78Sdan  SELECT * FROM t12 WHERE
1417ccb9eb78Sdan  a = (SELECT * FROM (SELECT count(*) FROM t13 LIMIT 5) ORDER BY 1 LIMIT 10)
1418ccb9eb78Sdan  AND (b=1 OR c=1);
1419ccb9eb78Sdan} {
1420ccb9eb78Sdan  4 1 0
1421ccb9eb78Sdan  4 0 1
1422ccb9eb78Sdan}
142367a5ec7bSdrh
1424383bb4faSdrh# 2018-11-05: ticket [https://www.sqlite.org/src/tktview/65eb38f6e46de8c75e188a]
1425383bb4faSdrh# Incorrect result in LEFT JOIN when STAT4 is enabled.
1426383bb4faSdrh#
1427383bb4faSdrhsqlite3 db :memory:
1428383bb4faSdrhdo_execsql_test where-22.1 {
1429383bb4faSdrh  CREATE TABLE t1(a INT);
1430383bb4faSdrh  CREATE INDEX t1a ON t1(a);
1431383bb4faSdrh  INSERT INTO t1(a) VALUES(NULL),(NULL),(42),(NULL),(NULL);
1432383bb4faSdrh  CREATE TABLE t2(dummy INT);
1433383bb4faSdrh  SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL;
1434383bb4faSdrh} {5}
1435383bb4faSdrh
1436bc0a55cfSdrh# 20190-02-22:  A bug introduced by checkin
1437bc0a55cfSdrh# https://www.sqlite.org/src/info/fa792714ae62fa98.
1438bc0a55cfSdrh#
1439bc0a55cfSdrhdo_execsql_test where-23.0 {
1440bc0a55cfSdrh  DROP TABLE IF EXISTS t1;
1441bc0a55cfSdrh  DROP TABLE IF EXISTS t2;
1442bc0a55cfSdrh  CREATE TABLE t1(a INTEGER PRIMARY KEY);
1443bc0a55cfSdrh  INSERT INTO t1(a) VALUES(1),(2),(3);
1444bc0a55cfSdrh  CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT);
1445bc0a55cfSdrh  INSERT INTO t2(y) VALUES(2),(3);
1446bc0a55cfSdrh  SELECT * FROM t1, t2 WHERE a=y AND y=3;
1447bc0a55cfSdrh} {3 2 3}
1448383bb4faSdrh
14496cf3009fSdan#-------------------------------------------------------------------------
14506cf3009fSdan#
14516cf3009fSdanreset_db
14526cf3009fSdando_execsql_test where-24.0 {
14536cf3009fSdan  CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
14546cf3009fSdan  INSERT INTO t1 VALUES(1, 'one');
14556cf3009fSdan  INSERT INTO t1 VALUES(2, 'two');
14566cf3009fSdan  INSERT INTO t1 VALUES(3, 'three');
14576cf3009fSdan  INSERT INTO t1 VALUES(4, 'four');
14586cf3009fSdan}
14596cf3009fSdan
14606cf3009fSdanforeach {tn sql res} {
14616cf3009fSdan  1 "SELECT b FROM t1"                   {one two three four}
14626cf3009fSdan  2 "SELECT b FROM t1 WHERE a<4"         {one two three}
14636cf3009fSdan  3 "SELECT b FROM t1 WHERE a>1"         {two three four}
14646cf3009fSdan  4 "SELECT b FROM t1 WHERE a>1 AND a<4" {two three}
14656cf3009fSdan
14666cf3009fSdan  5 "SELECT b FROM t1 WHERE a>? AND a<4" {}
14676cf3009fSdan  6 "SELECT b FROM t1 WHERE a>1 AND a<?" {}
14686cf3009fSdan  7 "SELECT b FROM t1 WHERE a>? AND a<?" {}
14696cf3009fSdan
14706cf3009fSdan  7 "SELECT b FROM t1 WHERE a>=? AND a<=4" {}
14716cf3009fSdan  8 "SELECT b FROM t1 WHERE a>=1 AND a<=?" {}
14726cf3009fSdan  9 "SELECT b FROM t1 WHERE a>=? AND a<=?" {}
14736cf3009fSdan} {
14746cf3009fSdan  set rev [list]
14756cf3009fSdan  foreach r $res { set rev [concat $r $rev] }
14766cf3009fSdan
14776cf3009fSdan  do_execsql_test where-24.$tn.1 "$sql"                     $res
14786cf3009fSdan  do_execsql_test where-24.$tn.2 "$sql ORDER BY rowid"      $res
14796cf3009fSdan  do_execsql_test where-24.$tn.3 "$sql ORDER BY rowid DESC" $rev
14806cf3009fSdan
14816cf3009fSdan  do_execsql_test where-24-$tn.4 "
14826cf3009fSdan    BEGIN;
14836cf3009fSdan      DELETE FROM t1;
14846cf3009fSdan      $sql;
14856cf3009fSdan      $sql ORDER BY rowid;
14866cf3009fSdan      $sql ORDER BY rowid DESC;
14876cf3009fSdan    ROLLBACK;
14886cf3009fSdan  "
14896cf3009fSdan}
14906cf3009fSdan
14916cf3009fSdan#-------------------------------------------------------------------------
14926cf3009fSdan#
14936cf3009fSdanreset_db
14946cf3009fSdando_execsql_test where-25.0 {
14956cf3009fSdan  CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
14966cf3009fSdan  CREATE UNIQUE INDEX i1 ON t1(c);
14976cf3009fSdan  INSERT INTO t1 VALUES(1, 'one', 'i');
14986cf3009fSdan  INSERT INTO t1 VALUES(2, 'two', 'ii');
14996cf3009fSdan
15006cf3009fSdan  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
15016cf3009fSdan  CREATE UNIQUE INDEX i2 ON t2(c);
15026cf3009fSdan  INSERT INTO t2 VALUES(1, 'one', 'i');
15036cf3009fSdan  INSERT INTO t2 VALUES(2, 'two', 'ii');
15046cf3009fSdan  INSERT INTO t2 VALUES(3, 'three', 'iii');
15056cf3009fSdan
15066cf3009fSdan  PRAGMA writable_schema = 1;
1507346a70caSdrh  UPDATE sqlite_schema SET rootpage = (
1508346a70caSdrh    SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
15096cf3009fSdan  ) WHERE name = 'i1';
15106cf3009fSdan}
15116cf3009fSdandb close
15126cf3009fSdansqlite3 db test.db
15136cf3009fSdando_catchsql_test where-25.1 {
15146cf3009fSdan  DELETE FROM t1 WHERE c='iii'
15156cf3009fSdan} {1 {database disk image is malformed}}
15166cf3009fSdando_catchsql_test where-25.2 {
15176cf3009fSdan  INSERT INTO t1 VALUES(4, 'four', 'iii')
15186cf3009fSdan    ON CONFLICT(c) DO UPDATE SET b=NULL
15196cf3009fSdan} {1 {database disk image is malformed}}
15206cf3009fSdan
15216cf3009fSdanreset_db
15226cf3009fSdando_execsql_test where-25.3 {
15236cf3009fSdan  CREATE TABLE t1(a PRIMARY KEY, b, c) WITHOUT ROWID;
15246cf3009fSdan  CREATE UNIQUE INDEX i1 ON t1(c);
15256cf3009fSdan  INSERT INTO t1 VALUES(1, 'one', 'i');
15266cf3009fSdan  INSERT INTO t1 VALUES(2, 'two', 'ii');
15276cf3009fSdan
15286cf3009fSdan  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
15296cf3009fSdan  CREATE UNIQUE INDEX i2 ON t2(c);
15306cf3009fSdan  INSERT INTO t2 VALUES(1, 'one', 'i');
15316cf3009fSdan  INSERT INTO t2 VALUES(2, 'two', 'ii');
15326cf3009fSdan  INSERT INTO t2 VALUES(3, 'three', 'iii');
15336cf3009fSdan
15346cf3009fSdan  PRAGMA writable_schema = 1;
1535346a70caSdrh  UPDATE sqlite_schema SET rootpage = (
1536346a70caSdrh    SELECT rootpage FROM sqlite_schema WHERE name = 'i2'
15376cf3009fSdan  ) WHERE name = 'i1';
15386cf3009fSdan}
15396cf3009fSdandb close
15406cf3009fSdansqlite3 db test.db
15416cf3009fSdando_catchsql_test where-25.4 {
15426cf3009fSdan  SELECT * FROM t1 WHERE c='iii'
15436cf3009fSdan} {0 {}}
15446cf3009fSdando_catchsql_test where-25.5 {
15456cf3009fSdan  INSERT INTO t1 VALUES(4, 'four', 'iii')
15466cf3009fSdan    ON CONFLICT(c) DO UPDATE SET b=NULL
15476cf3009fSdan} {1 {corrupt database}}
15486cf3009fSdan
15493e364802Sdrh# 2019-08-21 Ticket https://www.sqlite.org/src/info/d9f584e936c7a8d0
15503e364802Sdrh#
15513e364802Sdrhdb close
15523e364802Sdrhsqlite3 db :memory:
15533e364802Sdrhdo_execsql_test where-26.1 {
15543e364802Sdrh  CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT);
15553e364802Sdrh  INSERT INTO t0(c0, c1) VALUES (1, 'a');
15563e364802Sdrh  CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT);
15573e364802Sdrh  INSERT INTO t1(c0, c1) VALUES (1, 'a');
15583e364802Sdrh  SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0;
15593e364802Sdrh} {1 a}
15603e364802Sdrhdo_execsql_test where-26.2 {
15613e364802Sdrh  SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0;
15623e364802Sdrh} {1 a}
15633e364802Sdrhdo_execsql_test where-26.3 {
15643e364802Sdrh  SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0;
15653e364802Sdrh} {1 a}
15663e364802Sdrhdo_execsql_test where-26.4 {
15673e364802Sdrh  SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0;
15683e364802Sdrh} {1 a}
15693e364802Sdrhdo_execsql_test where-26.5 {
15703e364802Sdrh  SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0;
15713e364802Sdrh} {1}
15723e364802Sdrhdo_execsql_test where-26.6 {
15733e364802Sdrh  SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1;
15743e364802Sdrh} {1}
15753e364802Sdrhdo_execsql_test where-26.7 {
15763e364802Sdrh  SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0;
15773e364802Sdrh} {1}
15783e364802Sdrhdo_execsql_test where-26.8 {
15793e364802Sdrh  SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1;
15803e364802Sdrh} {1}
15813e364802Sdrh
1582de324617Sdrh# 2021-07-19 https://sqlite.org/forum/forumpost/2bdb86a068
1583de324617Sdrh# Lose of precision when doing comparisons between integer and
1584de324617Sdrh# floating point values that are near 9223372036854775807 in the
1585de324617Sdrh# OP_SeekGE opcode (and similar).
1586de324617Sdrh#
1587619a5f55Sdan# Valgrind documentation acknowledges that under valgrind, FP calculations
1588619a5f55Sdan# may not be as accurate as on x86/amd64 hardware. This seems to be causing
1589619a5f55Sdan# these tests to fail.
1590619a5f55Sdan#
1591619a5f55Sdan#   https://valgrind.org/docs/manual/manual-core.html#manual-core.limits
1592619a5f55Sdan#
1593619a5f55Sdanif {[permutation]!="valgrind"} {
1594de324617Sdrh  reset_db
1595de324617Sdrh  do_execsql_test where-27.1 {
1596de324617Sdrh    CREATE TABLE t1(a INTEGER PRIMARY KEY);
1597de324617Sdrh    INSERT INTO t1(a) VALUES(9223372036854775807);
1598de324617Sdrh    SELECT 1 FROM t1 WHERE a>=(9223372036854775807+1);
1599de324617Sdrh  } {}
1600de324617Sdrh  do_execsql_test where-27.2 {
1601de324617Sdrh    SELECT a>=9223372036854775807+1 FROM t1;
1602de324617Sdrh  } {0}
1603619a5f55Sdan}
1604de324617Sdrh
1605*cc212e44Sdrh# 2022-05-10 dbsqlfuzz 4c5e3e89bc251d28378be88233f531b84ec66901
1606*cc212e44Sdrh#
1607*cc212e44Sdrhreset_db
1608*cc212e44Sdrhdo_execsql_test where-28.1 {
1609*cc212e44Sdrh  CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT);
1610*cc212e44Sdrh  CREATE INDEX t1b ON t1(b,b,b,b,b,b,b,b,b,b,b,b,b);
1611*cc212e44Sdrh  INSERT INTO t1(a,b) VALUES(1,1),(15,2),(19,5);
1612*cc212e44Sdrh  UPDATE t1 SET b=999 WHERE a IN (SELECT 15) AND b IN (1,2);
1613*cc212e44Sdrh  SELECT * FROM t1;
1614*cc212e44Sdrh} {
1615*cc212e44Sdrh 1  1
1616*cc212e44Sdrh 15 999
1617*cc212e44Sdrh 19 5
1618*cc212e44Sdrh}
1619*cc212e44Sdrh
16206de4f4caSdrhfinish_test
1621