should be it
This commit is contained in:
69
external/duckdb/test/optimizer/topn/complex_top_n.test
vendored
Normal file
69
external/duckdb/test/optimizer/topn/complex_top_n.test
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
# name: test/optimizer/topn/complex_top_n.test
|
||||
# description: topN
|
||||
# group: [topn]
|
||||
|
||||
require vector_size 1024
|
||||
|
||||
set seed 0.42
|
||||
|
||||
statement ok
|
||||
create table CUSTOMERVIEW as select range customer_id, range*random()::INT % 3 as customer_priority from range(1000, 4000);
|
||||
|
||||
statement ok
|
||||
create table OrderView as select range order_id, ((random()*2::INT)%2)::BOOL order_isExpeditedShipped, range + (random() * 3)::INT order_customerId from range(1000, 4000);
|
||||
|
||||
statement ok
|
||||
create table OrderItemView as select random()*25 orderItem_quantity, range orderItem_orderId from range(1000, 4000);
|
||||
|
||||
statement ok
|
||||
create table CREDITCARDVIEW as select range CREDITCARD_CUSTOMERID from range(1000, 4000);
|
||||
|
||||
query III
|
||||
WITH CTE AS (
|
||||
SELECT J1P, CUSTOMER_PRIORITY, CUSTOMER_ID FROM CUSTOMERVIEW
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID, SUM(ORDERITEMVIEW.ORDERITEM_QUANTITY) AS J1P FROM ORDERVIEW
|
||||
LEFT JOIN ORDERITEMVIEW ON (ORDERVIEW.ORDER_ID = ORDERITEMVIEW.ORDERITEM_ORDERID)
|
||||
WHERE (ORDERVIEW.ORDER_ISEXPEDITEDSHIPPED IS TRUE)
|
||||
GROUP BY ORDERVIEW.ORDER_CUSTOMERID
|
||||
) AS J1J ON (J1J.ORDER_CUSTOMERID = CUSTOMERVIEW.CUSTOMER_ID)
|
||||
ORDER BY CUSTOMER_PRIORITY ASC, CUSTOMER_ID ASC
|
||||
LIMIT 50 OFFSET 50
|
||||
) SELECT J1P, Q2P, Q3P FROM CTE
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID FROM ORDERVIEW
|
||||
) AS Q1J ON (Q1J.ORDER_CUSTOMERID = CTE.CUSTOMER_ID)
|
||||
LEFT JOIN (
|
||||
SELECT CREDITCARD_CUSTOMERID AS Q2P FROM CREDITCARDVIEW
|
||||
) AS Q2J ON (Q2J.Q2P = CTE.CUSTOMER_ID)
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID Q3P FROM ORDERVIEW
|
||||
LEFT JOIN ORDERITEMVIEW ON ORDERVIEW.ORDER_ID = ORDERITEM_ORDERID
|
||||
) AS Q3J ON (Q3J.Q3P = CTE.CUSTOMER_ID) order by all;
|
||||
----
|
||||
351 values hashing to 4cba82d74d151aef44c26dc8693f5dca
|
||||
|
||||
query II
|
||||
explain WITH CTE AS (
|
||||
SELECT J1P, CUSTOMER_PRIORITY, CUSTOMER_ID FROM CUSTOMERVIEW
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID, SUM(ORDERITEMVIEW.ORDERITEM_QUANTITY) AS J1P FROM ORDERVIEW
|
||||
LEFT JOIN ORDERITEMVIEW ON (ORDERVIEW.ORDER_ID = ORDERITEMVIEW.ORDERITEM_ORDERID)
|
||||
WHERE (ORDERVIEW.ORDER_ISEXPEDITEDSHIPPED IS TRUE)
|
||||
GROUP BY ORDERVIEW.ORDER_CUSTOMERID
|
||||
) AS J1J ON (J1J.ORDER_CUSTOMERID = CUSTOMERVIEW.CUSTOMER_ID)
|
||||
ORDER BY CUSTOMER_PRIORITY ASC
|
||||
LIMIT 50 OFFSET 50
|
||||
) SELECT J1P, Q2P, Q3P FROM CTE
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID FROM ORDERVIEW
|
||||
) AS Q1J ON (Q1J.ORDER_CUSTOMERID = CTE.CUSTOMER_ID)
|
||||
LEFT JOIN (
|
||||
SELECT CREDITCARD_CUSTOMERID AS Q2P FROM CREDITCARDVIEW
|
||||
) AS Q2J ON (Q2J.Q2P = CTE.CUSTOMER_ID)
|
||||
LEFT JOIN (
|
||||
SELECT ORDER_CUSTOMERID Q3P FROM ORDERVIEW
|
||||
LEFT JOIN ORDERITEMVIEW ON ORDERVIEW.ORDER_ID = ORDERITEM_ORDERID
|
||||
) AS Q3J ON (Q3J.Q3P = CTE.CUSTOMER_ID);
|
||||
----
|
||||
physical_plan <REGEX>:.*TOP_N.*
|
||||
75
external/duckdb/test/optimizer/topn/topn_optimizer.test
vendored
Normal file
75
external/duckdb/test/optimizer/topn/topn_optimizer.test
vendored
Normal file
@@ -0,0 +1,75 @@
|
||||
# name: test/optimizer/topn/topn_optimizer.test
|
||||
# description: Test Top N optimization
|
||||
# group: [topn]
|
||||
|
||||
statement ok
|
||||
CREATE TABLE integers(i INTEGER, j INTEGER)
|
||||
|
||||
statement ok
|
||||
PRAGMA explain_output = OPTIMIZED_ONLY;
|
||||
|
||||
# standalone limit
|
||||
query II
|
||||
EXPLAIN SELECT i FROM integers LIMIT 4
|
||||
----
|
||||
logical_opt <REGEX>:.*LIMIT.*
|
||||
|
||||
# standalone order by
|
||||
query II
|
||||
EXPLAIN SELECT i FROM integers ORDER BY i
|
||||
----
|
||||
logical_opt <REGEX>:.*ORDER.*
|
||||
|
||||
# order by + limit is transformed into top-n
|
||||
query II
|
||||
EXPLAIN SELECT i FROM integers ORDER BY i LIMIT 4
|
||||
----
|
||||
logical_opt <REGEX>:.*TOP_N.*
|
||||
|
||||
# also works with offset
|
||||
query II
|
||||
EXPLAIN SELECT i FROM integers ORDER BY i LIMIT 4 OFFSET 3
|
||||
----
|
||||
logical_opt <REGEX>:.*TOP_N.*
|
||||
|
||||
# only offset but no limit: no top-n
|
||||
query II
|
||||
EXPLAIN SELECT i FROM integers ORDER BY i OFFSET 3
|
||||
----
|
||||
logical_opt <!REGEX>:.*TOP_N.*
|
||||
|
||||
# only limit, but in subquery with projection pull up optimization
|
||||
query II
|
||||
EXPLAIN SELECT * FROM (SELECT * FROM range(100000000) AS _(x) ORDER BY x) AS cte LIMIT 10
|
||||
----
|
||||
logical_opt <REGEX>:.*TOP_N.*
|
||||
|
||||
require no_alternative_verify
|
||||
|
||||
# top n optimization with more complex projection pull up
|
||||
query II
|
||||
EXPLAIN
|
||||
WITH cte1 AS (SELECT range%2000 a,
|
||||
(range%2000 + 2000) b,
|
||||
(range%2000 + 4000) c,
|
||||
(range%2000 + 6000) d
|
||||
FROM range(10000) ORDER BY range),
|
||||
cte2 as (select *, a as x, b as y, c as z from cte1),
|
||||
cte3 as (select *, a as l, b as m, c as n, d as o from cte2)
|
||||
SELECT * FROM cte3 LIMIT 4;
|
||||
----
|
||||
logical_opt <REGEX>:.*TOP_N.*
|
||||
|
||||
|
||||
statement ok
|
||||
create table large_table as select range a from range(100000);
|
||||
|
||||
query II
|
||||
EXPLAIN select * from large_table order by a limit 100;
|
||||
----
|
||||
logical_opt <REGEX>:.*TOP_N.*
|
||||
|
||||
query II
|
||||
EXPLAIN select * from large_table order by a limit 10000;
|
||||
----
|
||||
logical_opt <!REGEX>:.*TOP_N.*
|
||||
Reference in New Issue
Block a user