149 lines
3.0 KiB
SQL
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.*
|