should be it
This commit is contained in:
27
external/duckdb/test/sql/join/pushdown/pushdown_generated_columns.test
vendored
Normal file
27
external/duckdb/test/sql/join/pushdown/pushdown_generated_columns.test
vendored
Normal 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
|
||||
134
external/duckdb/test/sql/join/pushdown/pushdown_join_subquery.test_slow
vendored
Normal file
134
external/duckdb/test/sql/join/pushdown/pushdown_join_subquery.test_slow
vendored
Normal 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
|
||||
----
|
||||
44
external/duckdb/test/sql/join/pushdown/pushdown_join_tpch.test_slow
vendored
Normal file
44
external/duckdb/test/sql/join/pushdown/pushdown_join_tpch.test_slow
vendored
Normal 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
|
||||
61
external/duckdb/test/sql/join/pushdown/pushdown_join_types.test
vendored
Normal file
61
external/duckdb/test/sql/join/pushdown/pushdown_join_types.test
vendored
Normal 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
|
||||
33
external/duckdb/test/sql/join/pushdown/pushdown_many_columns.test_slow
vendored
Normal file
33
external/duckdb/test/sql/join/pushdown/pushdown_many_columns.test_slow
vendored
Normal 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
|
||||
43
external/duckdb/test/sql/join/pushdown/pushdown_many_joins.test
vendored
Normal file
43
external/duckdb/test/sql/join/pushdown/pushdown_many_joins.test
vendored
Normal 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
|
||||
Reference in New Issue
Block a user