1*4520Snw141292 2*4520Snw141292#pragma ident "%Z%%M% %I% %E% SMI" 3*4520Snw141292 4*4520Snw141292# 2001 September 15 5*4520Snw141292# 6*4520Snw141292# The author disclaims copyright to this source code. In place of 7*4520Snw141292# a legal notice, here is a blessing: 8*4520Snw141292# 9*4520Snw141292# May you do good and not evil. 10*4520Snw141292# May you find forgiveness for yourself and forgive others. 11*4520Snw141292# May you share freely, never taking more than you give. 12*4520Snw141292# 13*4520Snw141292#*********************************************************************** 14*4520Snw141292# This file implements regression tests for SQLite library. The 15*4520Snw141292# focus of this file is testing the the library is able to correctly 16*4520Snw141292# handle file-format 3 (version 2.6.x) databases. 17*4520Snw141292# 18*4520Snw141292# $Id: format3.test,v 1.4 2003/12/23 02:17:35 drh Exp $ 19*4520Snw141292 20*4520Snw141292set testdir [file dirname $argv0] 21*4520Snw141292source $testdir/tester.tcl 22*4520Snw141292 23*4520Snw141292# Create a bunch of data to sort against 24*4520Snw141292# 25*4520Snw141292do_test format3-1.0 { 26*4520Snw141292 set fd [open data.txt w] 27*4520Snw141292 puts $fd "1\tone\t0\tI\t3.141592653" 28*4520Snw141292 puts $fd "2\ttwo\t1\tII\t2.15" 29*4520Snw141292 puts $fd "3\tthree\t1\tIII\t4221.0" 30*4520Snw141292 puts $fd "4\tfour\t2\tIV\t-0.0013442" 31*4520Snw141292 puts $fd "5\tfive\t2\tV\t-11" 32*4520Snw141292 puts $fd "6\tsix\t2\tVI\t0.123" 33*4520Snw141292 puts $fd "7\tseven\t2\tVII\t123.0" 34*4520Snw141292 puts $fd "8\teight\t3\tVIII\t-1.6" 35*4520Snw141292 close $fd 36*4520Snw141292 execsql { 37*4520Snw141292 CREATE TABLE t1( 38*4520Snw141292 n int, 39*4520Snw141292 v varchar(10), 40*4520Snw141292 log int, 41*4520Snw141292 roman varchar(10), 42*4520Snw141292 flt real 43*4520Snw141292 ); 44*4520Snw141292 COPY t1 FROM 'data.txt' 45*4520Snw141292 } 46*4520Snw141292 file delete data.txt 47*4520Snw141292 db close 48*4520Snw141292 set ::bt [btree_open test.db] 49*4520Snw141292 btree_begin_transaction $::bt 50*4520Snw141292 set m [btree_get_meta $::bt] 51*4520Snw141292 set m [lreplace $m 2 2 3] 52*4520Snw141292 eval btree_update_meta $::bt $m 53*4520Snw141292 btree_commit $::bt 54*4520Snw141292 btree_close $::bt 55*4520Snw141292 sqlite db test.db 56*4520Snw141292 execsql {SELECT count(*) FROM t1} 57*4520Snw141292} {8} 58*4520Snw141292 59*4520Snw141292do_test format3-1.1 { 60*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY n} 61*4520Snw141292} {1 2 3 4 5 6 7 8} 62*4520Snw141292do_test format3-1.1.1 { 63*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY n ASC} 64*4520Snw141292} {1 2 3 4 5 6 7 8} 65*4520Snw141292do_test format3-1.1.1 { 66*4520Snw141292 execsql {SELECT ALL n FROM t1 ORDER BY n ASC} 67*4520Snw141292} {1 2 3 4 5 6 7 8} 68*4520Snw141292do_test format3-1.2 { 69*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY n DESC} 70*4520Snw141292} {8 7 6 5 4 3 2 1} 71*4520Snw141292do_test format3-1.3a { 72*4520Snw141292 execsql {SELECT v FROM t1 ORDER BY v} 73*4520Snw141292} {eight five four one seven six three two} 74*4520Snw141292do_test format3-1.3b { 75*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY v} 76*4520Snw141292} {8 5 4 1 7 6 3 2} 77*4520Snw141292do_test format3-1.4 { 78*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY v DESC} 79*4520Snw141292} {2 3 6 7 1 4 5 8} 80*4520Snw141292do_test format3-1.5 { 81*4520Snw141292 execsql {SELECT flt FROM t1 ORDER BY flt} 82*4520Snw141292} {-11 -1.6 -0.0013442 0.123 2.15 3.141592653 123.0 4221.0} 83*4520Snw141292do_test format3-1.6 { 84*4520Snw141292 execsql {SELECT flt FROM t1 ORDER BY flt DESC} 85*4520Snw141292} {4221.0 123.0 3.141592653 2.15 0.123 -0.0013442 -1.6 -11} 86*4520Snw141292do_test format3-1.7 { 87*4520Snw141292 execsql {SELECT roman FROM t1 ORDER BY roman} 88*4520Snw141292} {I II III IV V VI VII VIII} 89*4520Snw141292do_test format3-1.8 { 90*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log, flt} 91*4520Snw141292} {1 2 3 5 4 6 7 8} 92*4520Snw141292do_test format3-1.8.1 { 93*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log asc, flt} 94*4520Snw141292} {1 2 3 5 4 6 7 8} 95*4520Snw141292do_test format3-1.8.2 { 96*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log, flt ASC} 97*4520Snw141292} {1 2 3 5 4 6 7 8} 98*4520Snw141292do_test format3-1.8.3 { 99*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log ASC, flt asc} 100*4520Snw141292} {1 2 3 5 4 6 7 8} 101*4520Snw141292do_test format3-1.9 { 102*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log, flt DESC} 103*4520Snw141292} {1 3 2 7 6 4 5 8} 104*4520Snw141292do_test format3-1.9.1 { 105*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log ASC, flt DESC} 106*4520Snw141292} {1 3 2 7 6 4 5 8} 107*4520Snw141292do_test format3-1.10 { 108*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log DESC, flt} 109*4520Snw141292} {8 5 4 6 7 2 3 1} 110*4520Snw141292do_test format3-1.11 { 111*4520Snw141292 execsql {SELECT n FROM t1 ORDER BY log DESC, flt DESC} 112*4520Snw141292} {8 7 6 4 5 3 2 1} 113*4520Snw141292 114*4520Snw141292# These tests are designed to reach some hard-to-reach places 115*4520Snw141292# inside the string comparison routines. 116*4520Snw141292# 117*4520Snw141292# (Later) The sorting behavior changed in 2.7.0. But we will 118*4520Snw141292# keep these tests. You can never have too many test cases! 119*4520Snw141292# 120*4520Snw141292do_test format3-2.1.1 { 121*4520Snw141292 execsql { 122*4520Snw141292 UPDATE t1 SET v='x' || -flt; 123*4520Snw141292 UPDATE t1 SET v='x-2b' where v=='x-0.123'; 124*4520Snw141292 SELECT v FROM t1 ORDER BY v; 125*4520Snw141292 } 126*4520Snw141292} {x-123 x-2.15 x-2b x-3.141592653 x-4221 x0.0013442 x1.6 x11} 127*4520Snw141292do_test format3-2.1.2 { 128*4520Snw141292 execsql { 129*4520Snw141292 SELECT v FROM t1 ORDER BY substr(v,2,999); 130*4520Snw141292 } 131*4520Snw141292} {x-4221 x-123 x-3.141592653 x-2.15 x0.0013442 x1.6 x11 x-2b} 132*4520Snw141292do_test format3-2.1.3 { 133*4520Snw141292 execsql { 134*4520Snw141292 SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0; 135*4520Snw141292 } 136*4520Snw141292} {x-4221 x-123 x-3.141592653 x-2.15 x-2b x0.0013442 x1.6 x11} 137*4520Snw141292do_test format3-2.1.4 { 138*4520Snw141292 execsql { 139*4520Snw141292 SELECT v FROM t1 ORDER BY substr(v,2,999) DESC; 140*4520Snw141292 } 141*4520Snw141292} {x-2b x11 x1.6 x0.0013442 x-2.15 x-3.141592653 x-123 x-4221} 142*4520Snw141292do_test format3-2.1.5 { 143*4520Snw141292 execsql { 144*4520Snw141292 SELECT v FROM t1 ORDER BY substr(v,2,999)+0.0 DESC; 145*4520Snw141292 } 146*4520Snw141292} {x11 x1.6 x0.0013442 x-2b x-2.15 x-3.141592653 x-123 x-4221} 147*4520Snw141292 148*4520Snw141292# This is a bug fix for 2.2.4. 149*4520Snw141292# Strings are normally mapped to upper-case for a caseless comparison. 150*4520Snw141292# But this can cause problems for characters in between 'Z' and 'a'. 151*4520Snw141292# 152*4520Snw141292do_test format3-3.1 { 153*4520Snw141292 execsql { 154*4520Snw141292 CREATE TABLE t2(a,b); 155*4520Snw141292 INSERT INTO t2 VALUES('AGLIENTU',1); 156*4520Snw141292 INSERT INTO t2 VALUES('AGLIE`',2); 157*4520Snw141292 INSERT INTO t2 VALUES('AGNA',3); 158*4520Snw141292 SELECT a, b FROM t2 ORDER BY a; 159*4520Snw141292 } 160*4520Snw141292} {AGLIENTU 1 AGLIE` 2 AGNA 3} 161*4520Snw141292do_test format3-3.2 { 162*4520Snw141292 execsql { 163*4520Snw141292 SELECT a, b FROM t2 ORDER BY a DESC; 164*4520Snw141292 } 165*4520Snw141292} {AGNA 3 AGLIE` 2 AGLIENTU 1} 166*4520Snw141292do_test format3-3.3 { 167*4520Snw141292 execsql { 168*4520Snw141292 DELETE FROM t2; 169*4520Snw141292 INSERT INTO t2 VALUES('aglientu',1); 170*4520Snw141292 INSERT INTO t2 VALUES('aglie`',2); 171*4520Snw141292 INSERT INTO t2 VALUES('agna',3); 172*4520Snw141292 SELECT a, b FROM t2 ORDER BY a; 173*4520Snw141292 } 174*4520Snw141292} {aglie` 2 aglientu 1 agna 3} 175*4520Snw141292do_test format3-3.4 { 176*4520Snw141292 execsql { 177*4520Snw141292 SELECT a, b FROM t2 ORDER BY a DESC; 178*4520Snw141292 } 179*4520Snw141292} {agna 3 aglientu 1 aglie` 2} 180*4520Snw141292 181*4520Snw141292# Version 2.7.0 testing. 182*4520Snw141292# 183*4520Snw141292do_test format3-4.1 { 184*4520Snw141292 execsql { 185*4520Snw141292 INSERT INTO t1 VALUES(9,'x2.7',3,'IX',4.0e5); 186*4520Snw141292 INSERT INTO t1 VALUES(10,'x5.0e10',3,'X',-4.0e5); 187*4520Snw141292 INSERT INTO t1 VALUES(11,'x-4.0e9',3,'XI',4.1e4); 188*4520Snw141292 INSERT INTO t1 VALUES(12,'x01234567890123456789',3,'XII',-4.2e3); 189*4520Snw141292 SELECT n FROM t1 ORDER BY n; 190*4520Snw141292 } 191*4520Snw141292} {1 2 3 4 5 6 7 8 9 10 11 12} 192*4520Snw141292do_test format3-4.2 { 193*4520Snw141292 execsql { 194*4520Snw141292 SELECT n||'' FROM t1 ORDER BY 1; 195*4520Snw141292 } 196*4520Snw141292} {1 2 3 4 5 6 7 8 9 10 11 12} 197*4520Snw141292do_test format3-4.3 { 198*4520Snw141292 execsql { 199*4520Snw141292 SELECT n+0 FROM t1 ORDER BY 1; 200*4520Snw141292 } 201*4520Snw141292} {1 2 3 4 5 6 7 8 9 10 11 12} 202*4520Snw141292do_test format3-4.4 { 203*4520Snw141292 execsql { 204*4520Snw141292 SELECT n||'' FROM t1 ORDER BY 1 DESC; 205*4520Snw141292 } 206*4520Snw141292} {12 11 10 9 8 7 6 5 4 3 2 1} 207*4520Snw141292do_test format3-4.5 { 208*4520Snw141292 execsql { 209*4520Snw141292 SELECT n+0 FROM t1 ORDER BY 1 DESC; 210*4520Snw141292 } 211*4520Snw141292} {12 11 10 9 8 7 6 5 4 3 2 1} 212*4520Snw141292do_test format3-4.6 { 213*4520Snw141292 execsql { 214*4520Snw141292 SELECT v FROM t1 ORDER BY 1; 215*4520Snw141292 } 216*4520Snw141292} {x-123 x-2.15 x-2b x-3.141592653 x-4.0e9 x-4221 x0.0013442 x01234567890123456789 x1.6 x11 x2.7 x5.0e10} 217*4520Snw141292do_test format3-4.7 { 218*4520Snw141292 execsql { 219*4520Snw141292 SELECT v FROM t1 ORDER BY 1 DESC; 220*4520Snw141292 } 221*4520Snw141292} {x5.0e10 x2.7 x11 x1.6 x01234567890123456789 x0.0013442 x-4221 x-4.0e9 x-3.141592653 x-2b x-2.15 x-123} 222*4520Snw141292do_test format3-4.8 { 223*4520Snw141292 execsql { 224*4520Snw141292 SELECT substr(v,2,99) FROM t1 ORDER BY 1; 225*4520Snw141292 } 226*4520Snw141292} {-4.0e9 -4221 -123 -3.141592653 -2.15 0.0013442 1.6 2.7 11 5.0e10 01234567890123456789 -2b} 227*4520Snw141292 228*4520Snw141292# Build some new test data, this time with indices. 229*4520Snw141292# 230*4520Snw141292do_test format3-5.0 { 231*4520Snw141292 execsql { 232*4520Snw141292 DROP TABLE t1; 233*4520Snw141292 CREATE TABLE t1(w int, x text, y blob); 234*4520Snw141292 DROP TABLE t2; 235*4520Snw141292 CREATE TABLE t2(p varchar(1), q clob, r real, s numeric(8)); 236*4520Snw141292 } 237*4520Snw141292 for {set i 1} {$i<=100} {incr i} { 238*4520Snw141292 set w $i 239*4520Snw141292 set x [expr {int(log($i)/log(2))}] 240*4520Snw141292 set y [expr {$i*$i + 2*$i + 1}] 241*4520Snw141292 execsql "INSERT INTO t1 VALUES($w,$x,$y)" 242*4520Snw141292 } 243*4520Snw141292 execsql { 244*4520Snw141292 INSERT INTO t2 SELECT 101-w, x, (SELECT max(y) FROM t1)+1-y, y FROM t1; 245*4520Snw141292 CREATE INDEX i1w ON t1(w); 246*4520Snw141292 CREATE INDEX i1xy ON t1(x,y); 247*4520Snw141292 CREATE INDEX i2p ON t2(p); 248*4520Snw141292 CREATE INDEX i2r ON t2(r); 249*4520Snw141292 CREATE INDEX i2qs ON t2(q, s); 250*4520Snw141292 } 251*4520Snw141292} {} 252*4520Snw141292 253*4520Snw141292# Do an SQL statement. Append the search count to the end of the result. 254*4520Snw141292# 255*4520Snw141292proc count sql { 256*4520Snw141292 set ::sqlite_search_count 0 257*4520Snw141292 return [concat [execsql $sql] $::sqlite_search_count] 258*4520Snw141292} 259*4520Snw141292 260*4520Snw141292# Verify that queries use an index. We are using the special variable 261*4520Snw141292# "sqlite_search_count" which tallys the number of executions of MoveTo 262*4520Snw141292# and Next operators in the VDBE. By verifing that the search count is 263*4520Snw141292# small we can be assured that indices are being used properly. 264*4520Snw141292# 265*4520Snw141292do_test format3-5.1 { 266*4520Snw141292 db close 267*4520Snw141292 sqlite db test.db 268*4520Snw141292 count {SELECT x, y FROM t1 WHERE w=10} 269*4520Snw141292} {3 121 3} 270*4520Snw141292do_test format3-5.2 { 271*4520Snw141292 count {SELECT x, y FROM t1 WHERE w=11} 272*4520Snw141292} {3 144 3} 273*4520Snw141292do_test format3-5.3 { 274*4520Snw141292 count {SELECT x, y FROM t1 WHERE 11=w} 275*4520Snw141292} {3 144 3} 276*4520Snw141292do_test format3-5.4 { 277*4520Snw141292 count {SELECT x, y FROM t1 WHERE 11=w AND x>2} 278*4520Snw141292} {3 144 3} 279*4520Snw141292do_test format3-5.5 { 280*4520Snw141292 count {SELECT x, y FROM t1 WHERE y<200 AND w=11 AND x>2} 281*4520Snw141292} {3 144 3} 282*4520Snw141292do_test format3-5.6 { 283*4520Snw141292 count {SELECT x, y FROM t1 WHERE y<200 AND x>2 AND w=11} 284*4520Snw141292} {3 144 3} 285*4520Snw141292do_test format3-5.7 { 286*4520Snw141292 count {SELECT x, y FROM t1 WHERE w=11 AND y<200 AND x>2} 287*4520Snw141292} {3 144 3} 288*4520Snw141292do_test format3-5.8 { 289*4520Snw141292 count {SELECT x, y FROM t1 WHERE w>10 AND y=144 AND x=3} 290*4520Snw141292} {3 144 3} 291*4520Snw141292do_test format3-5.9 { 292*4520Snw141292 count {SELECT x, y FROM t1 WHERE y=144 AND w>10 AND x=3} 293*4520Snw141292} {3 144 3} 294*4520Snw141292do_test format3-5.10 { 295*4520Snw141292 count {SELECT x, y FROM t1 WHERE x=3 AND w>=10 AND y=121} 296*4520Snw141292} {3 121 3} 297*4520Snw141292do_test format3-5.11 { 298*4520Snw141292 count {SELECT x, y FROM t1 WHERE x=3 AND y=100 AND w<10} 299*4520Snw141292} {3 100 3} 300*4520Snw141292 301*4520Snw141292# New for SQLite version 2.1: Verify that that inequality constraints 302*4520Snw141292# are used correctly. 303*4520Snw141292# 304*4520Snw141292do_test format3-5.12 { 305*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y<100} 306*4520Snw141292} {8 3} 307*4520Snw141292do_test format3-5.13 { 308*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 100>y} 309*4520Snw141292} {8 3} 310*4520Snw141292do_test format3-5.14 { 311*4520Snw141292 count {SELECT w FROM t1 WHERE 3=x AND y<100} 312*4520Snw141292} {8 3} 313*4520Snw141292do_test format3-5.15 { 314*4520Snw141292 count {SELECT w FROM t1 WHERE 3=x AND 100>y} 315*4520Snw141292} {8 3} 316*4520Snw141292do_test format3-5.16 { 317*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y<=100} 318*4520Snw141292} {8 9 5} 319*4520Snw141292do_test format3-5.17 { 320*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 100>=y} 321*4520Snw141292} {8 9 5} 322*4520Snw141292do_test format3-5.18 { 323*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y>225} 324*4520Snw141292} {15 3} 325*4520Snw141292do_test format3-5.19 { 326*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 225<y} 327*4520Snw141292} {15 3} 328*4520Snw141292do_test format3-5.20 { 329*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y>=225} 330*4520Snw141292} {14 15 5} 331*4520Snw141292do_test format3-5.21 { 332*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 225<=y} 333*4520Snw141292} {14 15 5} 334*4520Snw141292do_test format3-5.22 { 335*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y>121 AND y<196} 336*4520Snw141292} {11 12 5} 337*4520Snw141292do_test format3-5.23 { 338*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y>=121 AND y<=196} 339*4520Snw141292} {10 11 12 13 9} 340*4520Snw141292do_test format3-5.24 { 341*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 121<y AND 196>y} 342*4520Snw141292} {11 12 5} 343*4520Snw141292do_test format3-5.25 { 344*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND 121<=y AND 196>=y} 345*4520Snw141292} {10 11 12 13 9} 346*4520Snw141292 347*4520Snw141292# Need to work on optimizing the BETWEEN operator. 348*4520Snw141292# 349*4520Snw141292# do_test format3-5.26 { 350*4520Snw141292# count {SELECT w FROM t1 WHERE x=3 AND y BETWEEN 121 AND 196} 351*4520Snw141292# } {10 11 12 13 9} 352*4520Snw141292 353*4520Snw141292do_test format3-5.27 { 354*4520Snw141292 count {SELECT w FROM t1 WHERE x=3 AND y+1==122} 355*4520Snw141292} {10 17} 356*4520Snw141292do_test format3-5.28 { 357*4520Snw141292 count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122} 358*4520Snw141292} {10 99} 359*4520Snw141292do_test format3-5.29 { 360*4520Snw141292 count {SELECT w FROM t1 WHERE y==121} 361*4520Snw141292} {10 99} 362*4520Snw141292 363*4520Snw141292 364*4520Snw141292do_test format3-5.30 { 365*4520Snw141292 count {SELECT w FROM t1 WHERE w>97} 366*4520Snw141292} {98 99 100 6} 367*4520Snw141292do_test format3-5.31 { 368*4520Snw141292 count {SELECT w FROM t1 WHERE w>=97} 369*4520Snw141292} {97 98 99 100 8} 370*4520Snw141292do_test format3-5.33 { 371*4520Snw141292 count {SELECT w FROM t1 WHERE w==97} 372*4520Snw141292} {97 3} 373*4520Snw141292do_test format3-5.34 { 374*4520Snw141292 count {SELECT w FROM t1 WHERE w+1==98} 375*4520Snw141292} {97 99} 376*4520Snw141292do_test format3-5.35 { 377*4520Snw141292 count {SELECT w FROM t1 WHERE w<3} 378*4520Snw141292} {1 2 4} 379*4520Snw141292do_test format3-5.36 { 380*4520Snw141292 count {SELECT w FROM t1 WHERE w<=3} 381*4520Snw141292} {1 2 3 6} 382*4520Snw141292do_test format3-5.37 { 383*4520Snw141292 count {SELECT w FROM t1 WHERE w+1<=4 ORDER BY w} 384*4520Snw141292} {1 2 3 199} 385*4520Snw141292 386*4520Snw141292 387*4520Snw141292# Do the same kind of thing except use a join as the data source. 388*4520Snw141292# 389*4520Snw141292do_test format3-6.1 { 390*4520Snw141292 db close 391*4520Snw141292 sqlite db test.db 392*4520Snw141292 count { 393*4520Snw141292 SELECT w, p FROM t2, t1 394*4520Snw141292 WHERE x=q AND y=s AND r=8977 395*4520Snw141292 } 396*4520Snw141292} {34 67 6} 397*4520Snw141292do_test format3-6.2 { 398*4520Snw141292 count { 399*4520Snw141292 SELECT w, p FROM t2, t1 400*4520Snw141292 WHERE x=q AND s=y AND r=8977 401*4520Snw141292 } 402*4520Snw141292} {34 67 6} 403*4520Snw141292do_test format3-6.3 { 404*4520Snw141292 count { 405*4520Snw141292 SELECT w, p FROM t2, t1 406*4520Snw141292 WHERE x=q AND s=y AND r=8977 AND w>10 407*4520Snw141292 } 408*4520Snw141292} {34 67 6} 409*4520Snw141292do_test format3-6.4 { 410*4520Snw141292 count { 411*4520Snw141292 SELECT w, p FROM t2, t1 412*4520Snw141292 WHERE p<80 AND x=q AND s=y AND r=8977 AND w>10 413*4520Snw141292 } 414*4520Snw141292} {34 67 6} 415*4520Snw141292do_test format3-6.5 { 416*4520Snw141292 count { 417*4520Snw141292 SELECT w, p FROM t2, t1 418*4520Snw141292 WHERE p<80 AND x=q AND 8977=r AND s=y AND w>10 419*4520Snw141292 } 420*4520Snw141292} {34 67 6} 421*4520Snw141292do_test format3-6.6 { 422*4520Snw141292 count { 423*4520Snw141292 SELECT w, p FROM t2, t1 424*4520Snw141292 WHERE x=q AND p=77 AND s=y AND w>5 425*4520Snw141292 } 426*4520Snw141292} {24 77 6} 427*4520Snw141292do_test format3-6.7 { 428*4520Snw141292 count { 429*4520Snw141292 SELECT w, p FROM t1, t2 430*4520Snw141292 WHERE x=q AND p>77 AND s=y AND w=5 431*4520Snw141292 } 432*4520Snw141292} {5 96 6} 433*4520Snw141292 434*4520Snw141292# Lets do a 3-way join. 435*4520Snw141292# 436*4520Snw141292do_test format3-7.1 { 437*4520Snw141292 count { 438*4520Snw141292 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 439*4520Snw141292 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=11 440*4520Snw141292 } 441*4520Snw141292} {11 90 11 9} 442*4520Snw141292do_test format3-7.2 { 443*4520Snw141292 count { 444*4520Snw141292 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 445*4520Snw141292 WHERE C.w=101-B.p AND B.r=10202-A.y AND A.w=12 446*4520Snw141292 } 447*4520Snw141292} {12 89 12 9} 448*4520Snw141292do_test format3-7.3 { 449*4520Snw141292 count { 450*4520Snw141292 SELECT A.w, B.p, C.w FROM t1 as A, t2 as B, t1 as C 451*4520Snw141292 WHERE A.w=15 AND B.p=C.w AND B.r=10202-A.y 452*4520Snw141292 } 453*4520Snw141292} {15 86 86 9} 454*4520Snw141292 455*4520Snw141292# Test to see that the special case of a constant WHERE clause is 456*4520Snw141292# handled. 457*4520Snw141292# 458*4520Snw141292do_test format3-8.1 { 459*4520Snw141292 count { 460*4520Snw141292 SELECT * FROM t1 WHERE 0 461*4520Snw141292 } 462*4520Snw141292} {0} 463*4520Snw141292do_test format3-8.2 { 464*4520Snw141292 count { 465*4520Snw141292 SELECT * FROM t1 WHERE 1 LIMIT 1 466*4520Snw141292 } 467*4520Snw141292} {1 0 4 1} 468*4520Snw141292do_test format3-8.3 { 469*4520Snw141292 execsql { 470*4520Snw141292 SELECT 99 WHERE 0 471*4520Snw141292 } 472*4520Snw141292} {} 473*4520Snw141292do_test format3-8.4 { 474*4520Snw141292 execsql { 475*4520Snw141292 SELECT 99 WHERE 1 476*4520Snw141292 } 477*4520Snw141292} {99} 478*4520Snw141292 479*4520Snw141292# Verify that IN operators in a WHERE clause are handled correctly. 480*4520Snw141292# 481*4520Snw141292do_test format3-9.1 { 482*4520Snw141292 count { 483*4520Snw141292 SELECT * FROM t1 WHERE rowid IN (1,2,3,1234) order by 1; 484*4520Snw141292 } 485*4520Snw141292} {1 0 4 2 1 9 3 1 16 0} 486*4520Snw141292do_test format3-9.2 { 487*4520Snw141292 count { 488*4520Snw141292 SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1; 489*4520Snw141292 } 490*4520Snw141292} {1 0 4 2 1 9 3 1 16 199} 491*4520Snw141292do_test format3-9.3 { 492*4520Snw141292 count { 493*4520Snw141292 SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1; 494*4520Snw141292 } 495*4520Snw141292} {1 0 4 2 1 9 3 1 16 10} 496*4520Snw141292do_test format3-9.4 { 497*4520Snw141292 count { 498*4520Snw141292 SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1; 499*4520Snw141292 } 500*4520Snw141292} {1 0 4 2 1 9 3 1 16 199} 501*4520Snw141292do_test format3-9.5 { 502*4520Snw141292 count { 503*4520Snw141292 SELECT * FROM t1 WHERE rowid IN 504*4520Snw141292 (select rowid from t1 where rowid IN (-1,2,4)) 505*4520Snw141292 ORDER BY 1; 506*4520Snw141292 } 507*4520Snw141292} {2 1 9 4 2 25 1} 508*4520Snw141292do_test format3-9.6 { 509*4520Snw141292 count { 510*4520Snw141292 SELECT * FROM t1 WHERE rowid+0 IN 511*4520Snw141292 (select rowid from t1 where rowid IN (-1,2,4)) 512*4520Snw141292 ORDER BY 1; 513*4520Snw141292 } 514*4520Snw141292} {2 1 9 4 2 25 199} 515*4520Snw141292do_test format3-9.7 { 516*4520Snw141292 count { 517*4520Snw141292 SELECT * FROM t1 WHERE w IN 518*4520Snw141292 (select rowid from t1 where rowid IN (-1,2,4)) 519*4520Snw141292 ORDER BY 1; 520*4520Snw141292 } 521*4520Snw141292} {2 1 9 4 2 25 7} 522*4520Snw141292do_test format3-9.8 { 523*4520Snw141292 count { 524*4520Snw141292 SELECT * FROM t1 WHERE w+0 IN 525*4520Snw141292 (select rowid from t1 where rowid IN (-1,2,4)) 526*4520Snw141292 ORDER BY 1; 527*4520Snw141292 } 528*4520Snw141292} {2 1 9 4 2 25 199} 529*4520Snw141292do_test format3-9.9 { 530*4520Snw141292 count { 531*4520Snw141292 SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1; 532*4520Snw141292 } 533*4520Snw141292} {2 1 9 3 1 16 6} 534*4520Snw141292do_test format3-9.10 { 535*4520Snw141292 count { 536*4520Snw141292 SELECT * FROM t1 WHERE x+0 IN (1,7) ORDER BY 1; 537*4520Snw141292 } 538*4520Snw141292} {2 1 9 3 1 16 199} 539*4520Snw141292do_test format3-9.11 { 540*4520Snw141292 count { 541*4520Snw141292 SELECT * FROM t1 WHERE y IN (6400,8100) ORDER BY 1; 542*4520Snw141292 } 543*4520Snw141292} {79 6 6400 89 6 8100 199} 544*4520Snw141292do_test format3-9.12 { 545*4520Snw141292 count { 546*4520Snw141292 SELECT * FROM t1 WHERE x=6 AND y IN (6400,8100) ORDER BY 1; 547*4520Snw141292 } 548*4520Snw141292} {79 6 6400 89 6 8100 74} 549*4520Snw141292do_test format3-9.13 { 550*4520Snw141292 count { 551*4520Snw141292 SELECT * FROM t1 WHERE x IN (1,7) AND y NOT IN (6400,8100) ORDER BY 1; 552*4520Snw141292 } 553*4520Snw141292} {2 1 9 3 1 16 6} 554*4520Snw141292do_test format3-9.14 { 555*4520Snw141292 count { 556*4520Snw141292 SELECT * FROM t1 WHERE x IN (1,7) AND y IN (9,10) ORDER BY 1; 557*4520Snw141292 } 558*4520Snw141292} {2 1 9 6} 559*4520Snw141292 560*4520Snw141292# This procedure executes the SQL. Then it checks the generated program 561*4520Snw141292# for the SQL and appends a "nosort" to the result if the program contains the 562*4520Snw141292# SortCallback opcode. If the program does not contain the SortCallback 563*4520Snw141292# opcode it appends "sort" 564*4520Snw141292# 565*4520Snw141292proc cksort {sql} { 566*4520Snw141292 set data [execsql $sql] 567*4520Snw141292 set prog [execsql "EXPLAIN $sql"] 568*4520Snw141292 if {[regexp SortCallback $prog]} {set x sort} {set x nosort} 569*4520Snw141292 lappend data $x 570*4520Snw141292 return $data 571*4520Snw141292} 572*4520Snw141292# Check out the logic that attempts to implement the ORDER BY clause 573*4520Snw141292# using an index rather than by sorting. 574*4520Snw141292# 575*4520Snw141292do_test format3-10.1 { 576*4520Snw141292 execsql { 577*4520Snw141292 CREATE TABLE t3(a,b,c); 578*4520Snw141292 CREATE INDEX t3a ON t3(a); 579*4520Snw141292 CREATE INDEX t3bc ON t3(b,c); 580*4520Snw141292 CREATE INDEX t3acb ON t3(a,c,b); 581*4520Snw141292 INSERT INTO t3 SELECT w, 101-w, y FROM t1; 582*4520Snw141292 SELECT count(*), sum(a), sum(b), sum(c) FROM t3; 583*4520Snw141292 } 584*4520Snw141292} {100 5050 5050 348550} 585*4520Snw141292do_test format3-10.2 { 586*4520Snw141292 cksort { 587*4520Snw141292 SELECT * FROM t3 ORDER BY a LIMIT 3 588*4520Snw141292 } 589*4520Snw141292} {1 100 4 2 99 9 3 98 16 nosort} 590*4520Snw141292do_test format3-10.3 { 591*4520Snw141292 cksort { 592*4520Snw141292 SELECT * FROM t3 ORDER BY a+1 LIMIT 3 593*4520Snw141292 } 594*4520Snw141292} {1 100 4 2 99 9 3 98 16 sort} 595*4520Snw141292do_test format3-10.4 { 596*4520Snw141292 cksort { 597*4520Snw141292 SELECT * FROM t3 WHERE a<10 ORDER BY a LIMIT 3 598*4520Snw141292 } 599*4520Snw141292} {1 100 4 2 99 9 3 98 16 nosort} 600*4520Snw141292do_test format3-10.5 { 601*4520Snw141292 cksort { 602*4520Snw141292 SELECT * FROM t3 WHERE a>0 AND a<10 ORDER BY a LIMIT 3 603*4520Snw141292 } 604*4520Snw141292} {1 100 4 2 99 9 3 98 16 nosort} 605*4520Snw141292do_test format3-10.6 { 606*4520Snw141292 cksort { 607*4520Snw141292 SELECT * FROM t3 WHERE a>0 ORDER BY a LIMIT 3 608*4520Snw141292 } 609*4520Snw141292} {1 100 4 2 99 9 3 98 16 nosort} 610*4520Snw141292do_test format3-10.7 { 611*4520Snw141292 cksort { 612*4520Snw141292 SELECT * FROM t3 WHERE b>0 ORDER BY a LIMIT 3 613*4520Snw141292 } 614*4520Snw141292} {1 100 4 2 99 9 3 98 16 sort} 615*4520Snw141292do_test format3-10.8 { 616*4520Snw141292 cksort { 617*4520Snw141292 SELECT * FROM t3 WHERE a IN (3,5,7,1,9,4,2) ORDER BY a LIMIT 3 618*4520Snw141292 } 619*4520Snw141292} {1 100 4 2 99 9 3 98 16 sort} 620*4520Snw141292do_test format3-10.9 { 621*4520Snw141292 cksort { 622*4520Snw141292 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 623*4520Snw141292 } 624*4520Snw141292} {1 100 4 nosort} 625*4520Snw141292do_test format3-10.10 { 626*4520Snw141292 cksort { 627*4520Snw141292 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a LIMIT 3 628*4520Snw141292 } 629*4520Snw141292} {1 100 4 nosort} 630*4520Snw141292do_test format3-10.11 { 631*4520Snw141292 cksort { 632*4520Snw141292 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c LIMIT 3 633*4520Snw141292 } 634*4520Snw141292} {1 100 4 nosort} 635*4520Snw141292do_test format3-10.12 { 636*4520Snw141292 cksort { 637*4520Snw141292 SELECT * FROM t3 WHERE a=1 AND c>0 ORDER BY a,c,b LIMIT 3 638*4520Snw141292 } 639*4520Snw141292} {1 100 4 nosort} 640*4520Snw141292do_test format3-10.13 { 641*4520Snw141292 cksort { 642*4520Snw141292 SELECT * FROM t3 WHERE a>0 ORDER BY a DESC LIMIT 3 643*4520Snw141292 } 644*4520Snw141292} {100 1 10201 99 2 10000 98 3 9801 nosort} 645*4520Snw141292do_test format3-10.13.1 { 646*4520Snw141292 cksort { 647*4520Snw141292 SELECT * FROM t3 WHERE a>0 ORDER BY a+1 DESC LIMIT 3 648*4520Snw141292 } 649*4520Snw141292} {100 1 10201 99 2 10000 98 3 9801 sort} 650*4520Snw141292do_test format3-10.14 { 651*4520Snw141292 cksort { 652*4520Snw141292 SELECT * FROM t3 ORDER BY b LIMIT 3 653*4520Snw141292 } 654*4520Snw141292} {100 1 10201 99 2 10000 98 3 9801 nosort} 655*4520Snw141292do_test format3-10.15 { 656*4520Snw141292 cksort { 657*4520Snw141292 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t3.a LIMIT 3 658*4520Snw141292 } 659*4520Snw141292} {1 0 2 1 3 1 nosort} 660*4520Snw141292do_test format3-10.16 { 661*4520Snw141292 cksort { 662*4520Snw141292 SELECT t3.a, t1.x FROM t3, t1 WHERE t3.a=t1.w ORDER BY t1.x, t3.a LIMIT 3 663*4520Snw141292 } 664*4520Snw141292} {1 0 2 1 3 1 sort} 665*4520Snw141292do_test format3-10.17 { 666*4520Snw141292 cksort { 667*4520Snw141292 SELECT y FROM t1 ORDER BY w COLLATE text LIMIT 3; 668*4520Snw141292 } 669*4520Snw141292} {4 121 10201 sort} 670*4520Snw141292do_test format3-10.18 { 671*4520Snw141292 cksort { 672*4520Snw141292 SELECT y FROM t1 ORDER BY w COLLATE numeric LIMIT 3; 673*4520Snw141292 } 674*4520Snw141292} {4 9 16 sort} 675*4520Snw141292do_test format3-10.19 { 676*4520Snw141292 cksort { 677*4520Snw141292 SELECT y FROM t1 ORDER BY w LIMIT 3; 678*4520Snw141292 } 679*4520Snw141292} {4 9 16 nosort} 680*4520Snw141292 681*4520Snw141292# Check that all comparisons are numeric. Similar tests in misc1.test 682*4520Snw141292# check the same comparisons on a format4+ database and find that some 683*4520Snw141292# are numeric and some are text. 684*4520Snw141292# 685*4520Snw141292do_test format3-11.1 { 686*4520Snw141292 execsql {SELECT '0'=='0.0'} 687*4520Snw141292} {1} 688*4520Snw141292do_test format3-11.2 { 689*4520Snw141292 execsql {SELECT '0'==0.0} 690*4520Snw141292} {1} 691*4520Snw141292do_test format3-11.3 { 692*4520Snw141292 execsql {SELECT '123456789012345678901'=='123456789012345678900'} 693*4520Snw141292} {1} 694*4520Snw141292do_test format3-11.4 { 695*4520Snw141292 execsql { 696*4520Snw141292 CREATE TABLE t6(a INT UNIQUE, b TEXT UNIQUE); 697*4520Snw141292 INSERT INTO t6 VALUES('0','0.0'); 698*4520Snw141292 SELECT * FROM t6; 699*4520Snw141292 } 700*4520Snw141292} {0 0.0} 701*4520Snw141292do_test format3-11.5 { 702*4520Snw141292 execsql { 703*4520Snw141292 INSERT OR IGNORE INTO t6 VALUES(0.0,'x'); 704*4520Snw141292 SELECT * FROM t6; 705*4520Snw141292 } 706*4520Snw141292} {0 0.0} 707*4520Snw141292do_test format3-11.6 { 708*4520Snw141292 execsql { 709*4520Snw141292 INSERT OR IGNORE INTO t6 VALUES('y',0); 710*4520Snw141292 SELECT * FROM t6; 711*4520Snw141292 } 712*4520Snw141292} {0 0.0} 713*4520Snw141292do_test format3-11.7 { 714*4520Snw141292 execsql { 715*4520Snw141292 CREATE TABLE t7(x INTEGER, y TEXT, z); 716*4520Snw141292 INSERT INTO t7 VALUES(0,0,1); 717*4520Snw141292 INSERT INTO t7 VALUES(0.0,0,2); 718*4520Snw141292 INSERT INTO t7 VALUES(0,0.0,3); 719*4520Snw141292 INSERT INTO t7 VALUES(0.0,0.0,4); 720*4520Snw141292 SELECT DISTINCT x, y FROM t7 ORDER BY z; 721*4520Snw141292 } 722*4520Snw141292} {0 0} 723*4520Snw141292 724*4520Snw141292# Make sure attempts to attach a format 3 database fail. 725*4520Snw141292# 726*4520Snw141292do_test format3-12.1 { 727*4520Snw141292 file delete -force test2.db 728*4520Snw141292 sqlite db2 test2.db 729*4520Snw141292 catchsql { 730*4520Snw141292 CREATE TABLE t8(x,y); 731*4520Snw141292 ATTACH DATABASE 'test.db' AS format3; 732*4520Snw141292 } db2; 733*4520Snw141292} {1 {incompatible file format in auxiliary database: format3}} 734*4520Snw141292do_test format3-12.2 { 735*4520Snw141292 catchsql { 736*4520Snw141292 ATTACH DATABASE 'test2.db' AS test2; 737*4520Snw141292 } 738*4520Snw141292} {1 {cannot attach auxiliary databases to an older format master database}} 739*4520Snw141292db2 close 740*4520Snw141292 741*4520Snw141292finish_test 742