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

149 lines
3.0 KiB
SQL

# name: test/sql/topn/top_n_materialization.test
# description: Test Top N Optimization
# group: [topn]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE test AS SELECT i, i + 1 AS j, i + 2 AS k, -i AS l FROM range(10) t(i);
statement ok
SET explain_output='optimized_only'
# Top N optimization
# this gets turned into a row-id join
query II
explain SELECT * FROM test ORDER BY j DESC LIMIT 2;
----
logical_opt <REGEX>:.*COMPARISON_JOIN.*
query IIII
SELECT * FROM test ORDER BY j DESC LIMIT 2;
----
9 10 11 -9
8 9 10 -8
query II
explain SELECT * FROM test ORDER BY j, i LIMIT 2;
----
logical_opt <REGEX>:.*COMPARISON_JOIN.*
query IIII
SELECT * FROM test ORDER BY j, i LIMIT 2;
----
0 1 2 0
1 2 3 -1
# this does not, we cannot remove any columns by turning it into a row-id join
query II
explain SELECT i FROM test ORDER BY i LIMIT 2;
----
logical_opt <!REGEX>:.*COMPARISON_JOIN.*
# we cannot do this with volatile expressions
query II
explain SELECT * FROM (SELECT i + random() AS i, j, k, l FROM test) ORDER BY i LIMIT 2;
----
logical_opt <!REGEX>:.*COMPARISON_JOIN.*
# top-n with expressions
query IIII
SELECT * FROM (SELECT -i i, -j j, -k k, -l l FROM test) ORDER BY -j DESC LIMIT 2
----
-9 -10 -11 9
-8 -9 -10 8
# multiple layers
query IIII
SELECT * FROM (SELECT 100 + i i, 1000 + j j, 10000 + k k, 100000 + l l FROM (SELECT -i i, -j j, -k k, -l l FROM test)) ORDER BY j DESC LIMIT 2
----
100 999 9998 100000
99 998 9997 100001
# limit + offset
query II
explain SELECT * FROM test LIMIT 2 OFFSET 2;
----
logical_opt <REGEX>:.*COMPARISON_JOIN.*
query IIII
SELECT * FROM test LIMIT 2 OFFSET 2;
----
2 3 4 -2
3 4 5 -3
# sample
query II
explain SELECT * FROM test USING SAMPLE 2 ROWS
----
logical_opt <REGEX>:.*COMPARISON_JOIN.*
# we can only use joins when we are sampling rows
query II
explain SELECT * FROM test USING SAMPLE 10%
----
logical_opt <!REGEX>:.*COMPARISON_JOIN.*
# order on expression
query IIII
SELECT * FROM test ORDER BY -j DESC LIMIT 2
----
0 1 2 0
1 2 3 -1
# projection in subquery
query IIII
SELECT * FROM (SELECT -i i, -j j, -k k, -l l FROM test) ORDER BY -j DESC LIMIT 2
----
-9 -10 -11 9
-8 -9 -10 8
# filter after top-n
query IIII
SELECT * FROM (
SELECT * FROM test ORDER BY j DESC LIMIT 2
) WHERE i=8
----
8 9 10 -8
query I
SELECT l FROM (
SELECT * FROM test ORDER BY j DESC LIMIT 2
) WHERE k=10
----
-8
# now with varchar columns
statement ok
CREATE OR REPLACE TABLE test AS SELECT i, printf('%02d', i + 1) AS j, printf('%02d', i + 2) AS k, -i AS l FROM range(10) t(i);
query IIII
SELECT * FROM test ORDER BY j DESC LIMIT 2;
----
9 10 11 -9
8 09 10 -8
query IIII
SELECT j, k, l, i FROM test WHERE i > 5 ORDER BY j DESC LIMIT 2;
----
10 11 -9 9
09 10 -8 8
# test late materialization setting
statement ok
SET late_materialization_max_rows=0
query II
explain SELECT * FROM test ORDER BY j DESC LIMIT 2;
----
logical_opt <!REGEX>:.*COMPARISON_JOIN.*
statement ok
RESET late_materialization_max_rows
query II
explain SELECT * FROM test ORDER BY j DESC LIMIT 2;
----
logical_opt <REGEX>:.*COMPARISON_JOIN.*