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,27 @@
# name: test/sql/join/pushdown/pushdown_generated_columns.test
# description: Join pushdown on generated columns
# group: [pushdown]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE unit2(
price INTEGER,
amount_sold INTEGER,
total_profit INTEGER GENERATED ALWAYS AS (price * amount_sold) VIRTUAL,
also_total_profit INTEGER GENERATED ALWAYS AS (total_profit) VIRTUAL
);
statement ok
INSERT INTO unit2 SELECT i, 20 FROM range(1000) t(i);
query IIII
SELECT * FROM unit2 JOIN (VALUES (2000)) t(total_profit) USING (total_profit);
----
100 20 2000 2000
query IIIII
SELECT * FROM unit2 JOIN (VALUES (2000)) t(total_profit) ON (t.total_profit = unit2.total_profit AND t.total_profit=unit2.also_total_profit);
----
100 20 2000 2000 2000

View File

@@ -0,0 +1,134 @@
# name: test/sql/join/pushdown/pushdown_join_subquery.test_slow
# description: Test join filter pushdown with subqueries
# group: [pushdown]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT CASE WHEN i%2=0 THEN NULL ELSE i END i FROM range(1000) t(i)
# expression on LHS
query II
SELECT * FROM integers JOIN (SELECT MAX(i) AS max_i FROM integers) ON i+2=max_i
----
997 999
# expression on RHS
query II
SELECT * FROM integers JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i-2
----
997 999
# filter
query II
SELECT * FROM (FROM integers WHERE i%2 = 1) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# filter that can be pushed down
query II
SELECT * FROM (FROM integers WHERE i>500) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# limit
query II
SELECT * FROM (FROM integers LIMIT 10000) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# order by
query II
SELECT * FROM (FROM integers ORDER BY i) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# top-n
query II
SELECT * FROM (FROM integers ORDER BY i DESC LIMIT 10) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# projection
query III
SELECT * FROM (SELECT i + 2 AS i, i AS k FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 997 999
# group by with join on grouping column
query II
SELECT * FROM (SELECT i FROM integers GROUP BY i) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# group by with join on aggregate
query III
SELECT * FROM (SELECT (1000 - i) AS grp, SUM(i) AS i FROM integers GROUP BY grp) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
1 999 999
# distinct
query II
SELECT * FROM (SELECT DISTINCT i FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# window
query IIII
SELECT * FROM (SELECT i + 2 AS i, i AS k, row_number() over () as rownum FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 997 998 999
statement ok
CREATE TABLE lists AS SELECT CASE WHEN i%2=0 THEN NULL ELSE i END AS i, [500 + i, 500 + i + 1, 500 + i + 2] l FROM range(1000) t(i)
# unnest where filter applies to non-unnest column
query III
SELECT * FROM (SELECT i, UNNEST(l) AS l FROM lists) JOIN (SELECT MAX(i) AS max_i FROM lists) ON i=max_i
----
999 1499 999
999 1500 999
999 1501 999
# unnest where filter applies to unnest column
query III
SELECT * FROM (SELECT i AS k, UNNEST(l) AS i FROM lists) JOIN (SELECT MAX(i) AS max_i FROM lists) ON i=max_i
----
497 999 999
NULL 999 999
499 999 999
# set operations
# union
query II
SELECT * FROM (FROM integers UNION ALL FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
999 999
query II
SELECT * FROM (FROM integers UNION FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# intersect
query II
SELECT * FROM (FROM integers INTERSECT FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
query II
SELECT * FROM (FROM integers INTERSECT ALL FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# except
query II
SELECT * FROM (FROM integers EXCEPT (SELECT 42)) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
query II
SELECT * FROM ((SELECT 999 i) EXCEPT FROM integers) JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----

View File

@@ -0,0 +1,44 @@
# name: test/sql/join/pushdown/pushdown_join_tpch.test_slow
# description: Test join filter pushdown on TPC-H
# group: [pushdown]
require tpch
statement ok
CALL dbgen(sf=1);
# single join
query II
SELECT l_orderkey, l_comment FROM lineitem WHERE l_orderkey=(SELECT MAX(l_orderkey) FROM lineitem) ORDER BY ALL
----
6000000 pecial excuses nag evenly f
6000000 riously pe
# multiple joins
query III
select l_orderkey, l_linenumber, l_comment
from lineitem
where l_linenumber=(select max(l_linenumber) from lineitem) AND
l_orderkey=(SELECT MAX(l_orderkey) FROM lineitem WHERE l_linenumber=7);
----
5999968 7 . express requests are
# involving separate tables
query I
select count(*) from lineitem where l_linenumber=(select max(l_linenumber) from lineitem) and l_suppkey=(select max(s_suppkey) from supplier);
----
16
# bunch of joins
query IIII
select l_orderkey, o_orderpriority, l_suppkey, l_linenumber
from lineitem join orders on (l_orderkey=o_orderkey)
where l_linenumber=(select max(l_linenumber) from lineitem) and
l_suppkey=(select max(s_suppkey) from supplier) and
o_orderpriority=(select max(o_orderpriority) from orders)
order by all
----
2076419 5-LOW 10000 7
2770594 5-LOW 10000 7
3196290 5-LOW 10000 7
3892931 5-LOW 10000 7

View File

@@ -0,0 +1,61 @@
# name: test/sql/join/pushdown/pushdown_join_types.test
# description: Test join filter pushdown with various join types
# group: [pushdown]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE integers AS SELECT CASE WHEN i%2=0 THEN NULL ELSE i END i FROM range(1000) t(i)
# inner join
query II
SELECT * FROM integers JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# right join
query II
SELECT * FROM integers RIGHT JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
----
999 999
# left join
query II
SELECT COUNT(*), COUNT(max_i) IS NOT NULL FROM (
SELECT * FROM integers LEFT JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
)
----
1000 1
query II
SELECT COUNT(*), COUNT(max_i) IS NOT NULL FROM (
SELECT * FROM integers FULL OUTER JOIN (SELECT MAX(i) AS max_i FROM integers) ON i=max_i
)
----
1000 1
# semi join
query I
SELECT * FROM integers WHERE i=(SELECT MAX(i) FROM integers)
----
999
query I
SELECT * FROM integers WHERE i IN (SELECT MAX(i) FROM integers)
----
999
# multiple values
query I
SELECT * FROM integers WHERE i IN (997, 999)
----
997
999
# mark join
query II
SELECT COUNT(*), SUM(CASE WHEN in_result THEN 1 ELSE 0 END) FROM
(SELECT i IN (SELECT MAX(i) FROM integers) AS in_result FROM integers)
----
1000 1

View File

@@ -0,0 +1,33 @@
# name: test/sql/join/pushdown/pushdown_many_columns.test_slow
# description: Test join filter pushdown on multiple columns
# group: [pushdown]
statement ok
PRAGMA enable_verification
# two columns of different types
statement ok
CREATE TABLE tbl AS SELECT CASE WHEN i%2=0 THEN NULL ELSE i END i, concat('thisisastring', i) s FROM range(1000) t(i)
query II
SELECT s, i FROM tbl WHERE i>10 AND s=(SELECT MAX(s) FROM tbl)
----
thisisastring999 999
query II
SELECT s, i FROM tbl JOIN (VALUES (999, 'thisisastring999')) t(i, s) USING (s, i)
----
thisisastring999 999
# all types
statement ok
CREATE TABLE all_types AS FROM test_all_types();
foreach col <all_types_columns>
query I
SELECT COUNT(*) FROM all_types WHERE "${col}"=(SELECT MIN("${col}") FROM all_types)
----
1
endloop

View File

@@ -0,0 +1,43 @@
# name: test/sql/join/pushdown/pushdown_many_joins.test
# description: Test join filter pushdown with many joins
# group: [pushdown]
statement ok
PRAGMA enable_verification
statement ok
CREATE TABLE bigtbl AS SELECT i%2 AS small_key, i%10 AS medium_key, i AS val FROM range(10000) t(i) ORDER BY small_key, medium_key
statement ok
CREATE TABLE smalltbl AS SELECT i small_key FROM range(2) t(i)
statement ok
CREATE TABLE mediumtbl AS SELECT i medium_key FROM range(10) t(i)
query I
SELECT COUNT(*) FROM bigtbl JOIN smalltbl USING (small_key) JOIN mediumtbl USING (medium_key)
----
10000
# individual filters
query I
SELECT COUNT(*) FROM bigtbl JOIN (FROM smalltbl WHERE small_key=1) smalltbl USING (small_key) JOIN mediumtbl USING (medium_key)
----
5000
query I
SELECT COUNT(*) FROM bigtbl JOIN smalltbl USING (small_key) JOIN (FROM mediumtbl WHERE medium_key=1) mediumtbl USING (medium_key)
----
1000
# double filter
query I
SELECT COUNT(*) FROM bigtbl JOIN (FROM smalltbl WHERE small_key=1) smalltbl USING (small_key) JOIN (FROM mediumtbl WHERE medium_key=1) mediumtbl USING (medium_key)
----
1000
# double filter
query I
SELECT COUNT(*) FROM bigtbl JOIN (FROM smalltbl WHERE small_key=1) smalltbl USING (small_key) JOIN (FROM mediumtbl WHERE medium_key=1) mediumtbl ON (mediumtbl.medium_key=smalltbl.small_key)
----
5000