blob: 5a0b361387b54aab6b19be6eb679ab2075b1525d [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drhc4a3c772001-04-04 11:48:57 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drhc4a3c772001-04-04 11:48:57 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# 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.
drhc4a3c772001-04-04 11:48:57 +00009#
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#
drh798da522004-11-04 04:42:28 +000015# $Id: rowid.test,v 1.17 2004/11/04 04:42:28 drh Exp $
drhc4a3c772001-04-04 11:48:57 +000016
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}
drh1eaa2692001-09-18 02:02:23 +000064do_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} {}
drhc4a3c772001-04-04 11:48:57 +000071do_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
drha0217ba2003-06-01 01:10:33 +000090# We can insert or update the ROWID column.
drhc4a3c772001-04-04 11:48:57 +000091#
92do_test rowid-2.1 {
drha0217ba2003-06-01 01:10:33 +000093 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}}
drhc4a3c772001-04-04 11:48:57 +000098do_test rowid-2.2 {
drha0217ba2003-06-01 01:10:33 +000099 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}}
drhc4a3c772001-04-04 11:48:57 +0000104do_test rowid-2.3 {
drha0217ba2003-06-01 01:10:33 +0000105 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}}
drhc4a3c772001-04-04 11:48:57 +0000110do_test rowid-2.4 {
drha0217ba2003-06-01 01:10:33 +0000111 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}}
drhc4a3c772001-04-04 11:48:57 +0000116do_test rowid-2.5 {
drha0217ba2003-06-01 01:10:33 +0000117 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}}
drhc4a3c772001-04-04 11:48:57 +0000122do_test rowid-2.6 {
drha0217ba2003-06-01 01:10:33 +0000123 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}}
drhc4a3c772001-04-04 11:48:57 +0000128
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}
drha0217ba2003-06-01 01:10:33 +0000137} {1 2 5 7 9}
drhc4a3c772001-04-04 11:48:57 +0000138do_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}
drha0217ba2003-06-01 01:10:33 +0000143} {1 3 5 7 9}
drhc4a3c772001-04-04 11:48:57 +0000144
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);
drh5cf8e8c2002-02-19 22:42:05 +0000170 INSERT INTO t2 VALUES(0,2,3);
drhc4a3c772001-04-04 11:48:57 +0000171 INSERT INTO t2 VALUES(4,5,6);
172 INSERT INTO t2 VALUES(7,8,9);
173 SELECT * FROM t2 ORDER BY x;
174 }
drh5cf8e8c2002-02-19 22:42:05 +0000175} {0 2 3 4 5 6 7 8 9}
drhc4a3c772001-04-04 11:48:57 +0000176do_test rowid-3.2 {
177 execsql {SELECT * FROM t2 ORDER BY rowid}
drh5cf8e8c2002-02-19 22:42:05 +0000178} {0 2 3 4 5 6 7 8 9}
drhc4a3c772001-04-04 11:48:57 +0000179do_test rowid-3.3 {
180 execsql {SELECT rowid, x, y FROM t2 ORDER BY rowid}
drh5cf8e8c2002-02-19 22:42:05 +0000181} {0 2 3 4 5 6 7 8 9}
drhc4a3c772001-04-04 11:48:57 +0000182do_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}
drhef4ac8f2004-06-19 00:16:31 +0000189# sqlite3 v3 - do_probtest doesn't exist anymore?
danielk197796fc5fe2004-05-13 11:34:16 +0000190if 0 {
drhc4a3c772001-04-04 11:48:57 +0000191do_probtest rowid-3.5 {
192 set r1 [execsql {SELECT _rowid_, rowid FROM t2 ORDER BY rowid}]
193 foreach {a b c d e f} $r1 {}
194 expr {$a!=$b && $c!=$d && $e!=$f}
195} {1}
danielk197796fc5fe2004-05-13 11:34:16 +0000196}
drhc4a3c772001-04-04 11:48:57 +0000197
198# Let's try some more complex examples, including some joins.
199#
200do_test rowid-4.1 {
201 execsql {
202 DELETE FROM t1;
203 DELETE FROM t2;
204 }
205 for {set i 1} {$i<=50} {incr i} {
206 execsql "INSERT INTO t1(x,y) VALUES($i,[expr {$i*$i}])"
207 }
208 execsql {INSERT INTO t2 SELECT _rowid_, x*y, y*y FROM t1}
209 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid}
210} {256}
211do_test rowid-4.2 {
212 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid}
213} {256}
214do_test rowid-4.2.1 {
215 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.oid==t2.rowid}
216} {256}
217do_test rowid-4.2.2 {
218 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
219} {256}
220do_test rowid-4.2.3 {
221 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t2.rowid==t1.rowid}
222} {256}
223do_test rowid-4.2.4 {
224 execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND t1.x==4}
225} {256}
226do_test rowid-4.2.5 {
227 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
228} {256}
229do_test rowid-4.2.6 {
230 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t2.rowid==t1.rowid}
231} {256}
232do_test rowid-4.2.7 {
233 execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND t1.x==4}
234} {256}
235do_test rowid-4.3 {
236 execsql {CREATE INDEX idxt1 ON t1(x)}
237 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1.rowid==t2.rowid}
238} {256}
239do_test rowid-4.3.1 {
240 execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
241} {256}
242do_test rowid-4.3.2 {
243 execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND 4==t1.x}
244} {256}
245do_test rowid-4.4 {
246 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid}
247} {256}
248do_test rowid-4.4.1 {
249 execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
250} {256}
251do_test rowid-4.4.2 {
252 execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND 4==t1.x}
253} {256}
254do_test rowid-4.5 {
255 execsql {CREATE INDEX idxt2 ON t2(y)}
drh487ab3c2001-11-08 00:45:21 +0000256 set sqlite_search_count 0
257 concat [execsql {
258 SELECT t1.x FROM t2, t1
drhc4a3c772001-04-04 11:48:57 +0000259 WHERE t2.y==256 AND t1.rowid==t2.rowid
drh487ab3c2001-11-08 00:45:21 +0000260 }] $sqlite_search_count
261} {4 3}
drhc4a3c772001-04-04 11:48:57 +0000262do_test rowid-4.5.1 {
drh487ab3c2001-11-08 00:45:21 +0000263 set sqlite_search_count 0
264 concat [execsql {
265 SELECT t1.x FROM t2, t1
drhc4a3c772001-04-04 11:48:57 +0000266 WHERE t1.OID==t2.rowid AND t2.y==81
drh487ab3c2001-11-08 00:45:21 +0000267 }] $sqlite_search_count
268} {3 3}
drhc4a3c772001-04-04 11:48:57 +0000269do_test rowid-4.6 {
270 execsql {
271 SELECT t1.x FROM t1, t2
272 WHERE t2.y==256 AND t1.rowid==t2.rowid
273 }
274} {4}
275
276do_test rowid-5.1 {
277 execsql {DELETE FROM t1 WHERE _rowid_ IN (SELECT oid FROM t1 WHERE x>8)}
278 execsql {SELECT max(x) FROM t1}
279} {8}
drh3543b3e2001-09-15 00:57:59 +0000280
drhc6b52df2002-01-04 03:09:29 +0000281# Make sure a "WHERE rowid=X" clause works when there is no ROWID of X.
282#
283do_test rowid-6.1 {
284 execsql {
285 SELECT x FROM t1
286 }
287} {1 2 3 4 5 6 7 8}
288do_test rowid-6.2 {
drh5cf8e8c2002-02-19 22:42:05 +0000289 for {set ::norow 1} {1} {incr ::norow} {
290 if {[execsql "SELECT x FROM t1 WHERE rowid=$::norow"]==""} break
291 }
drhc6b52df2002-01-04 03:09:29 +0000292 execsql [subst {
293 DELETE FROM t1 WHERE rowid=$::norow
294 }]
295} {}
296do_test rowid-6.3 {
297 execsql {
298 SELECT x FROM t1
299 }
300} {1 2 3 4 5 6 7 8}
301
drh5cf8e8c2002-02-19 22:42:05 +0000302# Beginning with version 2.3.4, SQLite computes rowids of new rows by
303# finding the maximum current rowid and adding one. It falls back to
304# the old random algorithm if the maximum rowid is the largest integer.
305# The following tests are for this new behavior.
306#
307do_test rowid-7.0 {
308 execsql {
309 DELETE FROM t1;
310 DROP TABLE t2;
311 DROP INDEX idxt1;
312 INSERT INTO t1 VALUES(1,2);
313 SELECT rowid, * FROM t1;
314 }
315} {1 1 2}
316do_test rowid-7.1 {
317 execsql {
318 INSERT INTO t1 VALUES(99,100);
319 SELECT rowid,* FROM t1
320 }
321} {1 1 2 2 99 100}
322do_test rowid-7.2 {
323 execsql {
324 CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
325 INSERT INTO t2(b) VALUES(55);
326 SELECT * FROM t2;
327 }
328} {1 55}
329do_test rowid-7.3 {
330 execsql {
331 INSERT INTO t2(b) VALUES(66);
332 SELECT * FROM t2;
333 }
334} {1 55 2 66}
335do_test rowid-7.4 {
336 execsql {
337 INSERT INTO t2(a,b) VALUES(1000000,77);
338 INSERT INTO t2(b) VALUES(88);
339 SELECT * FROM t2;
340 }
341} {1 55 2 66 1000000 77 1000001 88}
342do_test rowid-7.5 {
343 execsql {
344 INSERT INTO t2(a,b) VALUES(2147483647,99);
345 INSERT INTO t2(b) VALUES(11);
346 SELECT b FROM t2 ORDER BY b;
347 }
348} {11 55 66 77 88 99}
349do_test rowid-7.6 {
350 execsql {
351 SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647);
352 }
353} {11}
354do_test rowid-7.7 {
355 execsql {
356 INSERT INTO t2(b) VALUES(22);
357 INSERT INTO t2(b) VALUES(33);
358 INSERT INTO t2(b) VALUES(44);
359 INSERT INTO t2(b) VALUES(55);
360 SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647) ORDER BY b;
361 }
362} {11 22 33 44 55}
363do_test rowid-7.8 {
364 execsql {
365 DELETE FROM t2 WHERE a!=2;
366 INSERT INTO t2(b) VALUES(111);
367 SELECT * FROM t2;
368 }
369} {2 66 3 111}
drhc6b52df2002-01-04 03:09:29 +0000370
drh798da522004-11-04 04:42:28 +0000371ifcapable {trigger} {
drh49449832003-04-15 14:01:43 +0000372# Make sure AFTER triggers that do INSERTs do not change the last_insert_rowid.
373# Ticket #290
374#
375do_test rowid-8.1 {
376 execsql {
377 CREATE TABLE t3(a integer primary key);
378 CREATE TABLE t4(x);
379 INSERT INTO t4 VALUES(1);
380 CREATE TRIGGER r3 AFTER INSERT on t3 FOR EACH ROW BEGIN
381 INSERT INTO t4 VALUES(NEW.a+10);
382 END;
383 SELECT * FROM t3;
384 }
385} {}
386do_test rowid-8.2 {
387 execsql {
388 SELECT rowid, * FROM t4;
389 }
390} {1 1}
391do_test rowid-8.3 {
392 execsql {
393 INSERT INTO t3 VALUES(123);
394 SELECT last_insert_rowid();
395 }
396} {123}
397do_test rowid-8.4 {
398 execsql {
399 SELECT * FROM t3;
400 }
401} {123}
402do_test rowid-8.5 {
403 execsql {
404 SELECT rowid, * FROM t4;
405 }
406} {1 1 2 133}
407do_test rowid-8.6 {
408 execsql {
409 INSERT INTO t3 VALUES(NULL);
410 SELECT last_insert_rowid();
411 }
412} {124}
413do_test rowid-8.7 {
414 execsql {
415 SELECT * FROM t3;
416 }
417} {123 124}
418do_test rowid-8.8 {
419 execsql {
420 SELECT rowid, * FROM t4;
421 }
drh70ce3f02003-04-15 19:22:22 +0000422} {1 1 2 133 3 134}
drh798da522004-11-04 04:42:28 +0000423} ;# endif trigger
424
425# If triggers are not enable, simulate their effect for the tests that
426# follow.
427ifcapable {!trigger} {
428 execsql {
429 CREATE TABLE t3(a integer primary key);
430 INSERT INTO t3 VALUES(123);
431 INSERT INTO t3 VALUES(124);
432 }
433}
drh49449832003-04-15 14:01:43 +0000434
drh1dd59e02003-07-06 17:22:25 +0000435# ticket #377: Comparison between integer primiary key and floating point
436# values.
437#
438do_test rowid-9.1 {
439 execsql {
440 SELECT * FROM t3 WHERE a<123.5
441 }
442} {123}
443do_test rowid-9.2 {
444 execsql {
445 SELECT * FROM t3 WHERE a<124.5
446 }
447} {123 124}
448do_test rowid-9.3 {
449 execsql {
450 SELECT * FROM t3 WHERE a>123.5
451 }
452} {124}
453do_test rowid-9.4 {
454 execsql {
455 SELECT * FROM t3 WHERE a>122.5
456 }
457} {123 124}
458do_test rowid-9.5 {
459 execsql {
460 SELECT * FROM t3 WHERE a==123.5
461 }
462} {}
463do_test rowid-9.6 {
464 execsql {
465 SELECT * FROM t3 WHERE a==123.000
466 }
467} {123}
468do_test rowid-9.7 {
469 execsql {
470 SELECT * FROM t3 WHERE a>100.5 AND a<200.5
471 }
472} {123 124}
473do_test rowid-9.8 {
474 execsql {
475 SELECT * FROM t3 WHERE a>'xyz';
476 }
477} {}
478do_test rowid-9.9 {
479 execsql {
480 SELECT * FROM t3 WHERE a<'xyz';
481 }
482} {123 124}
483do_test rowid-9.10 {
484 execsql {
485 SELECT * FROM t3 WHERE a>=122.9 AND a<=123.1
486 }
487} {123}
488
drh751f4122004-01-14 21:59:22 +0000489# Ticket #567. Comparisons of ROWID or integery primary key against
490# floating point numbers still do not always work.
491#
492do_test rowid-10.1 {
493 execsql {
494 CREATE TABLE t5(a);
495 INSERT INTO t5 VALUES(1);
496 INSERT INTO t5 VALUES(2);
497 INSERT INTO t5 SELECT a+2 FROM t5;
498 INSERT INTO t5 SELECT a+4 FROM t5;
499 SELECT rowid, * FROM t5;
500 }
501} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
502do_test rowid-10.2 {
503 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5}
504} {6 6 7 7 8 8}
505do_test rowid-10.3 {
506 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0}
507} {5 5 6 6 7 7 8 8}
508do_test rowid-10.4 {
509 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5}
510} {6 6 7 7 8 8}
511do_test rowid-10.3.2 {
512 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0}
513} {6 6 7 7 8 8}
514do_test rowid-10.5 {
515 execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid}
516} {6 6 7 7 8 8}
517do_test rowid-10.6 {
518 execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid}
519} {6 6 7 7 8 8}
520do_test rowid-10.7 {
521 execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5}
522} {1 1 2 2 3 3 4 4 5 5}
523do_test rowid-10.8 {
524 execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5}
525} {1 1 2 2 3 3 4 4 5 5}
526do_test rowid-10.9 {
527 execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid}
528} {1 1 2 2 3 3 4 4 5 5}
529do_test rowid-10.10 {
530 execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid}
531} {1 1 2 2 3 3 4 4 5 5}
532do_test rowid-10.11 {
533 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5 ORDER BY rowid DESC}
534} {8 8 7 7 6 6}
535do_test rowid-10.11.2 {
536 execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0 ORDER BY rowid DESC}
537} {8 8 7 7 6 6 5 5}
538do_test rowid-10.12 {
539 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5 ORDER BY rowid DESC}
540} {8 8 7 7 6 6}
541do_test rowid-10.12.2 {
542 execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0 ORDER BY rowid DESC}
543} {8 8 7 7 6 6}
544do_test rowid-10.13 {
545 execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid ORDER BY rowid DESC}
546} {8 8 7 7 6 6}
547do_test rowid-10.14 {
548 execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid ORDER BY rowid DESC}
549} {8 8 7 7 6 6}
550do_test rowid-10.15 {
551 execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5 ORDER BY rowid DESC}
552} {5 5 4 4 3 3 2 2 1 1}
553do_test rowid-10.16 {
554 execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5 ORDER BY rowid DESC}
555} {5 5 4 4 3 3 2 2 1 1}
556do_test rowid-10.17 {
557 execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid ORDER BY rowid DESC}
558} {5 5 4 4 3 3 2 2 1 1}
559do_test rowid-10.18 {
560 execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid ORDER BY rowid DESC}
561} {5 5 4 4 3 3 2 2 1 1}
562
563do_test rowid-10.30 {
564 execsql {
565 CREATE TABLE t6(a);
566 INSERT INTO t6(rowid,a) SELECT -a,a FROM t5;
567 SELECT rowid, * FROM t6;
568 }
569} {-8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1}
570do_test rowid-10.31.1 {
571 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5}
572} {-5 5 -4 4 -3 3 -2 2 -1 1}
573do_test rowid-10.31.2 {
574 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0}
575} {-5 5 -4 4 -3 3 -2 2 -1 1}
576do_test rowid-10.32.1 {
577 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5 ORDER BY rowid DESC}
578} {-1 1 -2 2 -3 3 -4 4 -5 5}
579do_test rowid-10.32.1 {
580 execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0 ORDER BY rowid DESC}
581} {-1 1 -2 2 -3 3 -4 4 -5 5}
582do_test rowid-10.33 {
583 execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid}
584} {-5 5 -4 4 -3 3 -2 2 -1 1}
585do_test rowid-10.34 {
586 execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid ORDER BY rowid DESC}
587} {-1 1 -2 2 -3 3 -4 4 -5 5}
588do_test rowid-10.35.1 {
589 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5}
590} {-5 5 -4 4 -3 3 -2 2 -1 1}
591do_test rowid-10.35.2 {
592 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0}
593} {-4 4 -3 3 -2 2 -1 1}
594do_test rowid-10.36.1 {
595 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5 ORDER BY rowid DESC}
596} {-1 1 -2 2 -3 3 -4 4 -5 5}
597do_test rowid-10.36.2 {
598 execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0 ORDER BY rowid DESC}
599} {-1 1 -2 2 -3 3 -4 4}
600do_test rowid-10.37 {
601 execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid}
602} {-5 5 -4 4 -3 3 -2 2 -1 1}
603do_test rowid-10.38 {
604 execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid ORDER BY rowid DESC}
605} {-1 1 -2 2 -3 3 -4 4 -5 5}
606do_test rowid-10.39 {
607 execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5}
608} {-8 8 -7 7 -6 6}
609do_test rowid-10.40 {
610 execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5 ORDER BY rowid DESC}
611} {-6 6 -7 7 -8 8}
612do_test rowid-10.41 {
613 execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid}
614} {-8 8 -7 7 -6 6}
615do_test rowid-10.42 {
616 execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid ORDER BY rowid DESC}
617} {-6 6 -7 7 -8 8}
618do_test rowid-10.43 {
619 execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5}
620} {-8 8 -7 7 -6 6}
621do_test rowid-10.44 {
622 execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5 ORDER BY rowid DESC}
623} {-6 6 -7 7 -8 8}
624do_test rowid-10.44 {
625 execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid}
626} {-8 8 -7 7 -6 6}
627do_test rowid-10.46 {
628 execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid ORDER BY rowid DESC}
629} {-6 6 -7 7 -8 8}
630
631# Comparison of rowid against string values.
632#
633do_test rowid-11.1 {
634 execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc'}
635} {}
636do_test rowid-11.2 {
637 execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc'}
638} {}
639do_test rowid-11.3 {
640 execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc'}
641} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
642do_test rowid-11.4 {
643 execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc'}
644} {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
645
drh6a179ea2004-06-27 21:31:39 +0000646# Test the automatic generation of rowids when the table already contains
647# a rowid with the maximum value.
648#
649do_test rowid-12.1 {
650 execsql {
651 CREATE TABLE t7(x INTEGER PRIMARY KEY, y);
652 INSERT INTO t7 VALUES(9223372036854775807,'a');
653 SELECT y FROM t7;
654 }
655} {a}
656do_test rowid-12.2 {
657 execsql {
658 INSERT INTO t7 VALUES(NULL,'b');
659 SELECT y FROM t7;
660 }
661} {b a}
drh49449832003-04-15 14:01:43 +0000662
drh3543b3e2001-09-15 00:57:59 +0000663finish_test