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