blob: 234f0f00323259f2db53cd8b2fa62a574b3e772b [file] [log] [blame]
dan0d86a9b2019-03-08 20:57:05 +00001# 2018 May 19
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#
12
13source [file join [file dirname $argv0] pg_common.tcl]
14
15#=========================================================================
16
17start_test window8 "2019 March 01"
18ifcapable !windowfunc
19
20execsql_test 1.0 {
21 DROP TABLE IF EXISTS t3;
22 CREATE TABLE t3(a TEXT, b TEXT, c INTEGER);
23 INSERT INTO t3 VALUES
24 ('HH', 'bb', 355), ('CC', 'aa', 158), ('BB', 'aa', 399),
25 ('FF', 'bb', 938), ('HH', 'aa', 480), ('FF', 'bb', 870),
26 ('JJ', 'aa', 768), ('JJ', 'aa', 899), ('GG', 'bb', 929),
27 ('II', 'bb', 421), ('GG', 'bb', 844), ('FF', 'bb', 574),
28 ('CC', 'bb', 822), ('GG', 'bb', 938), ('BB', 'aa', 660),
29 ('HH', 'aa', 979), ('BB', 'bb', 792), ('DD', 'aa', 845),
30 ('JJ', 'bb', 354), ('FF', 'bb', 295), ('JJ', 'aa', 234),
31 ('BB', 'bb', 840), ('AA', 'aa', 934), ('EE', 'aa', 113),
32 ('AA', 'bb', 309), ('BB', 'aa', 412), ('AA', 'aa', 911),
33 ('AA', 'bb', 572), ('II', 'aa', 398), ('II', 'bb', 250),
34 ('II', 'aa', 652), ('BB', 'bb', 633), ('AA', 'aa', 239),
35 ('FF', 'aa', 670), ('BB', 'bb', 705), ('HH', 'bb', 963),
36 ('CC', 'bb', 346), ('II', 'bb', 671), ('BB', 'aa', 247),
37 ('AA', 'aa', 223), ('GG', 'aa', 480), ('HH', 'aa', 790),
38 ('FF', 'aa', 208), ('BB', 'bb', 711), ('EE', 'aa', 777),
39 ('DD', 'bb', 716), ('CC', 'aa', 759), ('CC', 'aa', 430),
40 ('CC', 'aa', 607), ('DD', 'bb', 794), ('GG', 'aa', 148),
41 ('GG', 'aa', 634), ('JJ', 'bb', 257), ('DD', 'bb', 959),
42 ('FF', 'bb', 726), ('BB', 'aa', 762), ('JJ', 'bb', 336),
43 ('GG', 'aa', 335), ('HH', 'bb', 330), ('GG', 'bb', 160),
44 ('JJ', 'bb', 839), ('FF', 'aa', 618), ('BB', 'aa', 393),
45 ('EE', 'bb', 629), ('FF', 'aa', 667), ('AA', 'bb', 870),
46 ('FF', 'bb', 102), ('JJ', 'aa', 113), ('DD', 'aa', 224),
47 ('AA', 'bb', 627), ('HH', 'bb', 730), ('II', 'bb', 443),
48 ('HH', 'bb', 133), ('EE', 'bb', 252), ('II', 'bb', 805),
49 ('BB', 'bb', 786), ('EE', 'bb', 768), ('HH', 'bb', 683),
50 ('DD', 'bb', 238), ('DD', 'aa', 256);
51}
52
53foreach {tn frame} {
54 1 { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING }
55 2 { GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW }
56 3 { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING }
57 4 { GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING }
58 5 { GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING }
59 6 { GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING }
60 7 { GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING }
61 8 { GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING }
62 9 { GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW }
63 10 { GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING }
64 11 { GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING }
65 12 { GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING }
66 13 { GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING }
67 14 { GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING }
68 15 { GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
69 16 { GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING }
70 17 { GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING }
71 18 { GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING }
72 19 { GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING }
73
74} {
75 execsql_test 1.$tn.1 "
76 SELECT a, b, sum(c) OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
77 "
78 execsql_test 1.$tn.2 "
79 SELECT a, b, sum(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
80 "
81 execsql_test 1.$tn.3 "
82 SELECT a, b, rank() OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
83 "
84 execsql_test 1.$tn.4 "
85 SELECT a, b, max(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
86 "
87 execsql_test 1.$tn.5 "
88 SELECT a, b, min(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
89 "
danc782a812019-03-15 20:46:19 +000090
91 set f2 "$frame EXCLUDE CURRENT ROW"
92
93 execsql_test 1.$tn.6 "
94 SELECT a, b, sum(c) OVER (ORDER BY a $f2) FROM t3 ORDER BY 1, 2, 3;
95 "
96 execsql_test 1.$tn.7 "
97 SELECT a, b, sum(c) OVER (ORDER BY a,b $f2) FROM t3 ORDER BY 1, 2, 3;
98 "
dand430c2e2019-03-19 11:17:28 +000099
100 execsql_test 1.$tn.8 "
101 SELECT a, b,
102 sum(c) OVER (ORDER BY a $f2),
103 sum(c) OVER (ORDER BY a $frame),
104 sum(c) OVER (ORDER BY a,b $f2),
105 sum(c) OVER (ORDER BY a,b $frame)
106 FROM t3 ORDER BY 1, 2, 3;
107 "
dan0d86a9b2019-03-08 20:57:05 +0000108}
109
dana0f6b832019-03-14 16:36:20 +0000110
111foreach {tn ex} {
112 1 { EXCLUDE NO OTHERS }
113 2 { EXCLUDE CURRENT ROW }
114 3 { EXCLUDE GROUP }
115 4 { EXCLUDE TIES }
116} {
117 execsql_test 2.$tn.1 "
118 SELECT row_number() OVER win
119 FROM t3
120 WINDOW win AS (
121 ORDER BY c, b, a
122 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
123 )
124 "
125
126 execsql_test 2.$tn.2 "
127 SELECT nth_value(c, 14) OVER win
128 FROM t3
danc782a812019-03-15 20:46:19 +0000129 WINDOW win AS (
130 ORDER BY c, b, a
131 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
132 )
dana0f6b832019-03-14 16:36:20 +0000133 "
dan1e7cb192019-03-16 20:29:54 +0000134
135 execsql_test 2.$tn.3 "
136 SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3
137 WINDOW win AS (
138 ORDER BY c, b, a
139 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW $ex
140 ) ORDER BY a, b, c;
141 "
dana0f6b832019-03-14 16:36:20 +0000142}
143
dan72b9fdc2019-03-09 20:49:17 +0000144==========
145
dana0f6b832019-03-14 16:36:20 +0000146execsql_test 3.0 {
dan72b9fdc2019-03-09 20:49:17 +0000147 DROP TABLE IF EXISTS t1;
danbb407272019-03-12 18:28:51 +0000148 CREATE TABLE t1(a REAL, b INTEGER);
dan72b9fdc2019-03-09 20:49:17 +0000149 INSERT INTO t1 VALUES
dan71fddaf2019-03-11 11:12:34 +0000150 (5, 10), (10, 20), (13, 26), (13, 26),
151 (15, 30), (20, 40), (22,80), (30, 90);
dan72b9fdc2019-03-09 20:49:17 +0000152}
153
154foreach {tn frame} {
155 1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
156 2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
157 3 { ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
dan71fddaf2019-03-11 11:12:34 +0000158 4 { ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
159 5 { ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
160 6 { ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
danbb407272019-03-12 18:28:51 +0000161
162 7 { ORDER BY a RANGE BETWEEN 5.1 PRECEDING AND 5.3 FOLLOWING }
163 8 { ORDER BY a RANGE BETWEEN 10.2 PRECEDING AND 5.4 PRECEDING }
164 9 { ORDER BY a RANGE BETWEEN 2.6 FOLLOWING AND 3.5 FOLLOWING }
165 10 { ORDER BY a DESC RANGE BETWEEN 5.7 PRECEDING AND 5.8 FOLLOWING }
166 11 { ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND 5.9 PRECEDING }
167 12 { ORDER BY a DESC RANGE BETWEEN 2.1 FOLLOWING AND UNBOUNDED FOLLOWING }
dan8eff0cc2019-03-19 17:45:31 +0000168 13 { ORDER BY a RANGE 5.1 PRECEDING }
dan72b9fdc2019-03-09 20:49:17 +0000169} {
dana0f6b832019-03-14 16:36:20 +0000170 execsql_test 3.$tn "
danbb407272019-03-12 18:28:51 +0000171 SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ($frame)
172 "
dan72b9fdc2019-03-09 20:49:17 +0000173}
174
dan1e7cb192019-03-16 20:29:54 +0000175==========
176
177execsql_test 4.0 {
178 DROP TABLE IF EXISTS t1;
179 CREATE TABLE t1(a INTEGER, b INTEGER);
180 INSERT INTO t1 VALUES
181 (NULL, 1), (NULL, 2), (NULL, 3), (10, 4), (10, 5);
182}
183
danbdabe742019-03-18 16:51:24 +0000184execsql_test 4.1.1 {
dan1e7cb192019-03-16 20:29:54 +0000185 SELECT sum(b) OVER (
186 ORDER BY a RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
187 ) FROM t1 ORDER BY 1;
188}
danbdabe742019-03-18 16:51:24 +0000189execsql_test 4.1.2 {
190 SELECT sum(b) OVER (
191 ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
192 ) FROM t1 ORDER BY 1;
193}
dan72b9fdc2019-03-09 20:49:17 +0000194
danbdabe742019-03-18 16:51:24 +0000195execsql_test 4.2.1 {
196 SELECT sum(b) OVER (
197 ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
198 ) FROM t1 ORDER BY 1 NULLS FIRST;
199}
200
201execsql_test 4.2.2 {
202 SELECT sum(b) OVER (
203 ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
204 ) FROM t1 ORDER BY 1 NULLS FIRST;
205}
206
207execsql_test 4.3.1 {
208 SELECT sum(b) OVER (
209 ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
210 ) FROM t1 ORDER BY 1 NULLS FIRST;
211}
212
213execsql_test 4.4.1 {
214 SELECT sum(b) OVER (
215 ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
216 ) FROM t1 ORDER BY 1 NULLS FIRST;
217}
218
219execsql_test 4.4.2 {
220 SELECT sum(b) OVER (
221 ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
222 ) FROM t1 ORDER BY 1 NULLS FIRST;
223}
dan66033422019-03-19 19:19:53 +0000224
225==========
226
227execsql_test 5.0 {
228 INSERT INTO t3 VALUES
229 (NULL, 'bb', 355), (NULL, 'cc', 158), (NULL, 'aa', 399),
230 ('JJ', NULL, 839), ('FF', NULL, 618), ('BB', NULL, 393),
231 (NULL, 'bb', 629), (NULL, NULL, 667), (NULL, NULL, 870);
232}
233
234foreach {tn ex} {
235 1 { EXCLUDE NO OTHERS }
236 2 { EXCLUDE CURRENT ROW }
237 3 { EXCLUDE GROUP }
238 4 { EXCLUDE TIES }
239} {
240 foreach {tn2 frame} {
241 1 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
242 2 { ORDER BY a NULLS FIRST
243 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
244 3 { PARTITION BY coalesce(a, '')
245 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
246 4 { ORDER BY a NULLS FIRST GROUPS 6 PRECEDING }
247 5 { ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
dan78694ea2019-03-19 19:39:42 +0000248 6 { ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
249 7 { ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
250 ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
dan66033422019-03-19 19:19:53 +0000251 } {
252 execsql_test 5.$tn.$tn2.1 "
253 SELECT max(c) OVER win,
dan78694ea2019-03-19 19:39:42 +0000254 min(c) OVER win,
255 count(a) OVER win
dan66033422019-03-19 19:19:53 +0000256 FROM t3
257 WINDOW win AS ( $frame $ex )
dan78694ea2019-03-19 19:39:42 +0000258 ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
dan66033422019-03-19 19:19:53 +0000259 "
260
261 execsql_test 5.$tn.$tn2.2 "
262 SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
dan78694ea2019-03-19 19:39:42 +0000263 rank() OVER win,
264 dense_rank() OVER win
dan66033422019-03-19 19:19:53 +0000265 FROM t3
266 WINDOW win AS ( $frame $ex )
dan78694ea2019-03-19 19:39:42 +0000267 ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
dan66033422019-03-19 19:19:53 +0000268 "
269 }
270}
271
dan0d86a9b2019-03-08 20:57:05 +0000272finish_test
273
274