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