# 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 :.*STREAMING_WINDOW.* # Unsupported aggregates query TT EXPLAIN SELECT i, COUNT(*) OVER() FROM integers; ---- physical_plan :.*STREAMING_WINDOW.* query TT EXPLAIN SELECT i, SUM(i) OVER() FROM integers; ---- physical_plan :.*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 :.*STREAMING_WINDOW.* query TT EXPLAIN SELECT j, COUNT(*) FILTER(WHERE i = 2) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers; ---- physical_plan :.*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 :.*STREAMING_WINDOW.* # Test each of the streaming window functions query TT explain select row_number() over (), i, j from integers ---- physical_plan :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*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 :.*STREAMING_WINDOW.* query TT EXPLAIN SELECT i, SUM(i) OVER(ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM integers; ---- physical_plan :.*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 :.*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 :.*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 :.*STREAMING_WINDOW.* # query TT explain select first_value(i) over (), last_value(i) over () from integers ---- physical_plan :.*STREAMING_WINDOW.* WINDOW .* query TT explain select last_value(i) over (), first_value(i) over () from integers ---- physical_plan :.*STREAMING_WINDOW.* WINDOW .* query TT explain select first_value(i) over (), last_value(i) over (order by j) from integers ---- physical_plan :.*STREAMING_WINDOW.* WINDOW .* query TT explain select last_value(i) over (order by j), first_value(i) over () from integers ---- physical_plan :.*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)