File: test_iejoin.test

package info (click to toggle)
duckdb 1.5.1-3
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 299,196 kB
  • sloc: cpp: 865,414; ansic: 57,292; python: 18,871; sql: 12,663; lisp: 11,751; yacc: 7,412; lex: 1,682; sh: 747; makefile: 564
file content (201 lines) | stat: -rw-r--r-- 3,879 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# 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)