xref: /sqlite-3.40.0/test/filter1.test (revision fa4b0d44)
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