persistentstorage/sqlite3api/TEST/TclScript/rowid.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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 # $Id: rowid.test,v 1.20 2008/01/19 20:11:26 drh Exp $
       
    16 
       
    17 set testdir [file dirname $argv0]
       
    18 source $testdir/tester.tcl
       
    19 
       
    20 # Basic ROWID functionality tests.
       
    21 #
       
    22 do_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}
       
    30 do_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}
       
    39 do_test rowid-1.3 {
       
    40   global x2rowid
       
    41   set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(1)"
       
    42   execsql $sql
       
    43 } {1}
       
    44 do_test rowid-1.4 {
       
    45   global x2rowid
       
    46   set sql "SELECT x FROM t1 WHERE rowid==$x2rowid(3)"
       
    47   execsql $sql
       
    48 } {3}
       
    49 do_test rowid-1.5 {
       
    50   global x2rowid
       
    51   set sql "SELECT x FROM t1 WHERE oid==$x2rowid(1)"
       
    52   execsql $sql
       
    53 } {1}
       
    54 do_test rowid-1.6 {
       
    55   global x2rowid
       
    56   set sql "SELECT x FROM t1 WHERE OID==$x2rowid(3)"
       
    57   execsql $sql
       
    58 } {3}
       
    59 do_test rowid-1.7 {
       
    60   global x2rowid
       
    61   set sql "SELECT x FROM t1 WHERE _rowid_==$x2rowid(1)"
       
    62   execsql $sql
       
    63 } {1}
       
    64 do_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 } {}
       
    71 do_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}
       
    77 do_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}
       
    83 do_test rowid-1.10 {
       
    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 
       
    90 # We can insert or update the ROWID column.
       
    91 #
       
    92 do_test rowid-2.1 {
       
    93   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}}
       
    98 do_test rowid-2.2 {
       
    99   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}}
       
   104 do_test rowid-2.3 {
       
   105   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}}
       
   110 do_test rowid-2.4 {
       
   111   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}}
       
   116 do_test rowid-2.5 {
       
   117   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}}
       
   122 do_test rowid-2.6 {
       
   123   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}}
       
   128 
       
   129 # But we can use ROWID in the WHERE clause of an UPDATE that does not
       
   130 # change the ROWID.
       
   131 #
       
   132 do_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}
       
   137 } {1 2 5 7 9}
       
   138 do_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}
       
   143 } {1 3 5 7 9}
       
   144 
       
   145 # We cannot index by ROWID
       
   146 #
       
   147 do_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}}
       
   151 do_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_}}
       
   155 do_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}}
       
   159 do_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 #
       
   167 do_test rowid-3.1 {
       
   168   execsql {
       
   169     CREATE TABLE t2(rowid int, x int, y int);
       
   170     INSERT INTO t2 VALUES(0,2,3);
       
   171     INSERT INTO t2 VALUES(4,5,6);
       
   172     INSERT INTO t2 VALUES(7,8,9);
       
   173     SELECT * FROM t2 ORDER BY x;
       
   174   }
       
   175 } {0 2 3 4 5 6 7 8 9}
       
   176 do_test rowid-3.2 {
       
   177   execsql {SELECT * FROM t2 ORDER BY rowid}
       
   178 } {0 2 3 4 5 6 7 8 9}
       
   179 do_test rowid-3.3 {
       
   180   execsql {SELECT rowid, x, y FROM t2 ORDER BY rowid}
       
   181 } {0 2 3 4 5 6 7 8 9}
       
   182 do_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}
       
   189 # sqlite3 v3 - do_probtest doesn't exist anymore?
       
   190 if 0 {
       
   191 do_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}
       
   196 }
       
   197 
       
   198 # Let's try some more complex examples, including some joins.
       
   199 #
       
   200 do_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}
       
   211 do_test rowid-4.2 {
       
   212   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid}
       
   213 } {256}
       
   214 do_test rowid-4.2.1 {
       
   215   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.oid==t2.rowid}
       
   216 } {256}
       
   217 do_test rowid-4.2.2 {
       
   218   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
       
   219 } {256}
       
   220 do_test rowid-4.2.3 {
       
   221   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t2.rowid==t1.rowid}
       
   222 } {256}
       
   223 do_test rowid-4.2.4 {
       
   224   execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND t1.x==4}
       
   225 } {256}
       
   226 do_test rowid-4.2.5 {
       
   227   execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
       
   228 } {256}
       
   229 do_test rowid-4.2.6 {
       
   230   execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t2.rowid==t1.rowid}
       
   231 } {256}
       
   232 do_test rowid-4.2.7 {
       
   233   execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND t1.x==4}
       
   234 } {256}
       
   235 do_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}
       
   239 do_test rowid-4.3.1 {
       
   240   execsql {SELECT t2.y FROM t1, t2 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
       
   241 } {256}
       
   242 do_test rowid-4.3.2 {
       
   243   execsql {SELECT t2.y FROM t1, t2 WHERE t2.rowid==t1.oid AND 4==t1.x}
       
   244 } {256}
       
   245 do_test rowid-4.4 {
       
   246   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1.rowid==t2.rowid}
       
   247 } {256}
       
   248 do_test rowid-4.4.1 {
       
   249   execsql {SELECT t2.y FROM t2, t1 WHERE t1.x==4 AND t1._rowid_==t2.rowid}
       
   250 } {256}
       
   251 do_test rowid-4.4.2 {
       
   252   execsql {SELECT t2.y FROM t2, t1 WHERE t2.rowid==t1.oid AND 4==t1.x}
       
   253 } {256}
       
   254 do_test rowid-4.5 {
       
   255   execsql {CREATE INDEX idxt2 ON t2(y)}
       
   256   set sqlite_search_count 0
       
   257   concat [execsql {
       
   258     SELECT t1.x FROM t2, t1 
       
   259     WHERE t2.y==256 AND t1.rowid==t2.rowid
       
   260   }] $sqlite_search_count
       
   261 } {4 3}
       
   262 do_test rowid-4.5.1 {
       
   263   set sqlite_search_count 0
       
   264   concat [execsql {
       
   265     SELECT t1.x FROM t2, t1 
       
   266     WHERE t1.OID==t2.rowid AND t2.y==81
       
   267   }] $sqlite_search_count
       
   268 } {3 3}
       
   269 do_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 
       
   276 do_test rowid-5.1.1 {
       
   277   ifcapable subquery {
       
   278     execsql {DELETE FROM t1 WHERE _rowid_ IN (SELECT oid FROM t1 WHERE x>8)}
       
   279   } else {
       
   280     set oids [execsql {SELECT oid FROM t1 WHERE x>8}]
       
   281     set where "_rowid_ = [join $oids { OR _rowid_ = }]"
       
   282     execsql "DELETE FROM t1 WHERE $where"
       
   283   }
       
   284 } {}
       
   285 do_test rowid-5.1.2 {
       
   286   execsql {SELECT max(x) FROM t1}
       
   287 } {8}
       
   288 
       
   289 # Make sure a "WHERE rowid=X" clause works when there is no ROWID of X.
       
   290 #
       
   291 do_test rowid-6.1 {
       
   292   execsql {
       
   293     SELECT x FROM t1
       
   294   }
       
   295 } {1 2 3 4 5 6 7 8}
       
   296 do_test rowid-6.2 {
       
   297   for {set ::norow 1} {1} {incr ::norow} {
       
   298     if {[execsql "SELECT x FROM t1 WHERE rowid=$::norow"]==""}  break
       
   299   }
       
   300   execsql [subst {
       
   301     DELETE FROM t1 WHERE rowid=$::norow
       
   302   }]
       
   303 } {}
       
   304 do_test rowid-6.3 {
       
   305   execsql {
       
   306     SELECT x FROM t1
       
   307   }
       
   308 } {1 2 3 4 5 6 7 8}
       
   309 
       
   310 # Beginning with version 2.3.4, SQLite computes rowids of new rows by
       
   311 # finding the maximum current rowid and adding one.  It falls back to
       
   312 # the old random algorithm if the maximum rowid is the largest integer.
       
   313 # The following tests are for this new behavior.
       
   314 #
       
   315 do_test rowid-7.0 {
       
   316   execsql {
       
   317     DELETE FROM t1;
       
   318     DROP TABLE t2;
       
   319     DROP INDEX idxt1;
       
   320     INSERT INTO t1 VALUES(1,2);
       
   321     SELECT rowid, * FROM t1;
       
   322   }
       
   323 } {1 1 2}
       
   324 do_test rowid-7.1 {
       
   325   execsql {
       
   326     INSERT INTO t1 VALUES(99,100);
       
   327     SELECT rowid,* FROM t1
       
   328   }
       
   329 } {1 1 2 2 99 100}
       
   330 do_test rowid-7.2 {
       
   331   execsql {
       
   332     CREATE TABLE t2(a INTEGER PRIMARY KEY, b);
       
   333     INSERT INTO t2(b) VALUES(55);
       
   334     SELECT * FROM t2;
       
   335   }
       
   336 } {1 55}
       
   337 do_test rowid-7.3 {
       
   338   execsql {
       
   339     INSERT INTO t2(b) VALUES(66);
       
   340     SELECT * FROM t2;
       
   341   }
       
   342 } {1 55 2 66}
       
   343 do_test rowid-7.4 {
       
   344   execsql {
       
   345     INSERT INTO t2(a,b) VALUES(1000000,77);
       
   346     INSERT INTO t2(b) VALUES(88);
       
   347     SELECT * FROM t2;
       
   348   }
       
   349 } {1 55 2 66 1000000 77 1000001 88}
       
   350 do_test rowid-7.5 {
       
   351   execsql {
       
   352     INSERT INTO t2(a,b) VALUES(2147483647,99);
       
   353     INSERT INTO t2(b) VALUES(11);
       
   354     SELECT b FROM t2 ORDER BY b;
       
   355   }
       
   356 } {11 55 66 77 88 99}
       
   357 ifcapable subquery {
       
   358   do_test rowid-7.6 {
       
   359     execsql {
       
   360       SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647);
       
   361     }
       
   362   } {11}
       
   363   do_test rowid-7.7 {
       
   364     execsql {
       
   365       INSERT INTO t2(b) VALUES(22);
       
   366       INSERT INTO t2(b) VALUES(33);
       
   367       INSERT INTO t2(b) VALUES(44);
       
   368       INSERT INTO t2(b) VALUES(55);
       
   369       SELECT b FROM t2 WHERE a NOT IN(1,2,1000000,1000001,2147483647) 
       
   370           ORDER BY b;
       
   371     }
       
   372   } {11 22 33 44 55}
       
   373 }
       
   374 do_test rowid-7.8 {
       
   375   execsql {
       
   376     DELETE FROM t2 WHERE a!=2;
       
   377     INSERT INTO t2(b) VALUES(111);
       
   378     SELECT * FROM t2;
       
   379   }
       
   380 } {2 66 3 111}
       
   381 
       
   382 ifcapable {trigger} {
       
   383 # Make sure AFTER triggers that do INSERTs do not change the last_insert_rowid.
       
   384 # Ticket #290
       
   385 #
       
   386 do_test rowid-8.1 {
       
   387   execsql {
       
   388     CREATE TABLE t3(a integer primary key);
       
   389     CREATE TABLE t4(x);
       
   390     INSERT INTO t4 VALUES(1);
       
   391     CREATE TRIGGER r3 AFTER INSERT on t3 FOR EACH ROW BEGIN
       
   392       INSERT INTO t4 VALUES(NEW.a+10);
       
   393     END;
       
   394     SELECT * FROM t3;
       
   395   }
       
   396 } {}
       
   397 do_test rowid-8.2 {
       
   398   execsql {
       
   399     SELECT rowid, * FROM t4;
       
   400   }
       
   401 } {1 1}
       
   402 do_test rowid-8.3 {
       
   403   execsql {
       
   404     INSERT INTO t3 VALUES(123);
       
   405     SELECT last_insert_rowid();
       
   406   }
       
   407 } {123}
       
   408 do_test rowid-8.4 {
       
   409   execsql {
       
   410     SELECT * FROM t3;
       
   411   }
       
   412 } {123}
       
   413 do_test rowid-8.5 {
       
   414   execsql {
       
   415     SELECT rowid, * FROM t4;
       
   416   }
       
   417 } {1 1 2 133}
       
   418 do_test rowid-8.6 {
       
   419   execsql {
       
   420     INSERT INTO t3 VALUES(NULL);
       
   421     SELECT last_insert_rowid();
       
   422   }
       
   423 } {124}
       
   424 do_test rowid-8.7 {
       
   425   execsql {
       
   426     SELECT * FROM t3;
       
   427   }
       
   428 } {123 124}
       
   429 do_test rowid-8.8 {
       
   430   execsql {
       
   431     SELECT rowid, * FROM t4;
       
   432   }
       
   433 } {1 1 2 133 3 134}
       
   434 } ;# endif trigger
       
   435 
       
   436 # If triggers are not enable, simulate their effect for the tests that
       
   437 # follow.
       
   438 ifcapable {!trigger} {
       
   439   execsql {
       
   440     CREATE TABLE t3(a integer primary key);
       
   441     INSERT INTO t3 VALUES(123);
       
   442     INSERT INTO t3 VALUES(124);
       
   443   }
       
   444 }
       
   445 
       
   446 # ticket #377: Comparison between integer primiary key and floating point
       
   447 # values.
       
   448 #
       
   449 do_test rowid-9.1 {
       
   450   execsql {
       
   451     SELECT * FROM t3 WHERE a<123.5
       
   452   }
       
   453 } {123}
       
   454 do_test rowid-9.2 {
       
   455   execsql {
       
   456     SELECT * FROM t3 WHERE a<124.5
       
   457   }
       
   458 } {123 124}
       
   459 do_test rowid-9.3 {
       
   460   execsql {
       
   461     SELECT * FROM t3 WHERE a>123.5
       
   462   }
       
   463 } {124}
       
   464 do_test rowid-9.4 {
       
   465   execsql {
       
   466     SELECT * FROM t3 WHERE a>122.5
       
   467   }
       
   468 } {123 124}
       
   469 do_test rowid-9.5 {
       
   470   execsql {
       
   471     SELECT * FROM t3 WHERE a==123.5
       
   472   }
       
   473 } {}
       
   474 do_test rowid-9.6 {
       
   475   execsql {
       
   476     SELECT * FROM t3 WHERE a==123.000
       
   477   }
       
   478 } {123}
       
   479 do_test rowid-9.7 {
       
   480   execsql {
       
   481     SELECT * FROM t3 WHERE a>100.5 AND a<200.5
       
   482   }
       
   483 } {123 124}
       
   484 do_test rowid-9.8 {
       
   485   execsql {
       
   486     SELECT * FROM t3 WHERE a>'xyz';
       
   487   }
       
   488 } {}
       
   489 do_test rowid-9.9 {
       
   490   execsql {
       
   491     SELECT * FROM t3 WHERE a<'xyz';
       
   492   }
       
   493 } {123 124}
       
   494 do_test rowid-9.10 {
       
   495   execsql {
       
   496     SELECT * FROM t3 WHERE a>=122.9 AND a<=123.1
       
   497   }
       
   498 } {123}
       
   499 
       
   500 # Ticket #567.  Comparisons of ROWID or integery primary key against
       
   501 # floating point numbers still do not always work.
       
   502 #
       
   503 do_test rowid-10.1 {
       
   504   execsql {
       
   505     CREATE TABLE t5(a);
       
   506     INSERT INTO t5 VALUES(1);
       
   507     INSERT INTO t5 VALUES(2);
       
   508     INSERT INTO t5 SELECT a+2 FROM t5;
       
   509     INSERT INTO t5 SELECT a+4 FROM t5;
       
   510     SELECT rowid, * FROM t5;
       
   511   }
       
   512 } {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
       
   513 do_test rowid-10.2 {
       
   514   execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5}
       
   515 } {6 6 7 7 8 8}
       
   516 do_test rowid-10.3 {
       
   517   execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0}
       
   518 } {5 5 6 6 7 7 8 8}
       
   519 do_test rowid-10.4 {
       
   520   execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5}
       
   521 } {6 6 7 7 8 8}
       
   522 do_test rowid-10.3.2 {
       
   523   execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0}
       
   524 } {6 6 7 7 8 8}
       
   525 do_test rowid-10.5 {
       
   526   execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid}
       
   527 } {6 6 7 7 8 8}
       
   528 do_test rowid-10.6 {
       
   529   execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid}
       
   530 } {6 6 7 7 8 8}
       
   531 do_test rowid-10.7 {
       
   532   execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5}
       
   533 } {1 1 2 2 3 3 4 4 5 5}
       
   534 do_test rowid-10.8 {
       
   535   execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5}
       
   536 } {1 1 2 2 3 3 4 4 5 5}
       
   537 do_test rowid-10.9 {
       
   538   execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid}
       
   539 } {1 1 2 2 3 3 4 4 5 5}
       
   540 do_test rowid-10.10 {
       
   541   execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid}
       
   542 } {1 1 2 2 3 3 4 4 5 5}
       
   543 do_test rowid-10.11 {
       
   544   execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.5 ORDER BY rowid DESC}
       
   545 } {8 8 7 7 6 6}
       
   546 do_test rowid-10.11.2 {
       
   547   execsql {SELECT rowid, a FROM t5 WHERE rowid>=5.0 ORDER BY rowid DESC}
       
   548 } {8 8 7 7 6 6 5 5}
       
   549 do_test rowid-10.12 {
       
   550   execsql {SELECT rowid, a FROM t5 WHERE rowid>5.5 ORDER BY rowid DESC}
       
   551 } {8 8 7 7 6 6}
       
   552 do_test rowid-10.12.2 {
       
   553   execsql {SELECT rowid, a FROM t5 WHERE rowid>5.0 ORDER BY rowid DESC}
       
   554 } {8 8 7 7 6 6}
       
   555 do_test rowid-10.13 {
       
   556   execsql {SELECT rowid, a FROM t5 WHERE 5.5<=rowid ORDER BY rowid DESC}
       
   557 } {8 8 7 7 6 6}
       
   558 do_test rowid-10.14 {
       
   559   execsql {SELECT rowid, a FROM t5 WHERE 5.5<rowid ORDER BY rowid DESC}
       
   560 } {8 8 7 7 6 6}
       
   561 do_test rowid-10.15 {
       
   562   execsql {SELECT rowid, a FROM t5 WHERE rowid<=5.5 ORDER BY rowid DESC}
       
   563 } {5 5 4 4 3 3 2 2 1 1}
       
   564 do_test rowid-10.16 {
       
   565   execsql {SELECT rowid, a FROM t5 WHERE rowid<5.5 ORDER BY rowid DESC}
       
   566 } {5 5 4 4 3 3 2 2 1 1}
       
   567 do_test rowid-10.17 {
       
   568   execsql {SELECT rowid, a FROM t5 WHERE 5.5>=rowid ORDER BY rowid DESC}
       
   569 } {5 5 4 4 3 3 2 2 1 1}
       
   570 do_test rowid-10.18 {
       
   571   execsql {SELECT rowid, a FROM t5 WHERE 5.5>rowid ORDER BY rowid DESC}
       
   572 } {5 5 4 4 3 3 2 2 1 1}
       
   573 
       
   574 do_test rowid-10.30 {
       
   575   execsql {
       
   576     CREATE TABLE t6(a);
       
   577     INSERT INTO t6(rowid,a) SELECT -a,a FROM t5;
       
   578     SELECT rowid, * FROM t6;
       
   579   }
       
   580 } {-8 8 -7 7 -6 6 -5 5 -4 4 -3 3 -2 2 -1 1}
       
   581 do_test rowid-10.31.1 {
       
   582   execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5}
       
   583 } {-5 5 -4 4 -3 3 -2 2 -1 1}
       
   584 do_test rowid-10.31.2 {
       
   585   execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0}
       
   586 } {-5 5 -4 4 -3 3 -2 2 -1 1}
       
   587 do_test rowid-10.32.1 {
       
   588   execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.5 ORDER BY rowid DESC}
       
   589 } {-1 1 -2 2 -3 3 -4 4 -5 5}
       
   590 do_test rowid-10.32.1 {
       
   591   execsql {SELECT rowid, a FROM t6 WHERE rowid>=-5.0 ORDER BY rowid DESC}
       
   592 } {-1 1 -2 2 -3 3 -4 4 -5 5}
       
   593 do_test rowid-10.33 {
       
   594   execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid}
       
   595 } {-5 5 -4 4 -3 3 -2 2 -1 1}
       
   596 do_test rowid-10.34 {
       
   597   execsql {SELECT rowid, a FROM t6 WHERE -5.5<=rowid ORDER BY rowid DESC}
       
   598 } {-1 1 -2 2 -3 3 -4 4 -5 5}
       
   599 do_test rowid-10.35.1 {
       
   600   execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5}
       
   601 } {-5 5 -4 4 -3 3 -2 2 -1 1}
       
   602 do_test rowid-10.35.2 {
       
   603   execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0}
       
   604 } {-4 4 -3 3 -2 2 -1 1}
       
   605 do_test rowid-10.36.1 {
       
   606   execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.5 ORDER BY rowid DESC}
       
   607 } {-1 1 -2 2 -3 3 -4 4 -5 5}
       
   608 do_test rowid-10.36.2 {
       
   609   execsql {SELECT rowid, a FROM t6 WHERE rowid>-5.0 ORDER BY rowid DESC}
       
   610 } {-1 1 -2 2 -3 3 -4 4}
       
   611 do_test rowid-10.37 {
       
   612   execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid}
       
   613 } {-5 5 -4 4 -3 3 -2 2 -1 1}
       
   614 do_test rowid-10.38 {
       
   615   execsql {SELECT rowid, a FROM t6 WHERE -5.5<rowid ORDER BY rowid DESC}
       
   616 } {-1 1 -2 2 -3 3 -4 4 -5 5}
       
   617 do_test rowid-10.39 {
       
   618   execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5}
       
   619 } {-8 8 -7 7 -6 6}
       
   620 do_test rowid-10.40 {
       
   621   execsql {SELECT rowid, a FROM t6 WHERE rowid<=-5.5 ORDER BY rowid DESC}
       
   622 } {-6 6 -7 7 -8 8}
       
   623 do_test rowid-10.41 {
       
   624   execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid}
       
   625 } {-8 8 -7 7 -6 6}
       
   626 do_test rowid-10.42 {
       
   627   execsql {SELECT rowid, a FROM t6 WHERE -5.5>=rowid ORDER BY rowid DESC}
       
   628 } {-6 6 -7 7 -8 8}
       
   629 do_test rowid-10.43 {
       
   630   execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5}
       
   631 } {-8 8 -7 7 -6 6}
       
   632 do_test rowid-10.44 {
       
   633   execsql {SELECT rowid, a FROM t6 WHERE rowid<-5.5 ORDER BY rowid DESC}
       
   634 } {-6 6 -7 7 -8 8}
       
   635 do_test rowid-10.44 {
       
   636   execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid}
       
   637 } {-8 8 -7 7 -6 6}
       
   638 do_test rowid-10.46 {
       
   639   execsql {SELECT rowid, a FROM t6 WHERE -5.5>rowid ORDER BY rowid DESC}
       
   640 } {-6 6 -7 7 -8 8}
       
   641 
       
   642 # Comparison of rowid against string values.
       
   643 #
       
   644 do_test rowid-11.1 {
       
   645   execsql {SELECT rowid, a FROM t5 WHERE rowid>'abc'}
       
   646 } {}
       
   647 do_test rowid-11.2 {
       
   648   execsql {SELECT rowid, a FROM t5 WHERE rowid>='abc'}
       
   649 } {}
       
   650 do_test rowid-11.3 {
       
   651   execsql {SELECT rowid, a FROM t5 WHERE rowid<'abc'}
       
   652 } {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
       
   653 do_test rowid-11.4 {
       
   654   execsql {SELECT rowid, a FROM t5 WHERE rowid<='abc'}
       
   655 } {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8}
       
   656 
       
   657 # Test the automatic generation of rowids when the table already contains
       
   658 # a rowid with the maximum value.
       
   659 #
       
   660 # Once the the maximum rowid is taken, rowids are normally chosen at
       
   661 # random.  By by reseting the random number generator, we can cause
       
   662 # the rowid guessing loop to collide with prior rowids, and test the
       
   663 # loop out to its limit of 100 iterations.  After 100 collisions, the
       
   664 # rowid guesser gives up and reports SQLITE_FULL.
       
   665 #
       
   666 do_test rowid-12.1 {
       
   667   execsql {
       
   668     CREATE TABLE t7(x INTEGER PRIMARY KEY, y);
       
   669     INSERT INTO t7 VALUES(9223372036854775807,'a');
       
   670     SELECT y FROM t7;
       
   671   }
       
   672 } {a}
       
   673 do_test rowid-12.2 {
       
   674   db close
       
   675   sqlite3 db test.db
       
   676   save_prng_state
       
   677   execsql {
       
   678     INSERT INTO t7 VALUES(NULL,'b');
       
   679     SELECT x, y FROM t7;
       
   680   }
       
   681 } {1 b 9223372036854775807 a}
       
   682 execsql {INSERT INTO t7 VALUES(2,'y');}
       
   683 for {set i 1} {$i<=101} {incr i} {
       
   684   do_test rowid-12.3.$i {
       
   685     restore_prng_state
       
   686     execsql {
       
   687       INSERT INTO t7 VALUES(NULL,'x');
       
   688       INSERT OR IGNORE INTO t7 VALUES(last_insert_rowid()+1,'y');
       
   689       SELECT count(*) FROM t7 WHERE y=='x';
       
   690     }
       
   691   } $i
       
   692 }
       
   693 do_test rowid-12.4 {
       
   694   restore_prng_state
       
   695   catchsql {
       
   696     INSERT INTO t7 VALUES(NULL,'x');
       
   697   }
       
   698 } {1 {database or disk is full}}
       
   699 
       
   700 
       
   701 finish_test