Coverage Report

Created: 2026-10-22 01:08

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exec/operator/hashjoin_build_sink.h
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#pragma once
19
20
#include "common/thread_safety_annotations.h"
21
#include "exec/operator/join_build_sink_operator.h"
22
#include "exec/operator/operator.h"
23
#include "exec/runtime_filter/runtime_filter_producer_helper.h"
24
25
namespace doris {
26
class HashJoinBuildSinkOperatorX;
27
28
class HashJoinBuildSinkLocalState MOCK_REMOVE(final)
29
        : public JoinBuildSinkLocalState<HashJoinSharedState, HashJoinBuildSinkLocalState> {
30
public:
31
    ENABLE_FACTORY_CREATOR(HashJoinBuildSinkLocalState);
32
    using Base = JoinBuildSinkLocalState<HashJoinSharedState, HashJoinBuildSinkLocalState>;
33
    using Parent = HashJoinBuildSinkOperatorX;
34
    HashJoinBuildSinkLocalState(DataSinkOperatorXBase* parent, RuntimeState* state);
35
72.0k
    ~HashJoinBuildSinkLocalState() override = default;
36
37
    Status init(RuntimeState* state, LocalSinkStateInfo& info) override;
38
    Status open(RuntimeState* state) override;
39
    Status terminate(RuntimeState* state) override;
40
    Status process_build_block(RuntimeState* state, Block& block);
41
42
    // Build ASOF JOIN pre-sorted index for O(log K) lookup
43
    Status build_asof_index(Block& block);
44
45
    void init_short_circuit_for_probe();
46
47
    bool build_unique() const;
48
49
4
    Dependency* finishdependency() override { return _finish_dependency.get(); }
50
51
    Status close(RuntimeState* state, Status exec_status) override;
52
53
    [[nodiscard]] MOCK_FUNCTION size_t get_reserve_mem_size(RuntimeState* state, bool eos);
54
55
protected:
56
    Status _hash_table_init(RuntimeState* state, const ColumnRawPtrs& raw_ptrs);
57
    void _set_build_side_has_external_nullmap(Block& block, const std::vector<int>& res_col_ids);
58
    Status _do_evaluate(Block& block, VExprContextSPtrs& exprs,
59
                        RuntimeProfile::Counter& expr_call_timer, std::vector<int>& res_col_ids,
60
                        bool is_mock = false);
61
    std::vector<uint16_t> _convert_block_to_null(Block& block);
62
    Status _extract_join_column(Block& block, ColumnUInt8::MutablePtr& null_map,
63
                                ColumnRawPtrs& raw_ptrs, const std::vector<int>& res_col_ids);
64
    friend class HashJoinBuildSinkOperatorX;
65
    friend class PartitionedHashJoinSinkLocalState;
66
    template <class HashTableContext>
67
    friend struct ProcessHashTableBuild;
68
69
    // build expr
70
    VExprContextSPtrs _build_expr_ctxs;
71
    std::vector<ColumnPtr> _key_columns_holder;
72
73
    bool _should_build_hash_table = true;
74
75
    size_t _evaluate_mem_usage = 0;
76
    size_t _build_side_rows = 0;
77
    int _task_idx;
78
79
    MutableBlock _build_side_mutable_block;
80
    std::shared_ptr<RuntimeFilterProducerHelper> _runtime_filter_producer_helper;
81
82
    /*
83
     * The comparison result of a null value with any other value is null,
84
     * which means that for most join(exclude: null aware join, null equal safe join),
85
     * the result of an equality condition involving null should be false,
86
     * so null does not need to be added to the hash table.
87
     */
88
    bool _build_side_has_external_nullmap = false;
89
    std::vector<int> _build_col_ids;
90
    int _asof_build_col_id = -1;
91
    std::shared_ptr<CountedFinishDependency> _finish_dependency;
92
93
    RuntimeProfile::Counter* _build_table_timer = nullptr;
94
    RuntimeProfile::Counter* _build_expr_call_timer = nullptr;
95
    RuntimeProfile::Counter* _build_table_insert_timer = nullptr;
96
    RuntimeProfile::Counter* _build_side_merge_block_timer = nullptr;
97
98
    RuntimeProfile::Counter* _build_blocks_memory_usage = nullptr;
99
    RuntimeProfile::Counter* _hash_table_memory_usage = nullptr;
100
    RuntimeProfile::Counter* _build_arena_memory_usage = nullptr;
101
102
    // ASOF index build counters
103
    RuntimeProfile::Counter* _asof_index_total_timer = nullptr;
104
    RuntimeProfile::Counter* _asof_index_expr_timer = nullptr;
105
    RuntimeProfile::Counter* _asof_index_sort_timer = nullptr;
106
    RuntimeProfile::Counter* _asof_index_group_timer = nullptr;
107
};
108
109
class HashJoinBuildSinkOperatorX MOCK_REMOVE(final)
110
        : public JoinBuildSinkOperatorX<HashJoinBuildSinkLocalState> {
111
public:
112
    HashJoinBuildSinkOperatorX(ObjectPool* pool, int operator_id, int dest_id,
113
                               const TPlanNode& tnode, const DescriptorTbl& descs);
114
48.0k
    Status init(const TDataSink& tsink) override {
115
48.0k
        return Status::InternalError("{} should not init with TDataSink",
116
48.0k
                                     JoinBuildSinkOperatorX<HashJoinBuildSinkLocalState>::_name);
117
48.0k
    }
118
119
    Status init(const TPlanNode& tnode, RuntimeState* state) override;
120
121
    Status prepare(RuntimeState* state) override;
122
123
    Status sink_impl(RuntimeState* state, Block* in_block, bool eos) override;
124
125
    size_t get_reserve_mem_size(RuntimeState* state, bool eos) override;
126
127
    [[nodiscard]] size_t get_memory_usage(RuntimeState* state) const;
128
129
    MOCK_FUNCTION std::string get_memory_usage_debug_str(RuntimeState* state) const;
130
131
33
    bool should_dry_run(RuntimeState* state) override {
132
33
        return _is_broadcast_join && !state->get_sink_local_state()
133
1
                                              ->cast<HashJoinBuildSinkLocalState>()
134
1
                                              ._should_build_hash_table;
135
33
    }
136
137
36
    DataDistribution required_data_distribution(RuntimeState* state) const override {
138
36
        if (_join_op == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN) {
139
6
            return {TLocalPartitionType::NOOP};
140
30
        } else if (_is_broadcast_join) {
141
4
            if (!_child->is_serial_operator()) {
142
2
                return {TLocalPartitionType::NOOP};
143
2
            }
144
2
            return state->enable_share_hash_table_for_broadcast_join()
145
2
                           ? DataDistribution(TLocalPartitionType::PASS_TO_ONE)
146
2
                           : DataDistribution(TLocalPartitionType::BROADCAST);
147
4
        }
148
26
        return _join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
149
26
                               _join_distribution == TJoinDistributionType::COLOCATE
150
26
                       ? DataDistribution(TLocalPartitionType::BUCKET_HASH_SHUFFLE,
151
0
                                          _partition_exprs)
152
26
                       : DataDistribution(TLocalPartitionType::GLOBAL_EXECUTION_HASH_SHUFFLE,
153
26
                                          _partition_exprs);
154
36
    }
155
156
144k
    bool is_shuffled_operator() const override {
157
144k
        return _join_distribution == TJoinDistributionType::PARTITIONED ||
158
144k
               _join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
159
144k
               _join_distribution == TJoinDistributionType::COLOCATE;
160
144k
    }
161
72.0k
    bool is_colocated_operator() const override {
162
72.0k
        return _join_distribution == TJoinDistributionType::BUCKET_SHUFFLE ||
163
72.0k
               _join_distribution == TJoinDistributionType::COLOCATE;
164
72.0k
    }
165
72.0k
    bool followed_by_shuffled_operator() const override {
166
72.0k
        return (is_shuffled_operator() && !is_colocated_operator()) ||
167
72.0k
               _followed_by_shuffled_operator;
168
72.0k
    }
169
46.3k
    std::vector<bool>& is_null_safe_eq_join() { return _is_null_safe_eq_join; }
170
171
48.0k
    bool allow_left_semi_direct_return(RuntimeState* state) const {
172
        // only single join conjunct and left semi join can direct return
173
48.0k
        return _join_op == TJoinOp::LEFT_SEMI_JOIN && _build_expr_ctxs.size() == 1 &&
174
48.0k
               !_have_other_join_conjunct && !_is_mark_join &&
175
48.0k
               state->query_options().__isset.enable_left_semi_direct_return_opt &&
176
48.0k
               state->query_options().enable_left_semi_direct_return_opt;
177
48.0k
    }
178
179
private:
180
    friend class HashJoinBuildSinkLocalState;
181
182
    const TJoinDistributionType::type _join_distribution;
183
    // build expr
184
    VExprContextSPtrs _build_expr_ctxs;
185
    // mark the build hash table whether it needs to store null value
186
    std::vector<bool> _serialize_null_into_key;
187
188
    // mark the join column whether support null eq
189
    std::vector<bool> _is_null_safe_eq_join;
190
191
    bool _is_broadcast_join = false;
192
    std::vector<TExpr> _partition_exprs;
193
194
    std::vector<SlotId> _hash_output_slot_ids;
195
    std::vector<bool> _should_keep_column_flags;
196
    bool _should_keep_hash_key_column = false;
197
198
    // ASOF JOIN: build-side expression extracted from MATCH_CONDITION's right child
199
    // Prepared against build child's row_desc directly (no intermediate tuple needed)
200
    VExprContextSPtr _asof_build_side_expr;
201
    TExprOpcode::type _asof_opcode = TExprOpcode::INVALID_OPCODE;
202
203
    bool _use_shared_hash_table = false;
204
    std::atomic<bool> _signaled = false;
205
    AnnotatedMutex _mutex;
206
    std::vector<std::shared_ptr<Dependency>> _finish_dependencies GUARDED_BY(_mutex);
207
    std::map<int, std::shared_ptr<RuntimeFilterWrapper>> _runtime_filters;
208
};
209
210
template <class HashTableContext>
211
struct ProcessHashTableBuild {
212
    ProcessHashTableBuild(uint32_t rows, ColumnRawPtrs& build_raw_ptrs,
213
                          HashJoinBuildSinkLocalState* parent, int batch_size, RuntimeState* state)
214
48.0k
            : _rows(rows),
215
48.0k
              _build_raw_ptrs(build_raw_ptrs),
216
48.0k
              _parent(parent),
217
48.0k
              _batch_size(batch_size),
218
48.0k
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
14.1k
            : _rows(rows),
215
14.1k
              _build_raw_ptrs(build_raw_ptrs),
216
14.1k
              _parent(parent),
217
14.1k
              _batch_size(batch_size),
218
14.1k
              _state(state) {}
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISE_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISE_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
160
            : _rows(rows),
215
160
              _build_raw_ptrs(build_raw_ptrs),
216
160
              _parent(parent),
217
160
              _batch_size(batch_size),
218
160
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
80
            : _rows(rows),
215
80
              _build_raw_ptrs(build_raw_ptrs),
216
80
              _parent(parent),
217
80
              _batch_size(batch_size),
218
80
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
323
            : _rows(rows),
215
323
              _build_raw_ptrs(build_raw_ptrs),
216
323
              _parent(parent),
217
323
              _batch_size(batch_size),
218
323
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
800
            : _rows(rows),
215
800
              _build_raw_ptrs(build_raw_ptrs),
216
800
              _parent(parent),
217
800
              _batch_size(batch_size),
218
800
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISE_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
240
            : _rows(rows),
215
240
              _build_raw_ptrs(build_raw_ptrs),
216
240
              _parent(parent),
217
240
              _batch_size(batch_size),
218
240
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISB_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
3.92k
            : _rows(rows),
215
3.92k
              _build_raw_ptrs(build_raw_ptrs),
216
3.92k
              _parent(parent),
217
3.92k
              _batch_size(batch_size),
218
3.92k
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
3.20k
            : _rows(rows),
215
3.20k
              _build_raw_ptrs(build_raw_ptrs),
216
3.20k
              _parent(parent),
217
3.20k
              _batch_size(batch_size),
218
3.20k
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
8.00k
            : _rows(rows),
215
8.00k
              _build_raw_ptrs(build_raw_ptrs),
216
8.00k
              _parent(parent),
217
8.00k
              _batch_size(batch_size),
218
8.00k
              _state(state) {}
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISE_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
8.00k
            : _rows(rows),
215
8.00k
              _build_raw_ptrs(build_raw_ptrs),
216
8.00k
              _parent(parent),
217
8.00k
              _batch_size(batch_size),
218
8.00k
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
960
            : _rows(rows),
215
960
              _build_raw_ptrs(build_raw_ptrs),
216
960
              _parent(parent),
217
960
              _batch_size(batch_size),
218
960
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISE_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
7.92k
            : _rows(rows),
215
7.92k
              _build_raw_ptrs(build_raw_ptrs),
216
7.92k
              _parent(parent),
217
7.92k
              _batch_size(batch_size),
218
7.92k
              _state(state) {}
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEEC2EjRSt6vectorIPKNS_7IColumnESaISC_EEPNS_27HashJoinBuildSinkLocalStateEiPNS_12RuntimeStateE
Line
Count
Source
214
324
            : _rows(rows),
215
324
              _build_raw_ptrs(build_raw_ptrs),
216
324
              _parent(parent),
217
324
              _batch_size(batch_size),
218
324
              _state(state) {}
219
220
    template <TJoinOp::type JoinOpType>
221
    Status run(HashTableContext& hash_table_ctx, ConstNullMapPtr null_map, bool* has_null_key,
222
48.0k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
48.0k
        if (null_map) {
224
            // first row is mocked and is null
225
39.2k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
35.5k
                *has_null_key = true;
227
35.5k
            }
228
39.2k
            if (short_circuit_for_null && *has_null_key) {
229
3.55k
                return Status::OK();
230
3.55k
            }
231
39.2k
        }
232
233
44.4k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
44.4k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
44.4k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
44.4k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
868
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
868
        }
241
242
44.4k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
44.4k
                                            null_map ? null_map->data() : nullptr, true, true,
244
44.4k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
44.4k
        bool keep_null_key = false;
247
44.4k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
44.4k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
44.4k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
44.4k
        } else if (_parent->parent()
253
44.4k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
44.4k
                                   .is_null_safe_eq_join()
255
44.4k
                                   .size() == 1 &&
256
44.4k
                   _parent->parent()
257
1.83k
                           ->cast<HashJoinBuildSinkOperatorX>()
258
1.83k
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
44.4k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
44.4k
                                         _rows, keep_null_key);
265
44.4k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
44.4k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
44.4k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
44.4k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
44.4k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
44.4k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
44.4k
        return Status::OK();
273
48.0k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.06k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.06k
                *has_null_key = true;
227
1.06k
            }
228
1.06k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.06k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.41k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.41k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.41k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.41k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.41k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.41k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.41k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.41k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.41k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.41k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.41k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.41k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.41k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.41k
        bool keep_null_key = false;
247
1.41k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.41k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.41k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.41k
        } else if (_parent->parent()
253
1.41k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.41k
                                   .is_null_safe_eq_join()
255
1.41k
                                   .size() == 1 &&
256
1.41k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.41k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.41k
                                         _rows, keep_null_key);
265
1.41k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.41k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.41k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.41k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.41k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.41k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.41k
        return Status::OK();
273
1.41k
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.40k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.40k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.40k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.40k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.40k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.40k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.40k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.40k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.40k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.40k
        bool keep_null_key = false;
247
1.40k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.40k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.40k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.40k
        } else if (_parent->parent()
253
1.40k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.40k
                                   .is_null_safe_eq_join()
255
1.40k
                                   .size() == 1 &&
256
1.40k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.40k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.40k
                                         _rows, keep_null_key);
265
1.40k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.40k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.40k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.40k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.40k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.40k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.40k
        return Status::OK();
273
1.40k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.40k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.40k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.40k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.40k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.40k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.40k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.40k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.40k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.40k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.40k
        bool keep_null_key = false;
247
1.40k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.40k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.40k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.40k
        } else if (_parent->parent()
253
1.40k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.40k
                                   .is_null_safe_eq_join()
255
1.40k
                                   .size() == 1 &&
256
1.40k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.40k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.40k
                                         _rows, keep_null_key);
265
1.40k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.40k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.40k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.40k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.40k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.40k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.40k
        return Status::OK();
273
1.40k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.41k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.41k
        if (null_map) {
224
            // first row is mocked and is null
225
1.41k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.06k
                *has_null_key = true;
227
1.06k
            }
228
1.41k
            if (short_circuit_for_null && *has_null_key) {
229
1.05k
                return Status::OK();
230
1.05k
            }
231
1.41k
        }
232
233
355
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
355
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
355
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
355
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
355
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
355
                                            null_map ? null_map->data() : nullptr, true, true,
244
355
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
355
        bool keep_null_key = false;
247
355
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
355
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
355
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
355
        } else if (_parent->parent()
253
355
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
355
                                   .is_null_safe_eq_join()
255
355
                                   .size() == 1 &&
256
355
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
355
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
355
                                         _rows, keep_null_key);
265
355
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
355
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
355
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
355
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
355
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
355
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
355
        return Status::OK();
273
1.41k
    }
_ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
1.40k
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
1.40k
        if (null_map) {
224
            // first row is mocked and is null
225
1.05k
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
1.05k
                *has_null_key = true;
227
1.05k
            }
228
1.05k
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
1.05k
        }
232
233
1.40k
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
1.40k
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
1.40k
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
1.40k
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
1.40k
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
1.40k
                                            null_map ? null_map->data() : nullptr, true, true,
244
1.40k
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
1.40k
        bool keep_null_key = false;
247
1.40k
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
1.40k
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
1.40k
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
1.40k
        } else if (_parent->parent()
253
1.40k
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
1.40k
                                   .is_null_safe_eq_join()
255
1.40k
                                   .size() == 1 &&
256
1.40k
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
1.40k
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
1.40k
                                         _rows, keep_null_key);
265
1.40k
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
1.40k
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
1.40k
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
1.40k
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
1.40k
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
1.40k
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
1.40k
        return Status::OK();
273
1.40k
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_16MethodSerializedINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodOneNumberIN4wide7integerILm256EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
8
                return Status::OK();
230
8
            }
231
16
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
16
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
16
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
16
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
8
                *has_null_key = true;
227
8
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
8
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
8
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
16
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIhNS_13JoinHashTableIhNS_17HashCRC32Return32IhEELb1EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
8
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
8
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
8
            if (short_circuit_for_null && *has_null_key) {
229
4
                return Status::OK();
230
4
            }
231
8
        }
232
233
4
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
4
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
4
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
4
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
4
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
4
                                            null_map ? null_map->data() : nullptr, true, true,
244
4
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
4
        bool keep_null_key = false;
247
4
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
4
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
4
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
4
        } else if (_parent->parent()
253
4
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
4
                                   .is_null_safe_eq_join()
255
4
                                   .size() == 1 &&
256
4
                   _parent->parent()
257
4
                           ->cast<HashJoinBuildSinkOperatorX>()
258
4
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
4
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
4
                                         _rows, keep_null_key);
265
4
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
4
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
4
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
4
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
4
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
4
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
4
        return Status::OK();
273
8
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
8
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
8
        if (null_map) {
224
            // first row is mocked and is null
225
4
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
4
                *has_null_key = true;
227
4
            }
228
4
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
4
        }
232
233
8
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
8
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
8
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
8
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
4
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
4
        }
241
242
8
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
8
                                            null_map ? null_map->data() : nullptr, true, true,
244
8
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
8
        bool keep_null_key = false;
247
8
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
8
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
8
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
8
        } else if (_parent->parent()
253
8
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
8
                                   .is_null_safe_eq_join()
255
8
                                   .size() == 1 &&
256
8
                   _parent->parent()
257
8
                           ->cast<HashJoinBuildSinkOperatorX>()
258
8
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
8
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
8
                                         _rows, keep_null_key);
265
8
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
8
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
8
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
8
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
8
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
8
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
8
        return Status::OK();
273
8
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectItNS_13JoinHashTableItNS_17HashCRC32Return32ItEELb1EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
35
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
35
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
35
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
35
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
35
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
35
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
35
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
35
                                            null_map ? null_map->data() : nullptr, true, true,
244
35
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
35
        bool keep_null_key = false;
247
35
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
35
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
35
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
35
        } else if (_parent->parent()
253
35
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
35
                                   .is_null_safe_eq_join()
255
35
                                   .size() == 1 &&
256
35
                   _parent->parent()
257
35
                           ->cast<HashJoinBuildSinkOperatorX>()
258
35
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
35
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
35
                                         _rows, keep_null_key);
265
35
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
35
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
35
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
35
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
35
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
35
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
35
        return Status::OK();
273
35
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
32
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
32
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
16
                return Status::OK();
230
16
            }
231
32
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIjNS_13JoinHashTableIjNS_17HashCRC32Return32IjEELb1EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
80
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
80
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
80
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
80
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
80
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
80
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
80
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
80
            if (short_circuit_for_null && *has_null_key) {
229
40
                return Status::OK();
230
40
            }
231
80
        }
232
233
40
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
40
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
40
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
40
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
40
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
40
                                            null_map ? null_map->data() : nullptr, true, true,
244
40
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
40
        bool keep_null_key = false;
247
40
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
40
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
40
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
40
        } else if (_parent->parent()
253
40
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
40
                                   .is_null_safe_eq_join()
255
40
                                   .size() == 1 &&
256
40
                   _parent->parent()
257
40
                           ->cast<HashJoinBuildSinkOperatorX>()
258
40
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
40
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
40
                                         _rows, keep_null_key);
265
40
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
40
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
40
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
40
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
40
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
40
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
40
        return Status::OK();
273
80
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
80
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
80
        if (null_map) {
224
            // first row is mocked and is null
225
40
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
40
                *has_null_key = true;
227
40
            }
228
40
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
40
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
40
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
40
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
80
                           ->cast<HashJoinBuildSinkOperatorX>()
258
80
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
80
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectImNS_13JoinHashTableImNS_17HashCRC32Return32ImEELb1EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
24
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
24
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
24
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
24
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
24
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
24
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
24
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
24
            if (short_circuit_for_null && *has_null_key) {
229
12
                return Status::OK();
230
12
            }
231
24
        }
232
233
12
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
12
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
12
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
12
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
12
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
12
                                            null_map ? null_map->data() : nullptr, true, true,
244
12
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
12
        bool keep_null_key = false;
247
12
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
12
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
12
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
12
        } else if (_parent->parent()
253
12
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
12
                                   .is_null_safe_eq_join()
255
12
                                   .size() == 1 &&
256
12
                   _parent->parent()
257
12
                           ->cast<HashJoinBuildSinkOperatorX>()
258
12
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
12
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
12
                                         _rows, keep_null_key);
265
12
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
12
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
12
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
12
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
12
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
12
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
12
        return Status::OK();
273
24
    }
_ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
24
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
24
        if (null_map) {
224
            // first row is mocked and is null
225
12
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
12
                *has_null_key = true;
227
12
            }
228
12
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
12
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
12
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
12
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
24
                           ->cast<HashJoinBuildSinkOperatorX>()
258
24
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
24
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_21MethodOneNumberDirectIN4wide7integerILm128EjEENS_13JoinHashTableIS4_NS_17HashCRC32Return32IS4_EELb1EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
392
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
392
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
392
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
392
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
392
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
392
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
392
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
392
            if (short_circuit_for_null && *has_null_key) {
229
294
                return Status::OK();
230
294
            }
231
392
        }
232
233
98
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
98
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
98
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
98
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
98
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
98
                                            null_map ? null_map->data() : nullptr, true, true,
244
98
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
98
        bool keep_null_key = false;
247
98
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
98
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
98
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
98
        } else if (_parent->parent()
253
98
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
98
                                   .is_null_safe_eq_join()
255
98
                                   .size() == 1 &&
256
98
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
98
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
98
                                         _rows, keep_null_key);
265
98
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
98
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
98
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
98
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
98
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
98
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
98
        return Status::OK();
273
392
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
392
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
392
        if (null_map) {
224
            // first row is mocked and is null
225
294
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
294
                *has_null_key = true;
227
294
            }
228
294
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
294
        }
232
233
392
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
392
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
392
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
392
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
392
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
392
                                            null_map ? null_map->data() : nullptr, true, true,
244
392
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
392
        bool keep_null_key = false;
247
392
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
392
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
392
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
392
        } else if (_parent->parent()
253
392
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
392
                                   .is_null_safe_eq_join()
255
392
                                   .size() == 1 &&
256
392
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
392
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
392
                                         _rows, keep_null_key);
265
392
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
392
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
392
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
392
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
392
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
392
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
392
        return Status::OK();
273
392
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableImNS_17HashCRC32Return32ImEELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS6_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
320
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
320
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
320
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
320
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
320
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
320
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
320
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
320
            if (short_circuit_for_null && *has_null_key) {
229
240
                return Status::OK();
230
240
            }
231
320
        }
232
233
80
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
80
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
80
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
80
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
80
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
80
                                            null_map ? null_map->data() : nullptr, true, true,
244
80
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
80
        bool keep_null_key = false;
247
80
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
80
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
80
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
80
        } else if (_parent->parent()
253
80
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
80
                                   .is_null_safe_eq_join()
255
80
                                   .size() == 1 &&
256
80
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
80
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
80
                                         _rows, keep_null_key);
265
80
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
80
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
80
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
80
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
80
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
80
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
80
        return Status::OK();
273
320
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
320
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
320
        if (null_map) {
224
            // first row is mocked and is null
225
240
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
240
                *has_null_key = true;
227
240
            }
228
240
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
240
        }
232
233
320
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
320
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
320
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
320
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
320
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
320
                                            null_map ? null_map->data() : nullptr, true, true,
244
320
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
320
        bool keep_null_key = false;
247
320
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
320
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
320
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
320
        } else if (_parent->parent()
253
320
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
320
                                   .is_null_safe_eq_join()
255
320
                                   .size() == 1 &&
256
320
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
320
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
320
                                         _rows, keep_null_key);
265
320
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
320
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
320
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
320
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
320
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
320
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
320
        return Status::OK();
273
320
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt72ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
800
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
800
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
600
                return Status::OK();
230
600
            }
231
800
        }
232
233
200
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
200
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
200
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
200
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
200
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
200
                                            null_map ? null_map->data() : nullptr, true, true,
244
200
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
200
        bool keep_null_key = false;
247
200
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
200
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
200
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
200
        } else if (_parent->parent()
253
200
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
200
                                   .is_null_safe_eq_join()
255
200
                                   .size() == 1 &&
256
200
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
200
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
200
                                         _rows, keep_null_key);
265
200
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
200
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
200
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
200
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
200
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
200
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
200
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_6UInt96ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt104ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
800
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
800
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
800
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
800
            if (short_circuit_for_null && *has_null_key) {
229
600
                return Status::OK();
230
600
            }
231
800
        }
232
233
200
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
200
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
200
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
200
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
200
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
200
                                            null_map ? null_map->data() : nullptr, true, true,
244
200
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
200
        bool keep_null_key = false;
247
200
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
200
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
200
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
200
        } else if (_parent->parent()
253
200
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
200
                                   .is_null_safe_eq_join()
255
200
                                   .size() == 1 &&
256
200
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
200
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
200
                                         _rows, keep_null_key);
265
200
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
200
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
200
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
200
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
200
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
200
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
200
        return Status::OK();
273
800
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
800
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
800
        if (null_map) {
224
            // first row is mocked and is null
225
600
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
600
                *has_null_key = true;
227
600
            }
228
600
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
600
        }
232
233
800
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
800
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
800
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
800
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
800
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
800
                                            null_map ? null_map->data() : nullptr, true, true,
244
800
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
800
        bool keep_null_key = false;
247
800
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
800
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
800
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
800
        } else if (_parent->parent()
253
800
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
800
                                   .is_null_safe_eq_join()
255
800
                                   .size() == 1 &&
256
800
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
800
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
800
                                         _rows, keep_null_key);
265
800
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
800
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
800
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
800
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
800
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
800
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
800
        return Status::OK();
273
800
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm128EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
96
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
96
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
96
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
96
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
96
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
96
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
96
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
96
            if (short_circuit_for_null && *has_null_key) {
229
72
                return Status::OK();
230
72
            }
231
96
        }
232
233
24
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
24
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
24
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
24
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
24
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
24
                                            null_map ? null_map->data() : nullptr, true, true,
244
24
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
24
        bool keep_null_key = false;
247
24
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
24
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
24
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
24
        } else if (_parent->parent()
253
24
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
24
                                   .is_null_safe_eq_join()
255
24
                                   .size() == 1 &&
256
24
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
24
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
24
                                         _rows, keep_null_key);
265
24
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
24
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
24
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
24
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
24
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
24
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
24
        return Status::OK();
273
96
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
96
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
96
        if (null_map) {
224
            // first row is mocked and is null
225
72
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
72
                *has_null_key = true;
227
72
            }
228
72
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
72
        }
232
233
96
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
96
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
96
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
96
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
96
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
96
                                            null_map ? null_map->data() : nullptr, true, true,
244
96
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
96
        bool keep_null_key = false;
247
96
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
96
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
96
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
96
        } else if (_parent->parent()
253
96
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
96
                                   .is_null_safe_eq_join()
255
96
                                   .size() == 1 &&
256
96
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
96
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
96
                                         _rows, keep_null_key);
265
96
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
96
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
96
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
96
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
96
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
96
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
96
        return Status::OK();
273
96
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableINS_7UInt136ENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
792
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
792
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
792
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
792
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
792
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
792
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
792
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
792
            if (short_circuit_for_null && *has_null_key) {
229
594
                return Status::OK();
230
594
            }
231
792
        }
232
233
198
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
198
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
198
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
198
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
198
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
198
                                            null_map ? null_map->data() : nullptr, true, true,
244
198
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
198
        bool keep_null_key = false;
247
198
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
198
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
198
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
198
        } else if (_parent->parent()
253
198
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
198
                                   .is_null_safe_eq_join()
255
198
                                   .size() == 1 &&
256
198
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
198
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
198
                                         _rows, keep_null_key);
265
198
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
198
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
198
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
198
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
198
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
198
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
198
        return Status::OK();
273
792
    }
_ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
792
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
792
        if (null_map) {
224
            // first row is mocked and is null
225
594
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
594
                *has_null_key = true;
227
594
            }
228
594
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
594
        }
232
233
792
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
792
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
792
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
792
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
792
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
792
                                            null_map ? null_map->data() : nullptr, true, true,
244
792
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
792
        bool keep_null_key = false;
247
792
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
792
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
792
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
792
        } else if (_parent->parent()
253
792
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
792
                                   .is_null_safe_eq_join()
255
792
                                   .size() == 1 &&
256
792
                   _parent->parent()
257
0
                           ->cast<HashJoinBuildSinkOperatorX>()
258
0
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
792
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
792
                                         _rows, keep_null_key);
265
792
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
792
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
792
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
792
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
792
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
792
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
792
        return Status::OK();
273
792
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_15MethodKeysFixedINS_13JoinHashTableIN4wide7integerILm256EjEENS_17HashCRC32Return32IS5_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS9_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE0EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE2EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
33
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
33
        if (null_map) {
224
            // first row is mocked and is null
225
17
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
17
                *has_null_key = true;
227
17
            }
228
17
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
17
        }
232
233
33
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
33
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
33
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
33
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
17
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
17
        }
241
242
33
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
33
                                            null_map ? null_map->data() : nullptr, true, true,
244
33
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
33
        bool keep_null_key = false;
247
33
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
33
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
33
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
33
        } else if (_parent->parent()
253
33
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
33
                                   .is_null_safe_eq_join()
255
33
                                   .size() == 1 &&
256
33
                   _parent->parent()
257
33
                           ->cast<HashJoinBuildSinkOperatorX>()
258
33
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
33
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
33
                                         _rows, keep_null_key);
265
33
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
33
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
33
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
33
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
33
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
33
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
33
        return Status::OK();
273
33
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE8EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
34
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
34
        if (null_map) {
224
            // first row is mocked and is null
225
18
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
18
                *has_null_key = true;
227
18
            }
228
18
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
18
        }
232
233
34
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
34
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
34
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
34
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
18
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
18
        }
241
242
34
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
34
                                            null_map ? null_map->data() : nullptr, true, true,
244
34
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
34
        bool keep_null_key = false;
247
34
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
34
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
34
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
34
        } else if (_parent->parent()
253
34
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
34
                                   .is_null_safe_eq_join()
255
34
                                   .size() == 1 &&
256
34
                   _parent->parent()
257
34
                           ->cast<HashJoinBuildSinkOperatorX>()
258
34
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
34
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
34
                                         _rows, keep_null_key);
265
34
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
34
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
34
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
34
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
34
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
34
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
34
        return Status::OK();
273
34
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE1EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
32
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE4EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
32
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE3EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE5EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE7EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
33
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
33
        if (null_map) {
224
            // first row is mocked and is null
225
17
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
17
                *has_null_key = true;
227
17
            }
228
17
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
17
        }
232
233
33
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
33
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
33
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
33
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
17
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
17
        }
241
242
33
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
33
                                            null_map ? null_map->data() : nullptr, true, true,
244
33
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
33
        bool keep_null_key = false;
247
33
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
33
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
33
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
33
        } else if (_parent->parent()
253
33
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
33
                                   .is_null_safe_eq_join()
255
33
                                   .size() == 1 &&
256
33
                   _parent->parent()
257
33
                           ->cast<HashJoinBuildSinkOperatorX>()
258
33
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
33
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
33
                                         _rows, keep_null_key);
265
33
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
33
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
33
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
33
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
33
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
33
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
33
        return Status::OK();
273
33
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE9EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE10EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
32
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
32
            if (short_circuit_for_null && *has_null_key) {
229
16
                return Status::OK();
230
16
            }
231
32
        }
232
233
16
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
16
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
16
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
16
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
0
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
0
        }
241
242
16
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
16
                                            null_map ? null_map->data() : nullptr, true, true,
244
16
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
16
        bool keep_null_key = false;
247
16
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
16
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
16
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
16
        } else if (_parent->parent()
253
16
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
16
                                   .is_null_safe_eq_join()
255
16
                                   .size() == 1 &&
256
16
                   _parent->parent()
257
16
                           ->cast<HashJoinBuildSinkOperatorX>()
258
16
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
16
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
16
                                         _rows, keep_null_key);
265
16
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
16
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
16
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
16
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
16
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
16
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
16
        return Status::OK();
273
32
    }
_ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE11EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Line
Count
Source
222
32
               bool short_circuit_for_null, bool with_other_conjuncts) {
223
32
        if (null_map) {
224
            // first row is mocked and is null
225
16
            if (simd::contain_one(null_map->data() + 1, _rows - 1)) {
226
16
                *has_null_key = true;
227
16
            }
228
16
            if (short_circuit_for_null && *has_null_key) {
229
0
                return Status::OK();
230
0
            }
231
16
        }
232
233
32
        SCOPED_TIMER(_parent->_build_table_insert_timer);
234
32
        hash_table_ctx.hash_table->template prepare_build<JoinOpType>(
235
32
                _rows, _batch_size, *has_null_key, hash_table_ctx.direct_mapping_range());
236
237
        // In order to make the null keys equal when using single null eq, all null keys need to be set to default value.
238
32
        if (_build_raw_ptrs.size() == 1 && null_map && *has_null_key) {
239
16
            const_cast<IColumn*>(_build_raw_ptrs[0])->replace_column_null_data(null_map->data());
240
16
        }
241
242
32
        hash_table_ctx.init_serialized_keys(_build_raw_ptrs, _rows,
243
32
                                            null_map ? null_map->data() : nullptr, true, true,
244
32
                                            hash_table_ctx.hash_table->get_bucket_size());
245
        // only 2 cases need to access the null value in hash table
246
32
        bool keep_null_key = false;
247
32
        if ((JoinOpType == TJoinOp::NULL_AWARE_LEFT_ANTI_JOIN ||
248
32
             JoinOpType == TJoinOp::NULL_AWARE_LEFT_SEMI_JOIN) &&
249
32
            with_other_conjuncts) {
250
            // null aware join with other conjuncts
251
0
            keep_null_key = true;
252
32
        } else if (_parent->parent()
253
32
                                   ->cast<HashJoinBuildSinkOperatorX>()
254
32
                                   .is_null_safe_eq_join()
255
32
                                   .size() == 1 &&
256
32
                   _parent->parent()
257
32
                           ->cast<HashJoinBuildSinkOperatorX>()
258
32
                           .is_null_safe_eq_join()[0]) {
259
            // single null safe eq
260
0
            keep_null_key = true;
261
0
        }
262
263
32
        hash_table_ctx.hash_table->build(hash_table_ctx.keys, hash_table_ctx.bucket_nums.data(),
264
32
                                         _rows, keep_null_key);
265
32
        hash_table_ctx.bucket_nums.resize(_batch_size);
266
32
        hash_table_ctx.bucket_nums.shrink_to_fit();
267
268
32
        COUNTER_SET(_parent->_hash_table_memory_usage,
269
32
                    (int64_t)hash_table_ctx.hash_table->get_byte_size());
270
32
        COUNTER_SET(_parent->_build_arena_memory_usage,
271
32
                    (int64_t)hash_table_ctx.serialized_keys_size(true));
272
32
        return Status::OK();
273
32
    }
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE12EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
Unexecuted instantiation: _ZN5doris21ProcessHashTableBuildINS_19MethodStringNoCacheINS_13JoinHashTableINS_9StringRefENS_17HashCRC32Return32IS3_EELb0EEEEEE3runILNS_7TJoinOp4typeE14EEENS_6StatusERS7_PKNS_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEEPbbb
274
275
private:
276
    const uint32_t _rows;
277
    ColumnRawPtrs& _build_raw_ptrs;
278
    HashJoinBuildSinkLocalState* _parent = nullptr;
279
    int _batch_size;
280
    RuntimeState* _state = nullptr;
281
};
282
283
/// Instantiated once in join_build_sink_operator.cpp; suppresses per-TU implicit
284
/// instantiation.
285
extern template class JoinBuildSinkOperatorX<HashJoinBuildSinkLocalState>;
286
extern template class JoinBuildSinkLocalState<HashJoinSharedState, HashJoinBuildSinkLocalState>;
287
288
} // namespace doris