xref: /sqlite-3.40.0/test/subselect.test (revision b29e60c4)
1b19a2bc6Sdrh# 2001 September 15
219a775c2Sdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
519a775c2Sdrh#
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.
919a775c2Sdrh#
1019a775c2Sdrh#***********************************************************************
1119a775c2Sdrh# This file implements regression tests for SQLite library.  The
1219a775c2Sdrh# focus of this file is testing SELECT statements that are part of
1319a775c2Sdrh# expressions.
1419a775c2Sdrh#
15de3e41e3Sdanielk1977# $Id: subselect.test,v 1.16 2008/08/04 03:51:24 danielk1977 Exp $
1619a775c2Sdrh
1719a775c2Sdrhset testdir [file dirname $argv0]
1819a775c2Sdrhsource $testdir/tester.tcl
1919a775c2Sdrh
203e8c37e7Sdanielk1977# Omit this whole file if the library is build without subquery support.
213e8c37e7Sdanielk1977ifcapable !subquery {
223e8c37e7Sdanielk1977  finish_test
233e8c37e7Sdanielk1977  return
243e8c37e7Sdanielk1977}
253e8c37e7Sdanielk1977
2619a775c2Sdrh# Basic sanity checking.  Try a simple subselect.
2719a775c2Sdrh#
2819a775c2Sdrhdo_test subselect-1.1 {
2919a775c2Sdrh  execsql {
3019a775c2Sdrh    CREATE TABLE t1(a int, b int);
3119a775c2Sdrh    INSERT INTO t1 VALUES(1,2);
3219a775c2Sdrh    INSERT INTO t1 VALUES(3,4);
3319a775c2Sdrh    INSERT INTO t1 VALUES(5,6);
3419a775c2Sdrh  }
3519a775c2Sdrh  execsql {SELECT * FROM t1 WHERE a = (SELECT count(*) FROM t1)}
3619a775c2Sdrh} {3 4}
3719a775c2Sdrh
3819a775c2Sdrh# Try a select with more than one result column.
3919a775c2Sdrh#
4019a775c2Sdrhdo_test subselect-1.2 {
4119a775c2Sdrh  set v [catch {execsql {SELECT * FROM t1 WHERE a = (SELECT * FROM t1)}} msg]
4219a775c2Sdrh  lappend v $msg
43*b29e60c4Sdrh} {1 {row value misused}}
4419a775c2Sdrh
4519a775c2Sdrh# A subselect without an aggregate.
4619a775c2Sdrh#
4719a775c2Sdrhdo_test subselect-1.3a {
4819a775c2Sdrh  execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=2)}
4919a775c2Sdrh} {2}
5019a775c2Sdrhdo_test subselect-1.3b {
5119a775c2Sdrh  execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=4)}
5219a775c2Sdrh} {4}
5319a775c2Sdrhdo_test subselect-1.3c {
5419a775c2Sdrh  execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=6)}
5519a775c2Sdrh} {6}
5685e9e22bSdrhdo_test subselect-1.3d {
5719a775c2Sdrh  execsql {SELECT b from t1 where a = (SELECT a FROM t1 WHERE b=8)}
5819a775c2Sdrh} {}
59de3e41e3Sdanielk1977ifcapable compound {
6085e9e22bSdrh  do_test subselect-1.3e {
6185e9e22bSdrh    execsql {
6285e9e22bSdrh      SELECT b FROM t1
6385e9e22bSdrh       WHERE a = (SELECT a FROM t1 UNION SELECT b FROM t1 ORDER BY 1);
6485e9e22bSdrh    }
6585e9e22bSdrh  } {2}
66de3e41e3Sdanielk1977}
6719a775c2Sdrh
6819a775c2Sdrh# What if the subselect doesn't return any value.  We should get
6919a775c2Sdrh# NULL as the result.  Check it out.
7019a775c2Sdrh#
7119a775c2Sdrhdo_test subselect-1.4 {
72f5905aa7Sdrh  execsql {SELECT b from t1 where a = coalesce((SELECT a FROM t1 WHERE b=5),1)}
73f5905aa7Sdrh} {2}
7419a775c2Sdrh
7519a775c2Sdrh# Try multiple subselects within a single expression.
7619a775c2Sdrh#
7719a775c2Sdrhdo_test subselect-1.5 {
7819a775c2Sdrh  execsql {
7919a775c2Sdrh    CREATE TABLE t2(x int, y int);
8019a775c2Sdrh    INSERT INTO t2 VALUES(1,2);
8119a775c2Sdrh    INSERT INTO t2 VALUES(2,4);
8219a775c2Sdrh    INSERT INTO t2 VALUES(3,8);
8319a775c2Sdrh    INSERT INTO t2 VALUES(4,16);
8419a775c2Sdrh  }
8519a775c2Sdrh  execsql {
8619a775c2Sdrh    SELECT y from t2
8719a775c2Sdrh    WHERE x = (SELECT sum(b) FROM t1 where a notnull) - (SELECT sum(a) FROM t1)
8819a775c2Sdrh  }
8919a775c2Sdrh} {8}
9019a775c2Sdrh
91600b1b2fSdrh# Try something useful.  Delete every entry from t2 where the
92600b1b2fSdrh# x value is less than half of the maximum.
93600b1b2fSdrh#
94600b1b2fSdrhdo_test subselect-1.6 {
95600b1b2fSdrh  execsql {DELETE FROM t2 WHERE x < 0.5*(SELECT max(x) FROM t2)}
96600b1b2fSdrh  execsql {SELECT x FROM t2 ORDER BY x}
97600b1b2fSdrh} {2 3 4}
98600b1b2fSdrh
99a9f9d1c0Sdrh# Make sure sorting works for SELECTs there used as a scalar expression.
100a9f9d1c0Sdrh#
101a9f9d1c0Sdrhdo_test subselect-2.1 {
102a9f9d1c0Sdrh  execsql {
103a9f9d1c0Sdrh    SELECT (SELECT a FROM t1 ORDER BY a), (SELECT a FROM t1 ORDER BY a DESC)
104a9f9d1c0Sdrh  }
105a9f9d1c0Sdrh} {1 5}
106a9f9d1c0Sdrhdo_test subselect-2.2 {
107a9f9d1c0Sdrh  execsql {
108a9f9d1c0Sdrh    SELECT 1 IN (SELECT a FROM t1 ORDER BY a);
109a9f9d1c0Sdrh  }
110a9f9d1c0Sdrh} {1}
111a9f9d1c0Sdrhdo_test subselect-2.3 {
112a9f9d1c0Sdrh  execsql {
113a9f9d1c0Sdrh    SELECT 2 IN (SELECT a FROM t1 ORDER BY a DESC);
114a9f9d1c0Sdrh  }
115a9f9d1c0Sdrh} {0}
116a9f9d1c0Sdrh
117ad16844fSdrh# Verify that the ORDER BY clause is honored in a subquery.
118ad16844fSdrh#
11927c77438Sdanielk1977ifcapable compound {
120ad16844fSdrhdo_test subselect-3.1 {
121ad16844fSdrh  execsql {
122ad16844fSdrh    CREATE TABLE t3(x int);
123ad16844fSdrh    INSERT INTO t3 SELECT a FROM t1 UNION ALL SELECT b FROM t1;
124ad16844fSdrh    SELECT * FROM t3 ORDER BY x;
125ad16844fSdrh  }
126ad16844fSdrh} {1 2 3 4 5 6}
12727c77438Sdanielk1977} ;# ifcapable compound
12827c77438Sdanielk1977ifcapable !compound {
12927c77438Sdanielk1977do_test subselect-3.1 {
13027c77438Sdanielk1977  execsql {
13127c77438Sdanielk1977    CREATE TABLE t3(x int);
13227c77438Sdanielk1977    INSERT INTO t3 SELECT a FROM t1;
13327c77438Sdanielk1977    INSERT INTO t3 SELECT b FROM t1;
13427c77438Sdanielk1977    SELECT * FROM t3 ORDER BY x;
13527c77438Sdanielk1977  }
13627c77438Sdanielk1977} {1 2 3 4 5 6}
13727c77438Sdanielk1977} ;# ifcapable !compound
13827c77438Sdanielk1977
139ad16844fSdrhdo_test subselect-3.2 {
140ad16844fSdrh  execsql {
141ad16844fSdrh    SELECT sum(x) FROM (SELECT x FROM t3 ORDER BY x LIMIT 2);
142ad16844fSdrh  }
1433d1d95e6Sdrh} {3}
144ad16844fSdrhdo_test subselect-3.3 {
145ad16844fSdrh  execsql {
146ad16844fSdrh    SELECT sum(x) FROM (SELECT x FROM t3 ORDER BY x DESC LIMIT 2);
147ad16844fSdrh  }
1483d1d95e6Sdrh} {11}
149ad16844fSdrhdo_test subselect-3.4 {
150ad16844fSdrh  execsql {
151ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x);
152ad16844fSdrh  }
153ad16844fSdrh} {1}
154ad16844fSdrhdo_test subselect-3.5 {
155ad16844fSdrh  execsql {
156ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x DESC);
157ad16844fSdrh  }
158ad16844fSdrh} {6}
159ad16844fSdrhdo_test subselect-3.6 {
160ad16844fSdrh  execsql {
161ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x LIMIT 1);
162ad16844fSdrh  }
163ad16844fSdrh} {1}
164ad16844fSdrhdo_test subselect-3.7 {
165ad16844fSdrh  execsql {
166ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x DESC LIMIT 1);
167ad16844fSdrh  }
168ad16844fSdrh} {6}
169ad16844fSdrhdo_test subselect-3.8 {
170ad16844fSdrh  execsql {
171ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x LIMIT 1 OFFSET 2);
172ad16844fSdrh  }
173ad16844fSdrh} {3}
174ad16844fSdrhdo_test subselect-3.9 {
175ad16844fSdrh  execsql {
176ad16844fSdrh    SELECT (SELECT x FROM t3 ORDER BY x DESC LIMIT 1 OFFSET 2);
177ad16844fSdrh  }
178ad16844fSdrh} {4}
179adfa3dafSdrhdo_test subselect-3.10 {
180adfa3dafSdrh  execsql {
181adfa3dafSdrh    SELECT x FROM t3 WHERE x IN
182adfa3dafSdrh       (SELECT x FROM t3 ORDER BY x DESC LIMIT 1 OFFSET 2);
183adfa3dafSdrh  }
184adfa3dafSdrh} {4}
185ad16844fSdrh
1866c1426fdSdrh# Ticket #2295.
1876c1426fdSdrh# Make sure type affinities work correctly on subqueries with
1886c1426fdSdrh# an ORDER BY clause.
1896c1426fdSdrh#
1906c1426fdSdrhdo_test subselect-4.1 {
1916c1426fdSdrh  execsql {
1926c1426fdSdrh    CREATE TABLE t4(a TEXT, b TEXT);
1936c1426fdSdrh    INSERT INTO t4 VALUES('a','1');
1946c1426fdSdrh    INSERT INTO t4 VALUES('b','2');
1956c1426fdSdrh    INSERT INTO t4 VALUES('c','3');
1966c1426fdSdrh    SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b);
1976c1426fdSdrh  }
1986c1426fdSdrh} {a b c}
1996c1426fdSdrhdo_test subselect-4.2 {
2006c1426fdSdrh  execsql {
2016c1426fdSdrh    SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b LIMIT 1);
2026c1426fdSdrh  }
2036c1426fdSdrh} {a}
2046c1426fdSdrhdo_test subselect-4.3 {
2056c1426fdSdrh  execsql {
2066c1426fdSdrh    SELECT a FROM t4 WHERE b IN (SELECT b FROM t4 ORDER BY b DESC LIMIT 1);
2076c1426fdSdrh  }
2086c1426fdSdrh} {c}
2096c1426fdSdrh
21019a775c2Sdrhfinish_test
211