xref: /sqlite-3.40.0/test/select4.test (revision b3ad4e61)
1b19a2bc6Sdrh# 2001 September 15
292dba24bSdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
592dba24bSdrh#
6b19a2bc6Sdrh#    May you do good and not evil.
7b19a2bc6Sdrh#    May you find forgiveness for yourself and forgive others.
8b19a2bc6Sdrh#    May you share freely, never taking more than you give.
992dba24bSdrh#
1092dba24bSdrh#***********************************************************************
1192dba24bSdrh# This file implements regression tests for SQLite library.  The
1292dba24bSdrh# focus of this file is testing UNION, INTERSECT and EXCEPT operators
1392dba24bSdrh# in SELECT statements.
1492dba24bSdrh#
1592dba24bSdrh
1692dba24bSdrhset testdir [file dirname $argv0]
1792dba24bSdrhsource $testdir/tester.tcl
1892dba24bSdrh
1927c77438Sdanielk1977# Most tests in this file depend on compound-select. But there are a couple
2027c77438Sdanielk1977# right at the end that test DISTINCT, so we cannot omit the entire file.
2127c77438Sdanielk1977#
2227c77438Sdanielk1977ifcapable compound {
2327c77438Sdanielk1977
2492dba24bSdrh# Build some test data
2592dba24bSdrh#
2692dba24bSdrhexecsql {
2792dba24bSdrh  CREATE TABLE t1(n int, log int);
285f3b4ab5Sdrh  BEGIN;
2992dba24bSdrh}
305f3b4ab5Sdrhfor {set i 1} {$i<32} {incr i} {
3124acd8f9Sdanielk1977  for {set j 0} {(1<<$j)<$i} {incr j} {}
325f3b4ab5Sdrh  execsql "INSERT INTO t1 VALUES($i,$j)"
335f3b4ab5Sdrh}
345f3b4ab5Sdrhexecsql {
355f3b4ab5Sdrh  COMMIT;
365f3b4ab5Sdrh}
3792cd52f5Sdrh
3892cd52f5Sdrhdo_test select4-1.0 {
3992dba24bSdrh  execsql {SELECT DISTINCT log FROM t1 ORDER BY log}
4092dba24bSdrh} {0 1 2 3 4 5}
4192dba24bSdrh
4292dba24bSdrh# Union All operator
4392dba24bSdrh#
4492dba24bSdrhdo_test select4-1.1a {
4592dba24bSdrh  lsort [execsql {SELECT DISTINCT log FROM t1}]
4692dba24bSdrh} {0 1 2 3 4 5}
4792dba24bSdrhdo_test select4-1.1b {
4892dba24bSdrh  lsort [execsql {SELECT n FROM t1 WHERE log=3}]
4992dba24bSdrh} {5 6 7 8}
5092dba24bSdrhdo_test select4-1.1c {
5192dba24bSdrh  execsql {
5292dba24bSdrh    SELECT DISTINCT log FROM t1
5392dba24bSdrh    UNION ALL
5492dba24bSdrh    SELECT n FROM t1 WHERE log=3
5592dba24bSdrh    ORDER BY log;
5692dba24bSdrh  }
5792dba24bSdrh} {0 1 2 3 4 5 5 6 7 8}
58c926afbcSdrhdo_test select4-1.1d {
59c926afbcSdrh  execsql {
60c926afbcSdrh    CREATE TABLE t2 AS
61c926afbcSdrh      SELECT DISTINCT log FROM t1
62c926afbcSdrh      UNION ALL
63c926afbcSdrh      SELECT n FROM t1 WHERE log=3
64c926afbcSdrh      ORDER BY log;
65c926afbcSdrh    SELECT * FROM t2;
66c926afbcSdrh  }
67c926afbcSdrh} {0 1 2 3 4 5 5 6 7 8}
68c926afbcSdrhexecsql {DROP TABLE t2}
69c926afbcSdrhdo_test select4-1.1e {
70c926afbcSdrh  execsql {
71c926afbcSdrh    CREATE TABLE t2 AS
72c926afbcSdrh      SELECT DISTINCT log FROM t1
73c926afbcSdrh      UNION ALL
74c926afbcSdrh      SELECT n FROM t1 WHERE log=3
75c926afbcSdrh      ORDER BY log DESC;
76c926afbcSdrh    SELECT * FROM t2;
77c926afbcSdrh  }
78c926afbcSdrh} {8 7 6 5 5 4 3 2 1 0}
79c926afbcSdrhexecsql {DROP TABLE t2}
80f46f905aSdrhdo_test select4-1.1f {
81f46f905aSdrh  execsql {
82f46f905aSdrh    SELECT DISTINCT log FROM t1
83f46f905aSdrh    UNION ALL
84f46f905aSdrh    SELECT n FROM t1 WHERE log=2
85f46f905aSdrh  }
86f46f905aSdrh} {0 1 2 3 4 5 3 4}
87f46f905aSdrhdo_test select4-1.1g {
88f46f905aSdrh  execsql {
89f46f905aSdrh    CREATE TABLE t2 AS
90f46f905aSdrh      SELECT DISTINCT log FROM t1
91f46f905aSdrh      UNION ALL
92f46f905aSdrh      SELECT n FROM t1 WHERE log=2;
93f46f905aSdrh    SELECT * FROM t2;
94f46f905aSdrh  }
95f46f905aSdrh} {0 1 2 3 4 5 3 4}
96f46f905aSdrhexecsql {DROP TABLE t2}
97e61b9f4fSdanielk1977ifcapable subquery {
9892dba24bSdrh  do_test select4-1.2 {
9992dba24bSdrh    execsql {
10092dba24bSdrh      SELECT log FROM t1 WHERE n IN
10192dba24bSdrh        (SELECT DISTINCT log FROM t1 UNION ALL
10292dba24bSdrh         SELECT n FROM t1 WHERE log=3)
10392dba24bSdrh      ORDER BY log;
10492dba24bSdrh    }
10592dba24bSdrh  } {0 1 2 2 3 3 3 3}
106e61b9f4fSdanielk1977}
1072af878ecSdrh
1082af878ecSdrh# EVIDENCE-OF: R-02644-22131 In a compound SELECT statement, only the
1092af878ecSdrh# last or right-most simple SELECT may have an ORDER BY clause.
1102af878ecSdrh#
11192cd52f5Sdrhdo_test select4-1.3 {
11292cd52f5Sdrh  set v [catch {execsql {
11392cd52f5Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log
11492cd52f5Sdrh    UNION ALL
11592cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
11692cd52f5Sdrh    ORDER BY log;
11792cd52f5Sdrh  }} msg]
11892cd52f5Sdrh  lappend v $msg
11992cd52f5Sdrh} {1 {ORDER BY clause should come after UNION ALL not before}}
120a276e3fdSdrhdo_catchsql_test select4-1.4 {
1217b4da150Sdrh  SELECT (VALUES(0) INTERSECT SELECT(0) UNION SELECT(0) ORDER BY 1 UNION
122a276e3fdSdrh          SELECT 0 UNION SELECT 0 ORDER BY 1);
123a276e3fdSdrh} {1 {ORDER BY clause should come after UNION not before}}
12492dba24bSdrh
12592dba24bSdrh# Union operator
12692dba24bSdrh#
12792dba24bSdrhdo_test select4-2.1 {
12892dba24bSdrh  execsql {
12992dba24bSdrh    SELECT DISTINCT log FROM t1
13092dba24bSdrh    UNION
13192dba24bSdrh    SELECT n FROM t1 WHERE log=3
13292dba24bSdrh    ORDER BY log;
13392dba24bSdrh  }
13492dba24bSdrh} {0 1 2 3 4 5 6 7 8}
135e61b9f4fSdanielk1977ifcapable subquery {
13692dba24bSdrh  do_test select4-2.2 {
13792dba24bSdrh    execsql {
13892dba24bSdrh      SELECT log FROM t1 WHERE n IN
13992dba24bSdrh        (SELECT DISTINCT log FROM t1 UNION
14092dba24bSdrh         SELECT n FROM t1 WHERE log=3)
14192dba24bSdrh      ORDER BY log;
14292dba24bSdrh    }
14392dba24bSdrh  } {0 1 2 2 3 3 3 3}
144e61b9f4fSdanielk1977}
14592cd52f5Sdrhdo_test select4-2.3 {
14692cd52f5Sdrh  set v [catch {execsql {
14792cd52f5Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log
14892cd52f5Sdrh    UNION
14992cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
15092cd52f5Sdrh    ORDER BY log;
15192cd52f5Sdrh  }} msg]
15292cd52f5Sdrh  lappend v $msg
15392cd52f5Sdrh} {1 {ORDER BY clause should come after UNION not before}}
1547b4da150Sdrhdo_test select4-2.4 {
1557b4da150Sdrh  set v [catch {execsql {
1567b4da150Sdrh    SELECT 0 ORDER BY (SELECT 0) UNION SELECT 0;
1577b4da150Sdrh  }} msg]
1587b4da150Sdrh  lappend v $msg
1597b4da150Sdrh} {1 {ORDER BY clause should come after UNION not before}}
1609b40e474Sdrhdo_execsql_test select4-2.5 {
1619b40e474Sdrh  SELECT 123 AS x ORDER BY (SELECT x ORDER BY 1);
1629b40e474Sdrh} {123}
16392dba24bSdrh
16492dba24bSdrh# Except operator
16592dba24bSdrh#
166c926afbcSdrhdo_test select4-3.1.1 {
16792dba24bSdrh  execsql {
16892dba24bSdrh    SELECT DISTINCT log FROM t1
16992dba24bSdrh    EXCEPT
17092dba24bSdrh    SELECT n FROM t1 WHERE log=3
17192dba24bSdrh    ORDER BY log;
17292dba24bSdrh  }
17392dba24bSdrh} {0 1 2 3 4}
174c926afbcSdrhdo_test select4-3.1.2 {
175c926afbcSdrh  execsql {
176c926afbcSdrh    CREATE TABLE t2 AS
177c926afbcSdrh      SELECT DISTINCT log FROM t1
178c926afbcSdrh      EXCEPT
179c926afbcSdrh      SELECT n FROM t1 WHERE log=3
180c926afbcSdrh      ORDER BY log;
181c926afbcSdrh    SELECT * FROM t2;
182c926afbcSdrh  }
183c926afbcSdrh} {0 1 2 3 4}
184c926afbcSdrhexecsql {DROP TABLE t2}
185c926afbcSdrhdo_test select4-3.1.3 {
186c926afbcSdrh  execsql {
187c926afbcSdrh    CREATE TABLE t2 AS
188c926afbcSdrh      SELECT DISTINCT log FROM t1
189c926afbcSdrh      EXCEPT
190c926afbcSdrh      SELECT n FROM t1 WHERE log=3
191c926afbcSdrh      ORDER BY log DESC;
192c926afbcSdrh    SELECT * FROM t2;
193c926afbcSdrh  }
194c926afbcSdrh} {4 3 2 1 0}
195c926afbcSdrhexecsql {DROP TABLE t2}
196e61b9f4fSdanielk1977ifcapable subquery {
19792dba24bSdrh  do_test select4-3.2 {
19892dba24bSdrh    execsql {
19992dba24bSdrh      SELECT log FROM t1 WHERE n IN
20092dba24bSdrh        (SELECT DISTINCT log FROM t1 EXCEPT
20192dba24bSdrh         SELECT n FROM t1 WHERE log=3)
20292dba24bSdrh      ORDER BY log;
20392dba24bSdrh    }
20492dba24bSdrh  } {0 1 2 2}
205e61b9f4fSdanielk1977}
20692cd52f5Sdrhdo_test select4-3.3 {
20792cd52f5Sdrh  set v [catch {execsql {
20892cd52f5Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log
20992cd52f5Sdrh    EXCEPT
21092cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
21192cd52f5Sdrh    ORDER BY log;
21292cd52f5Sdrh  }} msg]
21392cd52f5Sdrh  lappend v $msg
21492cd52f5Sdrh} {1 {ORDER BY clause should come after EXCEPT not before}}
21592dba24bSdrh
21692dba24bSdrh# Intersect operator
21792dba24bSdrh#
218c926afbcSdrhdo_test select4-4.1.1 {
21992dba24bSdrh  execsql {
22092dba24bSdrh    SELECT DISTINCT log FROM t1
22192dba24bSdrh    INTERSECT
22292dba24bSdrh    SELECT n FROM t1 WHERE log=3
22392dba24bSdrh    ORDER BY log;
22492dba24bSdrh  }
22592dba24bSdrh} {5}
226452c989fSdanielk1977
227c926afbcSdrhdo_test select4-4.1.2 {
228c926afbcSdrh  execsql {
2291e281291Sdrh    SELECT DISTINCT log FROM t1
2301e281291Sdrh    UNION ALL
2311e281291Sdrh    SELECT 6
232c926afbcSdrh    INTERSECT
233c926afbcSdrh    SELECT n FROM t1 WHERE log=3
2341e281291Sdrh    ORDER BY t1.log;
235c926afbcSdrh  }
236c926afbcSdrh} {5 6}
2371e281291Sdrh
238c926afbcSdrhdo_test select4-4.1.3 {
239c926afbcSdrh  execsql {
240c926afbcSdrh    CREATE TABLE t2 AS
2413d1bfeaaSdanielk1977      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
242c926afbcSdrh      INTERSECT
243c926afbcSdrh      SELECT n FROM t1 WHERE log=3
244c926afbcSdrh      ORDER BY log;
245c926afbcSdrh    SELECT * FROM t2;
246c926afbcSdrh  }
247c926afbcSdrh} {5 6}
248c926afbcSdrhexecsql {DROP TABLE t2}
249c926afbcSdrhdo_test select4-4.1.4 {
250c926afbcSdrh  execsql {
251c926afbcSdrh    CREATE TABLE t2 AS
2523d1bfeaaSdanielk1977      SELECT DISTINCT log FROM t1 UNION ALL SELECT 6
253c926afbcSdrh      INTERSECT
254c926afbcSdrh      SELECT n FROM t1 WHERE log=3
255c926afbcSdrh      ORDER BY log DESC;
256c926afbcSdrh    SELECT * FROM t2;
257c926afbcSdrh  }
258c926afbcSdrh} {6 5}
259c926afbcSdrhexecsql {DROP TABLE t2}
260e61b9f4fSdanielk1977ifcapable subquery {
26192dba24bSdrh  do_test select4-4.2 {
26292dba24bSdrh    execsql {
26392dba24bSdrh      SELECT log FROM t1 WHERE n IN
26492dba24bSdrh        (SELECT DISTINCT log FROM t1 INTERSECT
26592dba24bSdrh         SELECT n FROM t1 WHERE log=3)
26692dba24bSdrh      ORDER BY log;
26792dba24bSdrh    }
26892dba24bSdrh  } {3}
269e61b9f4fSdanielk1977}
27092cd52f5Sdrhdo_test select4-4.3 {
27192cd52f5Sdrh  set v [catch {execsql {
27292cd52f5Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log
27392cd52f5Sdrh    INTERSECT
27492cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
27592cd52f5Sdrh    ORDER BY log;
27692cd52f5Sdrh  }} msg]
27792cd52f5Sdrh  lappend v $msg
27892cd52f5Sdrh} {1 {ORDER BY clause should come after INTERSECT not before}}
2799af8646dSdrhdo_catchsql_test select4-4.4 {
2809af8646dSdrh  SELECT 3 IN (
2819af8646dSdrh    SELECT 0 ORDER BY 1
2829af8646dSdrh    INTERSECT
2839af8646dSdrh    SELECT 1
2849af8646dSdrh    INTERSECT
2859af8646dSdrh    SELECT 2
2869af8646dSdrh    ORDER BY 1
2879af8646dSdrh  );
2889af8646dSdrh} {1 {ORDER BY clause should come after INTERSECT not before}}
28992cd52f5Sdrh
29092cd52f5Sdrh# Various error messages while processing UNION or INTERSECT
29192cd52f5Sdrh#
29292cd52f5Sdrhdo_test select4-5.1 {
29392cd52f5Sdrh  set v [catch {execsql {
29492cd52f5Sdrh    SELECT DISTINCT log FROM t2
29592cd52f5Sdrh    UNION ALL
29692cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
29792cd52f5Sdrh    ORDER BY log;
29892cd52f5Sdrh  }} msg]
29992cd52f5Sdrh  lappend v $msg
30092cd52f5Sdrh} {1 {no such table: t2}}
30192cd52f5Sdrhdo_test select4-5.2 {
30292cd52f5Sdrh  set v [catch {execsql {
30392cd52f5Sdrh    SELECT DISTINCT log AS "xyzzy" FROM t1
30492cd52f5Sdrh    UNION ALL
30592cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
30692cd52f5Sdrh    ORDER BY xyzzy;
30792cd52f5Sdrh  }} msg]
30892cd52f5Sdrh  lappend v $msg
30992cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}}
31092cd52f5Sdrhdo_test select4-5.2b {
31192cd52f5Sdrh  set v [catch {execsql {
31201f3f253Sdrh    SELECT DISTINCT log AS xyzzy FROM t1
31392cd52f5Sdrh    UNION ALL
31492cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
3154c774314Sdrh    ORDER BY "xyzzy";
31692cd52f5Sdrh  }} msg]
31792cd52f5Sdrh  lappend v $msg
31892cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}}
31992cd52f5Sdrhdo_test select4-5.2c {
32092cd52f5Sdrh  set v [catch {execsql {
32192cd52f5Sdrh    SELECT DISTINCT log FROM t1
32292cd52f5Sdrh    UNION ALL
32392cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
3244c774314Sdrh    ORDER BY "xyzzy";
32592cd52f5Sdrh  }} msg]
32692cd52f5Sdrh  lappend v $msg
32701874bfcSdanielk1977} {1 {1st ORDER BY term does not match any column in the result set}}
32892cd52f5Sdrhdo_test select4-5.2d {
32992cd52f5Sdrh  set v [catch {execsql {
33092cd52f5Sdrh    SELECT DISTINCT log FROM t1
33192cd52f5Sdrh    INTERSECT
33292cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
3334c774314Sdrh    ORDER BY "xyzzy";
33492cd52f5Sdrh  }} msg]
33592cd52f5Sdrh  lappend v $msg
33601874bfcSdanielk1977} {1 {1st ORDER BY term does not match any column in the result set}}
33792cd52f5Sdrhdo_test select4-5.2e {
33892cd52f5Sdrh  set v [catch {execsql {
33992cd52f5Sdrh    SELECT DISTINCT log FROM t1
34092cd52f5Sdrh    UNION ALL
34192cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
34292cd52f5Sdrh    ORDER BY n;
34392cd52f5Sdrh  }} msg]
34492cd52f5Sdrh  lappend v $msg
34592cd52f5Sdrh} {0 {0 1 2 3 4 5 5 6 7 8}}
346e4de1febSdrhdo_test select4-5.2f {
347e4de1febSdrh  catchsql {
348e4de1febSdrh    SELECT DISTINCT log FROM t1
349e4de1febSdrh    UNION ALL
350e4de1febSdrh    SELECT n FROM t1 WHERE log=3
351e4de1febSdrh    ORDER BY log;
352e4de1febSdrh  }
353e4de1febSdrh} {0 {0 1 2 3 4 5 5 6 7 8}}
354e4de1febSdrhdo_test select4-5.2g {
355e4de1febSdrh  catchsql {
356e4de1febSdrh    SELECT DISTINCT log FROM t1
357e4de1febSdrh    UNION ALL
358e4de1febSdrh    SELECT n FROM t1 WHERE log=3
359e4de1febSdrh    ORDER BY 1;
360e4de1febSdrh  }
361e4de1febSdrh} {0 {0 1 2 3 4 5 5 6 7 8}}
362e4de1febSdrhdo_test select4-5.2h {
363e4de1febSdrh  catchsql {
364e4de1febSdrh    SELECT DISTINCT log FROM t1
365e4de1febSdrh    UNION ALL
366e4de1febSdrh    SELECT n FROM t1 WHERE log=3
367e4de1febSdrh    ORDER BY 2;
368e4de1febSdrh  }
36901874bfcSdanielk1977} {1 {1st ORDER BY term out of range - should be between 1 and 1}}
370e4de1febSdrhdo_test select4-5.2i {
371e4de1febSdrh  catchsql {
372e4de1febSdrh    SELECT DISTINCT 1, log FROM t1
373e4de1febSdrh    UNION ALL
374e4de1febSdrh    SELECT 2, n FROM t1 WHERE log=3
375e4de1febSdrh    ORDER BY 2, 1;
376e4de1febSdrh  }
377e4de1febSdrh} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
378e4de1febSdrhdo_test select4-5.2j {
379e4de1febSdrh  catchsql {
380e4de1febSdrh    SELECT DISTINCT 1, log FROM t1
381e4de1febSdrh    UNION ALL
382e4de1febSdrh    SELECT 2, n FROM t1 WHERE log=3
383e4de1febSdrh    ORDER BY 1, 2 DESC;
384e4de1febSdrh  }
385e4de1febSdrh} {0 {1 5 1 4 1 3 1 2 1 1 1 0 2 8 2 7 2 6 2 5}}
386e4de1febSdrhdo_test select4-5.2k {
387e4de1febSdrh  catchsql {
388e4de1febSdrh    SELECT DISTINCT 1, log FROM t1
389e4de1febSdrh    UNION ALL
390e4de1febSdrh    SELECT 2, n FROM t1 WHERE log=3
391e4de1febSdrh    ORDER BY n, 1;
392e4de1febSdrh  }
393e4de1febSdrh} {0 {1 0 1 1 1 2 1 3 1 4 1 5 2 5 2 6 2 7 2 8}}
39492cd52f5Sdrhdo_test select4-5.3 {
39592cd52f5Sdrh  set v [catch {execsql {
39692cd52f5Sdrh    SELECT DISTINCT log, n FROM t1
39792cd52f5Sdrh    UNION ALL
39892cd52f5Sdrh    SELECT n FROM t1 WHERE log=3
39992cd52f5Sdrh    ORDER BY log;
40092cd52f5Sdrh  }} msg]
40192cd52f5Sdrh  lappend v $msg
40292cd52f5Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
40310c081adSdrhdo_test select4-5.3-3807-1 {
40410c081adSdrh  catchsql {
40510c081adSdrh    SELECT 1 UNION SELECT 2, 3 UNION SELECT 4, 5 ORDER BY 1;
40610c081adSdrh  }
40710c081adSdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
40892cd52f5Sdrhdo_test select4-5.4 {
40992cd52f5Sdrh  set v [catch {execsql {
41092cd52f5Sdrh    SELECT log FROM t1 WHERE n=2
41192cd52f5Sdrh    UNION ALL
41292cd52f5Sdrh    SELECT log FROM t1 WHERE n=3
41392cd52f5Sdrh    UNION ALL
41492cd52f5Sdrh    SELECT log FROM t1 WHERE n=4
41592cd52f5Sdrh    UNION ALL
41692cd52f5Sdrh    SELECT log FROM t1 WHERE n=5
41792cd52f5Sdrh    ORDER BY log;
41892cd52f5Sdrh  }} msg]
41992cd52f5Sdrh  lappend v $msg
42092cd52f5Sdrh} {0 {1 2 2 3}}
42192dba24bSdrh
4224cfa7934Sdrhdo_test select4-6.1 {
4234cfa7934Sdrh  execsql {
4244cfa7934Sdrh    SELECT log, count(*) as cnt FROM t1 GROUP BY log
4254cfa7934Sdrh    UNION
4264cfa7934Sdrh    SELECT log, n FROM t1 WHERE n=7
4274cfa7934Sdrh    ORDER BY cnt, log;
4284cfa7934Sdrh  }
4294cfa7934Sdrh} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
4304cfa7934Sdrhdo_test select4-6.2 {
4314cfa7934Sdrh  execsql {
4324cfa7934Sdrh    SELECT log, count(*) FROM t1 GROUP BY log
4334cfa7934Sdrh    UNION
4344cfa7934Sdrh    SELECT log, n FROM t1 WHERE n=7
4354cfa7934Sdrh    ORDER BY count(*), log;
4364cfa7934Sdrh  }
4374cfa7934Sdrh} {0 1 1 1 2 2 3 4 3 7 4 8 5 15}
4384cfa7934Sdrh
439f570f011Sdrh# NULLs are indistinct for the UNION operator.
440f570f011Sdrh# Make sure the UNION operator recognizes this
441f5905aa7Sdrh#
442f5905aa7Sdrhdo_test select4-6.3 {
443f5905aa7Sdrh  execsql {
444f5905aa7Sdrh    SELECT NULL UNION SELECT NULL UNION
445f5905aa7Sdrh    SELECT 1 UNION SELECT 2 AS 'x'
446f5905aa7Sdrh    ORDER BY x;
447f5905aa7Sdrh  }
448f570f011Sdrh} {{} 1 2}
449f570f011Sdrhdo_test select4-6.3.1 {
450f5905aa7Sdrh  execsql {
451f5905aa7Sdrh    SELECT NULL UNION ALL SELECT NULL UNION ALL
452f5905aa7Sdrh    SELECT 1 UNION ALL SELECT 2 AS 'x'
453f5905aa7Sdrh    ORDER BY x;
454f5905aa7Sdrh  }
455f5905aa7Sdrh} {{} {} 1 2}
456f5905aa7Sdrh
457f570f011Sdrh# Make sure the DISTINCT keyword treats NULLs as indistinct.
458f5905aa7Sdrh#
459e61b9f4fSdanielk1977ifcapable subquery {
460f5905aa7Sdrh  do_test select4-6.4 {
461f5905aa7Sdrh    execsql {
462f5905aa7Sdrh      SELECT * FROM (
463f5905aa7Sdrh         SELECT NULL, 1 UNION ALL SELECT NULL, 1
464f5905aa7Sdrh      );
465f5905aa7Sdrh    }
466f5905aa7Sdrh  } {{} 1 {} 1}
467f5905aa7Sdrh  do_test select4-6.5 {
468f5905aa7Sdrh    execsql {
469f5905aa7Sdrh      SELECT DISTINCT * FROM (
470f5905aa7Sdrh         SELECT NULL, 1 UNION ALL SELECT NULL, 1
471f5905aa7Sdrh      );
472f5905aa7Sdrh    }
473f570f011Sdrh  } {{} 1}
474f5905aa7Sdrh  do_test select4-6.6 {
475f5905aa7Sdrh    execsql {
476f5905aa7Sdrh      SELECT DISTINCT * FROM (
477f5905aa7Sdrh         SELECT 1,2  UNION ALL SELECT 1,2
478f5905aa7Sdrh      );
479f5905aa7Sdrh    }
480f5905aa7Sdrh  } {1 2}
481e61b9f4fSdanielk1977}
482f5905aa7Sdrh
483bb113518Sdrh# Test distinctness of NULL in other ways.
484bb113518Sdrh#
485bb113518Sdrhdo_test select4-6.7 {
486bb113518Sdrh  execsql {
487bb113518Sdrh    SELECT NULL EXCEPT SELECT NULL
488bb113518Sdrh  }
489f570f011Sdrh} {}
490bb113518Sdrh
491f5905aa7Sdrh
49241202ccaSdrh# Make sure column names are correct when a compound select appears as
49341202ccaSdrh# an expression in the WHERE clause.
49441202ccaSdrh#
49541202ccaSdrhdo_test select4-7.1 {
49641202ccaSdrh  execsql {
49741202ccaSdrh    CREATE TABLE t2 AS SELECT log AS 'x', count(*) AS 'y' FROM t1 GROUP BY log;
49841202ccaSdrh    SELECT * FROM t2 ORDER BY x;
49941202ccaSdrh  }
50041202ccaSdrh} {0 1 1 1 2 2 3 4 4 8 5 15}
501e61b9f4fSdanielk1977ifcapable subquery {
50241202ccaSdrh  do_test select4-7.2 {
50341202ccaSdrh    execsql2 {
50441202ccaSdrh      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 INTERSECT SELECT x FROM t2)
50541202ccaSdrh      ORDER BY n
50641202ccaSdrh    }
50741202ccaSdrh  } {n 1 log 0 n 2 log 1 n 3 log 2 n 4 log 2 n 5 log 3}
50841202ccaSdrh  do_test select4-7.3 {
50941202ccaSdrh    execsql2 {
51041202ccaSdrh      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 EXCEPT SELECT x FROM t2)
51141202ccaSdrh      ORDER BY n LIMIT 2
51241202ccaSdrh    }
51341202ccaSdrh  } {n 6 log 3 n 7 log 3}
51441202ccaSdrh  do_test select4-7.4 {
51541202ccaSdrh    execsql2 {
51641202ccaSdrh      SELECT * FROM t1 WHERE n IN (SELECT n FROM t1 UNION SELECT x FROM t2)
51741202ccaSdrh      ORDER BY n LIMIT 2
51841202ccaSdrh    }
51941202ccaSdrh  } {n 1 log 0 n 2 log 1}
520e61b9f4fSdanielk1977} ;# ifcapable subquery
52141202ccaSdrh
52227c77438Sdanielk1977} ;# ifcapable compound
52327c77438Sdanielk1977
524bb999ef6Sdrh# Make sure DISTINCT works appropriately on TEXT and NUMERIC columns.
525bb999ef6Sdrhdo_test select4-8.1 {
526bb999ef6Sdrh  execsql {
527bb999ef6Sdrh    BEGIN;
528bb999ef6Sdrh    CREATE TABLE t3(a text, b float, c text);
5293d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(1, 1.1, '1.1');
5303d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(2, 1.10, '1.10');
5313d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(3, 1.10, '1.1');
5323d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(4, 1.1, '1.10');
5333d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(5, 1.2, '1.2');
5343d1bfeaaSdanielk1977    INSERT INTO t3 VALUES(6, 1.3, '1.3');
535bb999ef6Sdrh    COMMIT;
536bb999ef6Sdrh  }
537bb999ef6Sdrh  execsql {
538bb999ef6Sdrh    SELECT DISTINCT b FROM t3 ORDER BY c;
539bb999ef6Sdrh  }
540bb999ef6Sdrh} {1.1 1.2 1.3}
541bb999ef6Sdrhdo_test select4-8.2 {
542bb999ef6Sdrh  execsql {
543bb999ef6Sdrh    SELECT DISTINCT c FROM t3 ORDER BY c;
544bb999ef6Sdrh  }
545bb999ef6Sdrh} {1.1 1.10 1.2 1.3}
546bb999ef6Sdrh
54792378253Sdrh# Make sure the names of columns are taken from the right-most subquery
54892378253Sdrh# right in a compound query.  Ticket #1721
54992378253Sdrh#
5504b2688abSdanielk1977ifcapable compound {
5514b2688abSdanielk1977
55292378253Sdrhdo_test select4-9.1 {
55392378253Sdrh  execsql2 {
55492378253Sdrh    SELECT x, y FROM t2 UNION SELECT a, b FROM t3 ORDER BY x LIMIT 1
55592378253Sdrh  }
55692378253Sdrh} {x 0 y 1}
55792378253Sdrhdo_test select4-9.2 {
55892378253Sdrh  execsql2 {
55992378253Sdrh    SELECT x, y FROM t2 UNION ALL SELECT a, b FROM t3 ORDER BY x LIMIT 1
56092378253Sdrh  }
56192378253Sdrh} {x 0 y 1}
56292378253Sdrhdo_test select4-9.3 {
56392378253Sdrh  execsql2 {
56492378253Sdrh    SELECT x, y FROM t2 EXCEPT SELECT a, b FROM t3 ORDER BY x LIMIT 1
56592378253Sdrh  }
56692378253Sdrh} {x 0 y 1}
56792378253Sdrhdo_test select4-9.4 {
56892378253Sdrh  execsql2 {
56992378253Sdrh    SELECT x, y FROM t2 INTERSECT SELECT 0 AS a, 1 AS b;
57092378253Sdrh  }
57192378253Sdrh} {x 0 y 1}
57292378253Sdrhdo_test select4-9.5 {
57392378253Sdrh  execsql2 {
57492378253Sdrh    SELECT 0 AS x, 1 AS y
57592378253Sdrh    UNION
57692378253Sdrh    SELECT 2 AS p, 3 AS q
57792378253Sdrh    UNION
57892378253Sdrh    SELECT 4 AS a, 5 AS b
57992378253Sdrh    ORDER BY x LIMIT 1
58092378253Sdrh  }
58192378253Sdrh} {x 0 y 1}
5824b2688abSdanielk1977
5834b2688abSdanielk1977ifcapable subquery {
58492378253Sdrhdo_test select4-9.6 {
58592378253Sdrh  execsql2 {
58692378253Sdrh    SELECT * FROM (
58792378253Sdrh      SELECT 0 AS x, 1 AS y
58892378253Sdrh      UNION
58992378253Sdrh      SELECT 2 AS p, 3 AS q
59092378253Sdrh      UNION
59192378253Sdrh      SELECT 4 AS a, 5 AS b
59292378253Sdrh    ) ORDER BY 1 LIMIT 1;
59392378253Sdrh  }
59492378253Sdrh} {x 0 y 1}
59592378253Sdrhdo_test select4-9.7 {
59692378253Sdrh  execsql2 {
59792378253Sdrh    SELECT * FROM (
59892378253Sdrh      SELECT 0 AS x, 1 AS y
59992378253Sdrh      UNION
60092378253Sdrh      SELECT 2 AS p, 3 AS q
60192378253Sdrh      UNION
60292378253Sdrh      SELECT 4 AS a, 5 AS b
60392378253Sdrh    ) ORDER BY x LIMIT 1;
60492378253Sdrh  }
60592378253Sdrh} {x 0 y 1}
6064b2688abSdanielk1977} ;# ifcapable subquery
6074b2688abSdanielk1977
60892378253Sdrhdo_test select4-9.8 {
60901874bfcSdanielk1977  execsql {
61092378253Sdrh    SELECT 0 AS x, 1 AS y
61192378253Sdrh    UNION
61292378253Sdrh    SELECT 2 AS y, -3 AS x
61392378253Sdrh    ORDER BY x LIMIT 1;
61492378253Sdrh  }
61501874bfcSdanielk1977} {0 1}
61670517ab9Sdanielk1977
6174b2688abSdanielk1977do_test select4-9.9.1 {
61892378253Sdrh  execsql2 {
61992378253Sdrh    SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a
62092378253Sdrh  }
62192378253Sdrh} {a 1 b 2 a 3 b 4}
6224b2688abSdanielk1977
6234b2688abSdanielk1977ifcapable subquery {
6244b2688abSdanielk1977do_test select4-9.9.2 {
62592378253Sdrh  execsql2 {
62692378253Sdrh    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
62792378253Sdrh     WHERE b=3
62892378253Sdrh  }
62992378253Sdrh} {}
63092378253Sdrhdo_test select4-9.10 {
63192378253Sdrh  execsql2 {
63292378253Sdrh    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS b, 4 AS a)
63392378253Sdrh     WHERE b=2
63492378253Sdrh  }
63592378253Sdrh} {a 1 b 2}
63692378253Sdrhdo_test select4-9.11 {
63792378253Sdrh  execsql2 {
63892378253Sdrh    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
63992378253Sdrh     WHERE b=2
64092378253Sdrh  }
64192378253Sdrh} {a 1 b 2}
64292378253Sdrhdo_test select4-9.12 {
64392378253Sdrh  execsql2 {
64492378253Sdrh    SELECT * FROM (SELECT 1 AS a, 2 AS b UNION ALL SELECT 3 AS e, 4 AS b)
64592378253Sdrh     WHERE b>0
64692378253Sdrh  }
64792378253Sdrh} {a 1 b 2 a 3 b 4}
6484b2688abSdanielk1977} ;# ifcapable subquery
6494b2688abSdanielk1977
650b7654111Sdrh# Try combining DISTINCT, LIMIT, and OFFSET.  Make sure they all work
651b7654111Sdrh# together.
652b7654111Sdrh#
653b7654111Sdrhdo_test select4-10.1 {
654b7654111Sdrh  execsql {
655b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log
656b7654111Sdrh  }
657b7654111Sdrh} {0 1 2 3 4 5}
658b7654111Sdrhdo_test select4-10.2 {
659b7654111Sdrh  execsql {
660b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 4
661b7654111Sdrh  }
662b7654111Sdrh} {0 1 2 3}
663b7654111Sdrhdo_test select4-10.3 {
664b7654111Sdrh  execsql {
665b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0
666b7654111Sdrh  }
667b7654111Sdrh} {}
668b7654111Sdrhdo_test select4-10.4 {
669b7654111Sdrh  execsql {
670b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1
671b7654111Sdrh  }
672b7654111Sdrh} {0 1 2 3 4 5}
673b7654111Sdrhdo_test select4-10.5 {
674b7654111Sdrh  execsql {
675b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT -1 OFFSET 2
676b7654111Sdrh  }
677b7654111Sdrh} {2 3 4 5}
678b7654111Sdrhdo_test select4-10.6 {
679b7654111Sdrh  execsql {
680b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 3 OFFSET 2
681b7654111Sdrh  }
682b7654111Sdrh} {2 3 4}
683b7654111Sdrhdo_test select4-10.7 {
684b7654111Sdrh  execsql {
685b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY +log LIMIT 3 OFFSET 20
686b7654111Sdrh  }
687b7654111Sdrh} {}
688b7654111Sdrhdo_test select4-10.8 {
689b7654111Sdrh  execsql {
690b7654111Sdrh    SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
691b7654111Sdrh  }
692b7654111Sdrh} {}
693b7654111Sdrhdo_test select4-10.9 {
694b7654111Sdrh  execsql {
695b7654111Sdrh    SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
696b7654111Sdrh  }
697b7654111Sdrh} {31 5}
698b7654111Sdrh
699ad27e761Sdrh# Make sure compound SELECTs with wildly different numbers of columns
700ad27e761Sdrh# do not cause assertion faults due to register allocation issues.
701ad27e761Sdrh#
702ad27e761Sdrhdo_test select4-11.1 {
703ad27e761Sdrh  catchsql {
704ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
705ad27e761Sdrh    UNION
706ad27e761Sdrh    SELECT x FROM t2
707ad27e761Sdrh  }
708ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
709ad27e761Sdrhdo_test select4-11.2 {
710ad27e761Sdrh  catchsql {
711ad27e761Sdrh    SELECT x FROM t2
712ad27e761Sdrh    UNION
713ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
714ad27e761Sdrh  }
715ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
716ad27e761Sdrhdo_test select4-11.3 {
717ad27e761Sdrh  catchsql {
718ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
719ad27e761Sdrh    UNION ALL
720ad27e761Sdrh    SELECT x FROM t2
721ad27e761Sdrh  }
722ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
723ad27e761Sdrhdo_test select4-11.4 {
724ad27e761Sdrh  catchsql {
725ad27e761Sdrh    SELECT x FROM t2
726ad27e761Sdrh    UNION ALL
727ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
728ad27e761Sdrh  }
729ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
730ad27e761Sdrhdo_test select4-11.5 {
731ad27e761Sdrh  catchsql {
732ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
733ad27e761Sdrh    EXCEPT
734ad27e761Sdrh    SELECT x FROM t2
735ad27e761Sdrh  }
736ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
737ad27e761Sdrhdo_test select4-11.6 {
738ad27e761Sdrh  catchsql {
739ad27e761Sdrh    SELECT x FROM t2
740ad27e761Sdrh    EXCEPT
741ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
742ad27e761Sdrh  }
743ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
744ad27e761Sdrhdo_test select4-11.7 {
745ad27e761Sdrh  catchsql {
746ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
747ad27e761Sdrh    INTERSECT
748ad27e761Sdrh    SELECT x FROM t2
749ad27e761Sdrh  }
750ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
751ad27e761Sdrhdo_test select4-11.8 {
752ad27e761Sdrh  catchsql {
753ad27e761Sdrh    SELECT x FROM t2
754ad27e761Sdrh    INTERSECT
755ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
756ad27e761Sdrh  }
757ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
758ad27e761Sdrh
759ad27e761Sdrhdo_test select4-11.11 {
760ad27e761Sdrh  catchsql {
761ad27e761Sdrh    SELECT x FROM t2
762ad27e761Sdrh    UNION
763ad27e761Sdrh    SELECT x FROM t2
764ad27e761Sdrh    UNION ALL
765ad27e761Sdrh    SELECT x FROM t2
766ad27e761Sdrh    EXCEPT
767ad27e761Sdrh    SELECT x FROM t2
768ad27e761Sdrh    INTERSECT
769ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
770ad27e761Sdrh  }
771ad27e761Sdrh} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
772ad27e761Sdrhdo_test select4-11.12 {
773ad27e761Sdrh  catchsql {
774ad27e761Sdrh    SELECT x FROM t2
775ad27e761Sdrh    UNION
776ad27e761Sdrh    SELECT x FROM t2
777ad27e761Sdrh    UNION ALL
778ad27e761Sdrh    SELECT x FROM t2
779ad27e761Sdrh    EXCEPT
780ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
781ad27e761Sdrh    EXCEPT
782ad27e761Sdrh    SELECT x FROM t2
783ad27e761Sdrh  }
784ad27e761Sdrh} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
785ad27e761Sdrhdo_test select4-11.13 {
786ad27e761Sdrh  catchsql {
787ad27e761Sdrh    SELECT x FROM t2
788ad27e761Sdrh    UNION
789ad27e761Sdrh    SELECT x FROM t2
790ad27e761Sdrh    UNION ALL
791ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
792ad27e761Sdrh    UNION ALL
793ad27e761Sdrh    SELECT x FROM t2
794ad27e761Sdrh    EXCEPT
795ad27e761Sdrh    SELECT x FROM t2
796ad27e761Sdrh  }
797ad27e761Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
798ad27e761Sdrhdo_test select4-11.14 {
799ad27e761Sdrh  catchsql {
800ad27e761Sdrh    SELECT x FROM t2
801ad27e761Sdrh    UNION
802ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
803ad27e761Sdrh    UNION
804ad27e761Sdrh    SELECT x FROM t2
805ad27e761Sdrh    UNION ALL
806ad27e761Sdrh    SELECT x FROM t2
807ad27e761Sdrh    EXCEPT
808ad27e761Sdrh    SELECT x FROM t2
809ad27e761Sdrh  }
810ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
811ad27e761Sdrhdo_test select4-11.15 {
812ad27e761Sdrh  catchsql {
813ad27e761Sdrh    SELECT x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x FROM t2
814ad27e761Sdrh    UNION
815ad27e761Sdrh    SELECT x FROM t2
816ad27e761Sdrh    INTERSECT
817ad27e761Sdrh    SELECT x FROM t2
818ad27e761Sdrh    UNION ALL
819ad27e761Sdrh    SELECT x FROM t2
820ad27e761Sdrh    EXCEPT
821ad27e761Sdrh    SELECT x FROM t2
822ad27e761Sdrh  }
823ad27e761Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
8243dc4cc66Sdrhdo_test select4-11.16 {
8253dc4cc66Sdrh  catchsql {
8263dc4cc66Sdrh    INSERT INTO t2(rowid) VALUES(2) UNION SELECT 3,4 UNION SELECT 5,6 ORDER BY 1;
8273dc4cc66Sdrh  }
8283dc4cc66Sdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
829b7654111Sdrh
83010c081adSdrhdo_test select4-12.1 {
83110c081adSdrh  sqlite3 db2 :memory:
83210c081adSdrh  catchsql {
83310c081adSdrh    SELECT 1 UNION SELECT 2,3 UNION SELECT 4,5 ORDER BY 1;
83410c081adSdrh  } db2
83510c081adSdrh} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
83610c081adSdrh
837de3e41e3Sdanielk1977} ;# ifcapable compound
838de3e41e3Sdanielk1977
839c724008bSdrh
840c724008bSdrh# Ticket [3557ad65a076c] - Incorrect DISTINCT processing with an
841c724008bSdrh# indexed query using IN.
842c724008bSdrh#
843c724008bSdrhdo_test select4-13.1 {
844c724008bSdrh  sqlite3 db test.db
845c724008bSdrh  db eval {
846c724008bSdrh    CREATE TABLE t13(a,b);
847c724008bSdrh    INSERT INTO t13 VALUES(1,1);
848c724008bSdrh    INSERT INTO t13 VALUES(2,1);
849c724008bSdrh    INSERT INTO t13 VALUES(3,1);
850c724008bSdrh    INSERT INTO t13 VALUES(2,2);
851c724008bSdrh    INSERT INTO t13 VALUES(3,2);
852c724008bSdrh    INSERT INTO t13 VALUES(4,2);
853c724008bSdrh    CREATE INDEX t13ab ON t13(a,b);
854c724008bSdrh    SELECT DISTINCT b from t13 WHERE a IN (1,2,3);
855c724008bSdrh  }
856c724008bSdrh} {1 2}
857c724008bSdrh
858c0bf493eSdrh# 2014-02-18: Make sure compound SELECTs work with VALUES clauses
859c0bf493eSdrh#
860c0bf493eSdrhdo_execsql_test select4-14.1 {
861c0bf493eSdrh  CREATE TABLE t14(a,b,c);
862c0bf493eSdrh  INSERT INTO t14 VALUES(1,2,3),(4,5,6);
863c0bf493eSdrh  SELECT * FROM t14 INTERSECT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
864c0bf493eSdrh} {1 2 3}
865c0bf493eSdrhdo_execsql_test select4-14.2 {
866c0bf493eSdrh  SELECT * FROM t14 INTERSECT VALUES(1,2,3);
867c0bf493eSdrh} {1 2 3}
868c0bf493eSdrhdo_execsql_test select4-14.3 {
869c0bf493eSdrh  SELECT * FROM t14
870c0bf493eSdrh   UNION VALUES(3,2,1),(2,3,1),(1,2,3),(7,8,9),(4,5,6)
871c0bf493eSdrh   UNION SELECT * FROM t14 ORDER BY 1, 2, 3
872c0bf493eSdrh} {1 2 3 2 3 1 3 2 1 4 5 6 7 8 9}
873c0bf493eSdrhdo_execsql_test select4-14.4 {
874c0bf493eSdrh  SELECT * FROM t14
875c0bf493eSdrh   UNION VALUES(3,2,1)
876c0bf493eSdrh   UNION SELECT * FROM t14 ORDER BY 1, 2, 3
877c0bf493eSdrh} {1 2 3 3 2 1 4 5 6}
878c0bf493eSdrhdo_execsql_test select4-14.5 {
879c0bf493eSdrh  SELECT * FROM t14 EXCEPT VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
880c0bf493eSdrh} {4 5 6}
881c0bf493eSdrhdo_execsql_test select4-14.6 {
882c0bf493eSdrh  SELECT * FROM t14 EXCEPT VALUES(1,2,3)
883c0bf493eSdrh} {4 5 6}
884c0bf493eSdrhdo_execsql_test select4-14.7 {
885c0bf493eSdrh  SELECT * FROM t14 EXCEPT VALUES(1,2,3) EXCEPT VALUES(4,5,6)
886c0bf493eSdrh} {}
887c0bf493eSdrhdo_execsql_test select4-14.8 {
888c0bf493eSdrh  SELECT * FROM t14 EXCEPT VALUES('a','b','c') EXCEPT VALUES(4,5,6)
889c0bf493eSdrh} {1 2 3}
890c0bf493eSdrhdo_execsql_test select4-14.9 {
891c0bf493eSdrh  SELECT * FROM t14 UNION ALL VALUES(3,2,1),(2,3,1),(1,2,3),(2,1,3);
892c0bf493eSdrh} {1 2 3 4 5 6 3 2 1 2 3 1 1 2 3 2 1 3}
8931978d171Sdrhdo_execsql_test select4-14.10 {
8941978d171Sdrh  SELECT (VALUES(1),(2),(3),(4))
8951978d171Sdrh} {1}
8961978d171Sdrhdo_execsql_test select4-14.11 {
8971978d171Sdrh  SELECT (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4)
8981978d171Sdrh} {1}
899772460fdSdrhdo_execsql_test select4-14.12 {
900772460fdSdrh  VALUES(1) UNION VALUES(2);
901772460fdSdrh} {1 2}
902772460fdSdrhdo_execsql_test select4-14.13 {
903772460fdSdrh  VALUES(1),(2),(3) EXCEPT VALUES(2);
904772460fdSdrh} {1 3}
905772460fdSdrhdo_execsql_test select4-14.14 {
906772460fdSdrh  VALUES(1),(2),(3) EXCEPT VALUES(1),(3);
907772460fdSdrh} {2}
90860f4e091Sdrhdo_execsql_test select4-14.15 {
90960f4e091Sdrh  SELECT * FROM (SELECT 123), (SELECT 456) ON likely(0 OR 1) OR 0;
91060f4e091Sdrh} {123 456}
91100d5ab74Sdrhdo_execsql_test select4-14.16 {
91200d5ab74Sdrh  VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 99;
91300d5ab74Sdrh} {1 2 3 4 5}
91400d5ab74Sdrhdo_execsql_test select4-14.17 {
91500d5ab74Sdrh  VALUES(1),(2),(3),(4) UNION ALL SELECT 5 LIMIT 3;
91600d5ab74Sdrh} {1 2 3}
917c0bf493eSdrh
9182fade2f7Sdrh# Ticket https://www.sqlite.org/src/info/d06a25c84454a372
9192fade2f7Sdrh# Incorrect answer due to two co-routines using the same registers and expecting
9202fade2f7Sdrh# those register values to be preserved across a Yield.
9212fade2f7Sdrh#
9222fade2f7Sdrhdo_execsql_test select4-15.1 {
9232fade2f7Sdrh  DROP TABLE IF EXISTS tx;
9242fade2f7Sdrh  CREATE TABLE tx(id INTEGER PRIMARY KEY, a, b);
9252fade2f7Sdrh  INSERT INTO tx(a,b) VALUES(33,456);
9262fade2f7Sdrh  INSERT INTO tx(a,b) VALUES(33,789);
9272fade2f7Sdrh
9282fade2f7Sdrh  SELECT DISTINCT t0.id, t0.a, t0.b
9292fade2f7Sdrh    FROM tx AS t0, tx AS t1
9302fade2f7Sdrh   WHERE t0.a=t1.a AND t1.a=33 AND t0.b=456
9312fade2f7Sdrh  UNION
9322fade2f7Sdrh  SELECT DISTINCT t0.id, t0.a, t0.b
9332fade2f7Sdrh    FROM tx AS t0, tx AS t1
9342fade2f7Sdrh   WHERE t0.a=t1.a AND t1.a=33 AND t0.b=789
9352fade2f7Sdrh   ORDER BY 1;
9362fade2f7Sdrh} {1 33 456 2 33 789}
9372fade2f7Sdrh
9380ff47e9eSdrh# Enhancement (2016-03-15):  Use a co-routine for subqueries if the
9390ff47e9eSdrh# subquery is guaranteed to be the outer-most query
9400ff47e9eSdrh#
9410ff47e9eSdrhdo_execsql_test select4-16.1 {
9420ff47e9eSdrh  DROP TABLE IF EXISTS t1;
9430ff47e9eSdrh  CREATE TABLE t1(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,
9440ff47e9eSdrh  PRIMARY KEY(a,b DESC)) WITHOUT ROWID;
9450ff47e9eSdrh
9460ff47e9eSdrh  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100)
9470ff47e9eSdrh  INSERT INTO t1(a,b,c,d)
9480ff47e9eSdrh    SELECT x%10, x/10, x, printf('xyz%dabc',x) FROM c;
9490ff47e9eSdrh
9500ff47e9eSdrh  SELECT t3.c FROM
9510ff47e9eSdrh    (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
9520ff47e9eSdrh    JOIN t1 AS t3
9530ff47e9eSdrh  WHERE t2.a=t3.a AND t2.m=t3.b
9540ff47e9eSdrh  ORDER BY t3.a;
9550ff47e9eSdrh} {95 96 97 98 99}
9560ff47e9eSdrhdo_execsql_test select4-16.2 {
9570ff47e9eSdrh  SELECT t3.c FROM
9580ff47e9eSdrh    (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
9590ff47e9eSdrh    CROSS JOIN t1 AS t3
9600ff47e9eSdrh  WHERE t2.a=t3.a AND t2.m=t3.b
9610ff47e9eSdrh  ORDER BY t3.a;
9620ff47e9eSdrh} {95 96 97 98 99}
9630ff47e9eSdrhdo_execsql_test select4-16.3 {
9640ff47e9eSdrh  SELECT t3.c FROM
9650ff47e9eSdrh    (SELECT a,max(b) AS m FROM t1 WHERE a>=5 GROUP BY a) AS t2
9660ff47e9eSdrh    LEFT JOIN t1 AS t3
9670ff47e9eSdrh  WHERE t2.a=t3.a AND t2.m=t3.b
9680ff47e9eSdrh  ORDER BY t3.a;
9690ff47e9eSdrh} {95 96 97 98 99}
9700ff47e9eSdrh
971b1ec87afSdrh# Ticket https://www.sqlite.org/src/tktview/f7f8c97e975978d45  on 2016-04-25
972b1ec87afSdrh#
973b1ec87afSdrh# The where push-down optimization from 2015-06-02 is suppose to disable
974b1ec87afSdrh# on aggregate subqueries.  But if the subquery is a compound where the
975b1ec87afSdrh# last SELECT is non-aggregate but some other SELECT is an aggregate, the
976b1ec87afSdrh# test is incomplete and the optimization is not properly disabled.
977b1ec87afSdrh#
978b1ec87afSdrh# The following test cases verify that the fix works.
979b1ec87afSdrh#
980b1ec87afSdrhdo_execsql_test select4-17.1 {
981b1ec87afSdrh  DROP TABLE IF EXISTS t1;
982b1ec87afSdrh  CREATE TABLE t1(a int, b int);
983b1ec87afSdrh  INSERT INTO t1 VALUES(1,2),(1,18),(2,19);
984b1ec87afSdrh  SELECT x, y FROM (
985b1ec87afSdrh    SELECT 98 AS x, 99 AS y
986b1ec87afSdrh    UNION
987b1ec87afSdrh    SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
988b1ec87afSdrh  ) AS w WHERE y>=20
989b1ec87afSdrh  ORDER BY +x;
990b1ec87afSdrh} {1 20 98 99}
991b1ec87afSdrhdo_execsql_test select4-17.2 {
992b1ec87afSdrh  SELECT x, y FROM (
993b1ec87afSdrh    SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a
994b1ec87afSdrh    UNION
995b1ec87afSdrh    SELECT 98 AS x, 99 AS y
996b1ec87afSdrh  ) AS w WHERE y>=20
997b1ec87afSdrh  ORDER BY +x;
998b1ec87afSdrh} {1 20 98 99}
999b1ec87afSdrhdo_catchsql_test select4-17.3 {
1000b1ec87afSdrh  SELECT x, y FROM (
1001b1ec87afSdrh    SELECT a AS x, sum(b) AS y FROM t1 GROUP BY a LIMIT 3
1002b1ec87afSdrh    UNION
1003b1ec87afSdrh    SELECT 98 AS x, 99 AS y
1004b1ec87afSdrh  ) AS w WHERE y>=20
1005b1ec87afSdrh  ORDER BY +x;
1006b1ec87afSdrh} {1 {LIMIT clause should come after UNION not before}}
10070ff47e9eSdrh
10082e52a9c6Sdrh# 2020-04-03 ticket 51166be0159fd2ce from Yong Heng.
10092e52a9c6Sdrh# Adverse interaction between the constant propagation and push-down
10102e52a9c6Sdrh# optimizations.
10112e52a9c6Sdrh#
10122e52a9c6Sdrhreset_db
10132e52a9c6Sdrhdo_execsql_test select4-18.1 {
10142e52a9c6Sdrh  CREATE VIEW v0(v0) AS WITH v0 AS(SELECT 0 v0) SELECT(SELECT min(v0) OVER()) FROM v0 GROUP BY v0;
10152e52a9c6Sdrh  SELECT *FROM v0 v1 JOIN v0 USING(v0) WHERE datetime(v0) = (v0.v0)AND v0 = 10;
10162e52a9c6Sdrh} {}
10172e52a9c6Sdrhdo_execsql_test select4-18.2 {
10182e52a9c6Sdrh  CREATE VIEW t1(aa) AS
10192e52a9c6Sdrh     WITH t2(bb) AS (SELECT 123)
10202e52a9c6Sdrh     SELECT (SELECT min(bb) OVER()) FROM t2 GROUP BY bb;
10212e52a9c6Sdrh  SELECT * FROM t1;
10222e52a9c6Sdrh} {123}
10232e52a9c6Sdrhdo_execsql_test select4-18.3 {
10242e52a9c6Sdrh  SELECT * FROM t1 AS z1 JOIN t1 AS z2 USING(aa)
10252e52a9c6Sdrh   WHERE abs(z1.aa)=z2.aa AND z1.aa=123;
10262e52a9c6Sdrh} {123}
10270ff47e9eSdrh
1028*b3ad4e61Sdrh# 2021-03-31 Fix an assert() problem in the logic at the end of sqlite3Select()
1029*b3ad4e61Sdrh# that validates AggInfo.  The checks to ensure that AggInfo.aCol[].pCExpr
1030*b3ad4e61Sdrh# references a valid expression was looking at an expression that had been
1031*b3ad4e61Sdrh# deleted by the truth optimization in sqlite3ExprAnd() which was invoked by
1032*b3ad4e61Sdrh# the push-down optimization.  This is harmless in delivery builds, as that code
1033*b3ad4e61Sdrh# only runs with SQLITE_DEBUG.  But it should still be fixed.  The problem
1034*b3ad4e61Sdrh# was discovered by dbsqlfuzz (crash-dece7b67a3552ed7e571a7bda903afd1f7bd9b21)
1035*b3ad4e61Sdrh#
1036*b3ad4e61Sdrhreset_db
1037*b3ad4e61Sdrhdo_execsql_test select4-19.1 {
1038*b3ad4e61Sdrh  CREATE TABLE t1(x);
1039*b3ad4e61Sdrh  INSERT INTO t1 VALUES(99);
1040*b3ad4e61Sdrh  SELECT sum((SELECT 1 FROM (SELECT 2 WHERE x IS NULL) WHERE 0)) FROM t1;
1041*b3ad4e61Sdrh} {{}}
10420ff47e9eSdrh
104392dba24bSdrhfinish_test
1044