Skip to content

Commit b12b1e1

Browse files
committed
Allow moving conditions with subcolumns to prewhere
1 parent 48433c0 commit b12b1e1

File tree

4 files changed

+93
-2
lines changed

4 files changed

+93
-2
lines changed

src/Storages/MergeTree/MergeTreeWhereOptimizer.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,21 @@ static Int64 findMinPosition(const NameSet & condition_table_columns, const Name
5959
return min_position;
6060
}
6161

62+
static NameSet getTableColumns(const StorageMetadataPtr & metadata_snapshot, const Names & queried_columns)
63+
{
64+
const auto & columns_description = metadata_snapshot->getColumns();
65+
NameSet table_columns = collections::map<std::unordered_set>(columns_description.getAllPhysical(), [](const NameAndTypePair & col) { return col.name; });
66+
67+
/// Add also requested subcolumns to known table columns.
68+
for (const auto & column : queried_columns)
69+
{
70+
if (columns_description.hasSubcolumn(column))
71+
table_columns.insert(column);
72+
}
73+
74+
return table_columns;
75+
}
76+
6277
MergeTreeWhereOptimizer::MergeTreeWhereOptimizer(
6378
std::unordered_map<std::string, UInt64> column_sizes_,
6479
const StorageMetadataPtr & metadata_snapshot,
@@ -67,8 +82,7 @@ MergeTreeWhereOptimizer::MergeTreeWhereOptimizer(
6782
const std::optional<NameSet> & supported_columns_,
6883
LoggerPtr log_)
6984
: estimator(estimator_)
70-
, table_columns{collections::map<std::unordered_set>(
71-
metadata_snapshot->getColumns().getAllPhysical(), [](const NameAndTypePair & col) { return col.name; })}
85+
, table_columns(getTableColumns(metadata_snapshot, queried_columns_))
7286
, queried_columns{queried_columns_}
7387
, supported_columns{supported_columns_}
7488
, sorting_key_names{NameSet(
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<test>
2+
<settings>
3+
<max_threads>1</max_threads>
4+
<use_variant_as_common_type>1</use_variant_as_common_type>
5+
</settings>
6+
7+
<create_query>create table test (x UInt32, n Nullable(UInt32), s String, t Tuple(a UInt32, b String), json JSON) engine=MergeTree order by tuple()</create_query>
8+
<fill_query>insert into test select number, number = 0 ? NULL : number, repeat('a', 1000), tuple(number, randomString(1000)), toJSONString(map('a', number::Int32, 'b', repeat('a', 1000))) from numbers(1000000)</fill_query>
9+
10+
<query>select * from test where t.a = 42 format Null</query>
11+
<query>select * from test where n.null format Null</query>
12+
<query>select * from test where json.a = 42 format Null</query>
13+
14+
<drop_query>drop table if exists test</drop_query>
15+
</test>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
Expression ((Project names + Projection))
2+
Expression
3+
ReadFromMergeTree (default.test)
4+
0 \N (0,0) {"a":"0","b":"0"}
5+
1 \N (1,1) {"a":"1","b":"1"}
6+
2 \N (2,2) {"a":"2","b":"2"}
7+
3 \N (3,3) {"a":"3","b":"3"}
8+
Expression ((Project names + Projection))
9+
Filter ((WHERE + Change column names to column identifiers))
10+
ReadFromMergeTree (default.test)
11+
0 \N (0,0) {"a":"0","b":"0"}
12+
1 \N (1,1) {"a":"1","b":"1"}
13+
2 \N (2,2) {"a":"2","b":"2"}
14+
3 \N (3,3) {"a":"3","b":"3"}
15+
Expression ((Project names + Projection))
16+
Expression
17+
ReadFromMergeTree (default.test)
18+
0 \N (0,0) {"a":"0","b":"0"}
19+
1 \N (1,1) {"a":"1","b":"1"}
20+
2 \N (2,2) {"a":"2","b":"2"}
21+
3 \N (3,3) {"a":"3","b":"3"}
22+
Expression ((Project names + Projection))
23+
Filter ((WHERE + Change column names to column identifiers))
24+
ReadFromMergeTree (default.test)
25+
0 \N (0,0) {"a":"0","b":"0"}
26+
1 \N (1,1) {"a":"1","b":"1"}
27+
2 \N (2,2) {"a":"2","b":"2"}
28+
3 \N (3,3) {"a":"3","b":"3"}
29+
Expression ((Project names + Projection))
30+
Expression
31+
ReadFromMergeTree (default.test)
32+
0 \N (0,0) {"a":"0","b":"0"}
33+
1 \N (1,1) {"a":"1","b":"1"}
34+
2 \N (2,2) {"a":"2","b":"2"}
35+
3 \N (3,3) {"a":"3","b":"3"}
36+
Expression ((Project names + Projection))
37+
Filter ((WHERE + Change column names to column identifiers))
38+
ReadFromMergeTree (default.test)
39+
0 \N (0,0) {"a":"0","b":"0"}
40+
1 \N (1,1) {"a":"1","b":"1"}
41+
2 \N (2,2) {"a":"2","b":"2"}
42+
3 \N (3,3) {"a":"3","b":"3"}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
drop table if exists test;
2+
create table test (x UInt64, n Nullable(UInt32), t Tuple(a UInt32, b UInt32), json JSON) engine=MergeTree order by tuple() settings index_granularity=4;
3+
insert into test select number, number < 4 ? NULL : number, tuple(number, number), toJSONString(map('a', number, 'b', number)) from numbers(12);
4+
explain select * from test where n.null settings optimize_move_to_prewhere=1;
5+
select * from test where n.null settings optimize_move_to_prewhere=1;
6+
explain select * from test where n.null settings optimize_move_to_prewhere=0;
7+
select * from test where n.null settings optimize_move_to_prewhere=0;
8+
9+
explain select * from test where t.a < 4 settings optimize_move_to_prewhere=1;
10+
select * from test where t.a < 4 settings optimize_move_to_prewhere=1;
11+
explain select * from test where t.a < 4 settings optimize_move_to_prewhere=0;
12+
select * from test where t.a < 4 settings optimize_move_to_prewhere=0;
13+
14+
explain select * from test where json.a::Int64 < 4 settings optimize_move_to_prewhere=1;
15+
select * from test where json.a::Int64 < 4 settings optimize_move_to_prewhere=1;
16+
explain select * from test where json.a::Int64 < 4 settings optimize_move_to_prewhere=0;
17+
select * from test where json.a::Int64 < 4 settings optimize_move_to_prewhere=0;
18+
19+
drop table test;
20+

0 commit comments

Comments
 (0)