should be it

This commit is contained in:
2025-10-24 19:21:19 -05:00
parent a4b23fc57c
commit f09560c7b1
14047 changed files with 3161551 additions and 1 deletions

View 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.*

View 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.*