xref: /onnv-gate/usr/src/lib/libsqlite/test/select4.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 UNION, INTERSECT and EXCEPT operators
16*4520Snw141292# in SELECT statements.
17*4520Snw141292#
18*4520Snw141292# $Id: select4.test,v 1.13 2003/02/02 12:41:27 drh Exp $
19*4520Snw141292
20*4520Snw141292set testdir [file dirname $argv0]
21*4520Snw141292source $testdir/tester.tcl
22*4520Snw141292
23*4520Snw141292# Build some test data
24*4520Snw141292#
25*4520Snw141292set fd [open data1.txt w]
26*4520Snw141292for {set i 1} {$i<32} {incr i} {
27*4520Snw141292  for {set j 0} {pow(2,$j)<$i} {incr j} {}
28*4520Snw141292  puts $fd "$i\t$j"
29*4520Snw141292}
30*4520Snw141292close $fd
31*4520Snw141292execsql {
32*4520Snw141292  CREATE TABLE t1(n int, log int);
33*4520Snw141292  COPY t1 FROM 'data1.txt'
34*4520Snw141292}
35*4520Snw141292file delete data1.txt
36*4520Snw141292
37*4520Snw141292do_test select4-1.0 {
38*4520Snw141292  execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
39*4520Snw141292} {0 1 2 3 4 5}
40*4520Snw141292
41*4520Snw141292# Union All operator
42*4520Snw141292#
43*4520Snw141292do_test select4-1.1a {
44*4520Snw141292  lsort [execsql {SELECT DISTINCT log FROM t1}]
45*4520Snw141292} {0 1 2 3 4 5}
46*4520Snw141292do_test select4-1.1b {
47*4520Snw141292  lsort [execsql {SELECT n FROM t1 WHERE log=3}]
48*4520Snw141292} {5 6 7 8}
49*4520Snw141292do_test select4-1.1c {
50*4520Snw141292  execsql {
51*4520Snw141292    SELECT DISTINCT log FROM t1
52*4520Snw141292    UNION ALL
53*4520Snw141292    SELECT n FROM t1 WHERE log=3
54*4520Snw141292    ORDER BY log;
55*4520Snw141292  }
56*4520Snw141292} {0 1 2 3 4 5 5 6 7 8}
57*4520Snw141292do_test select4-1.1d {
58*4520Snw141292  execsql {
59*4520Snw141292    CREATE TABLE t2 AS
60*4520Snw141292      SELECT DISTINCT log FROM t1
61*4520Snw141292      UNION ALL
62*4520Snw141292      SELECT n FROM t1 WHERE log=3
63*4520Snw141292      ORDER BY log;
64*4520Snw141292    SELECT * FROM t2;
65*4520Snw141292  }
66*4520Snw141292} {0 1 2 3 4 5 5 6 7 8}
67*4520Snw141292execsql {DROP TABLE t2}
68*4520Snw141292do_test select4-1.1e {
69*4520Snw141292  execsql {
70*4520Snw141292    CREATE TABLE t2 AS
71*4520Snw141292      SELECT DISTINCT log FROM t1
72*4520Snw141292      UNION ALL
73*4520Snw141292      SELECT n FROM t1 WHERE log=3
74*4520Snw141292      ORDER BY log DESC;
75*4520Snw141292    SELECT * FROM t2;
76*4520Snw141292  }
77*4520Snw141292} {8 7 6 5 5 4 3 2 1 0}
78*4520Snw141292execsql {DROP TABLE t2}
79*4520Snw141292do_test select4-1.1f {
80*4520Snw141292  execsql {
81*4520Snw141292    SELECT DISTINCT log FROM t1
82*4520Snw141292    UNION ALL
83*4520Snw141292    SELECT n FROM t1 WHERE log=2
84*4520Snw141292  }
85*4520Snw141292} {0 1 2 3 4 5 3 4}
86*4520Snw141292do_test select4-1.1g {
87*4520Snw141292  execsql {
88*4520Snw141292    CREATE TABLE t2 AS
89*4520Snw141292      SELECT DISTINCT log FROM t1
90*4520Snw141292      UNION ALL
91*4520Snw141292      SELECT n FROM t1 WHERE log=2;
92*4520Snw141292    SELECT * FROM t2;
93*4520Snw141292  }
94*4520Snw141292} {0 1 2 3 4 5 3 4}
95*4520Snw141292execsql {DROP TABLE t2}
96*4520Snw141292do_test select4-1.2 {
97*4520Snw141292  execsql {
98*4520Snw141292    SELECT log FROM t1 WHERE n IN
99*4520Snw141292      (SELECT DISTINCT log FROM t1 UNION ALL
100*4520Snw141292       SELECT n FROM t1 WHERE log=3)
101*4520Snw141292    ORDER BY log;
102*4520Snw141292  }
103*4520Snw141292} {0 1 2 2 3 3 3 3}
104*4520Snw141292do_test select4-1.3 {
105*4520Snw141292  set v [catch {execsql {
106*4520Snw141292    SELECT DISTINCT log FROM t1 ORDER BY log
107*4520Snw141292    UNION ALL
108*4520Snw141292    SELECT n FROM t1 WHERE log=3
109*4520Snw141292    ORDER BY log;
110*4520Snw141292  }} msg]
111*4520Snw141292  lappend v $msg
112*4520Snw141292} {1 {ORDER BY clause should come after UNION ALL not before}}
113*4520Snw141292
114*4520Snw141292# Union operator
115*4520Snw141292#
116*4520Snw141292do_test select4-2.1 {
117*4520Snw141292  execsql {
118*4520Snw141292    SELECT DISTINCT log FROM t1
119*4520Snw141292    UNION
120*4520Snw141292    SELECT n FROM t1 WHERE log=3
121*4520Snw141292    ORDER BY log;
122*4520Snw141292  }
123*4520Snw141292} {0 1 2 3 4 5 6 7 8}
124*4520Snw141292do_test select4-2.2 {
125*4520Snw141292  execsql {
126*4520Snw141292    SELECT log FROM t1 WHERE n IN
127*4520Snw141292      (SELECT DISTINCT log FROM t1 UNION
128*4520Snw141292       SELECT n FROM t1 WHERE log=3)
129*4520Snw141292    ORDER BY log;
130*4520Snw141292  }
131*4520Snw141292} {0 1 2 2 3 3 3 3}
132*4520Snw141292do_test select4-2.3 {
133*4520Snw141292  set v [catch {execsql {
134*4520Snw141292    SELECT DISTINCT log FROM t1 ORDER BY log
135*4520Snw141292    UNION
136*4520Snw141292    SELECT n FROM t1 WHERE log=3
137*4520Snw141292    ORDER BY log;
138*4520Snw141292  }} msg]
139*4520Snw141292  lappend v $msg
140*4520Snw141292} {1 {ORDER BY clause should come after UNION not before}}
141*4520Snw141292
142*4520Snw141292# Except operator
143*4520Snw141292#
144*4520Snw141292do_test select4-3.1.1 {
145*4520Snw141292  execsql {
146*4520Snw141292    SELECT DISTINCT log FROM t1
147*4520Snw141292    EXCEPT
148*4520Snw141292    SELECT n FROM t1 WHERE log=3
149*4520Snw141292    ORDER BY log;
150*4520Snw141292  }
151*4520Snw141292} {0 1 2 3 4}
152*4520Snw141292do_test select4-3.1.2 {
153*4520Snw141292  execsql {
154*4520Snw141292    CREATE TABLE t2 AS
155*4520Snw141292      SELECT DISTINCT log FROM t1
156*4520Snw141292      EXCEPT
157*4520Snw141292      SELECT n FROM t1 WHERE log=3
158*4520Snw141292      ORDER BY log;
159*4520Snw141292    SELECT * FROM t2;
160*4520Snw141292  }
161*4520Snw141292} {0 1 2 3 4}
162*4520Snw141292execsql {DROP TABLE t2}
163*4520Snw141292do_test select4-3.1.3 {
164*4520Snw141292  execsql {
165*4520Snw141292    CREATE TABLE t2 AS
166*4520Snw141292      SELECT DISTINCT log FROM t1
167*4520Snw141292      EXCEPT
168*4520Snw141292      SELECT n FROM t1 WHERE log=3
169*4520Snw141292      ORDER BY log DESC;
170*4520Snw141292    SELECT * FROM t2;
171*4520Snw141292  }
172*4520Snw141292} {4 3 2 1 0}
173*4520Snw141292execsql {DROP TABLE t2}
174*4520Snw141292do_test select4-3.2 {
175*4520Snw141292  execsql {
176*4520Snw141292    SELECT log FROM t1 WHERE n IN
177*4520Snw141292      (SELECT DISTINCT log FROM t1 EXCEPT
178*4520Snw141292       SELECT n FROM t1 WHERE log=3)
179*4520Snw141292    ORDER BY log;
180*4520Snw141292  }
181*4520Snw141292} {0 1 2 2}
182*4520Snw141292do_test select4-3.3 {
183*4520Snw141292  set v [catch {execsql {
184*4520Snw141292    SELECT DISTINCT log FROM t1 ORDER BY log
185*4520Snw141292    EXCEPT
186*4520Snw141292    SELECT n FROM t1 WHERE log=3
187*4520Snw141292    ORDER BY log;
188*4520Snw141292  }} msg]
189*4520Snw141292  lappend v $msg
190*4520Snw141292} {1 {ORDER BY clause should come after EXCEPT not before}}
191*4520Snw141292
192*4520Snw141292# Intersect operator
193*4520Snw141292#
194*4520Snw141292do_test select4-4.1.1 {
195*4520Snw141292  execsql {
196*4520Snw141292    SELECT DISTINCT log FROM t1
197*4520Snw141292    INTERSECT
198*4520Snw141292    SELECT n FROM t1 WHERE log=3
199*4520Snw141292    ORDER BY log;
200*4520Snw141292  }
201*4520Snw141292} {5}
202*4520Snw141292do_test select4-4.1.2 {
203*4520Snw141292  execsql {
204*4520Snw141292    SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
205*4520Snw141292    INTERSECT
206*4520Snw141292    SELECT n FROM t1 WHERE log=3
207*4520Snw141292    ORDER BY log;
208*4520Snw141292  }
209*4520Snw141292} {5 6}
210*4520Snw141292do_test select4-4.1.3 {
211*4520Snw141292  execsql {
212*4520Snw141292    CREATE TABLE t2 AS
213*4520Snw141292      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
214*4520Snw141292      INTERSECT
215*4520Snw141292      SELECT n FROM t1 WHERE log=3
216*4520Snw141292      ORDER BY log;
217*4520Snw141292    SELECT * FROM t2;
218*4520Snw141292  }
219*4520Snw141292} {5 6}
220*4520Snw141292execsql {DROP TABLE t2}
221*4520Snw141292do_test select4-4.1.4 {
222*4520Snw141292  execsql {
223*4520Snw141292    CREATE TABLE t2 AS
224*4520Snw141292      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
225*4520Snw141292      INTERSECT
226*4520Snw141292      SELECT n FROM t1 WHERE log=3
227*4520Snw141292      ORDER BY log DESC;
228*4520Snw141292    SELECT * FROM t2;
229*4520Snw141292  }
230*4520Snw141292} {6 5}
231*4520Snw141292execsql {DROP TABLE t2}
232*4520Snw141292do_test select4-4.2 {
233*4520Snw141292  execsql {
234*4520Snw141292    SELECT log FROM t1 WHERE n IN
235*4520Snw141292      (SELECT DISTINCT log FROM t1 INTERSECT
236*4520Snw141292       SELECT n FROM t1 WHERE log=3)
237*4520Snw141292    ORDER BY log;
238*4520Snw141292  }
239*4520Snw141292} {3}
240*4520Snw141292do_test select4-4.3 {
241*4520Snw141292  set v [catch {execsql {
242*4520Snw141292    SELECT DISTINCT log FROM t1 ORDER BY log
243*4520Snw141292    INTERSECT
244*4520Snw141292    SELECT n FROM t1 WHERE log=3
245*4520Snw141292    ORDER BY log;
246*4520Snw141292  }} msg]
247*4520Snw141292  lappend v $msg
248*4520Snw141292} {1 {ORDER BY clause should come after INTERSECT not before}}
249*4520Snw141292
250*4520Snw141292# Various error messages while processing UNION or INTERSECT
251*4520Snw141292#
252*4520Snw141292do_test select4-5.1 {
253*4520Snw141292  set v [catch {execsql {
254*4520Snw141292    SELECT DISTINCT log FROM t2
255*4520Snw141292    UNION ALL
256*4520Snw141292    SELECT n FROM t1 WHERE log=3
257*4520Snw141292    ORDER BY log;
258*4520Snw141292  }} msg]
259*4520Snw141292  lappend v $msg
260*4520Snw141292} {1 {no such table: t2}}
261*4520Snw141292do_test select4-5.2 {
262*4520Snw141292  set v [catch {execsql {
263*4520Snw141292    SELECT DISTINCT log AS "xyzzy" FROM t1
264*4520Snw141292    UNION ALL
265*4520Snw141292    SELECT n FROM t1 WHERE log=3
266*4520Snw141292    ORDER BY xyzzy;
267*4520Snw141292  }} msg]
268*4520Snw141292  lappend v $msg
269*4520Snw141292} {0 {0 1 2 3 4 5 5 6 7 8}}
270*4520Snw141292do_test select4-5.2b {
271*4520Snw141292  set v [catch {execsql {
272*4520Snw141292    SELECT DISTINCT log AS xyzzy FROM t1
273*4520Snw141292    UNION ALL
274*4520Snw141292    SELECT n FROM t1 WHERE log=3
275*4520Snw141292    ORDER BY 'xyzzy';
276*4520Snw141292  }} msg]
277*4520Snw141292  lappend v $msg
278*4520Snw141292} {0 {0 1 2 3 4 5 5 6 7 8}}
279*4520Snw141292do_test select4-5.2c {
280*4520Snw141292  set v [catch {execsql {
281*4520Snw141292    SELECT DISTINCT log FROM t1
282*4520Snw141292    UNION ALL
283*4520Snw141292    SELECT n FROM t1 WHERE log=3
284*4520Snw141292    ORDER BY 'xyzzy';
285*4520Snw141292  }} msg]
286*4520Snw141292  lappend v $msg
287*4520Snw141292} {1 {ORDER BY term number 1 does not match any result column}}
288*4520Snw141292do_test select4-5.2d {
289*4520Snw141292  set v [catch {execsql {
290*4520Snw141292    SELECT DISTINCT log FROM t1
291*4520Snw141292    INTERSECT
292*4520Snw141292    SELECT n FROM t1 WHERE log=3
293*4520Snw141292    ORDER BY 'xyzzy';
294*4520Snw141292  }} msg]
295*4520Snw141292  lappend v $msg
296*4520Snw141292} {1 {ORDER BY term number 1 does not match any result column}}
297*4520Snw141292do_test select4-5.2e {
298*4520Snw141292  set v [catch {execsql {
299*4520Snw141292    SELECT DISTINCT log FROM t1
300*4520Snw141292    UNION ALL
301*4520Snw141292    SELECT n FROM t1 WHERE log=3
302*4520Snw141292    ORDER BY n;
303*4520Snw141292  }} msg]
304*4520Snw141292  lappend v $msg
305*4520Snw141292} {0 {0 1 2 3 4 5 5 6 7 8}}
306*4520Snw141292do_test select4-5.2f {
307*4520Snw141292  catchsql {
308*4520Snw141292    SELECT DISTINCT log FROM t1
309*4520Snw141292    UNION ALL
310*4520Snw141292    SELECT n FROM t1 WHERE log=3
311*4520Snw141292    ORDER BY log;
312*4520Snw141292  }
313*4520Snw141292} {0 {0 1 2 3 4 5 5 6 7 8}}
314*4520Snw141292do_test select4-5.2g {
315*4520Snw141292  catchsql {
316*4520Snw141292    SELECT DISTINCT log FROM t1
317*4520Snw141292    UNION ALL
318*4520Snw141292    SELECT n FROM t1 WHERE log=3
319*4520Snw141292    ORDER BY 1;
320*4520Snw141292  }
321*4520Snw141292} {0 {0 1 2 3 4 5 5 6 7 8}}
322*4520Snw141292do_test select4-5.2h {
323*4520Snw141292  catchsql {
324*4520Snw141292    SELECT DISTINCT log FROM t1
325*4520Snw141292    UNION ALL
326*4520Snw141292    SELECT n FROM t1 WHERE log=3
327*4520Snw141292    ORDER BY 2;
328*4520Snw141292  }
329*4520Snw141292} {1 {ORDER BY position 2 should be between 1 and 1}}
330*4520Snw141292do_test select4-5.2i {
331*4520Snw141292  catchsql {
332*4520Snw141292    SELECT DISTINCT 1, log FROM t1
333*4520Snw141292    UNION ALL
334*4520Snw141292    SELECT 2, n FROM t1 WHERE log=3
335*4520Snw141292    ORDER BY 2, 1;
336*4520Snw141292  }
337*4520Snw141292} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
338*4520Snw141292do_test select4-5.2j {
339*4520Snw141292  catchsql {
340*4520Snw141292    SELECT DISTINCT 1, log FROM t1
341*4520Snw141292    UNION ALL
342*4520Snw141292    SELECT 2, n FROM t1 WHERE log=3
343*4520Snw141292    ORDER BY 1, 2 DESC;
344*4520Snw141292  }
345*4520Snw141292} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
346*4520Snw141292do_test select4-5.2k {
347*4520Snw141292  catchsql {
348*4520Snw141292    SELECT DISTINCT 1, log FROM t1
349*4520Snw141292    UNION ALL
350*4520Snw141292    SELECT 2, n FROM t1 WHERE log=3
351*4520Snw141292    ORDER BY n, 1;
352*4520Snw141292  }
353*4520Snw141292} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
354*4520Snw141292do_test select4-5.3 {
355*4520Snw141292  set v [catch {execsql {
356*4520Snw141292    SELECT DISTINCT log, n FROM t1
357*4520Snw141292    UNION ALL
358*4520Snw141292    SELECT n FROM t1 WHERE log=3
359*4520Snw141292    ORDER BY log;
360*4520Snw141292  }} msg]
361*4520Snw141292  lappend v $msg
362*4520Snw141292} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
363*4520Snw141292do_test select4-5.4 {
364*4520Snw141292  set v [catch {execsql {
365*4520Snw141292    SELECT log FROM t1 WHERE n=2
366*4520Snw141292    UNION ALL
367*4520Snw141292    SELECT log FROM t1 WHERE n=3
368*4520Snw141292    UNION ALL
369*4520Snw141292    SELECT log FROM t1 WHERE n=4
370*4520Snw141292    UNION ALL
371*4520Snw141292    SELECT log FROM t1 WHERE n=5
372*4520Snw141292    ORDER BY log;
373*4520Snw141292  }} msg]
374*4520Snw141292  lappend v $msg
375*4520Snw141292} {0 {1 2 2 3}}
376*4520Snw141292
377*4520Snw141292do_test select4-6.1 {
378*4520Snw141292  execsql {
379*4520Snw141292    SELECT log, count(*) as cnt FROM t1 GROUP BY log
380*4520Snw141292    UNION
381*4520Snw141292    SELECT log, n FROM t1 WHERE n=7
382*4520Snw141292    ORDER BY cnt, log;
383*4520Snw141292  }
384*4520Snw141292} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
385*4520Snw141292do_test select4-6.2 {
386*4520Snw141292  execsql {
387*4520Snw141292    SELECT log, count(*) FROM t1 GROUP BY log
388*4520Snw141292    UNION
389*4520Snw141292    SELECT log, n FROM t1 WHERE n=7
390*4520Snw141292    ORDER BY count(*), log;
391*4520Snw141292  }
392*4520Snw141292} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
393*4520Snw141292
394*4520Snw141292# NULLs are indistinct for the UNION operator.
395*4520Snw141292# Make sure the UNION operator recognizes this
396*4520Snw141292#
397*4520Snw141292do_test select4-6.3 {
398*4520Snw141292  execsql {
399*4520Snw141292    SELECT NULL UNION SELECT NULL UNION
400*4520Snw141292    SELECT 1 UNION SELECT 2 AS 'x'
401*4520Snw141292    ORDER BY x;
402*4520Snw141292  }
403*4520Snw141292} {{} 1 2}
404*4520Snw141292do_test select4-6.3.1 {
405*4520Snw141292  execsql {
406*4520Snw141292    SELECT NULL UNION ALL SELECT NULL UNION ALL
407*4520Snw141292    SELECT 1 UNION ALL SELECT 2 AS 'x'
408*4520Snw141292    ORDER BY x;
409*4520Snw141292  }
410*4520Snw141292} {{} {} 1 2}
411*4520Snw141292
412*4520Snw141292# Make sure the DISTINCT keyword treats NULLs as indistinct.
413*4520Snw141292#
414*4520Snw141292do_test select4-6.4 {
415*4520Snw141292  execsql {
416*4520Snw141292    SELECT * FROM (
417*4520Snw141292       SELECT NULL, 1 UNION ALL SELECT NULL, 1
418*4520Snw141292    );
419*4520Snw141292  }
420*4520Snw141292} {{} 1 {} 1}
421*4520Snw141292do_test select4-6.5 {
422*4520Snw141292  execsql {
423*4520Snw141292    SELECT DISTINCT * FROM (
424*4520Snw141292       SELECT NULL, 1 UNION ALL SELECT NULL, 1
425*4520Snw141292    );
426*4520Snw141292  }
427*4520Snw141292} {{} 1}
428*4520Snw141292do_test select4-6.6 {
429*4520Snw141292  execsql {
430*4520Snw141292    SELECT DISTINCT * FROM (
431*4520Snw141292       SELECT 1,2  UNION ALL SELECT 1,2
432*4520Snw141292    );
433*4520Snw141292  }
434*4520Snw141292} {1 2}
435*4520Snw141292
436*4520Snw141292# Test distinctness of NULL in other ways.
437*4520Snw141292#
438*4520Snw141292do_test select4-6.7 {
439*4520Snw141292  execsql {
440*4520Snw141292    SELECT NULL EXCEPT SELECT NULL
441*4520Snw141292  }
442*4520Snw141292} {}
443*4520Snw141292
444*4520Snw141292
445*4520Snw141292# Make sure column names are correct when a compound select appears as
446*4520Snw141292# an expression in the WHERE clause.
447*4520Snw141292#
448*4520Snw141292do_test select4-7.1 {
449*4520Snw141292  execsql {
450*4520Snw141292    CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
451*4520Snw141292    SELECT * FROM t2 ORDER BY x;
452*4520Snw141292  }
453*4520Snw141292} {0 1 1 1 2 2 3 4 4 8 5 15}
454*4520Snw141292do_test select4-7.2 {
455*4520Snw141292  execsql2 {
456*4520Snw141292    SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
457*4520Snw141292    ORDER BY n
458*4520Snw141292  }
459*4520Snw141292} {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
460*4520Snw141292do_test select4-7.3 {
461*4520Snw141292  execsql2 {
462*4520Snw141292    SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
463*4520Snw141292    ORDER BY n LIMIT 2
464*4520Snw141292  }
465*4520Snw141292} {n 6 log 3 n 7 log 3}
466*4520Snw141292do_test select4-7.4 {
467*4520Snw141292  execsql2 {
468*4520Snw141292    SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
469*4520Snw141292    ORDER BY n LIMIT 2
470*4520Snw141292  }
471*4520Snw141292} {n 1 log 0 n 2 log 1}
472*4520Snw141292
473*4520Snw141292# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
474*4520Snw141292#
475*4520Snw141292do_test select4-8.1 {
476*4520Snw141292  execsql {
477*4520Snw141292    BEGIN;
478*4520Snw141292    CREATE TABLE t3(a text, b float, c text);
479*4520Snw141292    INSERT INTO t3 VALUES(1, 1.1, '1.1');
480*4520Snw141292    INSERT INTO t3 VALUES(2, 1.10, '1.10');
481*4520Snw141292    INSERT INTO t3 VALUES(3, 1.10, '1.1');
482*4520Snw141292    INSERT INTO t3 VALUES(4, 1.1, '1.10');
483*4520Snw141292    INSERT INTO t3 VALUES(5, 1.2, '1.2');
484*4520Snw141292    INSERT INTO t3 VALUES(6, 1.3, '1.3');
485*4520Snw141292    COMMIT;
486*4520Snw141292  }
487*4520Snw141292  execsql {
488*4520Snw141292    SELECT DISTINCT b FROM t3 ORDER BY c;
489*4520Snw141292  }
490*4520Snw141292} {1.1 1.2 1.3}
491*4520Snw141292do_test select4-8.2 {
492*4520Snw141292  execsql {
493*4520Snw141292    SELECT DISTINCT c FROM t3 ORDER BY c;
494*4520Snw141292  }
495*4520Snw141292} {1.1 1.10 1.2 1.3}
496*4520Snw141292
497*4520Snw141292
498*4520Snw141292finish_test
499