Skip to content

Commit b44c8d3

Browse files
Backport ClickHouse#91664 to 25.8: Fix memory usage in join with additional filter
1 parent b150c5a commit b44c8d3

File tree

13 files changed

+206
-99
lines changed

13 files changed

+206
-99
lines changed

src/Interpreters/ConcurrentHashJoin.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,17 +320,23 @@ class ConcurrentHashJoinResult : public IJoinResult
320320
if (!current_result)
321321
{
322322
if (next_block >= dispatched_blocks.size())
323-
return {Block(), true};
323+
return {Block(), nullptr, true};
324324

325325
current_result = hash_joins[next_block]->data->joinScatteredBlock(std::move(dispatched_blocks[next_block]));
326-
++next_block;
327326
}
328327

329328
auto data = current_result->next();
330329
if (data.is_last)
330+
{
331+
if (data.next_block)
332+
dispatched_blocks[next_block] = std::move(*data.next_block);
333+
else
334+
++next_block;
331335
current_result.reset();
336+
}
337+
332338
bool is_last = next_block >= dispatched_blocks.size() && data.is_last;
333-
return {std::move(data.block), is_last};
339+
return {std::move(data.block), nullptr, is_last};
334340
}
335341
};
336342

src/Interpreters/HashJoin/AddedColumns.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,4 @@ class AddedColumns
265265
}
266266
};
267267

268-
/// Adapter class to pass into addFoundRowAll
269-
/// In joinRightColumnsWithAdditionalFilter we don't want to add rows directly into AddedColumns,
270-
/// because they need to be filtered by additional_filter_expression.
271-
class PreSelectedRows : public std::vector<const RowRef *>
272-
{
273-
public:
274-
void appendFromBlock(const RowRef * row_ref, bool /* has_default */) { this->emplace_back(row_ref); }
275-
static constexpr bool isLazy() { return false; }
276-
};
277-
278268
}

src/Interpreters/HashJoin/HashJoin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,7 @@ IJoinResult::JoinResultBlock CrossJoinResult::next()
10361036

10371037
bool is_last = left_row >= rows_total;
10381038
res = res.cloneWithColumns(std::move(dst_columns));
1039-
return {res, is_last};
1039+
return {res, nullptr, is_last};
10401040
}
10411041

10421042
JoinResultPtr HashJoin::joinBlockImplCross(Block block) const

src/Interpreters/HashJoin/HashJoinMethods.h

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,23 +114,23 @@ class HashJoinMethods
114114
bool & all_values_unique);
115115

116116
template <typename AddedColumns>
117-
static void switchJoinRightColumns(
117+
static size_t switchJoinRightColumns(
118118
const std::vector<const MapsTemplate *> & mapv,
119119
AddedColumns & added_columns,
120120
const ScatteredBlock::Selector & selector,
121121
HashJoin::Type type,
122122
JoinStuff::JoinUsedFlags & used_flags);
123123

124124
template <typename KeyGetter, typename Map, typename AddedColumns>
125-
static void joinRightColumnsSwitchNullability(
125+
static size_t joinRightColumnsSwitchNullability(
126126
std::vector<KeyGetter> && key_getter_vector,
127127
const std::vector<const Map *> & mapv,
128128
AddedColumns & added_columns,
129129
const ScatteredBlock::Selector & selector,
130130
JoinStuff::JoinUsedFlags & used_flags);
131131

132132
template <typename KeyGetter, typename Map, bool need_filter, typename AddedColumns>
133-
static void joinRightColumnsSwitchMultipleDisjuncts(
133+
static size_t joinRightColumnsSwitchMultipleDisjuncts(
134134
std::vector<KeyGetter> && key_getter_vector,
135135
const std::vector<const Map *> & mapv,
136136
AddedColumns & added_columns,
@@ -147,7 +147,7 @@ class HashJoinMethods
147147
JoinCommon::JoinMask::Kind join_mask_kind,
148148
typename AddedColumns,
149149
typename Selector>
150-
static void joinRightColumns(
150+
static size_t joinRightColumns(
151151
std::vector<KeyGetter> && key_getter_vector,
152152
const std::vector<const Map *> & mapv,
153153
AddedColumns & added_columns,
@@ -161,7 +161,7 @@ class HashJoinMethods
161161
bool check_null_map,
162162
typename AddedColumns,
163163
typename Selector>
164-
static void joinRightColumnsSwitchJoinMaskKind(
164+
static size_t joinRightColumnsSwitchJoinMaskKind(
165165
std::vector<KeyGetter> && key_getter_vector,
166166
const std::vector<const Map *> & mapv,
167167
AddedColumns & added_columns,
@@ -176,31 +176,24 @@ class HashJoinMethods
176176
JoinCommon::JoinMask::Kind join_mask_kind,
177177
typename AddedColumns,
178178
typename Selector>
179-
static void joinRightColumns(
179+
static size_t joinRightColumns(
180180
KeyGetter & key_getter,
181181
const Map * map,
182182
AddedColumns & added_columns,
183183
JoinStuff::JoinUsedFlags & used_flags,
184184
const Selector & selector);
185185

186186
template <typename KeyGetter, typename Map, bool need_filter, bool check_null_map, typename AddedColumns, typename Selector>
187-
static void joinRightColumnsSwitchJoinMaskKind(
187+
static size_t joinRightColumnsSwitchJoinMaskKind(
188188
KeyGetter & key_getter,
189189
const Map * map,
190190
AddedColumns & added_columns,
191191
JoinStuff::JoinUsedFlags & used_flags,
192192
const Selector & selector);
193193

194-
template <typename AddedColumns, typename Selector>
195-
static ColumnPtr buildAdditionalFilter(
196-
const Selector & selector,
197-
const std::vector<const RowRef *> & selected_rows,
198-
const std::vector<size_t> & row_replicate_offset,
199-
AddedColumns & added_columns);
200-
201194
/// First to collect all matched rows refs by join keys, then filter out rows which are not true in additional filter expression.
202195
template <typename KeyGetter, typename Map, typename AddedColumns>
203-
static void joinRightColumnsWithAddtitionalFilter(
196+
static size_t joinRightColumnsWithAddtitionalFilter(
204197
std::vector<KeyGetter> && key_getter_vector,
205198
const std::vector<const Map *> & mapv,
206199
AddedColumns & added_columns,

0 commit comments

Comments
 (0)