Skip to content

Commit 41956d0

Browse files
authored
fix(query): cume_dist() always return unbounded frame (#16242)
* fix(query): cume_dist() always return unbounded frame * fix test
1 parent 121bb95 commit 41956d0

File tree

5 files changed

+95
-70
lines changed

5 files changed

+95
-70
lines changed

src/query/sql/src/planner/semantic/type_check.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,13 @@ impl<'a> TypeChecker<'a> {
13881388
}
13891389
});
13901390
}
1391+
WindowFuncType::CumeDist => {
1392+
return Ok(WindowFuncFrame {
1393+
units: WindowFuncFrameUnits::Range,
1394+
start_bound: WindowFuncFrameBound::Preceding(None),
1395+
end_bound: WindowFuncFrameBound::Following(None),
1396+
});
1397+
}
13911398
_ => {}
13921399
}
13931400
if let Some(frame) = window_frame {

tests/sqllogictests/suites/query/window_function/expr_in_window.test

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ statement ok
1414
INSERT INTO empsalary VALUES ('develop', 10, 5200, '2007-08-01'), ('sales', 1, 5000, '2006-10-01'), ('personnel', 5, 3500, '2007-12-10'), ('sales', 4, 4800, '2007-08-08'), ('personnel', 2, 3900, '2006-12-23'), ('develop', 7, 4200, '2008-01-01'), ('develop', 9, 4500, '2008-01-01'), ('sales', 3, 4800, '2007-08-01'), ('develop', 8, 6000, '2006-10-01'), ('develop', 11, 5200, '2007-08-15')
1515

1616
statement ok
17-
CREATE TABLE `empsalary2` ( `depname` VARCHAR null, `empno` BIGINT null, `salary` INT null, `enroll_date` DATE null)
17+
CREATE or replace TABLE `empsalary2` ( `depname` VARCHAR null, `empno` BIGINT null, `salary` INT null, `enroll_date` DATE null)
1818

1919
statement ok
2020
INSERT INTO empsalary2 SELECT * FROM empsalary
@@ -48,7 +48,7 @@ SELECT enroll_date, empno, salary, sum(salary + 1) OVER (PARTITION BY enroll_dat
4848
2008-01-01 9 4500 8702
4949

5050
query IIIRT
51-
SELECT empno, empno % 2, salary, sum(salary + 1) OVER (PARTITION BY empno % 2 ORDER BY enroll_date + 1) as W, enroll_date FROM empsalary order by W
51+
SELECT empno, empno % 2, salary, sum(salary + 1) OVER (PARTITION BY empno % 2 ORDER BY enroll_date + 1) as W, enroll_date FROM empsalary order by W, empno
5252
----
5353
1 1 5000 5001 2006-10-01
5454
8 0 6000 6001 2006-10-01
@@ -62,105 +62,105 @@ SELECT empno, empno % 2, salary, sum(salary + 1) OVER (PARTITION BY empno % 2 OR
6262
9 1 4500 27206 2008-01-01
6363

6464
query TII
65-
select depname, sum(sum(salary) + 1) over (partition by 1 order by sum(salary)), sum(salary) from empsalary group by depname;
65+
select depname, sum(sum(salary) + 1) over (partition by 1 order by sum(salary)) as w, sum(salary) from empsalary group by depname order by w;
6666
----
6767
personnel 7401 7400
6868
sales 22002 14600
6969
develop 47103 25100
7070

7171
# lag ignore default value
7272
query II
73-
SELECT salary, lag(salary + 1, 2) OVER (ORDER BY enroll_date) FROM empsalary
73+
SELECT salary, lag(salary + 1, 2) OVER (ORDER BY enroll_date) as w FROM empsalary order by salary, w
7474
----
75-
5000 NULL
76-
6000 NULL
75+
3500 4801
7776
3900 5001
78-
5200 6001
77+
4200 5201
78+
4500 3501
7979
4800 3901
8080
4800 5201
81+
5000 NULL
8182
5200 4801
82-
3500 4801
83-
4200 5201
84-
4500 3501
83+
5200 6001
84+
6000 NULL
8585

8686
# lag with constant default value
8787
query II
88-
SELECT salary, lag(salary + 1, 2, 888) OVER (ORDER BY enroll_date) FROM empsalary
88+
SELECT salary, lag(salary + 1, 2, 888) OVER (ORDER BY enroll_date) as w FROM empsalary order by salary, w
8989
----
90-
5000 888
91-
6000 888
90+
3500 4801
9291
3900 5001
93-
5200 6001
92+
4200 5201
93+
4500 3501
9494
4800 3901
9595
4800 5201
96+
5000 888
9697
5200 4801
97-
3500 4801
98-
4200 5201
99-
4500 3501
98+
5200 6001
99+
6000 888
100100

101101
# lag with column default value
102102
query II
103-
SELECT salary, lag(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) FROM empsalary
103+
SELECT salary, lag(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) as w FROM empsalary order by salary, w
104104
----
105-
5000 5002
106-
6000 6002
105+
3500 4801
107106
3900 5001
108-
5200 6001
107+
4200 5201
108+
4500 3501
109109
4800 3901
110110
4800 5201
111+
5000 5002
111112
5200 4801
112-
3500 4801
113-
4200 5201
114-
4500 3501
113+
5200 6001
114+
6000 6002
115115

116116
# lead ignore default value
117117
query II
118-
SELECT salary, lead(salary + 1, 2) OVER (ORDER BY enroll_date) FROM empsalary
118+
SELECT salary, lead(salary + 1, 2) OVER (ORDER BY enroll_date) as w FROM empsalary order by salary, w
119119
----
120-
5000 3901
121-
6000 5201
122-
3900 4801
123-
5200 4801
124-
4800 5201
125-
4800 3501
126-
5200 4201
127120
3500 4501
121+
3900 4801
128122
4200 NULL
129123
4500 NULL
124+
4800 3501
125+
4800 5201
126+
5000 3901
127+
5200 4201
128+
5200 4801
129+
6000 5201
130130

131131
# lead with constant default value
132132
query II
133-
SELECT salary, lead(salary + 1, 2, 888) OVER (ORDER BY enroll_date) FROM empsalary
133+
SELECT salary, lead(salary + 1, 2, 888) OVER (ORDER BY enroll_date) as w FROM empsalary order by salary, w
134134
----
135-
5000 3901
136-
6000 5201
137-
3900 4801
138-
5200 4801
139-
4800 5201
140-
4800 3501
141-
5200 4201
142135
3500 4501
136+
3900 4801
143137
4200 888
144138
4500 888
139+
4800 3501
140+
4800 5201
141+
5000 3901
142+
5200 4201
143+
5200 4801
144+
6000 5201
145145

146146
# lead with column default value
147147
query II
148-
SELECT salary, lead(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) FROM empsalary
148+
SELECT salary, lead(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) w FROM empsalary order by salary, w
149149
----
150-
5000 3901
151-
6000 5201
152-
3900 4801
153-
5200 4801
154-
4800 5201
155-
4800 3501
156-
5200 4201
157150
3500 4501
151+
3900 4801
158152
4200 4202
159153
4500 4502
154+
4800 3501
155+
4800 5201
156+
5000 3901
157+
5200 4201
158+
5200 4801
159+
6000 5201
160160

161161
# lead with nullable column
162162
query II
163-
SELECT salary, lead(salary + 1, 2) OVER (ORDER BY enroll_date) c FROM empsalary2 ORDER BY salary desc
163+
SELECT salary, lead(salary + 1, 2) OVER (ORDER BY enroll_date) c FROM empsalary2 ORDER BY salary desc, c desc
164164
----
165165
6000 5201
166166
5200 4801
@@ -174,7 +174,7 @@ SELECT salary, lead(salary + 1, 2) OVER (ORDER BY enroll_date) c FROM empsalary2
174174
3500 4501
175175

176176
query II
177-
SELECT salary, lead(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) c FROM empsalary2 ORDER BY salary desc
177+
SELECT salary, lead(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) c FROM empsalary2 ORDER BY salary desc, c desc
178178
----
179179
6000 5201
180180
5200 4801
@@ -189,27 +189,27 @@ SELECT salary, lead(salary + 1, 2, salary + 2) OVER (ORDER BY enroll_date) c FRO
189189

190190
# first_value
191191
query TII
192-
SELECT enroll_date, salary, first_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary
192+
SELECT enroll_date, salary, first_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary order by enroll_date, salary
193193
----
194194
2006-10-01 5000 5001
195195
2006-10-01 6000 5001
196196
2006-12-23 3900 5001
197-
2007-08-01 5200 5001
198197
2007-08-01 4800 5001
198+
2007-08-01 5200 5001
199199
2007-08-08 4800 5001
200200
2007-08-15 5200 5001
201201
2007-12-10 3500 5001
202202
2008-01-01 4200 5001
203203
2008-01-01 4500 5001
204204

205205
query TII
206-
SELECT enroll_date, salary, first_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary2
206+
SELECT enroll_date, salary, first_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary2 order by enroll_date, salary
207207
----
208208
2006-10-01 5000 5001
209209
2006-10-01 6000 5001
210210
2006-12-23 3900 5001
211-
2007-08-01 5200 5001
212211
2007-08-01 4800 5001
212+
2007-08-01 5200 5001
213213
2007-08-08 4800 5001
214214
2007-08-15 5200 5001
215215
2007-12-10 3500 5001
@@ -218,13 +218,13 @@ SELECT enroll_date, salary, first_value(salary + 1) OVER (ORDER BY enroll_date)
218218

219219
# last_value
220220
query TII
221-
SELECT enroll_date, salary, last_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary
221+
SELECT enroll_date, salary, last_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary order by enroll_date, salary
222222
----
223223
2006-10-01 5000 6001
224224
2006-10-01 6000 6001
225225
2006-12-23 3900 3901
226-
2007-08-01 5200 4801
227226
2007-08-01 4800 4801
227+
2007-08-01 5200 4801
228228
2007-08-08 4800 4801
229229
2007-08-15 5200 5201
230230
2007-12-10 3500 3501
@@ -233,13 +233,13 @@ SELECT enroll_date, salary, last_value(salary + 1) OVER (ORDER BY enroll_date) F
233233

234234
# last_value
235235
query TII
236-
SELECT enroll_date, salary, last_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary2
236+
SELECT enroll_date, salary, last_value(salary + 1) OVER (ORDER BY enroll_date) FROM empsalary2 order by enroll_date, salary
237237
----
238238
2006-10-01 5000 6001
239239
2006-10-01 6000 6001
240240
2006-12-23 3900 3901
241-
2007-08-01 5200 4801
242241
2007-08-01 4800 4801
242+
2007-08-01 5200 4801
243243
2007-08-08 4800 4801
244244
2007-08-15 5200 5201
245245
2007-12-10 3500 3501

tests/sqllogictests/suites/query/window_function/window_ignore_nulls.test

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ statement ok
22
set max_block_size = 1;
33

44
statement ok
5-
CREATE or replace TABLE issue2549 AS SELECT * FROM (VALUES
5+
CREATE or replace TABLE default.issue2549 AS SELECT * FROM (VALUES
66
(0, 1, 614),
77
(1, 1, null),
88
(2, 1, null),
@@ -20,7 +20,7 @@ SELECT
2020
ORDER BY id
2121
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
2222
) AS last_order_id
23-
FROM issue2549 order by 1,2,3,4
23+
FROM default.issue2549 order by 1,2,3,4
2424
----
2525
0 1 614 NULL
2626
1 1 NULL 614
@@ -38,7 +38,7 @@ SELECT
3838
ORDER BY id
3939
ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING
4040
) AS last_order_id
41-
FROM issue2549 order by 1,2,3,4
41+
FROM default.issue2549 order by 1,2,3,4
4242
----
4343
0 1 614 614
4444
1 1 NULL 614
@@ -56,7 +56,7 @@ SELECT
5656
ORDER BY id
5757
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
5858
) AS last_order_id
59-
FROM issue2549 order by 1,2,3,4
59+
FROM default.issue2549 order by 1,2,3,4
6060
----
6161
0 1 614 NULL
6262
1 1 NULL NULL
@@ -69,7 +69,7 @@ statement ok
6969
unset max_block_size;
7070

7171
statement ok
72-
CREATE or replace TABLE issue2549 AS SELECT * FROM (VALUES
72+
CREATE or replace TABLE default.issue2549 AS SELECT * FROM (VALUES
7373
(0, 1, 614),
7474
(1, 1, null),
7575
(2, 1, null),
@@ -87,7 +87,7 @@ SELECT
8787
ORDER BY id
8888
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
8989
) AS last_order_id
90-
FROM issue2549 order by 1,2,3,4
90+
FROM default.issue2549 order by 1,2,3,4
9191
----
9292
0 1 614 NULL
9393
1 1 NULL 614
@@ -105,7 +105,7 @@ SELECT
105105
ORDER BY id
106106
ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING
107107
) AS last_order_id
108-
FROM issue2549 order by 1,2,3,4
108+
FROM default.issue2549 order by 1,2,3,4
109109
----
110110
0 1 614 614
111111
1 1 NULL 614
@@ -123,7 +123,7 @@ SELECT
123123
ORDER BY id
124124
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
125125
) AS last_order_id
126-
FROM issue2549 order by 1,2,3,4
126+
FROM default.issue2549 order by 1,2,3,4
127127
----
128128
0 1 614 NULL
129129
1 1 NULL NULL
@@ -132,10 +132,10 @@ FROM issue2549 order by 1,2,3,4
132132
4 1 2027 639
133133

134134
statement error 1065
135-
SELECT id, user_id, order_id, sum (order_id) IGNORE NULLS over ( PARTITION BY user_id ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS last_order_id FROM issue2549
135+
SELECT id, user_id, order_id, sum (order_id) IGNORE NULLS over ( PARTITION BY user_id ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS last_order_id FROM default.issue2549
136136

137137
statement error 1065
138-
SELECT id, user_id, order_id, lag(order_id, 1) IGNORE NULLS over ( PARTITION BY user_id ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS last_order_id FROM issue2549
138+
SELECT id, user_id, order_id, lag(order_id, 1) IGNORE NULLS over ( PARTITION BY user_id ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS last_order_id FROM default.issue2549
139139

140140
statement ok
141-
drop TABLE issue2549
141+
drop TABLE default.issue2549

tests/sqllogictests/suites/query/window_function/window_wisconsin.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ SELECT ntile(5) OVER (ORDER BY ten, four) nn FROM tenk1 ORDER BY ten, four, nn
145145

146146
# cume_dist
147147
query I
148-
SELECT CAST(cume_dist() OVER (PARTITION BY four ORDER BY ten RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)*10 as INT) FROM tenk1 WHERE unique2 < 10 order by four, ten
148+
SELECT CAST(cume_dist() OVER (PARTITION BY four ORDER BY ten)*10 as INT) FROM tenk1 WHERE unique2 < 10 order by four, ten
149149
----
150150
7
151151
7
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
statement ok
2+
set max_block_size = 1;
3+
4+
include ./expr_in_window.test
5+
include ./named_window_basic.test
6+
include ./window_basic.test
7+
include ./window_bound.test
8+
include ./window_ignore_nulls.test
9+
include ./window_in_expr.test
10+
include ./window_ntile.test
11+
include ./window_partition_spill.test
12+
include ./window_qualify.test
13+
include ./window_range.test
14+
include ./window_subquery.test
15+
include ./window_wisconsin.test
16+
17+
statement ok
18+
unset global max_block_size;

0 commit comments

Comments
 (0)