16ba7ab0dSdan# 2018 May 8 26ba7ab0dSdan# 36ba7ab0dSdan# The author disclaims copyright to this source code. In place of 46ba7ab0dSdan# a legal notice, here is a blessing: 56ba7ab0dSdan# 66ba7ab0dSdan# May you do good and not evil. 76ba7ab0dSdan# May you find forgiveness for yourself and forgive others. 86ba7ab0dSdan# May you share freely, never taking more than you give. 96ba7ab0dSdan# 106ba7ab0dSdan#*********************************************************************** 116ba7ab0dSdan# This file implements regression tests for SQLite library. 126ba7ab0dSdan# 136ba7ab0dSdan 146ba7ab0dSdanset testdir [file dirname $argv0] 156ba7ab0dSdansource $testdir/tester.tcl 166ba7ab0dSdanset testprefix filter1 176ba7ab0dSdan 186ba7ab0dSdanifcapable !windowfunc { 196ba7ab0dSdan finish_test 206ba7ab0dSdan return 216ba7ab0dSdan} 226ba7ab0dSdan 236ba7ab0dSdando_execsql_test 1.0 { 246ba7ab0dSdan CREATE TABLE t1(a); 256ba7ab0dSdan CREATE INDEX i1 ON t1(a); 266ba7ab0dSdan INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); 276ba7ab0dSdan} 286ba7ab0dSdan 296ba7ab0dSdando_execsql_test 1.1 { SELECT sum(a) FROM t1; } 45 306ba7ab0dSdando_execsql_test 1.2 { SELECT sum(a) FILTER( WHERE a<5 ) FROM t1; } 10 316ba7ab0dSdan 326ba7ab0dSdando_execsql_test 1.3 { 336ba7ab0dSdan SELECT sum(a) FILTER( WHERE a>9 ), 346ba7ab0dSdan sum(a) FILTER( WHERE a>8 ), 356ba7ab0dSdan sum(a) FILTER( WHERE a>7 ), 366ba7ab0dSdan sum(a) FILTER( WHERE a>6 ), 376ba7ab0dSdan sum(a) FILTER( WHERE a>5 ), 386ba7ab0dSdan sum(a) FILTER( WHERE a>4 ), 396ba7ab0dSdan sum(a) FILTER( WHERE a>3 ), 406ba7ab0dSdan sum(a) FILTER( WHERE a>2 ), 416ba7ab0dSdan sum(a) FILTER( WHERE a>1 ), 426ba7ab0dSdan sum(a) FILTER( WHERE a>0 ) 436ba7ab0dSdan FROM t1; 446ba7ab0dSdan} {{} 9 17 24 30 35 39 42 44 45} 456ba7ab0dSdan 466ba7ab0dSdando_execsql_test 1.4 { 476ba7ab0dSdan SELECT max(a) FILTER (WHERE (a % 2)==0) FROM t1 486ba7ab0dSdan} {8} 496ba7ab0dSdan 506ba7ab0dSdando_execsql_test 1.5 { 516ba7ab0dSdan SELECT min(a) FILTER (WHERE a>4) FROM t1 526ba7ab0dSdan} {5} 536ba7ab0dSdan 546ba7ab0dSdando_execsql_test 1.6 { 556ba7ab0dSdan SELECT count(*) FILTER (WHERE a!=5) FROM t1 566ba7ab0dSdan} {8} 576ba7ab0dSdan 584f9adee2Sdando_execsql_test 1.7 { 596ba7ab0dSdan SELECT min(a) FILTER (WHERE a>3) FROM t1 GROUP BY (a%2) ORDER BY 1; 606ba7ab0dSdan} {4 5} 616ba7ab0dSdan 624f9adee2Sdando_execsql_test 1.8 { 634f9adee2Sdan CREATE VIEW vv AS 644f9adee2Sdan SELECT sum(a) FILTER( WHERE a>9 ), 654f9adee2Sdan sum(a) FILTER( WHERE a>8 ), 664f9adee2Sdan sum(a) FILTER( WHERE a>7 ), 674f9adee2Sdan sum(a) FILTER( WHERE a>6 ), 684f9adee2Sdan sum(a) FILTER( WHERE a>5 ), 694f9adee2Sdan sum(a) FILTER( WHERE a>4 ), 704f9adee2Sdan sum(a) FILTER( WHERE a>3 ), 714f9adee2Sdan sum(a) FILTER( WHERE a>2 ), 724f9adee2Sdan sum(a) FILTER( WHERE a>1 ), 734f9adee2Sdan sum(a) FILTER( WHERE a>0 ) 744f9adee2Sdan FROM t1; 754f9adee2Sdan SELECT * FROM vv; 764f9adee2Sdan} {{} 9 17 24 30 35 39 42 44 45} 774f9adee2Sdan 786ba7ab0dSdan 796ba7ab0dSdan#------------------------------------------------------------------------- 806ba7ab0dSdan# Test some errors: 816ba7ab0dSdan# 826ba7ab0dSdan# .1 FILTER on a non-aggregate function, 836ba7ab0dSdan# .2 Window function in FILTER clause, 846ba7ab0dSdan# .3 Aggregate function in FILTER clause, 856ba7ab0dSdan# 866ba7ab0dSdanreset_db 876ba7ab0dSdando_execsql_test 2.0 { 886ba7ab0dSdan CREATE TABLE t1(a); 896ba7ab0dSdan INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); 906ba7ab0dSdan} 916ba7ab0dSdan 926ba7ab0dSdando_catchsql_test 2.1 { 936ba7ab0dSdan SELECT upper(a) FILTER (WHERE a=1) FROM t1 945e61c1b7Sdan} {1 {FILTER may not be used with non-aggregate upper()}} 956ba7ab0dSdan 966ba7ab0dSdando_catchsql_test 2.2 { 976ba7ab0dSdan SELECT sum(a) FILTER (WHERE 1 - max(a) OVER () > 0) FROM t1 986ba7ab0dSdan} {1 {misuse of window function max()}} 996ba7ab0dSdan 1006ba7ab0dSdando_catchsql_test 2.3 { 1016ba7ab0dSdan SELECT sum(a) FILTER (WHERE 1 - count(a)) FROM t1 10216e12c57Sdan} {1 {misuse of aggregate function count()}} 1036ba7ab0dSdan 104ed09dddeSdan#------------------------------------------------------------------------- 105ed09dddeSdanreset_db 106ed09dddeSdando_execsql_test 3.0 { 107ed09dddeSdan CREATE TABLE t1(a,b); 108ed09dddeSdan INSERT INTO t1 VALUES(1, 1); 109ed09dddeSdan} 110ed09dddeSdando_execsql_test 3.1 { 111ed09dddeSdan SELECT b, max(a) FILTER (WHERE b='x') FROM t1; 112ed09dddeSdan} {1 {}} 113ed09dddeSdan 114ed09dddeSdando_execsql_test 3.2 { 115ed09dddeSdan CREATE TABLE t2(a, b, c); 116ed09dddeSdan INSERT INTO t2 VALUES(1, 2, 3); 117ed09dddeSdan INSERT INTO t2 VALUES(1, 3, 4); 118ed09dddeSdan INSERT INTO t2 VALUES(2, 5, 6); 119ed09dddeSdan INSERT INTO t2 VALUES(2, 7, 8); 120ed09dddeSdan} 121ed09dddeSdando_execsql_test 3.3 { 122ed09dddeSdan SELECT a, c, max(b) FILTER (WHERE c='x') FROM t2 GROUP BY a; 123ed09dddeSdan} {1 3 {} 2 6 {}} 124ed09dddeSdan 125ed09dddeSdando_execsql_test 3.4 { 126ed09dddeSdan DELETE FROM t2; 127ed09dddeSdan INSERT INTO t2 VALUES(1, 5, 'x'); 128ed09dddeSdan INSERT INTO t2 VALUES(1, 2, 3); 129ed09dddeSdan INSERT INTO t2 VALUES(1, 4, 'x'); 130ed09dddeSdan INSERT INTO t2 VALUES(2, 5, 6); 131ed09dddeSdan INSERT INTO t2 VALUES(2, 7, 8); 132ed09dddeSdan} 133ed09dddeSdando_execsql_test 3.5 { 134ed09dddeSdan SELECT a, c, max(b) FILTER (WHERE c='x') FROM t2 GROUP BY a; 135ed09dddeSdan} {1 x 5 2 6 {}} 136ed09dddeSdan 137a51ddb1eSdan#------------------------------------------------------------------------- 138a51ddb1eSdanreset_db 139a51ddb1eSdando_execsql_test 4.0 { 140a51ddb1eSdan CREATE TABLE t1(a, b, c); 141a51ddb1eSdan INSERT INTO t1 VALUES('a', 0, 5); 142a51ddb1eSdan INSERT INTO t1 VALUES('a', 1, 10); 143a51ddb1eSdan INSERT INTO t1 VALUES('a', 0, 15); 144a51ddb1eSdan 145a51ddb1eSdan INSERT INTO t1 VALUES('b', 0, 5); 146a51ddb1eSdan INSERT INTO t1 VALUES('b', 1, 1000); 147a51ddb1eSdan INSERT INTO t1 VALUES('b', 0, 5); 148a51ddb1eSdan 149a51ddb1eSdan INSERT INTO t1 VALUES('c', 0, 1); 150a51ddb1eSdan INSERT INTO t1 VALUES('c', 1, 2); 151a51ddb1eSdan INSERT INTO t1 VALUES('c', 0, 3); 152a51ddb1eSdan} 153a51ddb1eSdan 154a51ddb1eSdando_execsql_test 4.1 { 155a51ddb1eSdan SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY h; 156a51ddb1eSdan} {2.0 5.0 10.0} 157a51ddb1eSdando_execsql_test 4.2 { 158a51ddb1eSdan SELECT avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY (h+1.0); 159a51ddb1eSdan} {2.0 5.0 10.0} 160a51ddb1eSdando_execsql_test 4.3 { 161a51ddb1eSdan SELECT a, avg(c) FILTER (WHERE b!=1) AS h FROM t1 GROUP BY a ORDER BY avg(c); 162a51ddb1eSdan} {c 2.0 a 10.0 b 5.0} 163a51ddb1eSdando_execsql_test 4.4 { 164a51ddb1eSdan SELECT a, avg(c) FILTER (WHERE b!=1) FROM t1 GROUP BY a ORDER BY 2 165a51ddb1eSdan} {c 2.0 b 5.0 a 10.0} 166a51ddb1eSdan 1673703edf1Sdan#------------------------------------------------------------------------- 1683703edf1Sdanreset_db 1693703edf1Sdando_execsql_test 5.0 { 1703703edf1Sdan CREATE TABLE t1(a, b); 1713703edf1Sdan INSERT INTO t1 VALUES(1, 2); 1723703edf1Sdan INSERT INTO t1 VALUES(1, 3); 1733703edf1Sdan} 1743703edf1Sdan 1753703edf1Sdando_execsql_test 5.1 { 1763703edf1Sdan SELECT count(*) FILTER (WHERE b>2) FROM (SELECT * FROM t1) 1773703edf1Sdan} {1} 1783703edf1Sdan 1793703edf1Sdando_execsql_test 5.2 { 1803703edf1Sdan SELECT count(*) FILTER (WHERE b>2) OVER () FROM (SELECT * FROM t1) 1813703edf1Sdan} {1 1} 1823703edf1Sdan 1833703edf1Sdando_execsql_test 5.3 { 1843703edf1Sdan SELECT count(*) FILTER (WHERE b>2) OVER (ORDER BY b) FROM (SELECT * FROM t1) 1853703edf1Sdan} {0 1} 1863703edf1Sdan 1875e484cb3Sdan#------------------------------------------------------------------------- 1885e484cb3Sdanreset_db 1895e484cb3Sdando_execsql_test 6.0 { 1905e484cb3Sdan CREATE TABLE t1(a,b); 1915e484cb3Sdan INSERT INTO t1 VALUES(1,1); 1925e484cb3Sdan INSERT INTO t1 VALUES(2,2); 1935e484cb3Sdan CREATE TABLE t2(x,y); 1945e484cb3Sdan INSERT INTO t2 VALUES(1,1); 1955e484cb3Sdan} 1965e484cb3Sdan 1975e484cb3Sdando_execsql_test 6.1 { 1985e484cb3Sdan SELECT (SELECT COUNT(a) FILTER(WHERE x) FROM t2) FROM t1; 1995e484cb3Sdan} {1 1} 2005e484cb3Sdando_execsql_test 6.2 { 2015e484cb3Sdan SELECT (SELECT COUNT(a+x) FROM t2) FROM t1; 2025e484cb3Sdan} {1 1} 2035e484cb3Sdando_execsql_test 6.3 { 2045e484cb3Sdan SELECT (SELECT COUNT(a) FROM t2) FROM t1; 2055e484cb3Sdan} {2} 2065e484cb3Sdan 207*fa4b0d44Sdan#------------------------------------------------------------------------- 208*fa4b0d44Sdanreset_db 209*fa4b0d44Sdando_execsql_test 7.0 { 210*fa4b0d44Sdan CREATE TABLE t1(a INTEGER PRIMARY KEY, b); 211*fa4b0d44Sdan INSERT INTO t1 VALUES(321, 100000); 212*fa4b0d44Sdan INSERT INTO t1 VALUES(111, 110000); 213*fa4b0d44Sdan INSERT INTO t1 VALUES(444, 120000); 214*fa4b0d44Sdan INSERT INTO t1 VALUES(222, 130000); 215*fa4b0d44Sdan} 216*fa4b0d44Sdan 217*fa4b0d44Sdando_execsql_test 7.1 { 218*fa4b0d44Sdan SELECT max(a), max(a) FILTER (WHERE b<12345), b FROM t1; 219*fa4b0d44Sdan} { 220*fa4b0d44Sdan 444 {} 120000 221*fa4b0d44Sdan} 222*fa4b0d44Sdan 223*fa4b0d44Sdan 224*fa4b0d44Sdan 2256ba7ab0dSdanfinish_test 226