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