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