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