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