xref: /sqlite-3.40.0/test/rowid.test (revision b9248ef5)
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