Add a test for the fixes on this branch.
[sqlite.git] / test / window9.test
blob4b8e4fa58ff7886305efd6c3bba43ccdf896c79f
1 # 2019 June 8
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
6 #    May you do good and not evil.
7 #    May you find forgiveness for yourself and forgive others.
8 #    May you share freely, never taking more than you give.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
14 set testdir [file dirname $argv0]
15 source $testdir/tester.tcl
16 set testprefix window9
18 ifcapable !windowfunc {
19   finish_test
20   return
23 do_execsql_test 1.0 {
24   CREATE TABLE fruits(
25      name TEXT COLLATE NOCASE,
26      color TEXT COLLATE NOCASE
27   );
30 do_execsql_test 1.1 {
31   INSERT INTO fruits (name, color) VALUES ('apple', 'RED');
32   INSERT INTO fruits (name, color) VALUES ('APPLE', 'yellow');
33   INSERT INTO fruits (name, color) VALUES ('pear', 'YELLOW');
34   INSERT INTO fruits (name, color) VALUES ('PEAR', 'green');
37 do_execsql_test 1.2 {
38   SELECT name, color, dense_rank() OVER (ORDER BY name) FROM fruits;
39 } {
40   apple RED    1
41   APPLE yellow 1
42   pear  YELLOW 2
43   PEAR  green  2
46 do_execsql_test 1.3 {
47   SELECT name, color,
48     dense_rank() OVER (PARTITION BY name ORDER BY color)
49   FROM fruits;
50 } {
51   apple RED    1 
52   APPLE yellow 2 
53   PEAR green   1 
54   pear YELLOW  2
57 do_execsql_test 1.4 {
58   SELECT name, color,
59     dense_rank() OVER (ORDER BY name),
60     dense_rank() OVER (PARTITION BY name ORDER BY color)
61   FROM fruits;
62 } {
63   apple RED    1 1 
64   APPLE yellow 1 2 
65   PEAR  green  2 1 
66   pear  YELLOW 2 2
69 do_execsql_test 1.5 {
70   SELECT name, color,
71     dense_rank() OVER (ORDER BY name),
72     dense_rank() OVER (PARTITION BY name ORDER BY color)
73   FROM fruits ORDER BY color;
74 } {
75   PEAR  green  2 1 
76   apple RED    1 1 
77   APPLE yellow 1 2 
78   pear  YELLOW 2 2
81 do_execsql_test 2.0 {
82   CREATE TABLE t1(a BLOB, b INTEGER, c COLLATE nocase);
83   INSERT INTO t1 VALUES(1, 2, 'abc');
84   INSERT INTO t1 VALUES(3, 4, 'ABC');
87 do_execsql_test 2.1.1 {
88   SELECT c=='Abc' FROM t1
89 } {1     1}
90 do_execsql_test 2.1.2 {
91   SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1
92 } {1 1   1 2}
94 do_execsql_test 2.2.1 {
95   SELECT b=='2' FROM t1
96 } {1     0}
97 do_execsql_test 2.2.2 {
98   SELECT b=='2', rank() OVER (ORDER BY a) FROM t1
99 } {1 1   0 2}
101 #-------------------------------------------------------------------------
102 reset_db
103 do_execsql_test 3.0 {
104   CREATE TABLE t1(a);
105   CREATE TABLE t2(a,b,c);
108 do_execsql_test 3.1 {
109   SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1;
112 do_execsql_test 3.2 {
113   SELECT sum(a) OVER () FROM t2
114    ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ());
117 do_catchsql_test 3.3 {
118   SELECT a, sum(a) OVER (ORDER BY a DESC) FROM t2 
119   ORDER BY EXISTS(
120     SELECT 1 FROM t2 ORDER BY sum(a) OVER (ORDER BY a)
121   ) OVER (ORDER BY a);
122 } {1 {near "OVER": syntax error}}
124 do_catchsql_test 3.4 {
125   SELECT y, y+1, y+2 FROM (
126       SELECT c IN (
127         SELECT min(a) OVER (),
128         (abs(row_number() OVER())+22)/19,
129         max(a) OVER () FROM t1
130         ) AS y FROM t2
131       );
132 } {1 {sub-select returns 3 columns - expected 1}}
134 #-------------------------------------------------------------------------
135 reset_db
136 do_execsql_test 4.0 {
137   CREATE TABLE t1(a, b TEXT);
138   INSERT INTO t1 VALUES('A', 1), ('A', 2), ('2', 1), ('2', 2);
141 do_execsql_test 4.1.1 {
142   SELECT b, b=count(*), '1,2'                   FROM t1 GROUP BY b;
143 } {1 0 1,2 2 1 1,2}
144 do_execsql_test 4.1.2 {
145   SELECT b, b=count(*), group_concat(b) OVER () FROM t1 GROUP BY b;
146 } {1 0 1,2 2 1 1,2}
148 #--------------------------------------------------------------------------
149 reset_db
150 do_execsql_test 5.0 {
151   CREATE TABLE t1(a, b, c, d, e);
152   CREATE INDEX i1 ON t1(a, b, c, d, e);
155 foreach {tn sql} {
156   1 {
157     SELECT 
158       sum(e) OVER (),
159       sum(e) OVER (ORDER BY a),
160       sum(e) OVER (PARTITION BY a ORDER BY b),
161       sum(e) OVER (PARTITION BY a, b ORDER BY c),
162       sum(e) OVER (PARTITION BY a, b, c ORDER BY d)
163     FROM t1;
164   }
165   2 {
166     SELECT sum(e) OVER (PARTITION BY a ORDER BY b) FROM t1 ORDER BY a;
167   }
168 } {
169   do_test 5.1.$tn {
170     execsql "EXPLAIN QUERY PLAN $sql"
171   } {~/ORDER/}
174 #-------------------------------------------------------------------------
175 reset_db
176 do_execsql_test 6.0 {
177   CREATE TABLE t0(c0);
178   INSERT INTO t0(c0) VALUES (0);
181 do_execsql_test 6.1 {
182   SELECT * FROM t0 WHERE 
183   EXISTS (
184     SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
185   ) >=1 AND 
186   EXISTS (
187     SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
188   ) <=1;
189 } {0}
191 do_execsql_test 6.2 {
192   SELECT * FROM t0 WHERE EXISTS (
193     SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0
194   ) 
195   BETWEEN 1 AND 1;
196 } {0}
198 #-------------------------------------------------------------------------
199 reset_db
200 do_execsql_test 7.0 {
201   DROP TABLE IF EXISTS t1;
202   CREATE TABLE t1(x, y);
203   INSERT INTO t1 VALUES(10, 1);
204   INSERT INTO t1 VALUES(20, 2);
205   INSERT INTO t1 VALUES(3, 3);
206   INSERT INTO t1 VALUES(2, 4);
207   INSERT INTO t1 VALUES(1, 5);
208 } {}
211 do_execsql_test 7.1 {
212   SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z
213 } {
214   7.2 8.75 10.0 11.0 15.0
217 do_execsql_test 7.2 {
218   SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (z IS y);
219 } {
220   10.0 15.0 11.0 8.75 7.2
223 do_execsql_test 7.3 {
224   SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (y IS z);
225 } {
226   10.0 15.0 11.0 8.75 7.2
229 do_execsql_test 7.4 {
230   SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY z + 0.0;
231 } {
232   7.2 8.75 10.0 11.0 15.0
235 #-------------------------------------------------------------------------
236 reset_db
237 do_execsql_test 8.1.1 {
238   CREATE TABLE t1(a, b);
239   INSERT INTO t1 VALUES(1, 2), (3, 4);
240   SELECT min( sum(a) ) OVER () FROM t1;
241 } {4}
243 do_execsql_test 8.1.2 {
244   SELECT min( sum(a) ) OVER () FROM t1 GROUP BY a;
245 } {1 1}
247 do_execsql_test 8.2 {
248   CREATE VIEW v1 AS 
249     SELECT 0 AS x
250       UNION 
251     SELECT count() OVER() FROM (SELECT 0) 
252     ORDER BY 1
253   ;
256 do_catchsql_test 8.3 {
257   SELECT min( max((SELECT x FROM v1)) ) OVER()
258 } {0 0}
260 do_execsql_test 8.4 {
261   SELECT(
262       SELECT x UNION 
263       SELECT sum( avg((SELECT x FROM v1)) ) OVER()
264   )
265   FROM v1;
266 } {0.0 0.0}
268 #--------------------------------------------------------------------------
269 reset_db
270 do_execsql_test 9.0 {
271   CREATE TABLE t1(a, b, c);
272   INSERT INTO t1 VALUES(NULL,'bb',356);
273   INSERT INTO t1 VALUES('CB','aa',158);
274   INSERT INTO t1 VALUES('BB','aa',399);
275   INSERT INTO t1 VALUES('FF','bb',938);
278 do_catchsql_test 9.1 {
279   SELECT sum(c) OVER (
280     ORDER BY c RANGE BETWEEN 0 PRECEDING AND '-700' PRECEDING
281   )
282   FROM t1
283 } {1 {frame ending offset must be a non-negative number}}
285 finish_test