Files
email-tracker/external/duckdb/test/sql/window/test_streaming_window.test
2025-10-24 19:21:19 -05:00

449 lines
7.5 KiB
SQL

# 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)