xref: /sqlite-3.40.0/test/window9.test (revision b0c4ef71)
1# 2019 June 8
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
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.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.
12#
13
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16set testprefix window9
17
18ifcapable !windowfunc {
19  finish_test
20  return
21}
22
23do_execsql_test 1.0 {
24  CREATE TABLE fruits(
25     name TEXT COLLATE NOCASE,
26     color TEXT COLLATE NOCASE
27  );
28}
29
30do_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');
35}
36
37do_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
44}
45
46do_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
55}
56
57do_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
67}
68
69do_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
79}
80
81do_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');
85}
86
87do_execsql_test 2.1.1 {
88  SELECT c=='Abc' FROM t1
89} {1     1}
90do_execsql_test 2.1.2 {
91  SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1
92} {1 1   1 2}
93
94do_execsql_test 2.2.1 {
95  SELECT b=='2' FROM t1
96} {1     0}
97do_execsql_test 2.2.2 {
98  SELECT b=='2', rank() OVER (ORDER BY a) FROM t1
99} {1 1   0 2}
100
101#-------------------------------------------------------------------------
102reset_db
103do_execsql_test 3.0 {
104  CREATE TABLE t1(a);
105  CREATE TABLE t2(a,b,c);
106}
107
108do_execsql_test 3.1 {
109  SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1;
110}
111
112do_execsql_test 3.2 {
113  SELECT sum(a) OVER () FROM t2
114   ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ());
115}
116
117do_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}}
123
124do_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}}
133
134#-------------------------------------------------------------------------
135reset_db
136do_execsql_test 4.0 {
137  CREATE TABLE t1(a, b TEXT);
138  INSERT INTO t1 VALUES('A', 1), ('A', 2), ('2', 1), ('2', 2);
139}
140
141do_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}
144do_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}
147
148#--------------------------------------------------------------------------
149reset_db
150do_execsql_test 5.0 {
151  CREATE TABLE t1(a, b, c, d, e);
152  CREATE INDEX i1 ON t1(a, b, c, d, e);
153}
154
155foreach {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/}
172}
173
174#-------------------------------------------------------------------------
175reset_db
176do_execsql_test 6.0 {
177  CREATE TABLE t0(c0);
178  INSERT INTO t0(c0) VALUES (0);
179}
180
181do_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}
190
191do_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}
197
198#-------------------------------------------------------------------------
199reset_db
200do_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} {}
209
210
211do_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
215}
216
217do_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
221}
222
223do_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
227}
228
229do_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
233}
234
235finish_test
236