rowid.test 19 KB

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