should be it
This commit is contained in:
448
external/duckdb/test/sql/window/test_streaming_window.test
vendored
Normal file
448
external/duckdb/test/sql/window/test_streaming_window.test
vendored
Normal file
@@ -0,0 +1,448 @@
|
||||
# name: test/sql/window/test_streaming_window.test
|
||||
# description: Streaming window functions
|
||||
# group: [window]
|
||||
|
||||
statement ok
|
||||
PRAGMA enable_verification
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = PHYSICAL_ONLY;
|
||||
|
||||
statement ok
|
||||
create table integers (i int, j int)
|
||||
|
||||
statement ok
|
||||
insert into integers values (2, 2), (2, 1), (1, 2), (1, NULL)
|
||||
|
||||
query TT
|
||||
explain select first_value(i IGNORE NULLS) over () from integers
|
||||
----
|
||||
physical_plan <!REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
# Unsupported aggregates
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, COUNT(*) OVER() FROM integers;
|
||||
----
|
||||
physical_plan <!REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, SUM(i) OVER() FROM integers;
|
||||
----
|
||||
physical_plan <!REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT j, COUNT(j) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT j, COUNT(*) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT j, SUM(j) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
# Test each of the streaming window functions
|
||||
query TT
|
||||
explain select row_number() over (), i, j from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TTT
|
||||
select row_number() over (), i, j from integers
|
||||
----
|
||||
1 2 2
|
||||
2 2 1
|
||||
3 1 2
|
||||
4 1 NULL
|
||||
|
||||
query TT
|
||||
explain select rank() over (), i, j from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TTT
|
||||
select rank() over (), i, j from integers
|
||||
----
|
||||
1 2 2
|
||||
1 2 1
|
||||
1 1 2
|
||||
1 1 NULL
|
||||
|
||||
query TT
|
||||
explain select dense_rank() over (), i, j from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TTT
|
||||
select dense_rank() over (), i, j from integers
|
||||
----
|
||||
1 2 2
|
||||
1 2 1
|
||||
1 1 2
|
||||
1 1 NULL
|
||||
|
||||
query TT
|
||||
explain select percent_rank() over (), i, j from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TTT
|
||||
select percent_rank() over (), i, j from integers
|
||||
----
|
||||
0.0 2 2
|
||||
0.0 2 1
|
||||
0.0 1 2
|
||||
0.0 1 NULL
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, LAG(i, 1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT i, LAG(i, 1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
0 NULL
|
||||
1 0
|
||||
2 1
|
||||
3 2
|
||||
4 3
|
||||
5 4
|
||||
6 5
|
||||
7 6
|
||||
8 7
|
||||
9 8
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, LAG(i, -1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
SELECT i, LAG(i, -1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
0 1
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
4 5
|
||||
5 6
|
||||
6 7
|
||||
7 8
|
||||
8 9
|
||||
9 NULL
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, LEAD(i, -1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT i, LEAD(i, -1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
0 NULL
|
||||
1 0
|
||||
2 1
|
||||
3 2
|
||||
4 3
|
||||
5 4
|
||||
6 5
|
||||
7 6
|
||||
8 7
|
||||
9 8
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, LEAD(i, 1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
SELECT i, LEAD(i, 1) OVER() AS i1
|
||||
FROM range(10) tbl(i);
|
||||
----
|
||||
0 1
|
||||
1 2
|
||||
2 3
|
||||
3 4
|
||||
4 5
|
||||
5 6
|
||||
6 7
|
||||
7 8
|
||||
8 9
|
||||
9 NULL
|
||||
|
||||
# Test running aggregates
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, COUNT(*) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT i, COUNT(*) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
2 1
|
||||
2 2
|
||||
1 3
|
||||
1 4
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, COUNT(*) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT i, COUNT(*) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
2 1
|
||||
2 2
|
||||
1 2
|
||||
1 2
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT j, COUNT(j) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT j, COUNT(j) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
2 1
|
||||
1 2
|
||||
2 3
|
||||
NULL 3
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT i, SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query II
|
||||
SELECT i, SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers;
|
||||
----
|
||||
2 2
|
||||
2 4
|
||||
1 5
|
||||
1 6
|
||||
|
||||
query TT
|
||||
EXPLAIN
|
||||
SELECT SUM(s) FROM (
|
||||
SELECT SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) s
|
||||
FROM range(5000) tbl(i)
|
||||
);
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query I
|
||||
SELECT SUM(s) FROM (
|
||||
SELECT SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) s
|
||||
FROM range(5000) tbl(i)
|
||||
);
|
||||
----
|
||||
20833332500
|
||||
|
||||
# Some combinations of compatible window functions
|
||||
query TT
|
||||
explain select i, j, first_value(i) over (), first_value(j) over () from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
query TTTT
|
||||
select i, j, first_value(i) over (), first_value(j) over () from integers
|
||||
----
|
||||
2 2 2 2
|
||||
2 1 2 2
|
||||
1 2 2 2
|
||||
1 NULL 2 2
|
||||
|
||||
query TTT
|
||||
select row_number() over (), first_value(i) over (), first_value(j) over () from integers
|
||||
----
|
||||
1 2 2
|
||||
2 2 2
|
||||
3 2 2
|
||||
4 2 2
|
||||
|
||||
query TT
|
||||
select row_number() over (), row_number() over () from integers
|
||||
----
|
||||
1 1
|
||||
2 2
|
||||
3 3
|
||||
4 4
|
||||
|
||||
# Ignore nulls is not supported for streaming windows
|
||||
query TT
|
||||
explain select first_value(i IGNORE NULLS) over () from integers
|
||||
----
|
||||
physical_plan <!REGEX>:.*STREAMING_WINDOW.*
|
||||
|
||||
#
|
||||
query TT
|
||||
explain select first_value(i) over (), last_value(i) over () from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.* WINDOW .*
|
||||
|
||||
query TT
|
||||
explain select last_value(i) over (), first_value(i) over () from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.* WINDOW .*
|
||||
|
||||
query TT
|
||||
explain select first_value(i) over (), last_value(i) over (order by j) from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.* WINDOW .*
|
||||
|
||||
query TT
|
||||
explain select last_value(i) over (order by j), first_value(i) over () from integers
|
||||
----
|
||||
physical_plan <REGEX>:.*STREAMING_WINDOW.* WINDOW .*
|
||||
|
||||
#
|
||||
# Global state tests from #3275
|
||||
#
|
||||
|
||||
# Original UNION ALL bug
|
||||
statement ok
|
||||
CREATE TABLE v1(id bigint);
|
||||
|
||||
statement ok
|
||||
CREATE TABLE v2(id bigint);
|
||||
|
||||
statement ok
|
||||
INSERT INTO v1 VALUES (11), (12), (13);
|
||||
|
||||
statement ok
|
||||
INSERT INTO v2 VALUES (21), (22);
|
||||
|
||||
statement ok
|
||||
CREATE VIEW vertices_view AS
|
||||
SELECT * FROM v1
|
||||
UNION ALL
|
||||
SELECT * FROM v2;
|
||||
|
||||
query II
|
||||
SELECT id AS sparse_id, row_number() OVER () AS rnum
|
||||
FROM vertices_view;
|
||||
----
|
||||
11 1
|
||||
12 2
|
||||
13 3
|
||||
21 4
|
||||
22 5
|
||||
|
||||
# Recursive CTE
|
||||
query II
|
||||
WITH RECURSIVE rte AS (
|
||||
SELECT 1 l, 1::BIGINT r
|
||||
UNION ALL
|
||||
SELECT l+1, row_number() OVER()
|
||||
FROM rte
|
||||
WHERE l < 3
|
||||
)
|
||||
SELECT * FROM rte;
|
||||
----
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
|
||||
# In a prepared statement that is executed multiple times
|
||||
statement ok
|
||||
PREPARE sw1 AS
|
||||
SELECT i, row_number() OVER() AS row_no
|
||||
FROM range(10, 20) tbl(i)
|
||||
QUALIFY row_no <= ?::BIGINT
|
||||
;
|
||||
|
||||
query II
|
||||
EXECUTE sw1(10);
|
||||
----
|
||||
10 1
|
||||
11 2
|
||||
12 3
|
||||
13 4
|
||||
14 5
|
||||
15 6
|
||||
16 7
|
||||
17 8
|
||||
18 9
|
||||
19 10
|
||||
|
||||
query II
|
||||
EXECUTE sw1(2);
|
||||
----
|
||||
10 1
|
||||
11 2
|
||||
|
||||
# Struct Slicing
|
||||
query I
|
||||
from (values ({'key': 'A'}), ({'key': 'B'}), ({'key': 'C'}))
|
||||
select
|
||||
list(col0) over (rows between unbounded preceding and current row) as result
|
||||
----
|
||||
[{'key': A}]
|
||||
[{'key': A}, {'key': B}]
|
||||
[{'key': A}, {'key': B}, {'key': C}]
|
||||
|
||||
# Reset argument test (fails in debug)
|
||||
statement ok
|
||||
CREATE TABLE issue17621(i INT, j INT, k INT);
|
||||
|
||||
statement ok
|
||||
INSERT INTO issue17621 VALUES (1,1,1),
|
||||
(1,4,1),
|
||||
(1,2,1),
|
||||
(1,4,1),
|
||||
(1,4,1),
|
||||
(1,1,2),
|
||||
(1,4,2),
|
||||
(1,2,2),
|
||||
(1,4,2),
|
||||
(1,1,3),
|
||||
(1,4,3),
|
||||
(1,2,3),
|
||||
(1,4,3),
|
||||
(1,1,4),
|
||||
(1,4,4),
|
||||
(1,2,4),
|
||||
(1,4,4);
|
||||
|
||||
# No data because scan order is non-deterministic.
|
||||
statement ok
|
||||
SELECT
|
||||
k,
|
||||
STDDEV_POP(i),
|
||||
SUM(j),
|
||||
STDDEV_SAMP(k) OVER (ROWS UNBOUNDED PRECEDING) std_wf
|
||||
FROM issue17621
|
||||
GROUP BY ROLLUP(k)
|
||||
Reference in New Issue
Block a user