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