18cdbf836Sdrh# The author disclaims copyright to this source code. In place of 28cdbf836Sdrh# a legal notice, here is a blessing: 38cdbf836Sdrh# 48cdbf836Sdrh# May you do good and not evil. 58cdbf836Sdrh# May you find forgiveness for yourself and forgive others. 68cdbf836Sdrh# May you share freely, never taking more than you give. 78cdbf836Sdrh# 88cdbf836Sdrh#*********************************************************************** 98cdbf836Sdrh# This file implements regression tests for SQLite library. The 108cdbf836Sdrh# focus of this file is testing compute SELECT statements and nested 118cdbf836Sdrh# views. 128cdbf836Sdrh# 134152e677Sdanielk1977# $Id: select7.test,v 1.11 2007/09/12 17:01:45 danielk1977 Exp $ 148cdbf836Sdrh 158cdbf836Sdrh 168cdbf836Sdrhset testdir [file dirname $argv0] 178cdbf836Sdrhsource $testdir/tester.tcl 18923cadb1Sdanset testprefix select7 198cdbf836Sdrh 2027c77438Sdanielk1977ifcapable compound { 2127c77438Sdanielk1977 228cdbf836Sdrh# A 3-way INTERSECT. Ticket #875 2353c0f748Sdanielk1977ifcapable tempdb { 248cdbf836Sdrh do_test select7-1.1 { 258cdbf836Sdrh execsql { 268cdbf836Sdrh create temp table t1(x); 278cdbf836Sdrh insert into t1 values('amx'); 288cdbf836Sdrh insert into t1 values('anx'); 298cdbf836Sdrh insert into t1 values('amy'); 308cdbf836Sdrh insert into t1 values('bmy'); 318cdbf836Sdrh select * from t1 where x like 'a__' 328cdbf836Sdrh intersect select * from t1 where x like '_m_' 338cdbf836Sdrh intersect select * from t1 where x like '__x'; 348cdbf836Sdrh } 358cdbf836Sdrh } {amx} 3653c0f748Sdanielk1977} 378cdbf836Sdrh 388cdbf836Sdrh 398cdbf836Sdrh# Nested views do not handle * properly. Ticket #826. 408cdbf836Sdrh# 410fa8ddbdSdanielk1977ifcapable view { 428cdbf836Sdrhdo_test select7-2.1 { 438cdbf836Sdrh execsql { 448cdbf836Sdrh CREATE TABLE x(id integer primary key, a TEXT NULL); 458cdbf836Sdrh INSERT INTO x (a) VALUES ('first'); 468cdbf836Sdrh CREATE TABLE tempx(id integer primary key, a TEXT NULL); 478cdbf836Sdrh INSERT INTO tempx (a) VALUES ('t-first'); 488cdbf836Sdrh CREATE VIEW tv1 AS SELECT x.id, tx.id FROM x JOIN tempx tx ON tx.id=x.id; 498cdbf836Sdrh CREATE VIEW tv1b AS SELECT x.id, tx.id FROM x JOIN tempx tx on tx.id=x.id; 508cdbf836Sdrh CREATE VIEW tv2 AS SELECT * FROM tv1 UNION SELECT * FROM tv1b; 518cdbf836Sdrh SELECT * FROM tv2; 528cdbf836Sdrh } 538cdbf836Sdrh} {1 1} 540fa8ddbdSdanielk1977} ;# ifcapable view 558cdbf836Sdrh 5627c77438Sdanielk1977} ;# ifcapable compound 5727c77438Sdanielk1977 5849d642dbSdrh# Do not allow GROUP BY without an aggregate. Ticket #1039. 5949d642dbSdrh# 60e257300fSdanielk1977# Change: force any query with a GROUP BY clause to be processed as 61e257300fSdanielk1977# an aggregate query, whether it contains aggregates or not. 62e257300fSdanielk1977# 633e8c37e7Sdanielk1977ifcapable subquery { 64e257300fSdanielk1977 # do_test select7-3.1 { 65e257300fSdanielk1977 # catchsql { 66e257300fSdanielk1977 # SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name 67e257300fSdanielk1977 # } 68e257300fSdanielk1977 # } {1 {GROUP BY may only be used on aggregate queries}} 6949d642dbSdrh do_test select7-3.1 { 7049d642dbSdrh catchsql { 7149d642dbSdrh SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name 7249d642dbSdrh } 73e257300fSdanielk1977 } [list 0 [execsql {SELECT * FROM sqlite_master ORDER BY name}]] 743e8c37e7Sdanielk1977} 75e257300fSdanielk1977 76f6bbe022Sdrh# Ticket #2018 - Make sure names are resolved correctly on all 77f6bbe022Sdrh# SELECT statements of a compound subquery. 78f6bbe022Sdrh# 79f6bbe022Sdrhifcapable {subquery && compound} { 80f6bbe022Sdrh do_test select7-4.1 { 81f6bbe022Sdrh execsql { 82f6bbe022Sdrh CREATE TABLE IF NOT EXISTS photo(pk integer primary key, x); 83f6bbe022Sdrh CREATE TABLE IF NOT EXISTS tag(pk integer primary key, fk int, name); 84f6bbe022Sdrh 85f6bbe022Sdrh SELECT P.pk from PHOTO P WHERE NOT EXISTS ( 86f6bbe022Sdrh SELECT T2.pk from TAG T2 WHERE T2.fk = P.pk 87f6bbe022Sdrh EXCEPT 88f6bbe022Sdrh SELECT T3.pk from TAG T3 WHERE T3.fk = P.pk AND T3.name LIKE '%foo%' 89f6bbe022Sdrh ); 90f6bbe022Sdrh } 91f6bbe022Sdrh } {} 92f6bbe022Sdrh do_test select7-4.2 { 93f6bbe022Sdrh execsql { 94f6bbe022Sdrh INSERT INTO photo VALUES(1,1); 95f6bbe022Sdrh INSERT INTO photo VALUES(2,2); 96f6bbe022Sdrh INSERT INTO photo VALUES(3,3); 97f6bbe022Sdrh INSERT INTO tag VALUES(11,1,'one'); 98f6bbe022Sdrh INSERT INTO tag VALUES(12,1,'two'); 99f6bbe022Sdrh INSERT INTO tag VALUES(21,1,'one-b'); 100f6bbe022Sdrh SELECT P.pk from PHOTO P WHERE NOT EXISTS ( 101f6bbe022Sdrh SELECT T2.pk from TAG T2 WHERE T2.fk = P.pk 102f6bbe022Sdrh EXCEPT 103f6bbe022Sdrh SELECT T3.pk from TAG T3 WHERE T3.fk = P.pk AND T3.name LIKE '%foo%' 104f6bbe022Sdrh ); 105f6bbe022Sdrh } 106f6bbe022Sdrh } {2 3} 107e305f43fSdrh} 108f6bbe022Sdrh 109e305f43fSdrh# ticket #2347 110e305f43fSdrh# 111e305f43fSdrhifcapable {subquery && compound} { 112e305f43fSdrh do_test select7-5.1 { 113e305f43fSdrh catchsql { 114e305f43fSdrh CREATE TABLE t2(a,b); 115e305f43fSdrh SELECT 5 IN (SELECT a,b FROM t2); 116e305f43fSdrh } 117*8da209b1Sdan } {1 {sub-select returns 2 columns - expected 1}} 118e305f43fSdrh do_test select7-5.2 { 119e305f43fSdrh catchsql { 120e305f43fSdrh SELECT 5 IN (SELECT * FROM t2); 121e305f43fSdrh } 122*8da209b1Sdan } {1 {sub-select returns 2 columns - expected 1}} 123e305f43fSdrh do_test select7-5.3 { 124e305f43fSdrh catchsql { 125e305f43fSdrh SELECT 5 IN (SELECT a,b FROM t2 UNION SELECT b,a FROM t2); 126e305f43fSdrh } 127*8da209b1Sdan } {1 {sub-select returns 2 columns - expected 1}} 128e305f43fSdrh do_test select7-5.4 { 129e305f43fSdrh catchsql { 130e305f43fSdrh SELECT 5 IN (SELECT * FROM t2 UNION SELECT * FROM t2); 131e305f43fSdrh } 132*8da209b1Sdan } {1 {sub-select returns 2 columns - expected 1}} 133f6bbe022Sdrh} 134f6bbe022Sdrh 1350325d873Sdrh# Verify that an error occurs if you have too many terms on a 1360325d873Sdrh# compound select statement. 1370325d873Sdrh# 138afcf9bd8Sdanif {[clang_sanitize_address]==0} { 1394152e677Sdanielk1977 ifcapable compound { 1400325d873Sdrh if {$SQLITE_MAX_COMPOUND_SELECT>0} { 1410325d873Sdrh set sql {SELECT 0} 1420325d873Sdrh set result 0 1430325d873Sdrh for {set i 1} {$i<$SQLITE_MAX_COMPOUND_SELECT} {incr i} { 1440325d873Sdrh append sql " UNION ALL SELECT $i" 1450325d873Sdrh lappend result $i 1460325d873Sdrh } 1470325d873Sdrh do_test select7-6.1 { 1480325d873Sdrh catchsql $sql 1490325d873Sdrh } [list 0 $result] 1500325d873Sdrh append sql { UNION ALL SELECT 99999999} 1510325d873Sdrh do_test select7-6.2 { 1520325d873Sdrh catchsql $sql 1530325d873Sdrh } {1 {too many terms in compound SELECT}} 1540325d873Sdrh } 1554152e677Sdanielk1977 } 156afcf9bd8Sdan} 1570325d873Sdrh 158b7dca7d7Sdan# This block of tests verifies that bug aa92c76cd4 is fixed. 159b7dca7d7Sdan# 160b7dca7d7Sdando_test select7-7.1 { 161b7dca7d7Sdan execsql { 162b7dca7d7Sdan CREATE TABLE t3(a REAL); 163b7dca7d7Sdan INSERT INTO t3 VALUES(44.0); 164b7dca7d7Sdan INSERT INTO t3 VALUES(56.0); 165b7dca7d7Sdan } 166b7dca7d7Sdan} {} 167b7dca7d7Sdando_test select7-7.2 { 168b7dca7d7Sdan execsql { 169b7dca7d7Sdan pragma vdbe_trace = 0; 170b7dca7d7Sdan SELECT (CASE WHEN a=0 THEN 0 ELSE (a + 25) / 50 END) AS categ, count(*) 171b7dca7d7Sdan FROM t3 GROUP BY categ 172b7dca7d7Sdan } 173b7dca7d7Sdan} {1.38 1 1.62 1} 174b7dca7d7Sdando_test select7-7.3 { 175b7dca7d7Sdan execsql { 176b7dca7d7Sdan CREATE TABLE t4(a REAL); 177b7dca7d7Sdan INSERT INTO t4 VALUES( 2.0 ); 178b7dca7d7Sdan INSERT INTO t4 VALUES( 3.0 ); 179b7dca7d7Sdan } 180b7dca7d7Sdan} {} 181b7dca7d7Sdando_test select7-7.4 { 182b7dca7d7Sdan execsql { 183b7dca7d7Sdan SELECT (CASE WHEN a=0 THEN 'zero' ELSE a/2 END) AS t FROM t4 GROUP BY t; 184b7dca7d7Sdan } 185b7dca7d7Sdan} {1.0 1.5} 186b7dca7d7Sdando_test select7-7.5 { 187b7dca7d7Sdan execsql { SELECT a=0, typeof(a) FROM t4 } 188b7dca7d7Sdan} {0 real 0 real} 189b7dca7d7Sdando_test select7-7.6 { 190b7dca7d7Sdan execsql { SELECT a=0, typeof(a) FROM t4 GROUP BY a } 191b7dca7d7Sdan} {0 real 0 real} 192b7dca7d7Sdan 193b7dca7d7Sdando_test select7-7.7 { 194b7dca7d7Sdan execsql { 195b7dca7d7Sdan CREATE TABLE t5(a TEXT, b INT); 196b7dca7d7Sdan INSERT INTO t5 VALUES(123, 456); 197b7dca7d7Sdan SELECT typeof(a), a FROM t5 GROUP BY a HAVING a<b; 198b7dca7d7Sdan } 199b7dca7d7Sdan} {text 123} 200b7dca7d7Sdan 201923cadb1Sdando_execsql_test 8.0 { 202923cadb1Sdan CREATE TABLE t01(x, y); 203923cadb1Sdan CREATE TABLE t02(x, y); 204923cadb1Sdan} 205923cadb1Sdan 206923cadb1Sdando_catchsql_test 8.1 { 207923cadb1Sdan SELECT * FROM ( 208923cadb1Sdan SELECT * FROM t01 UNION SELECT x FROM t02 209923cadb1Sdan ) WHERE y=1 210923cadb1Sdan} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 211923cadb1Sdan 212923cadb1Sdando_catchsql_test 8.2 { 213923cadb1Sdan CREATE VIEW v0 as SELECT x, y FROM t01 UNION SELECT x FROM t02; 214923cadb1Sdan EXPLAIN QUERY PLAN SELECT * FROM v0 WHERE x='0' OR y; 215923cadb1Sdan} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}} 216923cadb1Sdan 217923cadb1Sdan 218f6bbe022Sdrhfinish_test 219