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