xref: /sqlite-3.40.0/test/window8.tcl (revision 3d691fd9)
10d86a9bdSdan# 2018 May 19
20d86a9bdSdan#
30d86a9bdSdan# The author disclaims copyright to this source code.  In place of
40d86a9bdSdan# a legal notice, here is a blessing:
50d86a9bdSdan#
60d86a9bdSdan#    May you do good and not evil.
70d86a9bdSdan#    May you find forgiveness for yourself and forgive others.
80d86a9bdSdan#    May you share freely, never taking more than you give.
90d86a9bdSdan#
100d86a9bdSdan#***********************************************************************
110d86a9bdSdan#
120d86a9bdSdan
130d86a9bdSdansource [file join [file dirname $argv0] pg_common.tcl]
140d86a9bdSdan
150d86a9bdSdan#=========================================================================
160d86a9bdSdan
170d86a9bdSdanstart_test window8 "2019 March 01"
180d86a9bdSdanifcapable !windowfunc
190d86a9bdSdan
200d86a9bdSdanexecsql_test 1.0 {
210d86a9bdSdan  DROP TABLE IF EXISTS t3;
220d86a9bdSdan  CREATE TABLE t3(a TEXT, b TEXT, c INTEGER);
230d86a9bdSdan  INSERT INTO t3 VALUES
240d86a9bdSdan    ('HH', 'bb', 355), ('CC', 'aa', 158), ('BB', 'aa', 399),
250d86a9bdSdan    ('FF', 'bb', 938), ('HH', 'aa', 480), ('FF', 'bb', 870),
260d86a9bdSdan    ('JJ', 'aa', 768), ('JJ', 'aa', 899), ('GG', 'bb', 929),
270d86a9bdSdan    ('II', 'bb', 421), ('GG', 'bb', 844), ('FF', 'bb', 574),
280d86a9bdSdan    ('CC', 'bb', 822), ('GG', 'bb', 938), ('BB', 'aa', 660),
290d86a9bdSdan    ('HH', 'aa', 979), ('BB', 'bb', 792), ('DD', 'aa', 845),
300d86a9bdSdan    ('JJ', 'bb', 354), ('FF', 'bb', 295), ('JJ', 'aa', 234),
310d86a9bdSdan    ('BB', 'bb', 840), ('AA', 'aa', 934), ('EE', 'aa', 113),
320d86a9bdSdan    ('AA', 'bb', 309), ('BB', 'aa', 412), ('AA', 'aa', 911),
330d86a9bdSdan    ('AA', 'bb', 572), ('II', 'aa', 398), ('II', 'bb', 250),
340d86a9bdSdan    ('II', 'aa', 652), ('BB', 'bb', 633), ('AA', 'aa', 239),
350d86a9bdSdan    ('FF', 'aa', 670), ('BB', 'bb', 705), ('HH', 'bb', 963),
360d86a9bdSdan    ('CC', 'bb', 346), ('II', 'bb', 671), ('BB', 'aa', 247),
370d86a9bdSdan    ('AA', 'aa', 223), ('GG', 'aa', 480), ('HH', 'aa', 790),
380d86a9bdSdan    ('FF', 'aa', 208), ('BB', 'bb', 711), ('EE', 'aa', 777),
390d86a9bdSdan    ('DD', 'bb', 716), ('CC', 'aa', 759), ('CC', 'aa', 430),
400d86a9bdSdan    ('CC', 'aa', 607), ('DD', 'bb', 794), ('GG', 'aa', 148),
410d86a9bdSdan    ('GG', 'aa', 634), ('JJ', 'bb', 257), ('DD', 'bb', 959),
420d86a9bdSdan    ('FF', 'bb', 726), ('BB', 'aa', 762), ('JJ', 'bb', 336),
430d86a9bdSdan    ('GG', 'aa', 335), ('HH', 'bb', 330), ('GG', 'bb', 160),
440d86a9bdSdan    ('JJ', 'bb', 839), ('FF', 'aa', 618), ('BB', 'aa', 393),
450d86a9bdSdan    ('EE', 'bb', 629), ('FF', 'aa', 667), ('AA', 'bb', 870),
460d86a9bdSdan    ('FF', 'bb', 102), ('JJ', 'aa', 113), ('DD', 'aa', 224),
470d86a9bdSdan    ('AA', 'bb', 627), ('HH', 'bb', 730), ('II', 'bb', 443),
480d86a9bdSdan    ('HH', 'bb', 133), ('EE', 'bb', 252), ('II', 'bb', 805),
490d86a9bdSdan    ('BB', 'bb', 786), ('EE', 'bb', 768), ('HH', 'bb', 683),
500d86a9bdSdan    ('DD', 'bb', 238), ('DD', 'aa', 256);
510d86a9bdSdan}
520d86a9bdSdan
530d86a9bdSdanforeach {tn frame} {
540d86a9bdSdan  1  { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING }
550d86a9bdSdan  2  { GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW }
560d86a9bdSdan  3  { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING }
570d86a9bdSdan  4  { GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING }
580d86a9bdSdan  5  { GROUPS BETWEEN 1 PRECEDING         AND 2 PRECEDING }
590d86a9bdSdan  6  { GROUPS BETWEEN 2 PRECEDING         AND 1 PRECEDING }
600d86a9bdSdan  7  { GROUPS BETWEEN 3 PRECEDING         AND 1 PRECEDING }
610d86a9bdSdan  8  { GROUPS BETWEEN 3 PRECEDING         AND 0 PRECEDING }
620d86a9bdSdan  9  { GROUPS BETWEEN 2 PRECEDING         AND CURRENT ROW }
630d86a9bdSdan  10 { GROUPS BETWEEN 3 PRECEDING         AND 0 FOLLOWING }
640d86a9bdSdan  11 { GROUPS BETWEEN 2 PRECEDING         AND UNBOUNDED FOLLOWING }
650d86a9bdSdan  12 { GROUPS BETWEEN CURRENT ROW         AND 0 FOLLOWING }
660d86a9bdSdan  13 { GROUPS BETWEEN CURRENT ROW         AND 1 FOLLOWING }
670d86a9bdSdan  14 { GROUPS BETWEEN CURRENT ROW         AND 100 FOLLOWING }
680d86a9bdSdan  15 { GROUPS BETWEEN CURRENT ROW         AND UNBOUNDED FOLLOWING }
690d86a9bdSdan  16 { GROUPS BETWEEN 0 FOLLOWING         AND 0 FOLLOWING }
700d86a9bdSdan  17 { GROUPS BETWEEN 1 FOLLOWING         AND 0 FOLLOWING }
710d86a9bdSdan  18 { GROUPS BETWEEN 1 FOLLOWING         AND 5 FOLLOWING }
720d86a9bdSdan  19 { GROUPS BETWEEN 1 FOLLOWING         AND UNBOUNDED FOLLOWING }
730d86a9bdSdan
740d86a9bdSdan} {
750d86a9bdSdan  execsql_test 1.$tn.1 "
760d86a9bdSdan    SELECT a, b, sum(c) OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
770d86a9bdSdan  "
780d86a9bdSdan  execsql_test 1.$tn.2 "
790d86a9bdSdan    SELECT a, b, sum(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
800d86a9bdSdan  "
810d86a9bdSdan  execsql_test 1.$tn.3 "
820d86a9bdSdan    SELECT a, b, rank() OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
830d86a9bdSdan  "
840d86a9bdSdan  execsql_test 1.$tn.4 "
850d86a9bdSdan    SELECT a, b, max(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
860d86a9bdSdan  "
870d86a9bdSdan  execsql_test 1.$tn.5 "
880d86a9bdSdan    SELECT a, b, min(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
890d86a9bdSdan  "
90c782a81aSdan
91c782a81aSdan  set f2 "$frame EXCLUDE CURRENT ROW"
92c782a81aSdan
93c782a81aSdan  execsql_test 1.$tn.6 "
94c782a81aSdan    SELECT a, b, sum(c) OVER (ORDER BY a $f2) FROM t3 ORDER BY 1, 2, 3;
95c782a81aSdan  "
96c782a81aSdan  execsql_test 1.$tn.7 "
97c782a81aSdan    SELECT a, b, sum(c) OVER (ORDER BY a,b $f2) FROM t3 ORDER BY 1, 2, 3;
98c782a81aSdan  "
99d430c2ebSdan
100d430c2ebSdan  execsql_test 1.$tn.8 "
101d430c2ebSdan    SELECT a, b,
102d430c2ebSdan      sum(c) OVER (ORDER BY a $f2),
103d430c2ebSdan      sum(c) OVER (ORDER BY a $frame),
104d430c2ebSdan      sum(c) OVER (ORDER BY a,b $f2),
105d430c2ebSdan      sum(c) OVER (ORDER BY a,b $frame)
106d430c2ebSdan    FROM t3 ORDER BY 1, 2, 3;
107d430c2ebSdan  "
1080d86a9bdSdan}
1090d86a9bdSdan
110a0f6b833Sdan
111a0f6b833Sdanforeach {tn ex} {
112a0f6b833Sdan  1  { EXCLUDE NO OTHERS }
113a0f6b833Sdan  2  { EXCLUDE CURRENT ROW }
114a0f6b833Sdan  3  { EXCLUDE GROUP }
115a0f6b833Sdan  4  { EXCLUDE TIES }
116a0f6b833Sdan} {
117a0f6b833Sdan  execsql_test 2.$tn.1 "
118a0f6b833Sdan    SELECT row_number() OVER win
119a0f6b833Sdan    FROM t3
120a0f6b833Sdan    WINDOW win AS (
121a0f6b833Sdan      ORDER BY c, b, a
122a0f6b833Sdan      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
123a0f6b833Sdan    )
124a0f6b833Sdan  "
125a0f6b833Sdan
126a0f6b833Sdan  execsql_test 2.$tn.2 "
127a0f6b833Sdan    SELECT nth_value(c, 14) OVER win
128a0f6b833Sdan    FROM t3
129c782a81aSdan    WINDOW win AS (
130c782a81aSdan      ORDER BY c, b, a
131c782a81aSdan      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
132c782a81aSdan    )
133a0f6b833Sdan  "
1341e7cb19bSdan
1351e7cb19bSdan  execsql_test 2.$tn.3 "
1361e7cb19bSdan    SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3
1371e7cb19bSdan    WINDOW win AS (
1381e7cb19bSdan      ORDER BY c, b, a
1391e7cb19bSdan      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW $ex
1401e7cb19bSdan    ) ORDER BY a, b, c;
1411e7cb19bSdan  "
142a0f6b833Sdan}
143a0f6b833Sdan
14472b9fdcfSdan==========
14572b9fdcfSdan
146a0f6b833Sdanexecsql_test 3.0 {
14772b9fdcfSdan  DROP TABLE IF EXISTS t1;
148bb407278Sdan  CREATE TABLE t1(a REAL, b INTEGER);
14972b9fdcfSdan  INSERT INTO t1 VALUES
15071fddaf1Sdan      (5, 10), (10, 20), (13, 26), (13, 26),
15171fddaf1Sdan      (15, 30), (20, 40), (22,80), (30, 90);
15272b9fdcfSdan}
15372b9fdcfSdan
15472b9fdcfSdanforeach {tn frame} {
15572b9fdcfSdan  1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
15672b9fdcfSdan  2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
15772b9fdcfSdan  3 { ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
15871fddaf1Sdan  4 { ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
15971fddaf1Sdan  5 { ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
16071fddaf1Sdan  6 { ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
161bb407278Sdan
162bb407278Sdan  7  { ORDER BY a RANGE BETWEEN 5.1 PRECEDING AND 5.3 FOLLOWING }
163bb407278Sdan  8  { ORDER BY a RANGE BETWEEN 10.2 PRECEDING AND 5.4 PRECEDING }
164bb407278Sdan  9  { ORDER BY a RANGE BETWEEN 2.6 FOLLOWING AND 3.5 FOLLOWING }
165bb407278Sdan  10 { ORDER BY a DESC RANGE BETWEEN 5.7 PRECEDING AND 5.8 FOLLOWING }
166bb407278Sdan  11 { ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND 5.9 PRECEDING }
167bb407278Sdan  12 { ORDER BY a DESC RANGE BETWEEN 2.1 FOLLOWING AND UNBOUNDED FOLLOWING }
1688eff0cc3Sdan  13  { ORDER BY a RANGE 5.1 PRECEDING }
16972b9fdcfSdan} {
170a0f6b833Sdan  execsql_test 3.$tn "
171bb407278Sdan    SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ($frame)
172bb407278Sdan  "
17372b9fdcfSdan}
17472b9fdcfSdan
1751e7cb19bSdan==========
1761e7cb19bSdan
1771e7cb19bSdanexecsql_test 4.0 {
1781e7cb19bSdan  DROP TABLE IF EXISTS t1;
1791e7cb19bSdan  CREATE TABLE t1(a INTEGER, b INTEGER);
1801e7cb19bSdan  INSERT INTO t1 VALUES
1811e7cb19bSdan    (NULL, 1), (NULL, 2), (NULL, 3), (10, 4), (10, 5);
1821e7cb19bSdan}
1831e7cb19bSdan
184bdabe742Sdanexecsql_test 4.1.1 {
1851e7cb19bSdan  SELECT sum(b) OVER (
1861e7cb19bSdan    ORDER BY a RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
1871e7cb19bSdan  ) FROM t1 ORDER BY 1;
1881e7cb19bSdan}
189bdabe742Sdanexecsql_test 4.1.2 {
190bdabe742Sdan  SELECT sum(b) OVER (
191bdabe742Sdan    ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
192bdabe742Sdan  ) FROM t1 ORDER BY 1;
193bdabe742Sdan}
19472b9fdcfSdan
195bdabe742Sdanexecsql_test 4.2.1 {
196bdabe742Sdan  SELECT sum(b) OVER (
197bdabe742Sdan    ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
198bdabe742Sdan  ) FROM t1 ORDER BY 1 NULLS FIRST;
199bdabe742Sdan}
200bdabe742Sdanexecsql_test 4.2.2 {
201bdabe742Sdan  SELECT sum(b) OVER (
202ae8e45cbSdan    ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
203ae8e45cbSdan  ) FROM t1 ORDER BY 1 NULLS LAST;
204ae8e45cbSdan}
205ae8e45cbSdan
206ae8e45cbSdanexecsql_test 4.2.3 {
207ae8e45cbSdan  SELECT sum(b) OVER (
208bdabe742Sdan    ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
209bdabe742Sdan  ) FROM t1 ORDER BY 1 NULLS FIRST;
210bdabe742Sdan}
211ae8e45cbSdanexecsql_test 4.2.4 {
212ae8e45cbSdan  SELECT sum(b) OVER (
213ae8e45cbSdan    ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
214ae8e45cbSdan  ) FROM t1 ORDER BY 1 NULLS LAST;
215ae8e45cbSdan}
216bdabe742Sdan
217bdabe742Sdanexecsql_test 4.3.1 {
218bdabe742Sdan  SELECT sum(b) OVER (
219bdabe742Sdan    ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
220bdabe742Sdan  ) FROM t1 ORDER BY 1 NULLS FIRST;
221bdabe742Sdan}
222ae8e45cbSdanexecsql_test 4.3.2 {
223ae8e45cbSdan  SELECT sum(b) OVER (
224ae8e45cbSdan    ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
225ae8e45cbSdan  ) FROM t1 ORDER BY 1 NULLS LAST;
226ae8e45cbSdan}
227bdabe742Sdan
228bdabe742Sdanexecsql_test 4.4.1 {
229bdabe742Sdan  SELECT sum(b) OVER (
230bdabe742Sdan    ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
231bdabe742Sdan  ) FROM t1 ORDER BY 1 NULLS FIRST;
232bdabe742Sdan}
233bdabe742Sdanexecsql_test 4.4.2 {
234bdabe742Sdan  SELECT sum(b) OVER (
235ae8e45cbSdan    ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
236ae8e45cbSdan  ) FROM t1 ORDER BY 1 NULLS LAST;
237ae8e45cbSdan}
238ae8e45cbSdan
239ae8e45cbSdanexecsql_test 4.4.3 {
240ae8e45cbSdan  SELECT sum(b) OVER (
241bdabe742Sdan    ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
242bdabe742Sdan  ) FROM t1 ORDER BY 1 NULLS FIRST;
243bdabe742Sdan}
244ae8e45cbSdanexecsql_test 4.4.4 {
245ae8e45cbSdan  SELECT sum(b) OVER (
246ae8e45cbSdan    ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
247ae8e45cbSdan  ) FROM t1 ORDER BY 1 NULLS LAST;
248ae8e45cbSdan}
2496603342fSdan
2508b47f520Sdanexecsql_test 4.5.1 {
2518b47f520Sdan  SELECT sum(b) OVER (
2528b47f520Sdan    ORDER BY a ASC  NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
2538b47f520Sdan  ) FROM t1 ORDER BY 1 NULLS LAST;
2548b47f520Sdan}
2558b47f520Sdanexecsql_test 4.5.2 {
2568b47f520Sdan  SELECT sum(b) OVER (
2578b47f520Sdan    ORDER BY a DESC NULLS FIRST RANGE
2588b47f520Sdan    BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
2598b47f520Sdan  ) FROM t1 ORDER BY 1 NULLS LAST;
2608b47f520Sdan}
2618b47f520Sdan
2626603342fSdan==========
2636603342fSdan
2646603342fSdanexecsql_test 5.0 {
2656603342fSdan  INSERT INTO t3 VALUES
2666603342fSdan    (NULL, 'bb', 355), (NULL, 'cc', 158), (NULL, 'aa', 399),
2676603342fSdan    ('JJ', NULL, 839), ('FF', NULL, 618), ('BB', NULL, 393),
2686603342fSdan    (NULL, 'bb', 629), (NULL, NULL, 667), (NULL, NULL, 870);
2696603342fSdan}
2706603342fSdan
2716603342fSdanforeach {tn ex} {
2726603342fSdan  1  { EXCLUDE NO OTHERS }
2736603342fSdan  2  { EXCLUDE CURRENT ROW }
2746603342fSdan  3  { EXCLUDE GROUP }
2756603342fSdan  4  { EXCLUDE TIES }
2766603342fSdan} {
2776603342fSdan  foreach {tn2 frame} {
2786603342fSdan    1 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
2796603342fSdan    2 { ORDER BY a NULLS FIRST
2806603342fSdan        RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
2816603342fSdan    3 { PARTITION BY coalesce(a, '')
2826603342fSdan        RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
2836603342fSdan    4 { ORDER BY a NULLS FIRST GROUPS 6 PRECEDING }
2846603342fSdan    5 { ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
28578694ea3Sdan    6 { ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
28678694ea3Sdan    7 { ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
28778694ea3Sdan        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
288ae8e45cbSdan
289ae8e45cbSdan    8 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
290ae8e45cbSdan    9 { ORDER BY a NULLS LAST
291ae8e45cbSdan        RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
292ae8e45cbSdan   10 { PARTITION BY coalesce(a, '')
293ae8e45cbSdan        RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
294ae8e45cbSdan   11 { ORDER BY a NULLS LAST GROUPS 6 PRECEDING }
295ae8e45cbSdan   12 { ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
296ae8e45cbSdan   13 { ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
297ae8e45cbSdan   14 { ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
298ae8e45cbSdan        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
2996603342fSdan  } {
3006603342fSdan    execsql_test 5.$tn.$tn2.1 "
3016603342fSdan      SELECT max(c) OVER win,
30278694ea3Sdan             min(c) OVER win,
30378694ea3Sdan             count(a) OVER win
3046603342fSdan      FROM t3
3056603342fSdan      WINDOW win AS ( $frame $ex )
30678694ea3Sdan      ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
3076603342fSdan    "
3086603342fSdan
3096603342fSdan    execsql_test 5.$tn.$tn2.2 "
3106603342fSdan      SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
31178694ea3Sdan             rank() OVER win,
31278694ea3Sdan             dense_rank() OVER win
3136603342fSdan      FROM t3
3146603342fSdan      WINDOW win AS ( $frame $ex )
31578694ea3Sdan      ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
3166603342fSdan    "
3176603342fSdan  }
3186603342fSdan}
3196603342fSdan
3203f49c321Sdan==========
3213f49c321Sdan
3223f49c321Sdanexecsql_test 6.0 {
3233f49c321Sdan  DROP TABLE IF EXISTS t2;
3243f49c321Sdan  CREATE TABLE t2(a TEXT, b INTEGER);
3253f49c321Sdan  INSERT INTO t2 VALUES('A', NULL);
3263f49c321Sdan  INSERT INTO t2 VALUES('B', NULL);
3273f49c321Sdan  INSERT INTO t2 VALUES('C', 1);
3283f49c321Sdan}
3293f49c321Sdan
3303f49c321Sdanexecsql_test 6.1 {
3313f49c321Sdan  SELECT string_agg(a, '.') OVER (
3323f49c321Sdan    ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
3333f49c321Sdan  )
3343f49c321Sdan  FROM t2
3353f49c321Sdan}
3363f49c321Sdan
3373f49c321Sdanexecsql_test 6.2 {
3383f49c321Sdan  SELECT string_agg(a, '.') OVER (
3393f49c321Sdan    ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
3403f49c321Sdan  )
3413f49c321Sdan  FROM t2
3423f49c321Sdan}
3433f49c321Sdan
3448b47f520Sdan==========
3453f49c321Sdan
3469889ede2Sdanexecsql_test 7.0 {
3479889ede2Sdan  DROP TABLE IF EXISTS t2;
3489889ede2Sdan  CREATE TABLE t2(a INTEGER, b INTEGER);
3499889ede2Sdan
3509889ede2Sdan  INSERT INTO t2 VALUES(1, 65);
3519889ede2Sdan  INSERT INTO t2 VALUES(2, NULL);
3529889ede2Sdan  INSERT INTO t2 VALUES(3, NULL);
3539889ede2Sdan  INSERT INTO t2 VALUES(4, NULL);
3541a97c413Sdan  INSERT INTO t2 VALUES(5, 66);
3551a97c413Sdan  INSERT INTO t2 VALUES(6, 67);
3569889ede2Sdan}
3579889ede2Sdan
3581a97c413Sdanforeach {tn f ex} {
3591a97c413Sdan  1 sum ""
3601a97c413Sdan  2 min ""
3611a97c413Sdan  3 sum "EXCLUDE CURRENT ROW"
3621a97c413Sdan  4 max "EXCLUDE CURRENT ROW"
3631a97c413Sdan} {
3641a97c413Sdanexecsql_test 7.$tn.1 "
3651a97c413Sdan  SELECT $f (a) OVER win FROM t2
3669889ede2Sdan  WINDOW win AS (
3679889ede2Sdan      ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
3689889ede2Sdan  );
3691a97c413Sdan"
3701a97c413Sdanexecsql_test 7.$tn.2 "
3711a97c413Sdan  SELECT $f (a) OVER win FROM t2
3721a97c413Sdan  WINDOW win AS (
3731a97c413Sdan      ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
3741a97c413Sdan  );
3751a97c413Sdan"
3761a97c413Sdanexecsql_test 7.$tn.3 "
3771a97c413Sdan  SELECT $f (a) OVER win FROM t2
3781a97c413Sdan  WINDOW win AS (
3791a97c413Sdan      ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
3801a97c413Sdan  );
3811a97c413Sdan"
3821a97c413Sdanexecsql_test 7.$tn.4 "
3831a97c413Sdan  SELECT $f (a) OVER win FROM t2
3841a97c413Sdan  WINDOW win AS (
3851a97c413Sdan      ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
3861a97c413Sdan  );
3871a97c413Sdan"
3881a97c413Sdanexecsql_test 7.$tn.5 "
3891a97c413Sdan  SELECT $f (a) OVER win FROM t2
3901a97c413Sdan  WINDOW win AS (
3911a97c413Sdan      ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
3921a97c413Sdan  );
3931a97c413Sdan"
3941a97c413Sdan
3951a97c413Sdanexecsql_test 7.$tn.6 "
3961a97c413Sdan  SELECT $f (a) OVER win FROM t2
3971a97c413Sdan  WINDOW win AS (
3981a97c413Sdan      ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
3991a97c413Sdan  );
4001a97c413Sdan"
4011a97c413Sdanexecsql_test 7.$tn.7 "
4021a97c413Sdan  SELECT $f (a) OVER win FROM t2
4031a97c413Sdan  WINDOW win AS (
4041a97c413Sdan      ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
4051a97c413Sdan  );
4061a97c413Sdan"
4071a97c413Sdanexecsql_test 7.$tn.8 "
4081a97c413Sdan  SELECT $f (a) OVER win FROM t2
4091a97c413Sdan  WINDOW win AS (
4101a97c413Sdan      ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
4111a97c413Sdan  );
4121a97c413Sdan"
4131a97c413Sdanexecsql_test 7.$tn.9 "
4141a97c413Sdan  SELECT $f (a) OVER win FROM t2
4151a97c413Sdan  WINDOW win AS (
4161a97c413Sdan      ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
4171a97c413Sdan  );
4181a97c413Sdan"
4199889ede2Sdan}
420ae8e45cbSdan
421be12083bSdan==========
422be12083bSdan
423be12083bSdanexecsql_test 8.0 {
424be12083bSdan  DROP TABLE IF EXISTS tx;
425be12083bSdan  CREATE TABLE tx(a INTEGER PRIMARY KEY);
426be12083bSdan  INSERT INTO tx VALUES(1), (2), (3), (4), (5), (6);
427be12083bSdan
428be12083bSdan  DROP TABLE IF EXISTS map;
429be12083bSdan  CREATE TABLE map(v INTEGER PRIMARY KEY, t TEXT);
430be12083bSdan  INSERT INTO map VALUES
431be12083bSdan    (1, 'odd'), (2, 'even'), (3, 'odd'),
432be12083bSdan    (4, 'even'), (5, 'odd'), (6, 'even');
433be12083bSdan}
434be12083bSdan
435be12083bSdanexecsql_test 8.1 {
436be12083bSdan  SELECT sum(a) OVER (
437be12083bSdan    PARTITION BY (
438be12083bSdan      SELECT t FROM map WHERE v=a
439be12083bSdan    ) ORDER BY a
440be12083bSdan  ) FROM tx;
441be12083bSdan}
442be12083bSdan
443be12083bSdanexecsql_test 8.2 {
444be12083bSdan  SELECT sum(a) OVER win FROM tx
445be12083bSdan  WINDOW win AS (
446be12083bSdan    PARTITION BY (
447be12083bSdan      SELECT t FROM map WHERE v=a
448be12083bSdan    ) ORDER BY a
449be12083bSdan  );
450be12083bSdan}
451be12083bSdan
452be12083bSdanexecsql_test 8.3 {
453be12083bSdan  WITH map2 AS (
454be12083bSdan    SELECT * FROM map
455be12083bSdan  )
456be12083bSdan  SELECT sum(a) OVER (
457be12083bSdan    PARTITION BY (
458be12083bSdan      SELECT t FROM map2 WHERE v=a
459be12083bSdan    ) ORDER BY a
460be12083bSdan  ) FROM tx;
461be12083bSdan}
462be12083bSdan
463be12083bSdanexecsql_test 8.4 {
464be12083bSdan  WITH map2 AS (
465be12083bSdan    SELECT * FROM map
466be12083bSdan  )
467be12083bSdan  SELECT sum(a) OVER win FROM tx
468be12083bSdan  WINDOW win AS (
469be12083bSdan    PARTITION BY (
470be12083bSdan      SELECT t FROM map2 WHERE v=a
471be12083bSdan    ) ORDER BY a
472be12083bSdan  );
473be12083bSdan}
474be12083bSdan
475*3d691fd9Sdan==========
476*3d691fd9Sdan
477*3d691fd9Sdanexecsql_test 9.1 {
478*3d691fd9Sdan  DROP TABLE IF EXISTS t1;
479*3d691fd9Sdan  DROP TABLE IF EXISTS t2;
480*3d691fd9Sdan  CREATE TABLE t1(a INTEGER);
481*3d691fd9Sdan  CREATE TABLE t2(y INTEGER);
482*3d691fd9Sdan}
483*3d691fd9Sdan
484*3d691fd9Sdanexecsql_test 9.2 {
485*3d691fd9Sdan  SELECT (
486*3d691fd9Sdan    SELECT max(a) OVER ( ORDER BY (SELECT sum(a) FROM t1) )
487*3d691fd9Sdan         + min(a) OVER()
488*3d691fd9Sdan  )
489*3d691fd9Sdan  FROM t1
490*3d691fd9Sdan}
4911a97c413Sdan
4921a97c413Sdan
4930d86a9bdSdanfinish_test
4940d86a9bdSdan
4950d86a9bdSdan
496