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