xref: /titanic_52/usr/src/lib/libsqlite/test/misc3.test (revision c5c4113dfcabb1eed3d4bdf7609de5170027a794)
1*c5c4113dSnw141292
2*c5c4113dSnw141292#pragma ident	"%Z%%M%	%I%	%E% SMI"
3*c5c4113dSnw141292
4*c5c4113dSnw141292# 2003 December 17
5*c5c4113dSnw141292#
6*c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
7*c5c4113dSnw141292# a legal notice, here is a blessing:
8*c5c4113dSnw141292#
9*c5c4113dSnw141292#    May you do good and not evil.
10*c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
11*c5c4113dSnw141292#    May you share freely, never taking more than you give.
12*c5c4113dSnw141292#
13*c5c4113dSnw141292#***********************************************************************
14*c5c4113dSnw141292# This file implements regression tests for SQLite library.
15*c5c4113dSnw141292#
16*c5c4113dSnw141292# This file implements tests for miscellanous features that were
17*c5c4113dSnw141292# left out of other test files.
18*c5c4113dSnw141292#
19*c5c4113dSnw141292# $Id: misc3.test,v 1.10 2004/03/17 23:32:08 drh Exp $
20*c5c4113dSnw141292
21*c5c4113dSnw141292set testdir [file dirname $argv0]
22*c5c4113dSnw141292source $testdir/tester.tcl
23*c5c4113dSnw141292
24*c5c4113dSnw141292# Ticket #529.  Make sure an ABORT does not damage the in-memory cache
25*c5c4113dSnw141292# that will be used by subsequent statements in the same transaction.
26*c5c4113dSnw141292#
27*c5c4113dSnw141292do_test misc3-1.1 {
28*c5c4113dSnw141292  execsql {
29*c5c4113dSnw141292    CREATE TABLE t1(a UNIQUE,b);
30*c5c4113dSnw141292    INSERT INTO t1
31*c5c4113dSnw141292      VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
32*c5c4113dSnw141292    UPDATE t1 SET b=b||b;
33*c5c4113dSnw141292    UPDATE t1 SET b=b||b;
34*c5c4113dSnw141292    UPDATE t1 SET b=b||b;
35*c5c4113dSnw141292    UPDATE t1 SET b=b||b;
36*c5c4113dSnw141292    UPDATE t1 SET b=b||b;
37*c5c4113dSnw141292    INSERT INTO t1 VALUES(2,'x');
38*c5c4113dSnw141292    UPDATE t1 SET b=substr(b,1,500);
39*c5c4113dSnw141292    BEGIN;
40*c5c4113dSnw141292  }
41*c5c4113dSnw141292  catchsql {UPDATE t1 SET a=CASE a WHEN 2 THEN 1 ELSE a END, b='y';}
42*c5c4113dSnw141292  execsql {
43*c5c4113dSnw141292    CREATE TABLE t2(x,y);
44*c5c4113dSnw141292    COMMIT;
45*c5c4113dSnw141292    PRAGMA integrity_check;
46*c5c4113dSnw141292  }
47*c5c4113dSnw141292} ok
48*c5c4113dSnw141292do_test misc3-1.2 {
49*c5c4113dSnw141292  execsql {
50*c5c4113dSnw141292    DROP TABLE t1;
51*c5c4113dSnw141292    DROP TABLE t2;
52*c5c4113dSnw141292    VACUUM;
53*c5c4113dSnw141292    CREATE TABLE t1(a UNIQUE,b);
54*c5c4113dSnw141292    INSERT INTO t1
55*c5c4113dSnw141292       VALUES(1,'a23456789_b23456789_c23456789_d23456789_e23456789_');
56*c5c4113dSnw141292    INSERT INTO t1 SELECT a+1, b||b FROM t1;
57*c5c4113dSnw141292    INSERT INTO t1 SELECT a+2, b||b FROM t1;
58*c5c4113dSnw141292    INSERT INTO t1 SELECT a+4, b FROM t1;
59*c5c4113dSnw141292    INSERT INTO t1 SELECT a+8, b FROM t1;
60*c5c4113dSnw141292    INSERT INTO t1 SELECT a+16, b FROM t1;
61*c5c4113dSnw141292    INSERT INTO t1 SELECT a+32, b FROM t1;
62*c5c4113dSnw141292    INSERT INTO t1 SELECT a+64, b FROM t1;
63*c5c4113dSnw141292
64*c5c4113dSnw141292    BEGIN;
65*c5c4113dSnw141292  }
66*c5c4113dSnw141292  catchsql {UPDATE t1 SET a=CASE a WHEN 128 THEN 127 ELSE a END, b='';}
67*c5c4113dSnw141292  execsql {
68*c5c4113dSnw141292    INSERT INTO t1 VALUES(200,'hello out there');
69*c5c4113dSnw141292    COMMIT;
70*c5c4113dSnw141292    PRAGMA integrity_check;
71*c5c4113dSnw141292  }
72*c5c4113dSnw141292} ok
73*c5c4113dSnw141292
74*c5c4113dSnw141292# Tests of the sqliteAtoF() function in util.c
75*c5c4113dSnw141292#
76*c5c4113dSnw141292do_test misc3-2.1 {
77*c5c4113dSnw141292  execsql {SELECT 2e-25*0.5e25}
78*c5c4113dSnw141292} 1
79*c5c4113dSnw141292do_test misc3-2.2 {
80*c5c4113dSnw141292  execsql {SELECT 2.0e-25*000000.500000000000000000000000000000e+00025}
81*c5c4113dSnw141292} 1
82*c5c4113dSnw141292do_test misc3-2.3 {
83*c5c4113dSnw141292  execsql {SELECT 000000000002e-0000000025*0.5e25}
84*c5c4113dSnw141292} 1
85*c5c4113dSnw141292do_test misc3-2.4 {
86*c5c4113dSnw141292  execsql {SELECT 2e-25*0.5e250}
87*c5c4113dSnw141292} 1e+225
88*c5c4113dSnw141292do_test misc3-2.5 {
89*c5c4113dSnw141292  execsql {SELECT 2.0e-250*0.5e25}
90*c5c4113dSnw141292} 1e-225
91*c5c4113dSnw141292do_test misc3-2.6 {
92*c5c4113dSnw141292  execsql {SELECT '-2.0e-127' * '-0.5e27'}
93*c5c4113dSnw141292} 1e-100
94*c5c4113dSnw141292do_test misc3-2.7 {
95*c5c4113dSnw141292  execsql {SELECT '+2.0e-127' * '-0.5e27'}
96*c5c4113dSnw141292} -1e-100
97*c5c4113dSnw141292do_test misc3-2.8 {
98*c5c4113dSnw141292  execsql {SELECT 2.0e-27 * '+0.5e+127'}
99*c5c4113dSnw141292} 1e+100
100*c5c4113dSnw141292do_test misc3-2.9 {
101*c5c4113dSnw141292  execsql {SELECT 2.0e-27 * '+0.000005e+132'}
102*c5c4113dSnw141292} 1e+100
103*c5c4113dSnw141292
104*c5c4113dSnw141292# Ticket #522.  Make sure integer overflow is handled properly in
105*c5c4113dSnw141292# indices.
106*c5c4113dSnw141292#
107*c5c4113dSnw141292do_test misc3-3.1 {
108*c5c4113dSnw141292  execsql {PRAGMA integrity_check}
109*c5c4113dSnw141292} ok
110*c5c4113dSnw141292do_test misc3-3.2 {
111*c5c4113dSnw141292  execsql {
112*c5c4113dSnw141292    CREATE TABLE t2(a INT UNIQUE);
113*c5c4113dSnw141292    PRAGMA integrity_check;
114*c5c4113dSnw141292  }
115*c5c4113dSnw141292} ok
116*c5c4113dSnw141292do_test misc3-3.3 {
117*c5c4113dSnw141292  execsql {
118*c5c4113dSnw141292    INSERT INTO t2 VALUES(2147483648);
119*c5c4113dSnw141292    PRAGMA integrity_check;
120*c5c4113dSnw141292  }
121*c5c4113dSnw141292} ok
122*c5c4113dSnw141292do_test misc3-3.4 {
123*c5c4113dSnw141292  execsql {
124*c5c4113dSnw141292    INSERT INTO t2 VALUES(-2147483649);
125*c5c4113dSnw141292    PRAGMA integrity_check;
126*c5c4113dSnw141292  }
127*c5c4113dSnw141292} ok
128*c5c4113dSnw141292do_test misc3-3.5 {
129*c5c4113dSnw141292  execsql {
130*c5c4113dSnw141292    INSERT INTO t2 VALUES(+2147483649);
131*c5c4113dSnw141292    PRAGMA integrity_check;
132*c5c4113dSnw141292  }
133*c5c4113dSnw141292} ok
134*c5c4113dSnw141292do_test misc3-3.6 {
135*c5c4113dSnw141292  execsql {
136*c5c4113dSnw141292    INSERT INTO t2 VALUES(+2147483647);
137*c5c4113dSnw141292    INSERT INTO t2 VALUES(-2147483648);
138*c5c4113dSnw141292    INSERT INTO t2 VALUES(-2147483647);
139*c5c4113dSnw141292    INSERT INTO t2 VALUES(2147483646);
140*c5c4113dSnw141292    SELECT * FROM t2 ORDER BY a;
141*c5c4113dSnw141292  }
142*c5c4113dSnw141292} {-2147483649 -2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
143*c5c4113dSnw141292do_test misc3-3.7 {
144*c5c4113dSnw141292  execsql {
145*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=-2147483648 ORDER BY a;
146*c5c4113dSnw141292  }
147*c5c4113dSnw141292} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
148*c5c4113dSnw141292do_test misc3-3.8 {
149*c5c4113dSnw141292  execsql {
150*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>-2147483648 ORDER BY a;
151*c5c4113dSnw141292  }
152*c5c4113dSnw141292} {-2147483647 2147483646 2147483647 2147483648 2147483649}
153*c5c4113dSnw141292do_test misc3-3.9 {
154*c5c4113dSnw141292  execsql {
155*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>-2147483649 ORDER BY a;
156*c5c4113dSnw141292  }
157*c5c4113dSnw141292} {-2147483648 -2147483647 2147483646 2147483647 2147483648 2147483649}
158*c5c4113dSnw141292do_test misc3-3.10 {
159*c5c4113dSnw141292  execsql {
160*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=0 AND a<2147483649 ORDER BY a DESC;
161*c5c4113dSnw141292  }
162*c5c4113dSnw141292} {2147483648 2147483647 2147483646}
163*c5c4113dSnw141292do_test misc3-3.11 {
164*c5c4113dSnw141292  execsql {
165*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=0 AND a<=2147483648 ORDER BY a DESC;
166*c5c4113dSnw141292  }
167*c5c4113dSnw141292} {2147483648 2147483647 2147483646}
168*c5c4113dSnw141292do_test misc3-3.12 {
169*c5c4113dSnw141292  execsql {
170*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=0 AND a<2147483648 ORDER BY a DESC;
171*c5c4113dSnw141292  }
172*c5c4113dSnw141292} {2147483647 2147483646}
173*c5c4113dSnw141292do_test misc3-3.13 {
174*c5c4113dSnw141292  execsql {
175*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=0 AND a<=2147483647 ORDER BY a DESC;
176*c5c4113dSnw141292  }
177*c5c4113dSnw141292} {2147483647 2147483646}
178*c5c4113dSnw141292do_test misc3-3.14 {
179*c5c4113dSnw141292  execsql {
180*c5c4113dSnw141292    SELECT * FROM t2 WHERE a>=0 AND a<2147483647 ORDER BY a DESC;
181*c5c4113dSnw141292  }
182*c5c4113dSnw141292} {2147483646}
183*c5c4113dSnw141292
184*c5c4113dSnw141292# Ticket #565.  A stack overflow is occurring when the subquery to the
185*c5c4113dSnw141292# right of an IN operator contains many NULLs
186*c5c4113dSnw141292#
187*c5c4113dSnw141292do_test misc3-4.1 {
188*c5c4113dSnw141292  execsql {
189*c5c4113dSnw141292    CREATE TABLE t3(a INTEGER PRIMARY KEY, b);
190*c5c4113dSnw141292    INSERT INTO t3(b) VALUES('abc');
191*c5c4113dSnw141292    INSERT INTO t3(b) VALUES('xyz');
192*c5c4113dSnw141292    INSERT INTO t3(b) VALUES(NULL);
193*c5c4113dSnw141292    INSERT INTO t3(b) VALUES(NULL);
194*c5c4113dSnw141292    INSERT INTO t3(b) SELECT b||'d' FROM t3;
195*c5c4113dSnw141292    INSERT INTO t3(b) SELECT b||'e' FROM t3;
196*c5c4113dSnw141292    INSERT INTO t3(b) SELECT b||'f' FROM t3;
197*c5c4113dSnw141292    INSERT INTO t3(b) SELECT b||'g' FROM t3;
198*c5c4113dSnw141292    INSERT INTO t3(b) SELECT b||'h' FROM t3;
199*c5c4113dSnw141292    SELECT count(a), count(b) FROM t3;
200*c5c4113dSnw141292  }
201*c5c4113dSnw141292} {128 64}
202*c5c4113dSnw141292do_test misc3-4.2 {
203*c5c4113dSnw141292  execsql {
204*c5c4113dSnw141292    SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3);
205*c5c4113dSnw141292  }
206*c5c4113dSnw141292} {64}
207*c5c4113dSnw141292do_test misc3-4.3 {
208*c5c4113dSnw141292  execsql {
209*c5c4113dSnw141292    SELECT count(a) FROM t3 WHERE b IN (SELECT b FROM t3 ORDER BY a+1);
210*c5c4113dSnw141292  }
211*c5c4113dSnw141292} {64}
212*c5c4113dSnw141292
213*c5c4113dSnw141292# Ticket #601:  Putting a left join inside "SELECT * FROM (<join-here>)"
214*c5c4113dSnw141292# gives different results that if the outer "SELECT * FROM ..." is omitted.
215*c5c4113dSnw141292#
216*c5c4113dSnw141292do_test misc3-5.1 {
217*c5c4113dSnw141292  execsql {
218*c5c4113dSnw141292    CREATE TABLE x1 (b, c);
219*c5c4113dSnw141292    INSERT INTO x1 VALUES('dog',3);
220*c5c4113dSnw141292    INSERT INTO x1 VALUES('cat',1);
221*c5c4113dSnw141292    INSERT INTO x1 VALUES('dog',4);
222*c5c4113dSnw141292    CREATE TABLE x2 (c, e);
223*c5c4113dSnw141292    INSERT INTO x2 VALUES(1,'one');
224*c5c4113dSnw141292    INSERT INTO x2 VALUES(2,'two');
225*c5c4113dSnw141292    INSERT INTO x2 VALUES(3,'three');
226*c5c4113dSnw141292    INSERT INTO x2 VALUES(4,'four');
227*c5c4113dSnw141292    SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
228*c5c4113dSnw141292       (SELECT b, max(c) AS c FROM x1 GROUP BY b)
229*c5c4113dSnw141292       USING(c);
230*c5c4113dSnw141292  }
231*c5c4113dSnw141292} {1 one cat 2 two {} 3 three {} 4 four dog}
232*c5c4113dSnw141292do_test misc4-5.2 {
233*c5c4113dSnw141292  execsql {
234*c5c4113dSnw141292    SELECT * FROM (
235*c5c4113dSnw141292      SELECT x2.c AS c, e, b FROM x2 LEFT JOIN
236*c5c4113dSnw141292         (SELECT b, max(c) AS c FROM x1 GROUP BY b)
237*c5c4113dSnw141292         USING(c)
238*c5c4113dSnw141292    );
239*c5c4113dSnw141292  }
240*c5c4113dSnw141292} {1 one cat 2 two {} 3 three {} 4 four dog}
241*c5c4113dSnw141292
242*c5c4113dSnw141292# Ticket #626:  make sure EXPLAIN prevents BEGIN and COMMIT from working.
243*c5c4113dSnw141292#
244*c5c4113dSnw141292do_test misc3-6.1 {
245*c5c4113dSnw141292  execsql {EXPLAIN BEGIN}
246*c5c4113dSnw141292  catchsql {BEGIN}
247*c5c4113dSnw141292} {0 {}}
248*c5c4113dSnw141292do_test misc3-6.2 {
249*c5c4113dSnw141292  execsql {EXPLAIN COMMIT}
250*c5c4113dSnw141292  catchsql {COMMIT}
251*c5c4113dSnw141292} {0 {}}
252*c5c4113dSnw141292do_test misc3-6.3 {
253*c5c4113dSnw141292  execsql {BEGIN; EXPLAIN ROLLBACK}
254*c5c4113dSnw141292  catchsql {ROLLBACK}
255*c5c4113dSnw141292} {0 {}}
256*c5c4113dSnw141292
257*c5c4113dSnw141292# Ticket #640:  vdbe stack overflow with a LIMIT clause on a SELECT inside
258*c5c4113dSnw141292# of a trigger.
259*c5c4113dSnw141292#
260*c5c4113dSnw141292do_test misc3-7.1 {
261*c5c4113dSnw141292  execsql {
262*c5c4113dSnw141292    BEGIN;
263*c5c4113dSnw141292    CREATE TABLE y1(a);
264*c5c4113dSnw141292    CREATE TABLE y2(b);
265*c5c4113dSnw141292    CREATE TABLE y3(c);
266*c5c4113dSnw141292    CREATE TRIGGER r1 AFTER DELETE ON y1 FOR EACH ROW BEGIN
267*c5c4113dSnw141292      INSERT INTO y3(c) SELECT b FROM y2 ORDER BY b LIMIT 1;
268*c5c4113dSnw141292    END;
269*c5c4113dSnw141292    INSERT INTO y1 VALUES(1);
270*c5c4113dSnw141292    INSERT INTO y1 VALUES(2);
271*c5c4113dSnw141292    INSERT INTO y1 SELECT a+2 FROM y1;
272*c5c4113dSnw141292    INSERT INTO y1 SELECT a+4 FROM y1;
273*c5c4113dSnw141292    INSERT INTO y1 SELECT a+8 FROM y1;
274*c5c4113dSnw141292    INSERT INTO y1 SELECT a+16 FROM y1;
275*c5c4113dSnw141292    INSERT INTO y2 SELECT a FROM y1;
276*c5c4113dSnw141292    COMMIT;
277*c5c4113dSnw141292    SELECT count(*) FROM y1;
278*c5c4113dSnw141292  }
279*c5c4113dSnw141292} 32
280*c5c4113dSnw141292do_test misc3-7.2 {
281*c5c4113dSnw141292  execsql {
282*c5c4113dSnw141292    DELETE FROM y1;
283*c5c4113dSnw141292    SELECT count(*) FROM y1;
284*c5c4113dSnw141292  }
285*c5c4113dSnw141292} 0
286*c5c4113dSnw141292do_test misc3-7.3 {
287*c5c4113dSnw141292  execsql {
288*c5c4113dSnw141292    SELECT count(*) FROM y3;
289*c5c4113dSnw141292  }
290*c5c4113dSnw141292} 32
291*c5c4113dSnw141292
292*c5c4113dSnw141292# Ticket #668:  VDBE stack overflow occurs when the left-hand side
293*c5c4113dSnw141292# of an IN expression is NULL and the result is used as an integer, not
294*c5c4113dSnw141292# as a jump.
295*c5c4113dSnw141292#
296*c5c4113dSnw141292do_test misc-8.1 {
297*c5c4113dSnw141292  execsql {
298*c5c4113dSnw141292    SELECT count(CASE WHEN b IN ('abc','xyz') THEN 'x' END) FROM t3
299*c5c4113dSnw141292  }
300*c5c4113dSnw141292} {2}
301*c5c4113dSnw141292do_test misc-8.2 {
302*c5c4113dSnw141292  execsql {
303*c5c4113dSnw141292    SELECT count(*) FROM t3 WHERE 1+(b IN ('abc','xyz'))==2
304*c5c4113dSnw141292  }
305*c5c4113dSnw141292} {2}
306*c5c4113dSnw141292
307*c5c4113dSnw141292finish_test
308