1b19a2bc6Sdrh# 2001 September 15 2c4a3c779Sdrh# 3b19a2bc6Sdrh# The author disclaims copyright to this source code. In place of 4b19a2bc6Sdrh# a legal notice, here is a blessing: 5c4a3c779Sdrh# 6b19a2bc6Sdrh# May you do good and not evil. 7b19a2bc6Sdrh# May you find forgiveness for yourself and forgive others. 8b19a2bc6Sdrh# May you share freely, never taking more than you give. 9c4a3c779Sdrh# 10c4a3c779Sdrh#*********************************************************************** 11c4a3c779Sdrh# This file implements regression tests for SQLite library. The 12c4a3c779Sdrh# focus of this file is testing the magic ROWID column that is 13c4a3c779Sdrh# found on all tables. 14c4a3c779Sdrh# 15ef1bd970Sdrh# EVIDENCE-OF: R-36924-43758 By default, every row in SQLite has a 16ef1bd970Sdrh# special column, usually called the "rowid", that uniquely identifies 17ef1bd970Sdrh# that row within the table. 18c4a3c779Sdrh 19c4a3c779Sdrhset testdir [file dirname $argv0] 20c4a3c779Sdrhsource $testdir/tester.tcl 21*b9248ef5Sdanset testprefix rowid 22c4a3c779Sdrh 23c4a3c779Sdrh# Basic ROWID functionality tests. 24c4a3c779Sdrh# 25c4a3c779Sdrhdo_test rowid-1.1 { 26c4a3c779Sdrh execsql { 27c4a3c779Sdrh CREATE TABLE t1(x int, y int); 28c4a3c779Sdrh INSERT INTO t1 VALUES(1,2); 29c4a3c779Sdrh INSERT INTO t1 VALUES(3,4); 30c4a3c779Sdrh SELECT x FROM t1 ORDER BY y; 31c4a3c779Sdrh } 32c4a3c779Sdrh} {1 3} 33c4a3c779Sdrhdo_test rowid-1.2 { 34c4a3c779Sdrh set r [execsql {SELECT rowid FROM t1 ORDER BY x}] 35c4a3c779Sdrh global x2rowid rowid2x 36c4a3c779Sdrh set x2rowid(1) [lindex $r 0] 37c4a3c779Sdrh set x2rowid(3) [lindex $r 1] 38c4a3c779Sdrh set rowid2x($x2rowid(1)) 1 39c4a3c779Sdrh set rowid2x($x2rowid(3)) 3 40c4a3c779Sdrh llength $r 41c4a3c779Sdrh} {2} 42c4a3c779Sdrhdo_test rowid-1.3 { 43c4a3c779Sdrh global x2rowid 44c4a3c779Sdrh set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(1)" 45c4a3c779Sdrh execsql $sql 46c4a3c779Sdrh} {1} 47c4a3c779Sdrhdo_test rowid-1.4 { 48c4a3c779Sdrh global x2rowid 49c4a3c779Sdrh set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(3)" 50c4a3c779Sdrh execsql $sql 51c4a3c779Sdrh} {3} 52c4a3c779Sdrhdo_test rowid-1.5 { 53c4a3c779Sdrh global x2rowid 54c4a3c779Sdrh set sql "SELECT x FROM t1 WHERE oid==$x2rowid(1)" 55c4a3c779Sdrh execsql $sql 56c4a3c779Sdrh} {1} 57c4a3c779Sdrhdo_test rowid-1.6 { 58c4a3c779Sdrh global x2rowid 59c4a3c779Sdrh set sql "SELECT x FROM t1 WHERE OID==$x2rowid(3)" 60c4a3c779Sdrh execsql $sql 61c4a3c779Sdrh} {3} 62c4a3c779Sdrhdo_test rowid-1.7 { 63c4a3c779Sdrh global x2rowid 64c4a3c779Sdrh set sql "SELECT x FROM t1 WHERE _rowid_==$x2rowid(1)" 65c4a3c779Sdrh execsql $sql 66c4a3c779Sdrh} {1} 671eaa2694Sdrhdo_test rowid-1.7.1 { 681eaa2694Sdrh while 1 { 691eaa2694Sdrh set norow [expr {int(rand()*1000000)}] 701eaa2694Sdrh if {$norow!=$x2rowid(1) && $norow!=$x2rowid(3)} break 711eaa2694Sdrh } 721eaa2694Sdrh execsql "SELECT x FROM t1 WHERE rowid=$norow" 731eaa2694Sdrh} {} 74c4a3c779Sdrhdo_test rowid-1.8 { 75c4a3c779Sdrh global x2rowid 76c4a3c779Sdrh set v [execsql {SELECT x, oid FROM t1 order by x}] 77c4a3c779Sdrh set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 78c4a3c779Sdrh expr {$v==$v2} 79c4a3c779Sdrh} {1} 80c4a3c779Sdrhdo_test rowid-1.9 { 81c4a3c779Sdrh global x2rowid 82c4a3c779Sdrh set v [execsql {SELECT x, RowID FROM t1 order by x}] 83c4a3c779Sdrh set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 84c4a3c779Sdrh expr {$v==$v2} 85c4a3c779Sdrh} {1} 86b556ce15Sdrhdo_test rowid-1.10 { 87c4a3c779Sdrh global x2rowid 88c4a3c779Sdrh set v [execsql {SELECT x, _rowid_ FROM t1 order by x}] 89c4a3c779Sdrh set v2 [list 1 $x2rowid(1) 3 $x2rowid(3)] 90c4a3c779Sdrh expr {$v==$v2} 91c4a3c779Sdrh} {1} 92c4a3c779Sdrh 93a0217ba7Sdrh# We can insert or update the ROWID column. 94c4a3c779Sdrh# 95c4a3c779Sdrhdo_test rowid-2.1 { 96a0217ba7Sdrh catchsql { 97a0217ba7Sdrh INSERT INTO t1(rowid,x,y) VALUES(1234,5,6); 98a0217ba7Sdrh SELECT rowid, * FROM t1; 99a0217ba7Sdrh } 100a0217ba7Sdrh} {0 {1 1 2 2 3 4 1234 5 6}} 101c4a3c779Sdrhdo_test rowid-2.2 { 102a0217ba7Sdrh catchsql { 103a0217ba7Sdrh UPDATE t1 SET rowid=12345 WHERE x==1; 104a0217ba7Sdrh SELECT rowid, * FROM t1 105a0217ba7Sdrh } 106a0217ba7Sdrh} {0 {2 3 4 1234 5 6 12345 1 2}} 107c4a3c779Sdrhdo_test rowid-2.3 { 108a0217ba7Sdrh catchsql { 109a0217ba7Sdrh INSERT INTO t1(y,x,oid) VALUES(8,7,1235); 110a0217ba7Sdrh SELECT rowid, * FROM t1 WHERE rowid>1000; 111a0217ba7Sdrh } 112a0217ba7Sdrh} {0 {1234 5 6 1235 7 8 12345 1 2}} 113c4a3c779Sdrhdo_test rowid-2.4 { 114a0217ba7Sdrh catchsql { 115a0217ba7Sdrh UPDATE t1 SET oid=12346 WHERE x==1; 116a0217ba7Sdrh SELECT rowid, * FROM t1; 117a0217ba7Sdrh } 118a0217ba7Sdrh} {0 {2 3 4 1234 5 6 1235 7 8 12346 1 2}} 119c4a3c779Sdrhdo_test rowid-2.5 { 120a0217ba7Sdrh catchsql { 121a0217ba7Sdrh INSERT INTO t1(x,_rowid_,y) VALUES(9,1236,10); 122a0217ba7Sdrh SELECT rowid, * FROM t1 WHERE rowid>1000; 123a0217ba7Sdrh } 124a0217ba7Sdrh} {0 {1234 5 6 1235 7 8 1236 9 10 12346 1 2}} 125c4a3c779Sdrhdo_test rowid-2.6 { 126a0217ba7Sdrh catchsql { 127a0217ba7Sdrh UPDATE t1 SET _rowid_=12347 WHERE x==1; 128a0217ba7Sdrh SELECT rowid, * FROM t1 WHERE rowid>1000; 129a0217ba7Sdrh } 130a0217ba7Sdrh} {0 {1234 5 6 1235 7 8 1236 9 10 12347 1 2}} 131c4a3c779Sdrh 132c4a3c779Sdrh# But we can use ROWID in the WHERE clause of an UPDATE that does not 133c4a3c779Sdrh# change the ROWID. 134c4a3c779Sdrh# 135c4a3c779Sdrhdo_test rowid-2.7 { 136c4a3c779Sdrh global x2rowid 137c4a3c779Sdrh set sql "UPDATE t1 SET x=2 WHERE OID==$x2rowid(3)" 138c4a3c779Sdrh execsql $sql 139c4a3c779Sdrh execsql {SELECT x FROM t1 ORDER BY x} 140a0217ba7Sdrh} {1 2 5 7 9} 141c4a3c779Sdrhdo_test rowid-2.8 { 142c4a3c779Sdrh global x2rowid 143c4a3c779Sdrh set sql "UPDATE t1 SET x=3 WHERE _rowid_==$x2rowid(3)" 144c4a3c779Sdrh execsql $sql 145c4a3c779Sdrh execsql {SELECT x FROM t1 ORDER BY x} 146a0217ba7Sdrh} {1 3 5 7 9} 147c4a3c779Sdrh 148087f83b6Sdrhif 0 { # With the index-on-expressions enhancement, creating 149087f83b6Sdrh # an index on ROWID has become possible. 150c4a3c779Sdrh# We cannot index by ROWID 151c4a3c779Sdrh# 152c4a3c779Sdrhdo_test rowid-2.9 { 153c4a3c779Sdrh set v [catch {execsql {CREATE INDEX idxt1 ON t1(rowid)}} msg] 154c4a3c779Sdrh lappend v $msg 155c4a3c779Sdrh} {1 {table t1 has no column named rowid}} 156c4a3c779Sdrhdo_test rowid-2.10 { 157c4a3c779Sdrh set v [catch {execsql {CREATE INDEX idxt1 ON t1(_rowid_)}} msg] 158c4a3c779Sdrh lappend v $msg 159c4a3c779Sdrh} {1 {table t1 has no column named _rowid_}} 160c4a3c779Sdrhdo_test rowid-2.11 { 161c4a3c779Sdrh set v [catch {execsql {CREATE INDEX idxt1 ON t1(oid)}} msg] 162c4a3c779Sdrh lappend v $msg 163c4a3c779Sdrh} {1 {table t1 has no column named oid}} 164c4a3c779Sdrhdo_test rowid-2.12 { 165c4a3c779Sdrh set v [catch {execsql {CREATE INDEX idxt1 ON t1(x, rowid)}} msg] 166c4a3c779Sdrh lappend v $msg 167c4a3c779Sdrh} {1 {table t1 has no column named rowid}} 1681f9ca2c8Sdrh} 169c4a3c779Sdrh 170c4a3c779Sdrh# Columns defined in the CREATE statement override the buildin ROWID 171c4a3c779Sdrh# column names. 172c4a3c779Sdrh# 173c4a3c779Sdrhdo_test rowid-3.1 { 174c4a3c779Sdrh execsql { 175c4a3c779Sdrh CREATE TABLE t2(rowid int, x int, y int); 1765cf8e8c7Sdrh INSERT INTO t2 VALUES(0,2,3); 177c4a3c779Sdrh INSERT INTO t2 VALUES(4,5,6); 178c4a3c779Sdrh INSERT INTO t2 VALUES(7,8,9); 179c4a3c779Sdrh SELECT * FROM t2 ORDER BY x; 180c4a3c779Sdrh } 1815cf8e8c7Sdrh} {0 2 3 4 5 6 7 8 9} 182c4a3c779Sdrhdo_test rowid-3.2 { 183c4a3c779Sdrh execsql {SELECT * FROM t2 ORDER BY rowid} 1845cf8e8c7Sdrh} {0 2 3 4 5 6 7 8 9} 185c4a3c779Sdrhdo_test rowid-3.3 { 186c4a3c779Sdrh execsql {SELECT rowid, x, y FROM t2 ORDER BY rowid} 1875cf8e8c7Sdrh} {0 2 3 4 5 6 7 8 9} 188c4a3c779Sdrhdo_test rowid-3.4 { 189c4a3c779Sdrh set r1 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY rowid}] 190c4a3c779Sdrh foreach {a b c d e f} $r1 {} 191c4a3c779Sdrh set r2 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY x DESC}] 192c4a3c779Sdrh foreach {u v w x y z} $r2 {} 193c4a3c779Sdrh expr {$u==$e && $w==$c && $y==$a} 194c4a3c779Sdrh} {1} 195ef4ac8f9Sdrh# sqlite3 v3 - do_probtest doesn't exist anymore? 19696fc5fe6Sdanielk1977if 0 { 197c4a3c779Sdrhdo_probtest rowid-3.5 { 198c4a3c779Sdrh set r1 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY rowid}] 199c4a3c779Sdrh foreach {a b c d e f} $r1 {} 200c4a3c779Sdrh expr {$a!=$b && $c!=$d && $e!=$f} 201c4a3c779Sdrh} {1} 20296fc5fe6Sdanielk1977} 203c4a3c779Sdrh 204c4a3c779Sdrh# Let's try some more complex examples, including some joins. 205c4a3c779Sdrh# 206c4a3c779Sdrhdo_test rowid-4.1 { 207c4a3c779Sdrh execsql { 208c4a3c779Sdrh DELETE FROM t1; 209c4a3c779Sdrh DELETE FROM t2; 210c4a3c779Sdrh } 211c4a3c779Sdrh for {set i 1} {$i<=50} {incr i} { 212c4a3c779Sdrh execsql "INSERT INTO t1(x,y) VALUES($i,[expr {$i*$i}])" 213c4a3c779Sdrh } 214c4a3c779Sdrh execsql {INSERT INTO t2 SELECT _rowid_, x*y, y*y FROM t1} 215c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid} 216c4a3c779Sdrh} {256} 217c4a3c779Sdrhdo_test rowid-4.2 { 218c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid} 219c4a3c779Sdrh} {256} 220c4a3c779Sdrhdo_test rowid-4.2.1 { 221c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.oid==t2.rowid} 222c4a3c779Sdrh} {256} 223c4a3c779Sdrhdo_test rowid-4.2.2 { 224c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 225c4a3c779Sdrh} {256} 226c4a3c779Sdrhdo_test rowid-4.2.3 { 227c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t2.rowid==t1.rowid} 228c4a3c779Sdrh} {256} 229c4a3c779Sdrhdo_test rowid-4.2.4 { 230c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND t1.x==4} 231c4a3c779Sdrh} {256} 232c4a3c779Sdrhdo_test rowid-4.2.5 { 233c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 234c4a3c779Sdrh} {256} 235c4a3c779Sdrhdo_test rowid-4.2.6 { 236c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t2.rowid==t1.rowid} 237c4a3c779Sdrh} {256} 238c4a3c779Sdrhdo_test rowid-4.2.7 { 239c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND t1.x==4} 240c4a3c779Sdrh} {256} 241c4a3c779Sdrhdo_test rowid-4.3 { 242c4a3c779Sdrh execsql {CREATE INDEX idxt1 ON t1(x)} 243c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid} 244c4a3c779Sdrh} {256} 245c4a3c779Sdrhdo_test rowid-4.3.1 { 246c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 247c4a3c779Sdrh} {256} 248c4a3c779Sdrhdo_test rowid-4.3.2 { 249c4a3c779Sdrh execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND 4==t1.x} 250c4a3c779Sdrh} {256} 251c4a3c779Sdrhdo_test rowid-4.4 { 252c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid} 253c4a3c779Sdrh} {256} 254c4a3c779Sdrhdo_test rowid-4.4.1 { 255c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid} 256c4a3c779Sdrh} {256} 257c4a3c779Sdrhdo_test rowid-4.4.2 { 258c4a3c779Sdrh execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND 4==t1.x} 259c4a3c779Sdrh} {256} 260c4a3c779Sdrhdo_test rowid-4.5 { 261c4a3c779Sdrh execsql {CREATE INDEX idxt2 ON t2(y)} 262487ab3caSdrh set sqlite_search_count 0 263487ab3caSdrh concat [execsql { 264487ab3caSdrh SELECT t1.x FROM t2, t1 265c4a3c779Sdrh WHERE t2.y==256 AND t1.rowid==t2.rowid 266487ab3caSdrh }] $sqlite_search_count 267487ab3caSdrh} {4 3} 268c4a3c779Sdrhdo_test rowid-4.5.1 { 269487ab3caSdrh set sqlite_search_count 0 270487ab3caSdrh concat [execsql { 271487ab3caSdrh SELECT t1.x FROM t2, t1 272c4a3c779Sdrh WHERE t1.OID==t2.rowid AND t2.y==81 273487ab3caSdrh }] $sqlite_search_count 274487ab3caSdrh} {3 3} 275c4a3c779Sdrhdo_test rowid-4.6 { 276c4a3c779Sdrh execsql { 277c4a3c779Sdrh SELECT t1.x FROM t1, t2 278c4a3c779Sdrh WHERE t2.y==256 AND t1.rowid==t2.rowid 279c4a3c779Sdrh } 280c4a3c779Sdrh} {4} 281c4a3c779Sdrh 2823e8c37e7Sdanielk1977do_test rowid-5.1.1 { 2833e8c37e7Sdanielk1977 ifcapable subquery { 284c4a3c779Sdrh execsql {DELETE FROM t1 WHERE _rowid_ IN (SELECT oid FROM t1 WHERE x>8)} 2853e8c37e7Sdanielk1977 } else { 2863e8c37e7Sdanielk1977 set oids [execsql {SELECT oid FROM t1 WHERE x>8}] 2873e8c37e7Sdanielk1977 set where "_rowid_ = [join $oids { OR _rowid_ = }]" 2883e8c37e7Sdanielk1977 execsql "DELETE FROM t1 WHERE $where" 2893e8c37e7Sdanielk1977 } 2903e8c37e7Sdanielk1977} {} 2913e8c37e7Sdanielk1977do_test rowid-5.1.2 { 292c4a3c779Sdrh execsql {SELECT max(x) FROM t1} 293c4a3c779Sdrh} {8} 2943543b3e0Sdrh 295c6b52df3Sdrh# Make sure a "WHERE rowid=X" clause works when there is no ROWID of X. 296c6b52df3Sdrh# 297c6b52df3Sdrhdo_test rowid-6.1 { 298c6b52df3Sdrh execsql { 299c6b52df3Sdrh SELECT x FROM t1 300c6b52df3Sdrh } 301c6b52df3Sdrh} {1 2 3 4 5 6 7 8} 302c6b52df3Sdrhdo_test rowid-6.2 { 3035cf8e8c7Sdrh for {set ::norow 1} {1} {incr ::norow} { 3045cf8e8c7Sdrh if {[execsql "SELECT x FROM t1 WHERE rowid=$::norow"]==""} break 3055cf8e8c7Sdrh } 306c6b52df3Sdrh execsql [subst { 307c6b52df3Sdrh DELETE FROM t1 WHERE rowid=$::norow 308c6b52df3Sdrh }] 309c6b52df3Sdrh} {} 310c6b52df3Sdrhdo_test rowid-6.3 { 311c6b52df3Sdrh execsql { 312c6b52df3Sdrh SELECT x FROM t1 313c6b52df3Sdrh } 314c6b52df3Sdrh} {1 2 3 4 5 6 7 8} 315c6b52df3Sdrh 3165cf8e8c7Sdrh# Beginning with version 2.3.4, SQLite computes rowids of new rows by 3175cf8e8c7Sdrh# finding the maximum current rowid and adding one. It falls back to 3185cf8e8c7Sdrh# the old random algorithm if the maximum rowid is the largest integer. 3195cf8e8c7Sdrh# The following tests are for this new behavior. 3205cf8e8c7Sdrh# 3215cf8e8c7Sdrhdo_test rowid-7.0 { 3225cf8e8c7Sdrh execsql { 3235cf8e8c7Sdrh DELETE FROM t1; 3245cf8e8c7Sdrh DROP TABLE t2; 3255cf8e8c7Sdrh DROP INDEX idxt1; 3265cf8e8c7Sdrh INSERT INTO t1 VALUES(1,2); 3275cf8e8c7Sdrh SELECT rowid, * FROM t1; 3285cf8e8c7Sdrh } 3295cf8e8c7Sdrh} {1 1 2} 3305cf8e8c7Sdrhdo_test rowid-7.1 { 3315cf8e8c7Sdrh execsql { 3325cf8e8c7Sdrh INSERT INTO t1 VALUES(99,100); 3335cf8e8c7Sdrh SELECT rowid,* FROM t1 3345cf8e8c7Sdrh } 3355cf8e8c7Sdrh} {1 1 2 2 99 100} 3365cf8e8c7Sdrhdo_test rowid-7.2 { 3375cf8e8c7Sdrh execsql { 3385cf8e8c7Sdrh CREATE TABLE t2(a INTEGER PRIMARY KEY, b); 3395cf8e8c7Sdrh INSERT INTO t2(b) VALUES(55); 3405cf8e8c7Sdrh SELECT * FROM t2; 3415cf8e8c7Sdrh } 3425cf8e8c7Sdrh} {1 55} 3435cf8e8c7Sdrhdo_test rowid-7.3 { 3445cf8e8c7Sdrh execsql { 3455cf8e8c7Sdrh INSERT INTO t2(b) VALUES(66); 3465cf8e8c7Sdrh SELECT * FROM t2; 3475cf8e8c7Sdrh } 3485cf8e8c7Sdrh} {1 55 2 66} 3495cf8e8c7Sdrhdo_test rowid-7.4 { 3505cf8e8c7Sdrh execsql { 3515cf8e8c7Sdrh INSERT INTO t2(a,b) VALUES(1000000,77); 3525cf8e8c7Sdrh INSERT INTO t2(b) VALUES(88); 3535cf8e8c7Sdrh SELECT * FROM t2; 3545cf8e8c7Sdrh } 3555cf8e8c7Sdrh} {1 55 2 66 1000000 77 1000001 88} 3565cf8e8c7Sdrhdo_test rowid-7.5 { 3575cf8e8c7Sdrh execsql { 3585cf8e8c7Sdrh INSERT INTO t2(a,b) VALUES(2147483647,99); 3595cf8e8c7Sdrh INSERT INTO t2(b) VALUES(11); 3605cf8e8c7Sdrh SELECT b FROM t2 ORDER BY b; 3615cf8e8c7Sdrh } 3625cf8e8c7Sdrh} {11 55 66 77 88 99} 3633e8c37e7Sdanielk1977ifcapable subquery { 3645cf8e8c7Sdrh do_test rowid-7.6 { 3655cf8e8c7Sdrh execsql { 3665cf8e8c7Sdrh SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647); 3675cf8e8c7Sdrh } 3685cf8e8c7Sdrh } {11} 3695cf8e8c7Sdrh do_test rowid-7.7 { 3705cf8e8c7Sdrh execsql { 3715cf8e8c7Sdrh INSERT INTO t2(b) VALUES(22); 3725cf8e8c7Sdrh INSERT INTO t2(b) VALUES(33); 3735cf8e8c7Sdrh INSERT INTO t2(b) VALUES(44); 3745cf8e8c7Sdrh INSERT INTO t2(b) VALUES(55); 3753e8c37e7Sdanielk1977 SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647) 3763e8c37e7Sdanielk1977 ORDER BY b; 3775cf8e8c7Sdrh } 3785cf8e8c7Sdrh } {11 22 33 44 55} 3793e8c37e7Sdanielk1977} 3805cf8e8c7Sdrhdo_test rowid-7.8 { 3815cf8e8c7Sdrh execsql { 3825cf8e8c7Sdrh DELETE FROM t2 WHERE a!=2; 3835cf8e8c7Sdrh INSERT INTO t2(b) VALUES(111); 3845cf8e8c7Sdrh SELECT * FROM t2; 3855cf8e8c7Sdrh } 3865cf8e8c7Sdrh} {2 66 3 111} 387c6b52df3Sdrh 388798da52cSdrhifcapable {trigger} { 38949449834Sdrh# Make sure AFTER triggers that do INSERTs do not change the last_insert_rowid. 39049449834Sdrh# Ticket #290 39149449834Sdrh# 39249449834Sdrhdo_test rowid-8.1 { 39349449834Sdrh execsql { 39449449834Sdrh CREATE TABLE t3(a integer primary key); 39549449834Sdrh CREATE TABLE t4(x); 39649449834Sdrh INSERT INTO t4 VALUES(1); 39749449834Sdrh CREATE TRIGGER r3 AFTER INSERT on t3 FOR EACH ROW BEGIN 39849449834Sdrh INSERT INTO t4 VALUES(NEW.a+10); 39949449834Sdrh END; 40049449834Sdrh SELECT * FROM t3; 40149449834Sdrh } 40249449834Sdrh} {} 40349449834Sdrhdo_test rowid-8.2 { 40449449834Sdrh execsql { 40549449834Sdrh SELECT rowid, * FROM t4; 40649449834Sdrh } 40749449834Sdrh} {1 1} 40849449834Sdrhdo_test rowid-8.3 { 40949449834Sdrh execsql { 41049449834Sdrh INSERT INTO t3 VALUES(123); 41149449834Sdrh SELECT last_insert_rowid(); 41249449834Sdrh } 41349449834Sdrh} {123} 41449449834Sdrhdo_test rowid-8.4 { 41549449834Sdrh execsql { 41649449834Sdrh SELECT * FROM t3; 41749449834Sdrh } 41849449834Sdrh} {123} 41949449834Sdrhdo_test rowid-8.5 { 42049449834Sdrh execsql { 42149449834Sdrh SELECT rowid, * FROM t4; 42249449834Sdrh } 42349449834Sdrh} {1 1 2 133} 42449449834Sdrhdo_test rowid-8.6 { 42549449834Sdrh execsql { 42649449834Sdrh INSERT INTO t3 VALUES(NULL); 42749449834Sdrh SELECT last_insert_rowid(); 42849449834Sdrh } 42949449834Sdrh} {124} 43049449834Sdrhdo_test rowid-8.7 { 43149449834Sdrh execsql { 43249449834Sdrh SELECT * FROM t3; 43349449834Sdrh } 43449449834Sdrh} {123 124} 43549449834Sdrhdo_test rowid-8.8 { 43649449834Sdrh execsql { 43749449834Sdrh SELECT rowid, * FROM t4; 43849449834Sdrh } 43970ce3f0cSdrh} {1 1 2 133 3 134} 440798da52cSdrh} ;# endif trigger 441798da52cSdrh 442798da52cSdrh# If triggers are not enable, simulate their effect for the tests that 443798da52cSdrh# follow. 444798da52cSdrhifcapable {!trigger} { 445798da52cSdrh execsql { 446798da52cSdrh CREATE TABLE t3(a integer primary key); 447798da52cSdrh INSERT INTO t3 VALUES(123); 448798da52cSdrh INSERT INTO t3 VALUES(124); 449798da52cSdrh } 450798da52cSdrh} 45149449834Sdrh 4521dd59e0fSdrh# ticket #377: Comparison between integer primiary key and floating point 4531dd59e0fSdrh# values. 4541dd59e0fSdrh# 4551dd59e0fSdrhdo_test rowid-9.1 { 4561dd59e0fSdrh execsql { 4571dd59e0fSdrh SELECT * FROM t3 WHERE a<123.5 4581dd59e0fSdrh } 4591dd59e0fSdrh} {123} 4601dd59e0fSdrhdo_test rowid-9.2 { 4611dd59e0fSdrh execsql { 4621dd59e0fSdrh SELECT * FROM t3 WHERE a<124.5 4631dd59e0fSdrh } 4641dd59e0fSdrh} {123 124} 4651dd59e0fSdrhdo_test rowid-9.3 { 4661dd59e0fSdrh execsql { 4671dd59e0fSdrh SELECT * FROM t3 WHERE a>123.5 4681dd59e0fSdrh } 4691dd59e0fSdrh} {124} 4701dd59e0fSdrhdo_test rowid-9.4 { 4711dd59e0fSdrh execsql { 4721dd59e0fSdrh SELECT * FROM t3 WHERE a>122.5 4731dd59e0fSdrh } 4741dd59e0fSdrh} {123 124} 4751dd59e0fSdrhdo_test rowid-9.5 { 4761dd59e0fSdrh execsql { 4771dd59e0fSdrh SELECT * FROM t3 WHERE a==123.5 4781dd59e0fSdrh } 4791dd59e0fSdrh} {} 4801dd59e0fSdrhdo_test rowid-9.6 { 4811dd59e0fSdrh execsql { 4821dd59e0fSdrh SELECT * FROM t3 WHERE a==123.000 4831dd59e0fSdrh } 4841dd59e0fSdrh} {123} 4851dd59e0fSdrhdo_test rowid-9.7 { 4861dd59e0fSdrh execsql { 4871dd59e0fSdrh SELECT * FROM t3 WHERE a>100.5 AND a<200.5 4881dd59e0fSdrh } 4891dd59e0fSdrh} {123 124} 4901dd59e0fSdrhdo_test rowid-9.8 { 4911dd59e0fSdrh execsql { 4921dd59e0fSdrh SELECT * FROM t3 WHERE a>'xyz'; 4931dd59e0fSdrh } 4941dd59e0fSdrh} {} 4951dd59e0fSdrhdo_test rowid-9.9 { 4961dd59e0fSdrh execsql { 4971dd59e0fSdrh SELECT * FROM t3 WHERE a<'xyz'; 4981dd59e0fSdrh } 4991dd59e0fSdrh} {123 124} 5001dd59e0fSdrhdo_test rowid-9.10 { 5011dd59e0fSdrh execsql { 5021dd59e0fSdrh SELECT * FROM t3 WHERE a>=122.9 AND a<=123.1 5031dd59e0fSdrh } 5041dd59e0fSdrh} {123} 5051dd59e0fSdrh 506751f4121Sdrh# Ticket #567. Comparisons of ROWID or integery primary key against 507751f4121Sdrh# floating point numbers still do not always work. 508751f4121Sdrh# 509751f4121Sdrhdo_test rowid-10.1 { 510751f4121Sdrh execsql { 511751f4121Sdrh CREATE TABLE t5(a); 512751f4121Sdrh INSERT INTO t5 VALUES(1); 513751f4121Sdrh INSERT INTO t5 VALUES(2); 514751f4121Sdrh INSERT INTO t5 SELECT a+2 FROM t5; 515751f4121Sdrh INSERT INTO t5 SELECT a+4 FROM t5; 516751f4121Sdrh SELECT rowid, * FROM t5; 517751f4121Sdrh } 518751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 519751f4121Sdrhdo_test rowid-10.2 { 520751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5} 521751f4121Sdrh} {6 6 7 7 8 8} 522751f4121Sdrhdo_test rowid-10.3 { 523751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0} 524751f4121Sdrh} {5 5 6 6 7 7 8 8} 525751f4121Sdrhdo_test rowid-10.4 { 526751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5} 527751f4121Sdrh} {6 6 7 7 8 8} 528751f4121Sdrhdo_test rowid-10.3.2 { 529751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0} 530751f4121Sdrh} {6 6 7 7 8 8} 531751f4121Sdrhdo_test rowid-10.5 { 532751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid} 533751f4121Sdrh} {6 6 7 7 8 8} 534751f4121Sdrhdo_test rowid-10.6 { 535751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid} 536751f4121Sdrh} {6 6 7 7 8 8} 537751f4121Sdrhdo_test rowid-10.7 { 538751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5} 539751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5} 540751f4121Sdrhdo_test rowid-10.8 { 541751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5} 542751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5} 543751f4121Sdrhdo_test rowid-10.9 { 544751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid} 545751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5} 546751f4121Sdrhdo_test rowid-10.10 { 547751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid} 548751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5} 549751f4121Sdrhdo_test rowid-10.11 { 550751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5 ORDER BY rowid DESC} 551751f4121Sdrh} {8 8 7 7 6 6} 552751f4121Sdrhdo_test rowid-10.11.2 { 553751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0 ORDER BY rowid DESC} 554751f4121Sdrh} {8 8 7 7 6 6 5 5} 555751f4121Sdrhdo_test rowid-10.12 { 556751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5 ORDER BY rowid DESC} 557751f4121Sdrh} {8 8 7 7 6 6} 558751f4121Sdrhdo_test rowid-10.12.2 { 559751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0 ORDER BY rowid DESC} 560751f4121Sdrh} {8 8 7 7 6 6} 561751f4121Sdrhdo_test rowid-10.13 { 562751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid ORDER BY rowid DESC} 563751f4121Sdrh} {8 8 7 7 6 6} 564751f4121Sdrhdo_test rowid-10.14 { 565751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid ORDER BY rowid DESC} 566751f4121Sdrh} {8 8 7 7 6 6} 567751f4121Sdrhdo_test rowid-10.15 { 568751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5 ORDER BY rowid DESC} 569751f4121Sdrh} {5 5 4 4 3 3 2 2 1 1} 570751f4121Sdrhdo_test rowid-10.16 { 571751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5 ORDER BY rowid DESC} 572751f4121Sdrh} {5 5 4 4 3 3 2 2 1 1} 573751f4121Sdrhdo_test rowid-10.17 { 574751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid ORDER BY rowid DESC} 575751f4121Sdrh} {5 5 4 4 3 3 2 2 1 1} 576751f4121Sdrhdo_test rowid-10.18 { 577751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid ORDER BY rowid DESC} 578751f4121Sdrh} {5 5 4 4 3 3 2 2 1 1} 579751f4121Sdrh 580751f4121Sdrhdo_test rowid-10.30 { 581751f4121Sdrh execsql { 582751f4121Sdrh CREATE TABLE t6(a); 583751f4121Sdrh INSERT INTO t6(rowid,a) SELECT -a,a FROM t5; 584751f4121Sdrh SELECT rowid, * FROM t6; 585751f4121Sdrh } 586751f4121Sdrh} {-8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1} 587751f4121Sdrhdo_test rowid-10.31.1 { 588751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5} 589751f4121Sdrh} {-5 5 -4 4 -3 3 -2 2 -1 1} 590751f4121Sdrhdo_test rowid-10.31.2 { 591751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0} 592751f4121Sdrh} {-5 5 -4 4 -3 3 -2 2 -1 1} 593751f4121Sdrhdo_test rowid-10.32.1 { 594751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5 ORDER BY rowid DESC} 595751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4 -5 5} 596751f4121Sdrhdo_test rowid-10.32.1 { 597751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0 ORDER BY rowid DESC} 598751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4 -5 5} 599751f4121Sdrhdo_test rowid-10.33 { 600751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid} 601751f4121Sdrh} {-5 5 -4 4 -3 3 -2 2 -1 1} 602751f4121Sdrhdo_test rowid-10.34 { 603751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid ORDER BY rowid DESC} 604751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4 -5 5} 605751f4121Sdrhdo_test rowid-10.35.1 { 606751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5} 607751f4121Sdrh} {-5 5 -4 4 -3 3 -2 2 -1 1} 608751f4121Sdrhdo_test rowid-10.35.2 { 609751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0} 610751f4121Sdrh} {-4 4 -3 3 -2 2 -1 1} 611751f4121Sdrhdo_test rowid-10.36.1 { 612751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5 ORDER BY rowid DESC} 613751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4 -5 5} 614751f4121Sdrhdo_test rowid-10.36.2 { 615751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0 ORDER BY rowid DESC} 616751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4} 617751f4121Sdrhdo_test rowid-10.37 { 618751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid} 619751f4121Sdrh} {-5 5 -4 4 -3 3 -2 2 -1 1} 620751f4121Sdrhdo_test rowid-10.38 { 621751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid ORDER BY rowid DESC} 622751f4121Sdrh} {-1 1 -2 2 -3 3 -4 4 -5 5} 623751f4121Sdrhdo_test rowid-10.39 { 624751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5} 625751f4121Sdrh} {-8 8 -7 7 -6 6} 626751f4121Sdrhdo_test rowid-10.40 { 627751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5 ORDER BY rowid DESC} 628751f4121Sdrh} {-6 6 -7 7 -8 8} 629751f4121Sdrhdo_test rowid-10.41 { 630751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid} 631751f4121Sdrh} {-8 8 -7 7 -6 6} 632751f4121Sdrhdo_test rowid-10.42 { 633751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid ORDER BY rowid DESC} 634751f4121Sdrh} {-6 6 -7 7 -8 8} 635751f4121Sdrhdo_test rowid-10.43 { 636751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5} 637751f4121Sdrh} {-8 8 -7 7 -6 6} 638751f4121Sdrhdo_test rowid-10.44 { 639751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5 ORDER BY rowid DESC} 640751f4121Sdrh} {-6 6 -7 7 -8 8} 641751f4121Sdrhdo_test rowid-10.44 { 642751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid} 643751f4121Sdrh} {-8 8 -7 7 -6 6} 644751f4121Sdrhdo_test rowid-10.46 { 645751f4121Sdrh execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid ORDER BY rowid DESC} 646751f4121Sdrh} {-6 6 -7 7 -8 8} 647751f4121Sdrh 648751f4121Sdrh# Comparison of rowid against string values. 649751f4121Sdrh# 650751f4121Sdrhdo_test rowid-11.1 { 651751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc'} 652751f4121Sdrh} {} 653751f4121Sdrhdo_test rowid-11.2 { 654751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc'} 655751f4121Sdrh} {} 656751f4121Sdrhdo_test rowid-11.3 { 657751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc'} 658751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 659751f4121Sdrhdo_test rowid-11.4 { 660751f4121Sdrh execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc'} 661751f4121Sdrh} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 662751f4121Sdrh 6639edd8c11Sdando_test rowid-11.asc.1 { 6649edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc' ORDER BY 1 ASC} 6659edd8c11Sdan} {} 6669edd8c11Sdando_test rowid-11.asc.2 { 6679edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc' ORDER BY 1 ASC} 6689edd8c11Sdan} {} 6699edd8c11Sdando_test rowid-11.asc.3 { 6709edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc' ORDER BY 1 ASC} 6719edd8c11Sdan} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 6729edd8c11Sdando_test rowid-11.asc.4 { 6739edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc' ORDER BY 1 ASC} 6749edd8c11Sdan} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 6759edd8c11Sdan 6769edd8c11Sdando_test rowid-11.desc.1 { 6779edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc' ORDER BY 1 DESC} 6789edd8c11Sdan} {} 6799edd8c11Sdando_test rowid-11.desc.2 { 6809edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc' ORDER BY 1 DESC} 6819edd8c11Sdan} {} 6829edd8c11Sdando_test rowid-11.desc.3 { 6839edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc' ORDER BY 1 DESC} 6849edd8c11Sdan} {8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1} 6859edd8c11Sdando_test rowid-11.desc.4 { 6869edd8c11Sdan execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc' ORDER BY 1 DESC} 6879edd8c11Sdan} {8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1} 6889edd8c11Sdan 6896a179ea7Sdrh# Test the automatic generation of rowids when the table already contains 6906a179ea7Sdrh# a rowid with the maximum value. 6916a179ea7Sdrh# 692d5578433Smistachkin# Once the maximum rowid is taken, rowids are normally chosen at 69391fd4d46Sdrh# random. By by reseting the random number generator, we can cause 69491fd4d46Sdrh# the rowid guessing loop to collide with prior rowids, and test the 69591fd4d46Sdrh# loop out to its limit of 100 iterations. After 100 collisions, the 69691fd4d46Sdrh# rowid guesser gives up and reports SQLITE_FULL. 69791fd4d46Sdrh# 6986a179ea7Sdrhdo_test rowid-12.1 { 6996a179ea7Sdrh execsql { 7006a179ea7Sdrh CREATE TABLE t7(x INTEGER PRIMARY KEY, y); 7019ed7a995Sdrh CREATE TABLE t7temp(a INTEGER PRIMARY KEY); 7026a179ea7Sdrh INSERT INTO t7 VALUES(9223372036854775807,'a'); 7036a179ea7Sdrh SELECT y FROM t7; 7046a179ea7Sdrh } 7056a179ea7Sdrh} {a} 7066a179ea7Sdrhdo_test rowid-12.2 { 70791fd4d46Sdrh db close 70891fd4d46Sdrh sqlite3 db test.db 70991fd4d46Sdrh save_prng_state 7106a179ea7Sdrh execsql { 7116a179ea7Sdrh INSERT INTO t7 VALUES(NULL,'b'); 7122c4dc635Sdrh SELECT x, y FROM t7 ORDER BY x; 7136a179ea7Sdrh } 7142c4dc635Sdrh} {/\d+ b 9223372036854775807 a/} 71591fd4d46Sdrhexecsql {INSERT INTO t7 VALUES(2,'y');} 7169ed7a995Sdrhfor {set i 1} {$i<100} {incr i} { 71791fd4d46Sdrh do_test rowid-12.3.$i { 7189ed7a995Sdrh db eval {DELETE FROM t7temp; INSERT INTO t7temp VALUES(1);} 71991fd4d46Sdrh restore_prng_state 72091fd4d46Sdrh execsql { 72191fd4d46Sdrh INSERT INTO t7 VALUES(NULL,'x'); 72291fd4d46Sdrh SELECT count(*) FROM t7 WHERE y=='x'; 72391fd4d46Sdrh } 72491fd4d46Sdrh } $i 72591fd4d46Sdrh} 72691fd4d46Sdrhdo_test rowid-12.4 { 7279ed7a995Sdrh db eval {DELETE FROM t7temp; INSERT INTO t7temp VALUES(1);} 72891fd4d46Sdrh restore_prng_state 72991fd4d46Sdrh catchsql { 73091fd4d46Sdrh INSERT INTO t7 VALUES(NULL,'x'); 73191fd4d46Sdrh } 73291fd4d46Sdrh} {1 {database or disk is full}} 73391fd4d46Sdrh 7343b130bebSdrh# INSERTs that happen inside of nested function calls are recorded 7353b130bebSdrh# by last_insert_rowid. 7363b130bebSdrh# 7373b130bebSdrhproc rowid_addrow_func {n} { 7383b130bebSdrh db eval {INSERT INTO t13(rowid,x) VALUES($n,$n*$n)} 7393b130bebSdrh return [db last_insert_rowid] 7403b130bebSdrh} 7413b130bebSdrhdb function addrow rowid_addrow_func 7423b130bebSdrhdo_execsql_test rowid-13.1 { 7433b130bebSdrh CREATE TABLE t13(x); 7443b130bebSdrh INSERT INTO t13(rowid,x) VALUES(1234,5); 7453b130bebSdrh SELECT rowid, x, addrow(rowid+1000), '|' FROM t13 LIMIT 3; 7463b130bebSdrh SELECT last_insert_rowid(); 7473b130bebSdrh} {1234 5 2234 | 2234 4990756 3234 | 3234 10458756 4234 | 4234} 74849449834Sdrh 7499edd8c11Sdan#------------------------------------------------------------------------- 7509edd8c11Sdando_execsql_test rowid-14.0 { 7519edd8c11Sdan CREATE TABLE t14(x INTEGER PRIMARY KEY); 7529edd8c11Sdan INSERT INTO t14(x) VALUES (100); 7539edd8c11Sdan} 7549edd8c11Sdando_execsql_test rowid-14.1 { 7559edd8c11Sdan SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid ASC; 7569edd8c11Sdan} {100} 7579edd8c11Sdando_execsql_test rowid-14.2 { 7589edd8c11Sdan SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid DESC; 7599edd8c11Sdan} {100} 7609edd8c11Sdan 7619edd8c11Sdando_execsql_test rowid-14.3 { 7629edd8c11Sdan DELETE FROM t14; 7639edd8c11Sdan SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid ASC; 7649edd8c11Sdan} {} 7659edd8c11Sdando_execsql_test rowid-14.4 { 7669edd8c11Sdan SELECT * FROM t14 WHERE x < 'a' ORDER BY rowid DESC; 7679edd8c11Sdan} {} 7689edd8c11Sdan 769a40cb96aSdanreset_db 770a40cb96aSdando_execsql_test rowid-15.0 { 771a40cb96aSdan PRAGMA reverse_unordered_selects=true; 772a40cb96aSdan CREATE TABLE t1 (c0, c1); 773a40cb96aSdan CREATE TABLE t2 (c0 INT UNIQUE); 774a40cb96aSdan INSERT INTO t1(c0, c1) VALUES (0, 0), (0, NULL); 775a40cb96aSdan INSERT INTO t2(c0) VALUES (1); 776a40cb96aSdan} 777a40cb96aSdan 778a40cb96aSdando_execsql_test rowid-15.1 { 779a40cb96aSdan SELECT t2.c0, t1.c1 FROM t1, t2 780a40cb96aSdan WHERE (t2.rowid <= 'a') OR (t1.c0 <= t2.c0) LIMIT 100 781a40cb96aSdan} {1 {} 1 0} 782a40cb96aSdan 783a40cb96aSdando_execsql_test rowid-15.2 { 784a40cb96aSdan SELECT 1, NULL INTERSECT SELECT * FROM ( 785a40cb96aSdan SELECT t2.c0, t1.c1 FROM t1, t2 786a40cb96aSdan WHERE ((t2.rowid <= 'a')) OR (t1.c0 <= t2.c0) ORDER BY 'a' DESC LIMIT 100 787a40cb96aSdan ); 788a40cb96aSdan} {1 {}} 789a40cb96aSdan 790*b9248ef5Sdan#------------------------------------------------------------------------- 791*b9248ef5Sdan# Check that an unqualified "rowid" can be used in join queries so long 792*b9248ef5Sdan# as only one of the source objects has a rowid column. 793*b9248ef5Sdan# 794*b9248ef5Sdanreset_db 795*b9248ef5Sdando_execsql_test 16.0 { 796*b9248ef5Sdan CREATE TABLE t1(x); 797*b9248ef5Sdan CREATE TABLE t2(y PRIMARY KEY) WITHOUT ROWID; 798*b9248ef5Sdan CREATE VIEW v1 AS SELECT x FROM t1; 799*b9248ef5Sdan CREATE TABLE t3(z); 800*b9248ef5Sdan 801*b9248ef5Sdan INSERT INTO t1(rowid, x) VALUES(1, 1); 802*b9248ef5Sdan INSERT INTO t2(y) VALUES(2); 803*b9248ef5Sdan INSERT INTO t3(rowid, z) VALUES(3, 3); 804*b9248ef5Sdan} 805*b9248ef5Sdan 806*b9248ef5Sdando_execsql_test 16.1 { SELECT rowid FROM t1, t2; } {1} 807*b9248ef5Sdando_execsql_test 16.2 { SELECT rowid FROM t1, v1; } {1} 808*b9248ef5Sdando_execsql_test 16.3 { SELECT rowid FROM t3, v1; } {3} 809*b9248ef5Sdando_execsql_test 16.4 { SELECT rowid FROM t3, (SELECT 123); } {3} 810*b9248ef5Sdan 811*b9248ef5Sdando_execsql_test 16.5 { SELECT rowid FROM t2, t1; } {1} 812*b9248ef5Sdando_execsql_test 16.6 { SELECT rowid FROM v1, t1; } {1} 813*b9248ef5Sdando_execsql_test 16.7 { SELECT rowid FROM v1, t3; } {3} 814*b9248ef5Sdando_execsql_test 16.8 { SELECT rowid FROM (SELECT 123), t3; } {3} 815*b9248ef5Sdan 816*b9248ef5Sdando_catchsql_test 16.5 { SELECT rowid FROM t1, t3; } {1 {no such column: rowid}} 817*b9248ef5Sdan 818*b9248ef5Sdan 819a40cb96aSdan 8203543b3e0Sdrhfinish_test 821