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 magic ROWID column that is 16*4520Snw141292# found on all tables. 17*4520Snw141292# 18*4520Snw141292# $Id: rowid.test,v 1.13 2004/01/14 21:59:24 drh Exp $ 19*4520Snw141292 20*4520Snw141292set testdir [file dirname $argv0] 21*4520Snw141292source $testdir/tester.tcl 22*4520Snw141292 23*4520Snw141292# Basic ROWID functionality tests. 24*4520Snw141292# 25*4520Snw141292do_test rowid-1.1 { 26*4520Snw141292 execsql { 27*4520Snw141292 CREATE TABLE t1(x int, y int); 28*4520Snw141292 INSERT INTO t1 VALUES(1,2); 29*4520Snw141292 INSERT INTO t1 VALUES(3,4); 30*4520Snw141292 SELECT x FROM t1 ORDER BY y; 31*4520Snw141292 } 32*4520Snw141292} {1 3} 33*4520Snw141292do_test rowid-1.2 { 34*4520Snw141292 set r [execsql {SELECT rowid FROM t1 ORDER BY x}] 35*4520Snw141292 global x2rowid rowid2x 36*4520Snw141292 set x2rowid(1) [lindex $r 0] 37*4520Snw141292 set x2rowid(3) [lindex $r 1] 38*4520Snw141292 set rowid2x($x2rowid(1)) 1 39*4520Snw141292 set rowid2x($x2rowid(3)) 3 40*4520Snw141292 llength $r 41*4520Snw141292} {2} 42*4520Snw141292do_test rowid-1.3 { 43*4520Snw141292 global x2rowid 44*4520Snw141292 set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(1)" 45*4520Snw141292 execsql $sql 46*4520Snw141292} {1} 47*4520Snw141292do_test rowid-1.4 { 48*4520Snw141292 global x2rowid 49*4520Snw141292 set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(3)" 50*4520Snw141292 execsql $sql 51*4520Snw141292} {3} 52*4520Snw141292do_test rowid-1.5 { 53*4520Snw141292 global x2rowid 54*4520Snw141292 set sql "SELECT x FROM t1 WHERE oid==$x2rowid(1)" 55*4520Snw141292 execsql $sql 56*4520Snw141292} {1} 57*4520Snw141292do_test rowid-1.6 { 58*4520Snw141292 global x2rowid 59*4520Snw141292 set sql "SELECT x FROM t1 WHERE OID==$x2rowid(3)" 60*4520Snw141292 execsql $sql 61*4520Snw141292} {3} 62*4520Snw141292do_test rowid-1.7 { 63*4520Snw141292 global x2rowid 64*4520Snw141292 set sql "SELECT x FROM t1 WHERE _rowid_==$x2rowid(1)" 65*4520Snw141292 execsql $sql 66*4520Snw141292} {1} 67*4520Snw141292do_test rowid-1.7.1 { 68*4520Snw141292 while 1 { 69*4520Snw141292 set norow [expr {int(rand()*1000000)}] 70*4520Snw141292 if {$norow!=$x2rowid(1) && $norow!=$x2rowid(3)} break 71*4520Snw141292 } 72*4520Snw141292 execsql "SELECT x FROM t1 WHERE rowid=$norow" 73*4520Snw141292} {} 74*4520Snw141292do_test rowid-1.8 { 75*4520Snw141292 global x2rowid 76*4520Snw141292 set v [execsql {SELECT x, oid FROM t1 order by x}] 77*4520Snw141292 set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 78*4520Snw141292 expr {$v==$v2} 79*4520Snw141292} {1} 80*4520Snw141292do_test rowid-1.9 { 81*4520Snw141292 global x2rowid 82*4520Snw141292 set v [execsql {SELECT x, RowID FROM t1 order by x}] 83*4520Snw141292 set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 84*4520Snw141292 expr {$v==$v2} 85*4520Snw141292} {1} 86*4520Snw141292do_test rowid-1.9 { 87*4520Snw141292 global x2rowid 88*4520Snw141292 set v [execsql {SELECT x, _rowid_ FROM t1 order by x}] 89*4520Snw141292 set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 90*4520Snw141292 expr {$v==$v2} 91*4520Snw141292} {1} 92*4520Snw141292 93*4520Snw141292# We can insert or update the ROWID column. 94*4520Snw141292# 95*4520Snw141292do_test rowid-2.1 { 96*4520Snw141292 catchsql { 97*4520Snw141292 INSERT INTO t1(rowid,x,y) VALUES(1234,5,6); 98*4520Snw141292 SELECT rowid, * FROM t1; 99*4520Snw141292 } 100*4520Snw141292} {0 {1 1 2 2 3 4 1234 5 6}} 101*4520Snw141292do_test rowid-2.2 { 102*4520Snw141292 catchsql { 103*4520Snw141292 UPDATE t1 SET rowid=12345 WHERE x==1; 104*4520Snw141292 SELECT rowid, * FROM t1 105*4520Snw141292 } 106*4520Snw141292} {0 {2 3 4 1234 5 6 12345 1 2}} 107*4520Snw141292do_test rowid-2.3 { 108*4520Snw141292 catchsql { 109*4520Snw141292 INSERT INTO t1(y,x,oid) VALUES(8,7,1235); 110*4520Snw141292 SELECT rowid, * FROM t1 WHERE rowid>1000; 111*4520Snw141292 } 112*4520Snw141292} {0 {1234 5 6 1235 7 8 12345 1 2}} 113*4520Snw141292do_test rowid-2.4 { 114*4520Snw141292 catchsql { 115*4520Snw141292 UPDATE t1 SET oid=12346 WHERE x==1; 116*4520Snw141292 SELECT rowid, * FROM t1; 117*4520Snw141292 } 118*4520Snw141292} {0 {2 3 4 1234 5 6 1235 7 8 12346 1 2}} 119*4520Snw141292do_test rowid-2.5 { 120*4520Snw141292 catchsql { 121*4520Snw141292 INSERT INTO t1(x,_rowid_,y) VALUES(9,1236,10); 122*4520Snw141292 SELECT rowid, * FROM t1 WHERE rowid>1000; 123*4520Snw141292 } 124*4520Snw141292} {0 {1234 5 6 1235 7 8 1236 9 10 12346 1 2}} 125*4520Snw141292do_test rowid-2.6 { 126*4520Snw141292 catchsql { 127*4520Snw141292 UPDATE t1 SET _rowid_=12347 WHERE x==1; 128*4520Snw141292 SELECT rowid, * FROM t1 WHERE rowid>1000; 129*4520Snw141292 } 130*4520Snw141292} {0 {1234 5 6 1235 7 8 1236 9 10 12347 1 2}} 131*4520Snw141292 132*4520Snw141292# But we can use ROWID in the WHERE clause of an UPDATE that does not 133*4520Snw141292# change the ROWID. 134*4520Snw141292# 135*4520Snw141292do_test rowid-2.7 { 136*4520Snw141292 global x2rowid 137*4520Snw141292 set sql "UPDATE t1 SET x=2 WHERE OID==$x2rowid(3)" 138*4520Snw141292 execsql $sql 139*4520Snw141292 execsql {SELECT x FROM t1 ORDER BY x} 140*4520Snw141292} {1 2 5 7 9} 141*4520Snw141292do_test rowid-2.8 { 142*4520Snw141292 global x2rowid 143*4520Snw141292 set sql "UPDATE t1 SET x=3 WHERE _rowid_==$x2rowid(3)" 144*4520Snw141292 execsql $sql 145*4520Snw141292 execsql {SELECT x FROM t1 ORDER BY x} 146*4520Snw141292} {1 3 5 7 9} 147*4520Snw141292 148*4520Snw141292# We cannot index by ROWID 149*4520Snw141292# 150*4520Snw141292do_test rowid-2.9 { 151*4520Snw141292 set v [catch {execsql {CREATE INDEX idxt1 ON t1(rowid)}} msg] 152*4520Snw141292 lappend v $msg 153*4520Snw141292} {1 {table t1 has no column named rowid}} 154*4520Snw141292do_test rowid-2.10 { 155*4520Snw141292 set v [catch {execsql {CREATE INDEX idxt1 ON t1(_rowid_)}} msg] 156*4520Snw141292 lappend v $msg 157*4520Snw141292} {1 {table t1 has no column named _rowid_}} 158*4520Snw141292do_test rowid-2.11 { 159*4520Snw141292 set v [catch {execsql {CREATE INDEX idxt1 ON t1(oid)}} msg] 160*4520Snw141292 lappend v $msg 161*4520Snw141292} {1 {table t1 has no column named oid}} 162*4520Snw141292do_test rowid-2.12 { 163*4520Snw141292 set v [catch {execsql {CREATE INDEX idxt1 ON t1(x, rowid)}} msg] 164*4520Snw141292 lappend v $msg 165*4520Snw141292} {1 {table t1 has no column named rowid}} 166*4520Snw141292 167*4520Snw141292# Columns defined in the CREATE statement override the buildin ROWID 168*4520Snw141292# column names. 169*4520Snw141292# 170*4520Snw141292do_test rowid-3.1 { 171*4520Snw141292 execsql { 172*4520Snw141292 CREATE TABLE t2(rowid int, x int, y int); 173*4520Snw141292 INSERT INTO t2 VALUES(0,2,3); 174*4520Snw141292 INSERT INTO t2 VALUES(4,5,6); 175*4520Snw141292 INSERT INTO t2 VALUES(7,8,9); 176*4520Snw141292 SELECT * FROM t2 ORDER BY x; 177*4520Snw141292 } 178*4520Snw141292} {0 2 3 4 5 6 7 8 9} 179*4520Snw141292do_test rowid-3.2 { 180*4520Snw141292 execsql {SELECT * FROM t2 ORDER BY rowid} 181*4520Snw141292} {0 2 3 4 5 6 7 8 9} 182*4520Snw141292do_test rowid-3.3 { 183*4520Snw141292 execsql {SELECT rowid, x, y FROM t2 ORDER BY rowid} 184*4520Snw141292} {0 2 3 4 5 6 7 8 9} 185*4520Snw141292do_test rowid-3.4 { 186*4520Snw141292 set r1 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY rowid}] 187*4520Snw141292 foreach {a b c d e f} $r1 {} 188*4520Snw141292 set r2 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY x DESC}] 189*4520Snw141292 foreach {u v w x y z} $r2 {} 190*4520Snw141292 expr {$u==$e && $w==$c && $y==$a} 191*4520Snw141292} {1} 192*4520Snw141292do_probtest rowid-3.5 { 193*4520Snw141292 set r1 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY rowid}] 194*4520Snw141292 foreach {a b c d e f} $r1 {} 195*4520Snw141292 expr {$a!=$b && $c!=$d && $e!=$f} 196*4520Snw141292} {1} 197*4520Snw141292 198*4520Snw141292# Let's try some more complex examples, including some joins. 199*4520Snw141292# 200*4520Snw141292do_test rowid-4.1 { 201*4520Snw141292 execsql { 202*4520Snw141292 DELETE FROM t1; 203*4520Snw141292 DELETE FROM t2; 204*4520Snw141292 } 205*4520Snw141292 for {set i 1} {$i<=50} {incr i} { 206*4520Snw141292 execsql "INSERT INTO t1(x,y) VALUES($i,[expr {$i*$i}])" 207*4520Snw141292 } 208*4520Snw141292 execsql {INSERT INTO t2 SELECT _rowid_, x*y, y*y FROM t1} 209*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid} 210*4520Snw141292} {256} 211*4520Snw141292do_test rowid-4.2 { 212*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid} 213*4520Snw141292} {256} 214*4520Snw141292do_test rowid-4.2.1 { 215*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.oid==t2.rowid} 216*4520Snw141292} {256} 217*4520Snw141292do_test rowid-4.2.2 { 218*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 219*4520Snw141292} {256} 220*4520Snw141292do_test rowid-4.2.3 { 221*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t2.rowid==t1.rowid} 222*4520Snw141292} {256} 223*4520Snw141292do_test rowid-4.2.4 { 224*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND t1.x==4} 225*4520Snw141292} {256} 226*4520Snw141292do_test rowid-4.2.5 { 227*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 228*4520Snw141292} {256} 229*4520Snw141292do_test rowid-4.2.6 { 230*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t2.rowid==t1.rowid} 231*4520Snw141292} {256} 232*4520Snw141292do_test rowid-4.2.7 { 233*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND t1.x==4} 234*4520Snw141292} {256} 235*4520Snw141292do_test rowid-4.3 { 236*4520Snw141292 execsql {CREATE INDEX idxt1 ON t1(x)} 237*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid} 238*4520Snw141292} {256} 239*4520Snw141292do_test rowid-4.3.1 { 240*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 241*4520Snw141292} {256} 242*4520Snw141292do_test rowid-4.3.2 { 243*4520Snw141292 execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND 4==t1.x} 244*4520Snw141292} {256} 245*4520Snw141292do_test rowid-4.4 { 246*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid} 247*4520Snw141292} {256} 248*4520Snw141292do_test rowid-4.4.1 { 249*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 250*4520Snw141292} {256} 251*4520Snw141292do_test rowid-4.4.2 { 252*4520Snw141292 execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND 4==t1.x} 253*4520Snw141292} {256} 254*4520Snw141292do_test rowid-4.5 { 255*4520Snw141292 execsql {CREATE INDEX idxt2 ON t2(y)} 256*4520Snw141292 set sqlite_search_count 0 257*4520Snw141292 concat [execsql { 258*4520Snw141292 SELECT t1.x FROM t2, t1 259*4520Snw141292 WHERE t2.y==256 AND t1.rowid==t2.rowid 260*4520Snw141292 }] $sqlite_search_count 261*4520Snw141292} {4 3} 262*4520Snw141292do_test rowid-4.5.1 { 263*4520Snw141292 set sqlite_search_count 0 264*4520Snw141292 concat [execsql { 265*4520Snw141292 SELECT t1.x FROM t2, t1 266*4520Snw141292 WHERE t1.OID==t2.rowid AND t2.y==81 267*4520Snw141292 }] $sqlite_search_count 268*4520Snw141292} {3 3} 269*4520Snw141292do_test rowid-4.6 { 270*4520Snw141292 execsql { 271*4520Snw141292 SELECT t1.x FROM t1, t2 272*4520Snw141292 WHERE t2.y==256 AND t1.rowid==t2.rowid 273*4520Snw141292 } 274*4520Snw141292} {4} 275*4520Snw141292 276*4520Snw141292do_test rowid-5.1 { 277*4520Snw141292 execsql {DELETE FROM t1 WHERE _rowid_ IN (SELECT oid FROM t1 WHERE x>8)} 278*4520Snw141292 execsql {SELECT max(x) FROM t1} 279*4520Snw141292} {8} 280*4520Snw141292 281*4520Snw141292# Make sure a "WHERE rowid=X" clause works when there is no ROWID of X. 282*4520Snw141292# 283*4520Snw141292do_test rowid-6.1 { 284*4520Snw141292 execsql { 285*4520Snw141292 SELECT x FROM t1 286*4520Snw141292 } 287*4520Snw141292} {1 2 3 4 5 6 7 8} 288*4520Snw141292do_test rowid-6.2 { 289*4520Snw141292 for {set ::norow 1} {1} {incr ::norow} { 290*4520Snw141292 if {[execsql "SELECT x FROM t1 WHERE rowid=$::norow"]==""} break 291*4520Snw141292 } 292*4520Snw141292 execsql [subst { 293*4520Snw141292 DELETE FROM t1 WHERE rowid=$::norow 294*4520Snw141292 }] 295*4520Snw141292} {} 296*4520Snw141292do_test rowid-6.3 { 297*4520Snw141292 execsql { 298*4520Snw141292 SELECT x FROM t1 299*4520Snw141292 } 300*4520Snw141292} {1 2 3 4 5 6 7 8} 301*4520Snw141292 302*4520Snw141292# Beginning with version 2.3.4, SQLite computes rowids of new rows by 303*4520Snw141292# finding the maximum current rowid and adding one. It falls back to 304*4520Snw141292# the old random algorithm if the maximum rowid is the largest integer. 305*4520Snw141292# The following tests are for this new behavior. 306*4520Snw141292# 307*4520Snw141292do_test rowid-7.0 { 308*4520Snw141292 execsql { 309*4520Snw141292 DELETE FROM t1; 310*4520Snw141292 DROP TABLE t2; 311*4520Snw141292 DROP INDEX idxt1; 312*4520Snw141292 INSERT INTO t1 VALUES(1,2); 313*4520Snw141292 SELECT rowid, * FROM t1; 314*4520Snw141292 } 315*4520Snw141292} {1 1 2} 316*4520Snw141292do_test rowid-7.1 { 317*4520Snw141292 execsql { 318*4520Snw141292 INSERT INTO t1 VALUES(99,100); 319*4520Snw141292 SELECT rowid,* FROM t1 320*4520Snw141292 } 321*4520Snw141292} {1 1 2 2 99 100} 322*4520Snw141292do_test rowid-7.2 { 323*4520Snw141292 execsql { 324*4520Snw141292 CREATE TABLE t2(a INTEGER PRIMARY KEY, b); 325*4520Snw141292 INSERT INTO t2(b) VALUES(55); 326*4520Snw141292 SELECT * FROM t2; 327*4520Snw141292 } 328*4520Snw141292} {1 55} 329*4520Snw141292do_test rowid-7.3 { 330*4520Snw141292 execsql { 331*4520Snw141292 INSERT INTO t2(b) VALUES(66); 332*4520Snw141292 SELECT * FROM t2; 333*4520Snw141292 } 334*4520Snw141292} {1 55 2 66} 335*4520Snw141292do_test rowid-7.4 { 336*4520Snw141292 execsql { 337*4520Snw141292 INSERT INTO t2(a,b) VALUES(1000000,77); 338*4520Snw141292 INSERT INTO t2(b) VALUES(88); 339*4520Snw141292 SELECT * FROM t2; 340*4520Snw141292 } 341*4520Snw141292} {1 55 2 66 1000000 77 1000001 88} 342*4520Snw141292do_test rowid-7.5 { 343*4520Snw141292 execsql { 344*4520Snw141292 INSERT INTO t2(a,b) VALUES(2147483647,99); 345*4520Snw141292 INSERT INTO t2(b) VALUES(11); 346*4520Snw141292 SELECT b FROM t2 ORDER BY b; 347*4520Snw141292 } 348*4520Snw141292} {11 55 66 77 88 99} 349*4520Snw141292do_test rowid-7.6 { 350*4520Snw141292 execsql { 351*4520Snw141292 SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647); 352*4520Snw141292 } 353*4520Snw141292} {11} 354*4520Snw141292do_test rowid-7.7 { 355*4520Snw141292 execsql { 356*4520Snw141292 INSERT INTO t2(b) VALUES(22); 357*4520Snw141292 INSERT INTO t2(b) VALUES(33); 358*4520Snw141292 INSERT INTO t2(b) VALUES(44); 359*4520Snw141292 INSERT INTO t2(b) VALUES(55); 360*4520Snw141292 SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647) ORDER BY b; 361*4520Snw141292 } 362*4520Snw141292} {11 22 33 44 55} 363*4520Snw141292do_test rowid-7.8 { 364*4520Snw141292 execsql { 365*4520Snw141292 DELETE FROM t2 WHERE a!=2; 366*4520Snw141292 INSERT INTO t2(b) VALUES(111); 367*4520Snw141292 SELECT * FROM t2; 368*4520Snw141292 } 369*4520Snw141292} {2 66 3 111} 370*4520Snw141292 371*4520Snw141292# Make sure AFTER triggers that do INSERTs do not change the last_insert_rowid. 372*4520Snw141292# Ticket #290 373*4520Snw141292# 374*4520Snw141292do_test rowid-8.1 { 375*4520Snw141292 execsql { 376*4520Snw141292 CREATE TABLE t3(a integer primary key); 377*4520Snw141292 CREATE TABLE t4(x); 378*4520Snw141292 INSERT INTO t4 VALUES(1); 379*4520Snw141292 CREATE TRIGGER r3 AFTER INSERT on t3 FOR EACH ROW BEGIN 380*4520Snw141292 INSERT INTO t4 VALUES(NEW.a+10); 381*4520Snw141292 END; 382*4520Snw141292 SELECT * FROM t3; 383*4520Snw141292 } 384*4520Snw141292} {} 385*4520Snw141292do_test rowid-8.2 { 386*4520Snw141292 execsql { 387*4520Snw141292 SELECT rowid, * FROM t4; 388*4520Snw141292 } 389*4520Snw141292} {1 1} 390*4520Snw141292do_test rowid-8.3 { 391*4520Snw141292 execsql { 392*4520Snw141292 INSERT INTO t3 VALUES(123); 393*4520Snw141292 SELECT last_insert_rowid(); 394*4520Snw141292 } 395*4520Snw141292} {123} 396*4520Snw141292do_test rowid-8.4 { 397*4520Snw141292 execsql { 398*4520Snw141292 SELECT * FROM t3; 399*4520Snw141292 } 400*4520Snw141292} {123} 401*4520Snw141292do_test rowid-8.5 { 402*4520Snw141292 execsql { 403*4520Snw141292 SELECT rowid, * FROM t4; 404*4520Snw141292 } 405*4520Snw141292} {1 1 2 133} 406*4520Snw141292do_test rowid-8.6 { 407*4520Snw141292 execsql { 408*4520Snw141292 INSERT INTO t3 VALUES(NULL); 409*4520Snw141292 SELECT last_insert_rowid(); 410*4520Snw141292 } 411*4520Snw141292} {124} 412*4520Snw141292do_test rowid-8.7 { 413*4520Snw141292 execsql { 414*4520Snw141292 SELECT * FROM t3; 415*4520Snw141292 } 416*4520Snw141292} {123 124} 417*4520Snw141292do_test rowid-8.8 { 418*4520Snw141292 execsql { 419*4520Snw141292 SELECT rowid, * FROM t4; 420*4520Snw141292 } 421*4520Snw141292} {1 1 2 133 3 134} 422*4520Snw141292 423*4520Snw141292# ticket #377: Comparison between integer primiary key and floating point 424*4520Snw141292# values. 425*4520Snw141292# 426*4520Snw141292do_test rowid-9.1 { 427*4520Snw141292 execsql { 428*4520Snw141292 SELECT * FROM t3 WHERE a<123.5 429*4520Snw141292 } 430*4520Snw141292} {123} 431*4520Snw141292do_test rowid-9.2 { 432*4520Snw141292 execsql { 433*4520Snw141292 SELECT * FROM t3 WHERE a<124.5 434*4520Snw141292 } 435*4520Snw141292} {123 124} 436*4520Snw141292do_test rowid-9.3 { 437*4520Snw141292 execsql { 438*4520Snw141292 SELECT * FROM t3 WHERE a>123.5 439*4520Snw141292 } 440*4520Snw141292} {124} 441*4520Snw141292do_test rowid-9.4 { 442*4520Snw141292 execsql { 443*4520Snw141292 SELECT * FROM t3 WHERE a>122.5 444*4520Snw141292 } 445*4520Snw141292} {123 124} 446*4520Snw141292do_test rowid-9.5 { 447*4520Snw141292 execsql { 448*4520Snw141292 SELECT * FROM t3 WHERE a==123.5 449*4520Snw141292 } 450*4520Snw141292} {} 451*4520Snw141292do_test rowid-9.6 { 452*4520Snw141292 execsql { 453*4520Snw141292 SELECT * FROM t3 WHERE a==123.000 454*4520Snw141292 } 455*4520Snw141292} {123} 456*4520Snw141292do_test rowid-9.7 { 457*4520Snw141292 execsql { 458*4520Snw141292 SELECT * FROM t3 WHERE a>100.5 AND a<200.5 459*4520Snw141292 } 460*4520Snw141292} {123 124} 461*4520Snw141292do_test rowid-9.8 { 462*4520Snw141292 execsql { 463*4520Snw141292 SELECT * FROM t3 WHERE a>'xyz'; 464*4520Snw141292 } 465*4520Snw141292} {} 466*4520Snw141292do_test rowid-9.9 { 467*4520Snw141292 execsql { 468*4520Snw141292 SELECT * FROM t3 WHERE a<'xyz'; 469*4520Snw141292 } 470*4520Snw141292} {123 124} 471*4520Snw141292do_test rowid-9.10 { 472*4520Snw141292 execsql { 473*4520Snw141292 SELECT * FROM t3 WHERE a>=122.9 AND a<=123.1 474*4520Snw141292 } 475*4520Snw141292} {123} 476*4520Snw141292 477*4520Snw141292# Ticket #567. Comparisons of ROWID or integery primary key against 478*4520Snw141292# floating point numbers still do not always work. 479*4520Snw141292# 480*4520Snw141292do_test rowid-10.1 { 481*4520Snw141292 execsql { 482*4520Snw141292 CREATE TABLE t5(a); 483*4520Snw141292 INSERT INTO t5 VALUES(1); 484*4520Snw141292 INSERT INTO t5 VALUES(2); 485*4520Snw141292 INSERT INTO t5 SELECT a+2 FROM t5; 486*4520Snw141292 INSERT INTO t5 SELECT a+4 FROM t5; 487*4520Snw141292 SELECT rowid, * FROM t5; 488*4520Snw141292 } 489*4520Snw141292} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 490*4520Snw141292do_test rowid-10.2 { 491*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5} 492*4520Snw141292} {6 6 7 7 8 8} 493*4520Snw141292do_test rowid-10.3 { 494*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0} 495*4520Snw141292} {5 5 6 6 7 7 8 8} 496*4520Snw141292do_test rowid-10.4 { 497*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5} 498*4520Snw141292} {6 6 7 7 8 8} 499*4520Snw141292do_test rowid-10.3.2 { 500*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0} 501*4520Snw141292} {6 6 7 7 8 8} 502*4520Snw141292do_test rowid-10.5 { 503*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid} 504*4520Snw141292} {6 6 7 7 8 8} 505*4520Snw141292do_test rowid-10.6 { 506*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid} 507*4520Snw141292} {6 6 7 7 8 8} 508*4520Snw141292do_test rowid-10.7 { 509*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5} 510*4520Snw141292} {1 1 2 2 3 3 4 4 5 5} 511*4520Snw141292do_test rowid-10.8 { 512*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5} 513*4520Snw141292} {1 1 2 2 3 3 4 4 5 5} 514*4520Snw141292do_test rowid-10.9 { 515*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid} 516*4520Snw141292} {1 1 2 2 3 3 4 4 5 5} 517*4520Snw141292do_test rowid-10.10 { 518*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid} 519*4520Snw141292} {1 1 2 2 3 3 4 4 5 5} 520*4520Snw141292do_test rowid-10.11 { 521*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5 ORDER BY rowid DESC} 522*4520Snw141292} {8 8 7 7 6 6} 523*4520Snw141292do_test rowid-10.11.2 { 524*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0 ORDER BY rowid DESC} 525*4520Snw141292} {8 8 7 7 6 6 5 5} 526*4520Snw141292do_test rowid-10.12 { 527*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5 ORDER BY rowid DESC} 528*4520Snw141292} {8 8 7 7 6 6} 529*4520Snw141292do_test rowid-10.12.2 { 530*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0 ORDER BY rowid DESC} 531*4520Snw141292} {8 8 7 7 6 6} 532*4520Snw141292do_test rowid-10.13 { 533*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid ORDER BY rowid DESC} 534*4520Snw141292} {8 8 7 7 6 6} 535*4520Snw141292do_test rowid-10.14 { 536*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid ORDER BY rowid DESC} 537*4520Snw141292} {8 8 7 7 6 6} 538*4520Snw141292do_test rowid-10.15 { 539*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5 ORDER BY rowid DESC} 540*4520Snw141292} {5 5 4 4 3 3 2 2 1 1} 541*4520Snw141292do_test rowid-10.16 { 542*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5 ORDER BY rowid DESC} 543*4520Snw141292} {5 5 4 4 3 3 2 2 1 1} 544*4520Snw141292do_test rowid-10.17 { 545*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid ORDER BY rowid DESC} 546*4520Snw141292} {5 5 4 4 3 3 2 2 1 1} 547*4520Snw141292do_test rowid-10.18 { 548*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid ORDER BY rowid DESC} 549*4520Snw141292} {5 5 4 4 3 3 2 2 1 1} 550*4520Snw141292 551*4520Snw141292do_test rowid-10.30 { 552*4520Snw141292 execsql { 553*4520Snw141292 CREATE TABLE t6(a); 554*4520Snw141292 INSERT INTO t6(rowid,a) SELECT -a,a FROM t5; 555*4520Snw141292 SELECT rowid, * FROM t6; 556*4520Snw141292 } 557*4520Snw141292} {-8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1} 558*4520Snw141292do_test rowid-10.31.1 { 559*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5} 560*4520Snw141292} {-5 5 -4 4 -3 3 -2 2 -1 1} 561*4520Snw141292do_test rowid-10.31.2 { 562*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0} 563*4520Snw141292} {-5 5 -4 4 -3 3 -2 2 -1 1} 564*4520Snw141292do_test rowid-10.32.1 { 565*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5 ORDER BY rowid DESC} 566*4520Snw141292} {-1 1 -2 2 -3 3 -4 4 -5 5} 567*4520Snw141292do_test rowid-10.32.1 { 568*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0 ORDER BY rowid DESC} 569*4520Snw141292} {-1 1 -2 2 -3 3 -4 4 -5 5} 570*4520Snw141292do_test rowid-10.33 { 571*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid} 572*4520Snw141292} {-5 5 -4 4 -3 3 -2 2 -1 1} 573*4520Snw141292do_test rowid-10.34 { 574*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid ORDER BY rowid DESC} 575*4520Snw141292} {-1 1 -2 2 -3 3 -4 4 -5 5} 576*4520Snw141292do_test rowid-10.35.1 { 577*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5} 578*4520Snw141292} {-5 5 -4 4 -3 3 -2 2 -1 1} 579*4520Snw141292do_test rowid-10.35.2 { 580*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0} 581*4520Snw141292} {-4 4 -3 3 -2 2 -1 1} 582*4520Snw141292do_test rowid-10.36.1 { 583*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5 ORDER BY rowid DESC} 584*4520Snw141292} {-1 1 -2 2 -3 3 -4 4 -5 5} 585*4520Snw141292do_test rowid-10.36.2 { 586*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0 ORDER BY rowid DESC} 587*4520Snw141292} {-1 1 -2 2 -3 3 -4 4} 588*4520Snw141292do_test rowid-10.37 { 589*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid} 590*4520Snw141292} {-5 5 -4 4 -3 3 -2 2 -1 1} 591*4520Snw141292do_test rowid-10.38 { 592*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid ORDER BY rowid DESC} 593*4520Snw141292} {-1 1 -2 2 -3 3 -4 4 -5 5} 594*4520Snw141292do_test rowid-10.39 { 595*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5} 596*4520Snw141292} {-8 8 -7 7 -6 6} 597*4520Snw141292do_test rowid-10.40 { 598*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5 ORDER BY rowid DESC} 599*4520Snw141292} {-6 6 -7 7 -8 8} 600*4520Snw141292do_test rowid-10.41 { 601*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid} 602*4520Snw141292} {-8 8 -7 7 -6 6} 603*4520Snw141292do_test rowid-10.42 { 604*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid ORDER BY rowid DESC} 605*4520Snw141292} {-6 6 -7 7 -8 8} 606*4520Snw141292do_test rowid-10.43 { 607*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5} 608*4520Snw141292} {-8 8 -7 7 -6 6} 609*4520Snw141292do_test rowid-10.44 { 610*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5 ORDER BY rowid DESC} 611*4520Snw141292} {-6 6 -7 7 -8 8} 612*4520Snw141292do_test rowid-10.44 { 613*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid} 614*4520Snw141292} {-8 8 -7 7 -6 6} 615*4520Snw141292do_test rowid-10.46 { 616*4520Snw141292 execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid ORDER BY rowid DESC} 617*4520Snw141292} {-6 6 -7 7 -8 8} 618*4520Snw141292 619*4520Snw141292# Comparison of rowid against string values. 620*4520Snw141292# 621*4520Snw141292do_test rowid-11.1 { 622*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc'} 623*4520Snw141292} {} 624*4520Snw141292do_test rowid-11.2 { 625*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc'} 626*4520Snw141292} {} 627*4520Snw141292do_test rowid-11.3 { 628*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc'} 629*4520Snw141292} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 630*4520Snw141292do_test rowid-11.4 { 631*4520Snw141292 execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc'} 632*4520Snw141292} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 633*4520Snw141292 634*4520Snw141292 635*4520Snw141292 636*4520Snw141292finish_test 637