xref: /onnv-gate/usr/src/lib/libsqlite/test/in.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 IN and BETWEEN operator.
16*4520Snw141292#
17*4520Snw141292# $Id: in.test,v 1.11 2004/01/15 03:30:25 drh Exp $
18*4520Snw141292
19*4520Snw141292set testdir [file dirname $argv0]
20*4520Snw141292source $testdir/tester.tcl
21*4520Snw141292
22*4520Snw141292# Generate the test data we will need for the first squences of tests.
23*4520Snw141292#
24*4520Snw141292do_test in-1.0 {
25*4520Snw141292  set fd [open data1.txt w]
26*4520Snw141292  for {set i 1} {$i<=10} {incr i} {
27*4520Snw141292    puts $fd "$i\t[expr {int(pow(2,$i))}]"
28*4520Snw141292  }
29*4520Snw141292  close $fd
30*4520Snw141292  execsql {
31*4520Snw141292    CREATE TABLE t1(a int, b int);
32*4520Snw141292    COPY t1 FROM 'data1.txt';
33*4520Snw141292  }
34*4520Snw141292  file delete -force data1.txt
35*4520Snw141292  execsql {SELECT count(*) FROM t1}
36*4520Snw141292} {10}
37*4520Snw141292
38*4520Snw141292# Do basic testing of BETWEEN.
39*4520Snw141292#
40*4520Snw141292do_test in-1.1 {
41*4520Snw141292  execsql {SELECT a FROM t1 WHERE b BETWEEN 10 AND 50 ORDER BY a}
42*4520Snw141292} {4 5}
43*4520Snw141292do_test in-1.2 {
44*4520Snw141292  execsql {SELECT a FROM t1 WHERE b NOT BETWEEN 10 AND 50 ORDER BY a}
45*4520Snw141292} {1 2 3 6 7 8 9 10}
46*4520Snw141292do_test in-1.3 {
47*4520Snw141292  execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 ORDER BY a}
48*4520Snw141292} {1 2 3 4}
49*4520Snw141292do_test in-1.4 {
50*4520Snw141292  execsql {SELECT a FROM t1 WHERE b NOT BETWEEN a AND a*5 ORDER BY a}
51*4520Snw141292} {5 6 7 8 9 10}
52*4520Snw141292do_test in-1.6 {
53*4520Snw141292  execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 OR b=512 ORDER BY a}
54*4520Snw141292} {1 2 3 4 9}
55*4520Snw141292do_test in-1.7 {
56*4520Snw141292  execsql {SELECT a+ 100*(a BETWEEN 1 and 3) FROM t1 ORDER BY b}
57*4520Snw141292} {101 102 103 4 5 6 7 8 9 10}
58*4520Snw141292
59*4520Snw141292
60*4520Snw141292# Testing of the IN operator using static lists on the right-hand side.
61*4520Snw141292#
62*4520Snw141292do_test in-2.1 {
63*4520Snw141292  execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) ORDER BY a}
64*4520Snw141292} {3 4 5}
65*4520Snw141292do_test in-2.2 {
66*4520Snw141292  execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) ORDER BY a}
67*4520Snw141292} {1 2 6 7 8 9 10}
68*4520Snw141292do_test in-2.3 {
69*4520Snw141292  execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) OR b=512 ORDER BY a}
70*4520Snw141292} {3 4 5 9}
71*4520Snw141292do_test in-2.4 {
72*4520Snw141292  execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) OR b=512 ORDER BY a}
73*4520Snw141292} {1 2 6 7 8 9 10}
74*4520Snw141292do_test in-2.5 {
75*4520Snw141292  execsql {SELECT a+100*(b IN (8,16,24)) FROM t1 ORDER BY b}
76*4520Snw141292} {1 2 103 104 5 6 7 8 9 10}
77*4520Snw141292
78*4520Snw141292do_test in-2.6 {
79*4520Snw141292  set v [catch {execsql {SELECT a FROM t1 WHERE b IN (b+10,20)}} msg]
80*4520Snw141292  lappend v $msg
81*4520Snw141292} {1 {right-hand side of IN operator must be constant}}
82*4520Snw141292do_test in-2.7 {
83*4520Snw141292  set v [catch {execsql {SELECT a FROM t1 WHERE b IN (max(5,10,b),20)}} msg]
84*4520Snw141292  lappend v $msg
85*4520Snw141292} {1 {right-hand side of IN operator must be constant}}
86*4520Snw141292do_test in-2.8 {
87*4520Snw141292  execsql {SELECT a FROM t1 WHERE b IN (8*2,64/2) ORDER BY b}
88*4520Snw141292} {4 5}
89*4520Snw141292do_test in-2.9 {
90*4520Snw141292  set v [catch {execsql {SELECT a FROM t1 WHERE b IN (max(5,10),20)}} msg]
91*4520Snw141292  lappend v $msg
92*4520Snw141292} {1 {right-hand side of IN operator must be constant}}
93*4520Snw141292do_test in-2.10 {
94*4520Snw141292  set v [catch {execsql {SELECT a FROM t1 WHERE min(0,b IN (a,30))}} msg]
95*4520Snw141292  lappend v $msg
96*4520Snw141292} {1 {right-hand side of IN operator must be constant}}
97*4520Snw141292do_test in-2.11 {
98*4520Snw141292  set v [catch {execsql {SELECT a FROM t1 WHERE c IN (10,20)}} msg]
99*4520Snw141292  lappend v $msg
100*4520Snw141292} {1 {no such column: c}}
101*4520Snw141292
102*4520Snw141292# Testing the IN operator where the right-hand side is a SELECT
103*4520Snw141292#
104*4520Snw141292do_test in-3.1 {
105*4520Snw141292  execsql {
106*4520Snw141292    SELECT a FROM t1
107*4520Snw141292    WHERE b IN (SELECT b FROM t1 WHERE a<5)
108*4520Snw141292    ORDER BY a
109*4520Snw141292  }
110*4520Snw141292} {1 2 3 4}
111*4520Snw141292do_test in-3.2 {
112*4520Snw141292  execsql {
113*4520Snw141292    SELECT a FROM t1
114*4520Snw141292    WHERE b IN (SELECT b FROM t1 WHERE a<5) OR b==512
115*4520Snw141292    ORDER BY a
116*4520Snw141292  }
117*4520Snw141292} {1 2 3 4 9}
118*4520Snw141292do_test in-3.3 {
119*4520Snw141292  execsql {
120*4520Snw141292    SELECT a + 100*(b IN (SELECT b FROM t1 WHERE a<5)) FROM t1 ORDER BY b
121*4520Snw141292  }
122*4520Snw141292} {101 102 103 104 5 6 7 8 9 10}
123*4520Snw141292
124*4520Snw141292# Make sure the UPDATE and DELETE commands work with IN-SELECT
125*4520Snw141292#
126*4520Snw141292do_test in-4.1 {
127*4520Snw141292  execsql {
128*4520Snw141292    UPDATE t1 SET b=b*2
129*4520Snw141292    WHERE b IN (SELECT b FROM t1 WHERE a>8)
130*4520Snw141292  }
131*4520Snw141292  execsql {SELECT b FROM t1 ORDER BY b}
132*4520Snw141292} {2 4 8 16 32 64 128 256 1024 2048}
133*4520Snw141292do_test in-4.2 {
134*4520Snw141292  execsql {
135*4520Snw141292    DELETE FROM t1 WHERE b IN (SELECT b FROM t1 WHERE a>8)
136*4520Snw141292  }
137*4520Snw141292  execsql {SELECT a FROM t1 ORDER BY a}
138*4520Snw141292} {1 2 3 4 5 6 7 8}
139*4520Snw141292do_test in-4.3 {
140*4520Snw141292  execsql {
141*4520Snw141292    DELETE FROM t1 WHERE b NOT IN (SELECT b FROM t1 WHERE a>4)
142*4520Snw141292  }
143*4520Snw141292  execsql {SELECT a FROM t1 ORDER BY a}
144*4520Snw141292} {5 6 7 8}
145*4520Snw141292
146*4520Snw141292# Do an IN with a constant RHS but where the RHS has many, many
147*4520Snw141292# elements.  We need to test that collisions in the hash table
148*4520Snw141292# are resolved properly.
149*4520Snw141292#
150*4520Snw141292do_test in-5.1 {
151*4520Snw141292  execsql {
152*4520Snw141292    INSERT INTO t1 VALUES('hello', 'world');
153*4520Snw141292    SELECT * FROM t1
154*4520Snw141292    WHERE a IN (
155*4520Snw141292       'Do','an','IN','with','a','constant','RHS','but','where','the',
156*4520Snw141292       'has','many','elements','We','need','to','test','that',
157*4520Snw141292       'collisions','hash','table','are','resolved','properly',
158*4520Snw141292       'This','in-set','contains','thirty','one','entries','hello');
159*4520Snw141292  }
160*4520Snw141292} {hello world}
161*4520Snw141292
162*4520Snw141292# Make sure the IN operator works with INTEGER PRIMARY KEY fields.
163*4520Snw141292#
164*4520Snw141292do_test in-6.1 {
165*4520Snw141292  execsql {
166*4520Snw141292    CREATE TABLE ta(a INTEGER PRIMARY KEY, b);
167*4520Snw141292    INSERT INTO ta VALUES(1,1);
168*4520Snw141292    INSERT INTO ta VALUES(2,2);
169*4520Snw141292    INSERT INTO ta VALUES(3,3);
170*4520Snw141292    INSERT INTO ta VALUES(4,4);
171*4520Snw141292    INSERT INTO ta VALUES(6,6);
172*4520Snw141292    INSERT INTO ta VALUES(8,8);
173*4520Snw141292    INSERT INTO ta VALUES(10,
174*4520Snw141292       'This is a key that is long enough to require a malloc in the VDBE');
175*4520Snw141292    SELECT * FROM ta WHERE a<10;
176*4520Snw141292  }
177*4520Snw141292} {1 1 2 2 3 3 4 4 6 6 8 8}
178*4520Snw141292do_test in-6.2 {
179*4520Snw141292  execsql {
180*4520Snw141292    CREATE TABLE tb(a INTEGER PRIMARY KEY, b);
181*4520Snw141292    INSERT INTO tb VALUES(1,1);
182*4520Snw141292    INSERT INTO tb VALUES(2,2);
183*4520Snw141292    INSERT INTO tb VALUES(3,3);
184*4520Snw141292    INSERT INTO tb VALUES(5,5);
185*4520Snw141292    INSERT INTO tb VALUES(7,7);
186*4520Snw141292    INSERT INTO tb VALUES(9,9);
187*4520Snw141292    INSERT INTO tb VALUES(11,
188*4520Snw141292       'This is a key that is long enough to require a malloc in the VDBE');
189*4520Snw141292    SELECT * FROM tb WHERE a<10;
190*4520Snw141292  }
191*4520Snw141292} {1 1 2 2 3 3 5 5 7 7 9 9}
192*4520Snw141292do_test in-6.3 {
193*4520Snw141292  execsql {
194*4520Snw141292    SELECT a FROM ta WHERE b IN (SELECT a FROM tb);
195*4520Snw141292  }
196*4520Snw141292} {1 2 3}
197*4520Snw141292do_test in-6.4 {
198*4520Snw141292  execsql {
199*4520Snw141292    SELECT a FROM ta WHERE b NOT IN (SELECT a FROM tb);
200*4520Snw141292  }
201*4520Snw141292} {4 6 8 10}
202*4520Snw141292do_test in-6.5 {
203*4520Snw141292  execsql {
204*4520Snw141292    SELECT a FROM ta WHERE b IN (SELECT b FROM tb);
205*4520Snw141292  }
206*4520Snw141292} {1 2 3 10}
207*4520Snw141292do_test in-6.6 {
208*4520Snw141292  execsql {
209*4520Snw141292    SELECT a FROM ta WHERE b NOT IN (SELECT b FROM tb);
210*4520Snw141292  }
211*4520Snw141292} {4 6 8}
212*4520Snw141292do_test in-6.7 {
213*4520Snw141292  execsql {
214*4520Snw141292    SELECT a FROM ta WHERE a IN (SELECT a FROM tb);
215*4520Snw141292  }
216*4520Snw141292} {1 2 3}
217*4520Snw141292do_test in-6.8 {
218*4520Snw141292  execsql {
219*4520Snw141292    SELECT a FROM ta WHERE a NOT IN (SELECT a FROM tb);
220*4520Snw141292  }
221*4520Snw141292} {4 6 8 10}
222*4520Snw141292do_test in-6.9 {
223*4520Snw141292  execsql {
224*4520Snw141292    SELECT a FROM ta WHERE a IN (SELECT b FROM tb);
225*4520Snw141292  }
226*4520Snw141292} {1 2 3}
227*4520Snw141292do_test in-6.10 {
228*4520Snw141292  execsql {
229*4520Snw141292    SELECT a FROM ta WHERE a NOT IN (SELECT b FROM tb);
230*4520Snw141292  }
231*4520Snw141292} {4 6 8 10}
232*4520Snw141292
233*4520Snw141292# Tests of IN operator against empty sets.  (Ticket #185)
234*4520Snw141292#
235*4520Snw141292do_test in-7.1 {
236*4520Snw141292  execsql {
237*4520Snw141292    SELECT a FROM t1 WHERE a IN ();
238*4520Snw141292  }
239*4520Snw141292} {}
240*4520Snw141292do_test in-7.2 {
241*4520Snw141292  execsql {
242*4520Snw141292    SELECT a FROM t1 WHERE a IN (5);
243*4520Snw141292  }
244*4520Snw141292} {5}
245*4520Snw141292do_test in-7.3 {
246*4520Snw141292  execsql {
247*4520Snw141292    SELECT a FROM t1 WHERE a NOT IN () ORDER BY a;
248*4520Snw141292  }
249*4520Snw141292} {5 6 7 8 hello}
250*4520Snw141292do_test in-7.4 {
251*4520Snw141292  execsql {
252*4520Snw141292    SELECT a FROM t1 WHERE a IN (5) AND b IN ();
253*4520Snw141292  }
254*4520Snw141292} {}
255*4520Snw141292do_test in-7.5 {
256*4520Snw141292  execsql {
257*4520Snw141292    SELECT a FROM t1 WHERE a IN (5) AND b NOT IN ();
258*4520Snw141292  }
259*4520Snw141292} {5}
260*4520Snw141292do_test in-7.6 {
261*4520Snw141292  execsql {
262*4520Snw141292    SELECT a FROM ta WHERE a IN ();
263*4520Snw141292  }
264*4520Snw141292} {}
265*4520Snw141292do_test in-7.7 {
266*4520Snw141292  execsql {
267*4520Snw141292    SELECT a FROM ta WHERE a NOT IN ();
268*4520Snw141292  }
269*4520Snw141292} {1 2 3 4 6 8 10}
270*4520Snw141292
271*4520Snw141292do_test in-8.1 {
272*4520Snw141292  execsql {
273*4520Snw141292    SELECT b FROM t1 WHERE a IN ('hello','there')
274*4520Snw141292  }
275*4520Snw141292} {world}
276*4520Snw141292do_test in-8.2 {
277*4520Snw141292  execsql {
278*4520Snw141292    SELECT b FROM t1 WHERE a IN ("hello",'there')
279*4520Snw141292  }
280*4520Snw141292} {world}
281*4520Snw141292
282*4520Snw141292# Test constructs of the form:  expr IN tablename
283*4520Snw141292#
284*4520Snw141292do_test in-9.1 {
285*4520Snw141292  execsql {
286*4520Snw141292    CREATE TABLE t4 AS SELECT a FROM tb;
287*4520Snw141292    SELECT * FROM t4;
288*4520Snw141292  }
289*4520Snw141292} {1 2 3 5 7 9 11}
290*4520Snw141292do_test in-9.2 {
291*4520Snw141292  execsql {
292*4520Snw141292    SELECT b FROM t1 WHERE a IN t4;
293*4520Snw141292  }
294*4520Snw141292} {32 128}
295*4520Snw141292do_test in-9.3 {
296*4520Snw141292  execsql {
297*4520Snw141292    SELECT b FROM t1 WHERE a NOT IN t4;
298*4520Snw141292  }
299*4520Snw141292} {64 256 world}
300*4520Snw141292do_test in-9.4 {
301*4520Snw141292  catchsql {
302*4520Snw141292    SELECT b FROM t1 WHERE a NOT IN tb;
303*4520Snw141292  }
304*4520Snw141292} {1 {only a single result allowed for a SELECT that is part of an expression}}
305*4520Snw141292
306*4520Snw141292finish_test
307