Skip to content

Commit c8c494a

Browse files
committed
Allow move GLOBAL IN conditions to prewhere
1 parent 57db0fa commit c8c494a

File tree

4 files changed

+94
-17
lines changed

4 files changed

+94
-17
lines changed

src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -560,11 +560,6 @@ bool MergeTreeWhereOptimizer::cannotBeMoved(const RPNBuilderTreeNode & node, con
560560
if (function_name == "arrayJoin")
561561
return true;
562562

563-
/// disallow GLOBAL IN, GLOBAL NOT IN
564-
/// TODO why?
565-
if (function_name == "globalIn" || function_name == "globalNotIn")
566-
return true;
567-
568563
size_t arguments_size = function_node.getArgumentsSize();
569564
for (size_t i = 0; i < arguments_size; ++i)
570565
{

tests/queries/0_stateless/03302_analyzer_distributed_filter_push_down.reference

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ CreatingSets (Create sets before main query execution)
297297
ReadFromRemote (Read from remote replica)
298298
CreatingSets (Create sets before main query execution)
299299
Expression ((Project names + Projection))
300-
Filter ((WHERE + Change column names to column identifiers))
300+
Expression
301301
ReadFromMergeTree (default.tab0)
302302
Indexes:
303303
PrimaryKey
@@ -314,7 +314,7 @@ CreatingSets (Create sets before main query execution)
314314
Expression ((Project names + Projection))
315315
Aggregating
316316
Expression (Before GROUP BY)
317-
Filter ((WHERE + (Change column names to column identifiers + (Project names + (Projection + Change column names to column identifiers)))))
317+
Expression
318318
ReadFromMergeTree (default.tab0)
319319
Indexes:
320320
PrimaryKey
@@ -332,7 +332,7 @@ CreatingSets (Create sets before main query execution)
332332
ReadFromRemote (Read from remote replica)
333333
CreatingSets (Create sets before main query execution)
334334
Expression ((Project names + Projection))
335-
Filter ((WHERE + Change column names to column identifiers))
335+
Expression
336336
ReadFromMergeTree (default.tab0)
337337
Indexes:
338338
PrimaryKey
@@ -343,7 +343,7 @@ CreatingSets (Create sets before main query execution)
343343
Granules: 1/123
344344
CreatingSets (Create sets before main query execution)
345345
Expression ((Project names + Projection))
346-
Filter ((WHERE + Change column names to column identifiers))
346+
Expression
347347
ReadFromMergeTree (default.tab0)
348348
Indexes:
349349
PrimaryKey
@@ -361,7 +361,7 @@ CreatingSets (Create sets before main query execution)
361361
Aggregating
362362
Union
363363
Expression (Before GROUP BY)
364-
Filter ((WHERE + (Change column names to column identifiers + (Project names + (Projection + Change column names to column identifiers)))))
364+
Expression
365365
ReadFromMergeTree (default.tab0)
366366
Indexes:
367367
PrimaryKey
@@ -375,7 +375,7 @@ CreatingSets (Create sets before main query execution)
375375
ReadFromRemote (Read from remote replica)
376376
CreatingSets (Create sets before main query execution)
377377
Expression ((Project names + Projection))
378-
Filter ((WHERE + Change column names to column identifiers))
378+
Expression
379379
ReadFromMergeTree (default.tab0)
380380
Indexes:
381381
PrimaryKey
@@ -390,7 +390,7 @@ CreatingSets (Create sets before main query execution)
390390
Aggregating
391391
Union
392392
Expression (Before GROUP BY)
393-
Filter ((WHERE + (Change column names to column identifiers + (Project names + (Projection + Change column names to column identifiers)))))
393+
Expression
394394
ReadFromMergeTree (default.tab0)
395395
Indexes:
396396
PrimaryKey
@@ -404,7 +404,7 @@ CreatingSets (Create sets before main query execution)
404404
ReadFromRemote (Read from remote replica)
405405
CreatingSets (Create sets before main query execution)
406406
Expression ((Project names + Projection))
407-
Filter ((WHERE + Change column names to column identifiers))
407+
Expression
408408
ReadFromMergeTree (default.tab0)
409409
Indexes:
410410
PrimaryKey
@@ -415,7 +415,7 @@ CreatingSets (Create sets before main query execution)
415415
Granules: 1/123
416416
CreatingSets (Create sets before main query execution)
417417
Expression ((Project names + Projection))
418-
Filter ((WHERE + Change column names to column identifiers))
418+
Expression
419419
ReadFromMergeTree (default.tab0)
420420
Indexes:
421421
PrimaryKey
@@ -430,7 +430,7 @@ CreatingSets (Create sets before main query execution)
430430
Aggregating
431431
Union
432432
Expression (Before GROUP BY)
433-
Filter ((WHERE + (Change column names to column identifiers + (Project names + (Projection + Change column names to column identifiers)))))
433+
Expression
434434
ReadFromMergeTree (default.tab0)
435435
Indexes:
436436
PrimaryKey
@@ -442,7 +442,7 @@ CreatingSets (Create sets before main query execution)
442442
ReadFromRemote (Read from remote replica)
443443
CreatingSets (Create sets before main query execution)
444444
Expression ((Project names + Projection))
445-
Filter ((WHERE + Change column names to column identifiers))
445+
Expression
446446
ReadFromMergeTree (default.tab0)
447447
Indexes:
448448
PrimaryKey
@@ -454,7 +454,7 @@ CreatingSets (Create sets before main query execution)
454454
ReadFromSystemNumbers
455455
CreatingSets (Create sets before main query execution)
456456
Expression ((Project names + Projection))
457-
Filter ((WHERE + Change column names to column identifiers))
457+
Expression
458458
ReadFromMergeTree (default.tab0)
459459
Indexes:
460460
PrimaryKey
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
3 2048
2+
23 2048
3+
Prewhere filter column: globalIn(key, ) (removed)
4+
3 2048
5+
Prewhere filter column: globalIn(key, ) (removed)
6+
0 2048
7+
1 2048
8+
2 2048
9+
4 2048
10+
5 2048
11+
Prewhere filter column: globalNotIn(key, ) (removed)
12+
0 2048
13+
1 2048
14+
2 2048
15+
4 2048
16+
5 2048
17+
Prewhere filter column: globalNotIn(key, ) (removed)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
DROP TABLE IF EXISTS 03457_data;
2+
DROP TABLE IF EXISTS 03457_filter;
3+
4+
SET parallel_replicas_local_plan = 1;
5+
6+
CREATE TABLE 03457_filter (key UInt64) ENGINE = Memory
7+
AS
8+
SELECT 3 UNION ALL SELECT 23;
9+
10+
CREATE TABLE 03457_data (key UInt64, val String) ENGINE = MergeTree ORDER BY key
11+
AS
12+
SELECT number, randomString(2048) FROM numbers(100);
13+
14+
SELECT key, length(val) FROM (
15+
SELECT * FROM 03457_data WHERE key GLOBAL IN (03457_filter)
16+
)
17+
ORDER BY key;
18+
19+
SELECT replaceRegexpAll(trim(explain), '__table\d\.|__set_\d+_\d+|_subquery\d+|03457_filter', '')
20+
FROM (
21+
EXPLAIN actions = 1
22+
SELECT * FROM 03457_data WHERE key GLOBAL IN (03457_filter)
23+
)
24+
WHERE explain LIKE '%Prewhere filter column: globalIn%';
25+
26+
SELECT key, length(val) FROM (
27+
SELECT * FROM 03457_data WHERE key GLOBAL IN (SELECT * FROM 03457_filter WHERE key = 3)
28+
)
29+
ORDER BY key;
30+
31+
SELECT replaceRegexpAll(trim(explain), '__table\d\.|__set_\d+_\d+|_subquery\d+|03457_filter', '')
32+
FROM (
33+
EXPLAIN actions = 1
34+
SELECT * FROM 03457_data WHERE key GLOBAL IN (SELECT * FROM 03457_filter WHERE key = 3)
35+
)
36+
WHERE explain LIKE '%Prewhere filter column: globalIn%';
37+
38+
SELECT key, length(val) FROM (
39+
SELECT * FROM 03457_data WHERE key GLOBAL NOT IN (03457_filter)
40+
)
41+
ORDER BY key
42+
LIMIT 5;
43+
44+
SELECT replaceRegexpAll(trim(explain), '__table\d\.|__set_\d+_\d+|_subquery\d+|03457_filter', '')
45+
FROM (
46+
EXPLAIN actions = 1
47+
SELECT * FROM 03457_data WHERE key GLOBAL NOT IN (03457_filter)
48+
)
49+
WHERE explain LIKE '%Prewhere filter column: globalNotIn%';
50+
51+
SELECT key, length(val) FROM (
52+
SELECT * FROM 03457_data WHERE key GLOBAL NOT IN (SELECT * FROM 03457_filter WHERE key = 3)
53+
)
54+
ORDER BY key
55+
LIMIT 5;
56+
57+
SELECT replaceRegexpAll(trim(explain), '__table\d\.|__set_\d+_\d+|_subquery\d+|03457_filter', '')
58+
FROM (
59+
EXPLAIN actions = 1
60+
SELECT * FROM 03457_data WHERE key GLOBAL NOT IN (SELECT * FROM 03457_filter WHERE key = 3)
61+
)
62+
WHERE explain LIKE '%Prewhere filter column: globalNotIn%';
63+
64+
DROP TABLE 03457_data;
65+
DROP TABLE 03457_filter;

0 commit comments

Comments
 (0)