1ec8d2427Sdrh# 2008 September 16 2ec8d2427Sdrh# 3ec8d2427Sdrh# The author disclaims copyright to this source code. In place of 4ec8d2427Sdrh# a legal notice, here is a blessing: 5ec8d2427Sdrh# 6ec8d2427Sdrh# May you do good and not evil. 7ec8d2427Sdrh# May you find forgiveness for yourself and forgive others. 8ec8d2427Sdrh# May you share freely, never taking more than you give. 9ec8d2427Sdrh# 10ec8d2427Sdrh#*********************************************************************** 11ec8d2427Sdrh# This file implements regression tests for SQLite library. 12ec8d2427Sdrh# 1303949bacSdrh# $Id: selectC.test,v 1.5 2009/05/17 15:26:21 drh Exp $ 14ec8d2427Sdrh 15ec8d2427Sdrhset testdir [file dirname $argv0] 16ec8d2427Sdrhsource $testdir/tester.tcl 17ac56ab7eSdanset testprefix selectC 18ec8d2427Sdrh 19f44ed027Sdrh# Ticket # 20ec8d2427Sdrhdo_test selectC-1.1 { 21ec8d2427Sdrh execsql { 22ec8d2427Sdrh CREATE TABLE t1(a, b, c); 23ec8d2427Sdrh INSERT INTO t1 VALUES(1,'aaa','bbb'); 24ec8d2427Sdrh INSERT INTO t1 SELECT * FROM t1; 25ec8d2427Sdrh INSERT INTO t1 VALUES(2,'ccc','ddd'); 26ec8d2427Sdrh 27ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 28ec8d2427Sdrh FROM t1 29ec8d2427Sdrh WHERE y IN ('aaabbb','xxx'); 30ec8d2427Sdrh } 31ec8d2427Sdrh} {1 aaabbb} 32ec8d2427Sdrhdo_test selectC-1.2 { 33ec8d2427Sdrh execsql { 34ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 35ec8d2427Sdrh FROM t1 36ec8d2427Sdrh WHERE b||c IN ('aaabbb','xxx'); 37ec8d2427Sdrh } 38ec8d2427Sdrh} {1 aaabbb} 39ec8d2427Sdrhdo_test selectC-1.3 { 40ec8d2427Sdrh execsql { 41ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 42ec8d2427Sdrh FROM t1 43ec8d2427Sdrh WHERE y='aaabbb' 44ec8d2427Sdrh } 45ec8d2427Sdrh} {1 aaabbb} 46ec8d2427Sdrhdo_test selectC-1.4 { 47ec8d2427Sdrh execsql { 48ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 49ec8d2427Sdrh FROM t1 50ec8d2427Sdrh WHERE b||c='aaabbb' 51ec8d2427Sdrh } 52ec8d2427Sdrh} {1 aaabbb} 53ec8d2427Sdrhdo_test selectC-1.5 { 54ec8d2427Sdrh execsql { 55ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 56ec8d2427Sdrh FROM t1 57ec8d2427Sdrh WHERE x=2 58ec8d2427Sdrh } 59ec8d2427Sdrh} {2 cccddd} 60ec8d2427Sdrhdo_test selectC-1.6 { 61ec8d2427Sdrh execsql { 62ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 63ec8d2427Sdrh FROM t1 64ec8d2427Sdrh WHERE a=2 65ec8d2427Sdrh } 66ec8d2427Sdrh} {2 cccddd} 67ec8d2427Sdrhdo_test selectC-1.7 { 68ec8d2427Sdrh execsql { 69ec8d2427Sdrh SELECT DISTINCT a AS x, b||c AS y 70ec8d2427Sdrh FROM t1 71ec8d2427Sdrh WHERE +y='aaabbb' 72ec8d2427Sdrh } 73ec8d2427Sdrh} {1 aaabbb} 74f44ed027Sdrhdo_test selectC-1.8 { 75f44ed027Sdrh execsql { 76f44ed027Sdrh SELECT a AS x, b||c AS y 77f44ed027Sdrh FROM t1 78f44ed027Sdrh GROUP BY x, y 79f44ed027Sdrh HAVING y='aaabbb' 80f44ed027Sdrh } 81f44ed027Sdrh} {1 aaabbb} 82f44ed027Sdrhdo_test selectC-1.9 { 83f44ed027Sdrh execsql { 84f44ed027Sdrh SELECT a AS x, b||c AS y 85f44ed027Sdrh FROM t1 86f44ed027Sdrh GROUP BY x, y 87f44ed027Sdrh HAVING b||c='aaabbb' 88f44ed027Sdrh } 89f44ed027Sdrh} {1 aaabbb} 90f44ed027Sdrhdo_test selectC-1.10 { 91f44ed027Sdrh execsql { 92f44ed027Sdrh SELECT a AS x, b||c AS y 93f44ed027Sdrh FROM t1 94f44ed027Sdrh WHERE y='aaabbb' 95f44ed027Sdrh GROUP BY x, y 96f44ed027Sdrh } 97f44ed027Sdrh} {1 aaabbb} 98f44ed027Sdrhdo_test selectC-1.11 { 99f44ed027Sdrh execsql { 100f44ed027Sdrh SELECT a AS x, b||c AS y 101f44ed027Sdrh FROM t1 102f44ed027Sdrh WHERE b||c='aaabbb' 103f44ed027Sdrh GROUP BY x, y 104f44ed027Sdrh } 105f44ed027Sdrh} {1 aaabbb} 106d742bb78Sdrhproc longname_toupper x {return [string toupper $x]} 107d742bb78Sdrhdb function uppercaseconversionfunctionwithaverylongname longname_toupper 108d742bb78Sdrhdo_test selectC-1.12.1 { 109f44ed027Sdrh execsql { 110f44ed027Sdrh SELECT DISTINCT upper(b) AS x 111f44ed027Sdrh FROM t1 112f44ed027Sdrh ORDER BY x 113f44ed027Sdrh } 114f44ed027Sdrh} {AAA CCC} 115d742bb78Sdrhdo_test selectC-1.12.2 { 116d742bb78Sdrh execsql { 117d742bb78Sdrh SELECT DISTINCT uppercaseconversionfunctionwithaverylongname(b) AS x 118d742bb78Sdrh FROM t1 119d742bb78Sdrh ORDER BY x 120d742bb78Sdrh } 121d742bb78Sdrh} {AAA CCC} 122d742bb78Sdrhdo_test selectC-1.13.1 { 123f44ed027Sdrh execsql { 124f44ed027Sdrh SELECT upper(b) AS x 125f44ed027Sdrh FROM t1 126f44ed027Sdrh GROUP BY x 127f44ed027Sdrh ORDER BY x 128f44ed027Sdrh } 129f44ed027Sdrh} {AAA CCC} 130d742bb78Sdrhdo_test selectC-1.13.2 { 131d742bb78Sdrh execsql { 132d742bb78Sdrh SELECT uppercaseconversionfunctionwithaverylongname(b) AS x 133d742bb78Sdrh FROM t1 134d742bb78Sdrh GROUP BY x 135d742bb78Sdrh ORDER BY x 136d742bb78Sdrh } 137d742bb78Sdrh} {AAA CCC} 138d742bb78Sdrhdo_test selectC-1.14.1 { 139d176611bSdrh execsql { 140d176611bSdrh SELECT upper(b) AS x 141d176611bSdrh FROM t1 142d176611bSdrh ORDER BY x DESC 143d176611bSdrh } 144d176611bSdrh} {CCC AAA AAA} 145d742bb78Sdrhdo_test selectC-1.14.2 { 146d742bb78Sdrh execsql { 147d742bb78Sdrh SELECT uppercaseconversionfunctionwithaverylongname(b) AS x 148d742bb78Sdrh FROM t1 149d742bb78Sdrh ORDER BY x DESC 150d742bb78Sdrh } 151d742bb78Sdrh} {CCC AAA AAA} 152ec8d2427Sdrh 15303949bacSdrh# The following query used to leak memory. Verify that has been fixed. 15403949bacSdrh# 1552f56da3fSdanifcapable trigger&&compound { 15603949bacSdrh do_test selectC-2.1 { 15703949bacSdrh catchsql { 15803949bacSdrh CREATE TABLE t21a(a,b); 15903949bacSdrh INSERT INTO t21a VALUES(1,2); 16003949bacSdrh CREATE TABLE t21b(n); 16103949bacSdrh CREATE TRIGGER r21 AFTER INSERT ON t21b BEGIN 16203949bacSdrh SELECT a FROM t21a WHERE a>new.x UNION ALL 16303949bacSdrh SELECT b FROM t21a WHERE b>new.x ORDER BY 1 LIMIT 2; 16403949bacSdrh END; 16503949bacSdrh INSERT INTO t21b VALUES(6); 16603949bacSdrh } 16703949bacSdrh } {1 {no such column: new.x}} 16875cbd984Sdan} 16903949bacSdrh 17067a6a40cSdan# Check that ticket [883034dcb5] is fixed. 17167a6a40cSdan# 17267a6a40cSdando_test selectC-3.1 { 17367a6a40cSdan execsql { 17467a6a40cSdan CREATE TABLE person ( 17567a6a40cSdan org_id TEXT NOT NULL, 17667a6a40cSdan nickname TEXT NOT NULL, 17767a6a40cSdan license TEXT, 17867a6a40cSdan CONSTRAINT person_pk PRIMARY KEY (org_id, nickname), 17967a6a40cSdan CONSTRAINT person_license_uk UNIQUE (license) 18067a6a40cSdan ); 18167a6a40cSdan INSERT INTO person VALUES('meyers', 'jack', '2GAT123'); 18267a6a40cSdan INSERT INTO person VALUES('meyers', 'hill', 'V345FMP'); 18367a6a40cSdan INSERT INTO person VALUES('meyers', 'jim', '2GAT138'); 18467a6a40cSdan INSERT INTO person VALUES('smith', 'maggy', ''); 18567a6a40cSdan INSERT INTO person VALUES('smith', 'jose', 'JJZ109'); 18667a6a40cSdan INSERT INTO person VALUES('smith', 'jack', 'THX138'); 18767a6a40cSdan INSERT INTO person VALUES('lakeside', 'dave', '953OKG'); 18867a6a40cSdan INSERT INTO person VALUES('lakeside', 'amy', NULL); 18967a6a40cSdan INSERT INTO person VALUES('lake-apts', 'tom', NULL); 19067a6a40cSdan INSERT INTO person VALUES('acorn', 'hideo', 'CQB421'); 19167a6a40cSdan 19267a6a40cSdan SELECT 19367a6a40cSdan org_id, 19467a6a40cSdan count((NOT (org_id IS NULL)) AND (NOT (nickname IS NULL))) 19567a6a40cSdan FROM person 19667a6a40cSdan WHERE (CASE WHEN license != '' THEN 1 ELSE 0 END) 19767a6a40cSdan GROUP BY 1; 19867a6a40cSdan } 19967a6a40cSdan} {acorn 1 lakeside 1 meyers 3 smith 2} 20067a6a40cSdando_test selectC-3.2 { 20167a6a40cSdan execsql { 20267a6a40cSdan CREATE TABLE t2(a PRIMARY KEY, b); 20367a6a40cSdan INSERT INTO t2 VALUES('abc', 'xxx'); 20467a6a40cSdan INSERT INTO t2 VALUES('def', 'yyy'); 20567a6a40cSdan SELECT a, max(b || a) FROM t2 WHERE (b||b||b)!='value' GROUP BY a; 20667a6a40cSdan } 20767a6a40cSdan} {abc xxxabc def yyydef} 20867a6a40cSdando_test selectC-3.3 { 20967a6a40cSdan execsql { 21067a6a40cSdan SELECT b, max(a || b) FROM t2 WHERE (b||b||b)!='value' GROUP BY a; 21167a6a40cSdan } 21267a6a40cSdan} {xxx abcxxx yyy defyyy} 21367a6a40cSdan 21449ad330dSdan 21549ad330dSdanproc udf {} { incr ::udf } 21649ad330dSdanset ::udf 0 21749ad330dSdandb function udf udf 21849ad330dSdan 21949ad330dSdando_execsql_test selectC-4.1 { 22049ad330dSdan create table t_distinct_bug (a, b, c); 22149ad330dSdan insert into t_distinct_bug values ('1', '1', 'a'); 22249ad330dSdan insert into t_distinct_bug values ('1', '2', 'b'); 22349ad330dSdan insert into t_distinct_bug values ('1', '3', 'c'); 22449ad330dSdan insert into t_distinct_bug values ('1', '1', 'd'); 22549ad330dSdan insert into t_distinct_bug values ('1', '2', 'e'); 22649ad330dSdan insert into t_distinct_bug values ('1', '3', 'f'); 22749ad330dSdan} {} 22849ad330dSdan 22949ad330dSdando_execsql_test selectC-4.2 { 23049ad330dSdan select a from (select distinct a, b from t_distinct_bug) 23149ad330dSdan} {1 1 1} 23249ad330dSdan 23349ad330dSdando_execsql_test selectC-4.3 { 23449ad330dSdan select a, udf() from (select distinct a, b from t_distinct_bug) 23549ad330dSdan} {1 1 1 2 1 3} 23649ad330dSdan 237ac56ab7eSdan#------------------------------------------------------------------------- 238ac56ab7eSdan# Test that the problem in ticket #190c2507 has been fixed. 239ac56ab7eSdan# 240ac56ab7eSdando_execsql_test 5.0 { 241ac56ab7eSdan CREATE TABLE x1(a); 242ac56ab7eSdan CREATE TABLE x2(b); 243ac56ab7eSdan CREATE TABLE x3(c); 244ac56ab7eSdan CREATE VIEW vvv AS SELECT b FROM x2 ORDER BY 1; 245ac56ab7eSdan 246ac56ab7eSdan INSERT INTO x1 VALUES('a'), ('b'); 247ac56ab7eSdan INSERT INTO x2 VALUES(22), (23), (25), (24), (21); 248ac56ab7eSdan INSERT INTO x3 VALUES(302), (303), (301); 249ac56ab7eSdan} 250ac56ab7eSdan 251ac56ab7eSdando_execsql_test 5.1 { 252ac56ab7eSdan CREATE TABLE x4 AS SELECT b FROM vvv UNION ALL SELECT c from x3; 253ac56ab7eSdan SELECT * FROM x4; 254ac56ab7eSdan} {21 22 23 24 25 302 303 301} 255ac56ab7eSdan 256ac56ab7eSdando_execsql_test 5.2 { 257ac56ab7eSdan SELECT * FROM x1, x4 258ac56ab7eSdan} { 259ac56ab7eSdan a 21 a 22 a 23 a 24 a 25 a 302 a 303 a 301 260ac56ab7eSdan b 21 b 22 b 23 b 24 b 25 b 302 b 303 b 301 261ac56ab7eSdan} 262ac56ab7eSdan 263ac56ab7eSdando_execsql_test 5.3 { 264*de9ed629Sdan SELECT * FROM x1, (SELECT b FROM vvv UNION ALL SELECT c from x3) ORDER BY 1,2; 265ac56ab7eSdan} { 266*de9ed629Sdan a 21 a 22 a 23 a 24 a 25 a 301 a 302 a 303 267*de9ed629Sdan b 21 b 22 b 23 b 24 b 25 b 301 b 302 b 303 268ac56ab7eSdan} 269ac56ab7eSdan 270ec8d2427Sdrhfinish_test 271