202 lines
3.8 KiB
SQL
202 lines
3.8 KiB
SQL
# name: test/sql/join/iejoin/test_iejoin.test
|
|
# description: Test IEJoin
|
|
# group: [iejoin]
|
|
|
|
statement ok
|
|
PRAGMA enable_verification
|
|
|
|
statement ok
|
|
SET merge_join_threshold=0
|
|
|
|
# Restrictive tail predicates
|
|
# Use inequalities to prevent future range choice optimisation
|
|
query II
|
|
WITH test AS (
|
|
SELECT
|
|
i AS id,
|
|
i AS begin,
|
|
i + 10 AS end,
|
|
i % 2 AS p1,
|
|
i % 3 AS p2
|
|
FROM range(0, 10) tbl(i)
|
|
)
|
|
SELECT lhs.id, rhs.id
|
|
FROM test lhs, test rhs
|
|
WHERE lhs.begin < rhs.end
|
|
AND rhs.begin < lhs.end
|
|
AND lhs.p1 <> rhs.p1
|
|
AND lhs.p2 <> rhs.p2
|
|
ORDER BY ALL
|
|
----
|
|
0 1
|
|
0 5
|
|
0 7
|
|
1 0
|
|
1 2
|
|
1 6
|
|
1 8
|
|
2 1
|
|
2 3
|
|
2 7
|
|
2 9
|
|
3 2
|
|
3 4
|
|
3 8
|
|
4 3
|
|
4 5
|
|
4 9
|
|
5 0
|
|
5 4
|
|
5 6
|
|
6 1
|
|
6 5
|
|
6 7
|
|
7 0
|
|
7 2
|
|
7 6
|
|
7 8
|
|
8 1
|
|
8 3
|
|
8 7
|
|
8 9
|
|
9 2
|
|
9 4
|
|
9 8
|
|
|
|
# Subquery/CTE
|
|
query II
|
|
WITH test AS (
|
|
SELECT
|
|
i AS id,
|
|
i AS begin,
|
|
i + 10 AS end,
|
|
i % 2 AS p1,
|
|
i % 3 AS p2
|
|
FROM range(0, 10) tbl(i)
|
|
),
|
|
sub AS (
|
|
SELECT lhs.id AS lid, rhs.id AS rid
|
|
FROM test lhs, test rhs
|
|
WHERE lhs.begin < rhs.end
|
|
AND rhs.begin < lhs.end
|
|
AND lhs.p1 <> rhs.p1
|
|
AND lhs.p2 <> rhs.p2
|
|
ORDER BY ALL
|
|
)
|
|
SELECT MIN(lid), MAX(rid)
|
|
FROM sub
|
|
----
|
|
0 9
|
|
|
|
# RTEs are not (yet) supported
|
|
# so this should work, but not trigger IEJoin in the physical plan.
|
|
query I
|
|
WITH RECURSIVE t AS
|
|
(
|
|
SELECT 1 AS x, 0 AS begin, 4 AS end
|
|
UNION ALL
|
|
SELECT lhs.x + 1 AS x,
|
|
GREATEST(lhs.begin, rhs.begin) as begin,
|
|
LEAST(lhs.end, rhs.end) AS end
|
|
FROM t lhs, t rhs
|
|
WHERE lhs.begin + 1 < rhs.end - 1
|
|
AND rhs.begin + 1 < lhs.end - 1
|
|
AND lhs.x < 3
|
|
)
|
|
SELECT COUNT(*) FROM t
|
|
----
|
|
3
|
|
|
|
# Fix missing continue statement in right join handler
|
|
statement ok
|
|
CREATE TABLE issue3486 AS
|
|
SELECT generate_series as ts from generate_series(timestamp '2020-01-01', timestamp '2021-01-01', interval 1 day);
|
|
|
|
query IIII
|
|
WITH data_table AS (
|
|
SELECT epoch(ts) as ts
|
|
FROM issue3486
|
|
WHERE ts IS NOT NULL
|
|
),
|
|
S AS (
|
|
SELECT
|
|
min(ts) as minVal,
|
|
max(ts) as maxVal,
|
|
(max(ts) - min(ts)) as range
|
|
FROM data_table
|
|
),
|
|
buckets AS (
|
|
SELECT
|
|
range as bucket,
|
|
(range) * (select range FROM S) / 40 + (select minVal from S) as low,
|
|
(range + 1) * (select range FROM S) / 40 + (select minVal from S) as high
|
|
FROM range(0, 40, 1)
|
|
)
|
|
SELECT
|
|
bucket,
|
|
low,
|
|
high,
|
|
count(data_table.ts) as count
|
|
FROM buckets
|
|
LEFT JOIN data_table ON (data_table.ts >= low AND data_table.ts < high)
|
|
GROUP BY bucket, low, high
|
|
ORDER BY bucket;
|
|
----
|
|
0 1577836800 1578627360 10
|
|
1 1578627360 1579417920 9
|
|
2 1579417920 1580208480 9
|
|
3 1580208480 1580999040 9
|
|
4 1580999040 1581789600 9
|
|
5 1581789600 1582580160 9
|
|
6 1582580160 1583370720 10
|
|
7 1583370720 1584161280 9
|
|
8 1584161280 1584951840 9
|
|
9 1584951840 1585742400 9
|
|
10 1585742400 1586532960 9
|
|
11 1586532960 1587323520 9
|
|
12 1587323520 1588114080 9
|
|
13 1588114080 1588904640 10
|
|
14 1588904640 1589695200 9
|
|
15 1589695200 1590485760 9
|
|
16 1590485760 1591276320 9
|
|
17 1591276320 1592066880 9
|
|
18 1592066880 1592857440 9
|
|
19 1592857440 1593648000 9
|
|
20 1593648000 1594438560 10
|
|
21 1594438560 1595229120 9
|
|
22 1595229120 1596019680 9
|
|
23 1596019680 1596810240 9
|
|
24 1596810240 1597600800 9
|
|
25 1597600800 1598391360 9
|
|
26 1598391360 1599181920 10
|
|
27 1599181920 1599972480 9
|
|
28 1599972480 1600763040 9
|
|
29 1600763040 1601553600 9
|
|
30 1601553600 1602344160 9
|
|
31 1602344160 1603134720 9
|
|
32 1603134720 1603925280 9
|
|
33 1603925280 1604715840 10
|
|
34 1604715840 1605506400 9
|
|
35 1605506400 1606296960 9
|
|
36 1606296960 1607087520 9
|
|
37 1607087520 1607878080 9
|
|
38 1607878080 1608668640 9
|
|
39 1608668640 1609459200 9
|
|
|
|
# internal issue 5197
|
|
statement ok
|
|
create table test_big as select range i, range + 100_000 j, 'hello' k from range (20_000)
|
|
|
|
statement ok
|
|
create table test_small as select range i, range + 100_000 j, 'hello' k from range (0,20_000,10)
|
|
|
|
statement ok
|
|
select *
|
|
from test_small t1
|
|
join test_small t2
|
|
on (t1.i = t2.j)
|
|
join test_small t3
|
|
on (true)
|
|
join test_big t4
|
|
on (t3.i < t4.i and t3.j > t4.j)
|