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