Coverage Report

Created: 2026-05-13 17:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/array/function_arrays_overlap.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
#pragma once
18
19
#include <fmt/format.h>
20
#include <glog/logging.h>
21
#include <sys/types.h>
22
23
#include <boost/iterator/iterator_facade.hpp>
24
#include <memory>
25
#include <ostream>
26
#include <utility>
27
28
#include "common/status.h"
29
#include "core/assert_cast.h"
30
#include "core/block/block.h"
31
#include "core/block/column_numbers.h"
32
#include "core/block/column_with_type_and_name.h"
33
#include "core/column/column.h"
34
#include "core/column/column_nullable.h"
35
#include "core/column/column_vector.h"
36
#include "core/data_type/data_type.h"
37
#include "core/data_type/data_type_array.h"
38
#include "core/data_type/data_type_nullable.h"
39
#include "core/data_type/data_type_number.h"
40
#include "core/string_ref.h"
41
#include "core/types.h"
42
#include "exec/common/hash_table/hash.h"
43
#include "exprs/function/array/function_array_index.h"
44
#include "exprs/function/array/function_array_utils.h"
45
#include "exprs/function/function.h"
46
#include "exprs/function/function_helpers.h"
47
48
namespace doris {
49
class FunctionContext;
50
} // namespace doris
51
template <typename, typename>
52
struct DefaultHash;
53
54
namespace doris {
55
56
template <typename T>
57
class ColumnStr;
58
using ColumnString = ColumnStr<UInt32>;
59
60
template <typename T>
61
struct OverlapSetImpl {
62
    using ElementNativeType = typename NativeType<typename T::value_type>::Type;
63
    using Set = phmap::flat_hash_set<ElementNativeType, DefaultHash<ElementNativeType>>;
64
    Set set;
65
    bool has_null = false;
66
67
4
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
68
4
        const auto& vec = assert_cast<const T&>(*column).get_data();
69
9
        for (size_t i = start; i < start + size; ++i) {
70
5
            if (nullmap[i]) {
71
0
                has_null = true;
72
0
                continue;
73
0
            }
74
5
            set.insert(vec[i]);
75
5
        }
76
4
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE3EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE4EEEE12insert_arrayEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE5EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Line
Count
Source
67
2
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
68
2
        const auto& vec = assert_cast<const T&>(*column).get_data();
69
5
        for (size_t i = start; i < start + size; ++i) {
70
3
            if (nullmap[i]) {
71
0
                has_null = true;
72
0
                continue;
73
0
            }
74
3
            set.insert(vec[i]);
75
3
        }
76
2
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE6EEEE12insert_arrayEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE7EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Line
Count
Source
67
1
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
68
1
        const auto& vec = assert_cast<const T&>(*column).get_data();
69
2
        for (size_t i = start; i < start + size; ++i) {
70
1
            if (nullmap[i]) {
71
0
                has_null = true;
72
0
                continue;
73
0
            }
74
1
            set.insert(vec[i]);
75
1
        }
76
1
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE8EEEE12insert_arrayEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE9EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Line
Count
Source
67
1
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
68
1
        const auto& vec = assert_cast<const T&>(*column).get_data();
69
2
        for (size_t i = start; i < start + size; ++i) {
70
1
            if (nullmap[i]) {
71
0
                has_null = true;
72
0
                continue;
73
0
            }
74
1
            set.insert(vec[i]);
75
1
        }
76
1
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE11EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE25EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE26EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE12EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE27EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE42EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE36EEEE12insert_arrayEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE37EEEE12insert_arrayEPKNS_7IColumnEPKhmm
77
78
4
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
79
4
        const auto& vec = assert_cast<const T&>(*column).get_data();
80
9
        for (size_t i = start; i < start + size; ++i) {
81
8
            if (nullmap[i]) {
82
0
                if (has_null) {
83
0
                    return true;
84
0
                } else {
85
0
                    continue;
86
0
                }
87
0
            }
88
89
8
            if (set.contains(vec[i])) {
90
3
                return true;
91
3
            }
92
8
        }
93
1
        return false;
94
4
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE3EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE4EEEE8find_anyEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE5EEEE8find_anyEPKNS_7IColumnEPKhmm
Line
Count
Source
78
2
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
79
2
        const auto& vec = assert_cast<const T&>(*column).get_data();
80
7
        for (size_t i = start; i < start + size; ++i) {
81
6
            if (nullmap[i]) {
82
0
                if (has_null) {
83
0
                    return true;
84
0
                } else {
85
0
                    continue;
86
0
                }
87
0
            }
88
89
6
            if (set.contains(vec[i])) {
90
1
                return true;
91
1
            }
92
6
        }
93
1
        return false;
94
2
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE6EEEE8find_anyEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE7EEEE8find_anyEPKNS_7IColumnEPKhmm
Line
Count
Source
78
1
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
79
1
        const auto& vec = assert_cast<const T&>(*column).get_data();
80
1
        for (size_t i = start; i < start + size; ++i) {
81
1
            if (nullmap[i]) {
82
0
                if (has_null) {
83
0
                    return true;
84
0
                } else {
85
0
                    continue;
86
0
                }
87
0
            }
88
89
1
            if (set.contains(vec[i])) {
90
1
                return true;
91
1
            }
92
1
        }
93
0
        return false;
94
1
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE8EEEE8find_anyEPKNS_7IColumnEPKhmm
_ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE9EEEE8find_anyEPKNS_7IColumnEPKhmm
Line
Count
Source
78
1
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
79
1
        const auto& vec = assert_cast<const T&>(*column).get_data();
80
1
        for (size_t i = start; i < start + size; ++i) {
81
1
            if (nullmap[i]) {
82
0
                if (has_null) {
83
0
                    return true;
84
0
                } else {
85
0
                    continue;
86
0
                }
87
0
            }
88
89
1
            if (set.contains(vec[i])) {
90
1
                return true;
91
1
            }
92
1
        }
93
0
        return false;
94
1
    }
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE11EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE25EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE26EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE12EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE27EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE42EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE36EEEE8find_anyEPKNS_7IColumnEPKhmm
Unexecuted instantiation: _ZN5doris14OverlapSetImplINS_12ColumnVectorILNS_13PrimitiveTypeE37EEEE8find_anyEPKNS_7IColumnEPKhmm
95
};
96
97
template <>
98
struct OverlapSetImpl<ColumnDecimal128V2> {
99
    using ElementNativeType = Int128;
100
    using Set = phmap::flat_hash_set<ElementNativeType, DefaultHash<ElementNativeType>>;
101
    Set set;
102
    bool has_null = false;
103
104
10
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
105
10
        const auto& vec = assert_cast<const ColumnDecimal128V2&>(*column).get_data();
106
20
        for (size_t i = start; i < start + size; ++i) {
107
10
            if (nullmap[i]) {
108
0
                has_null = true;
109
0
                continue;
110
0
            }
111
10
            set.insert(vec[i].value());
112
10
        }
113
10
    }
114
115
10
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
116
10
        const auto& vec = assert_cast<const ColumnDecimal128V2&>(*column).get_data();
117
24
        for (size_t i = start; i < start + size; ++i) {
118
20
            if (nullmap[i]) {
119
2
                if (has_null) {
120
0
                    return true;
121
2
                } else {
122
2
                    continue;
123
2
                }
124
2
            }
125
126
18
            if (set.contains(vec[i].value())) {
127
6
                return true;
128
6
            }
129
18
        }
130
4
        return false;
131
10
    }
132
};
133
134
template <>
135
struct OverlapSetImpl<ColumnString> {
136
    using Set = phmap::flat_hash_set<StringRef, DefaultHash<StringRef>>;
137
    Set set;
138
    bool has_null = false;
139
140
13
    void insert_array(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
141
31
        for (size_t i = start; i < start + size; ++i) {
142
18
            if (nullmap[i]) {
143
5
                has_null = true;
144
5
                continue;
145
5
            }
146
13
            set.insert(column->get_data_at(i));
147
13
        }
148
13
    }
149
150
13
    bool find_any(const IColumn* column, const UInt8* nullmap, size_t start, size_t size) {
151
27
        for (size_t i = start; i < start + size; ++i) {
152
23
            if (nullmap[i]) {
153
0
                if (has_null) {
154
0
                    return true;
155
0
                } else {
156
0
                    continue;
157
0
                }
158
0
            }
159
160
23
            if (set.contains(column->get_data_at(i))) {
161
9
                return true;
162
9
            }
163
23
        }
164
4
        return false;
165
13
    }
166
};
167
168
class FunctionArraysOverlap : public IFunction {
169
public:
170
    static constexpr auto name = "arrays_overlap";
171
9
    static FunctionPtr create() { return std::make_shared<FunctionArraysOverlap>(); }
172
173
    /// Get function name.
174
8
    String get_name() const override { return name; }
175
176
14
    bool use_default_implementation_for_nulls() const override { return false; }
177
178
8
    bool is_variadic() const override { return false; }
179
180
7
    size_t get_number_of_arguments() const override { return 2; }
181
182
7
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
183
7
        auto left_data_type = remove_nullable(arguments[0]);
184
7
        auto right_data_type = remove_nullable(arguments[1]);
185
7
        DCHECK(left_data_type->get_primitive_type() == TYPE_ARRAY) << arguments[0]->get_name();
186
7
        DCHECK(right_data_type->get_primitive_type() == TYPE_ARRAY) << arguments[1]->get_name();
187
7
        auto left_nested_type = remove_nullable(
188
7
                assert_cast<const DataTypeArray&>(*left_data_type).get_nested_type());
189
7
        auto right_nested_type = remove_nullable(
190
7
                assert_cast<const DataTypeArray&>(*right_data_type).get_nested_type());
191
7
        DCHECK(left_nested_type->equals_ignore_precision(*right_nested_type))
192
0
                << "data type " << arguments[0]->get_name() << " not equal with "
193
0
                << arguments[1]->get_name();
194
7
        return make_nullable(std::make_shared<DataTypeUInt8>());
195
7
    }
196
197
    /**
198
     * eval inverted index. we can filter array rows with inverted index iter
199
     * array_overlap(array, []) -> array_overlap(array, const value)
200
     */
201
    Status evaluate_inverted_index(
202
            const ColumnsWithTypeAndName& arguments,
203
            const std::vector<IndexFieldNameAndTypePair>& data_type_with_names,
204
            std::vector<segment_v2::IndexIterator*> iterators, uint32_t num_rows,
205
            const InvertedIndexAnalyzerCtx* analyzer_ctx,
206
0
            segment_v2::InvertedIndexResultBitmap& bitmap_result) const override {
207
0
        DCHECK(arguments.size() == 1);
208
0
        DCHECK(data_type_with_names.size() == 1);
209
0
        DCHECK(iterators.size() == 1);
210
0
        auto* iter = iterators[0];
211
0
        if (iter == nullptr) {
212
0
            return Status::OK();
213
0
        }
214
0
        auto data_type_with_name = data_type_with_names[0];
215
0
        if (!segment_v2::IndexReaderHelper::has_string_or_bkd_index(iter)) {
216
0
            return Status::Error<ErrorCode::INVERTED_INDEX_EVALUATE_SKIPPED>(
217
0
                    "Inverted index evaluate skipped, no inverted index reader can not support "
218
0
                    "array_overlap");
219
0
        }
220
        // in arrays_overlap param is array Field and const Field
221
0
        ColumnPtr arg_column = arguments[0].column;
222
0
        DataTypePtr arg_type = arguments[0].type;
223
0
        if ((is_column_nullable(*arg_column) && !is_column_const(*remove_nullable(arg_column))) ||
224
0
            (!is_column_nullable(*arg_column) && !is_column_const(*arg_column))) {
225
            // if not we should skip inverted index and evaluate in expression
226
0
            return Status::Error<ErrorCode::INVERTED_INDEX_EVALUATE_SKIPPED>(
227
0
                    "Inverted index evaluate skipped, array_overlap only support const value");
228
0
        }
229
230
0
        Field param_value;
231
0
        arguments[0].column->get(0, param_value);
232
0
        DCHECK(arguments[0].type->get_primitive_type() == TYPE_ARRAY);
233
        // The current implementation for the inverted index of arrays cannot handle cases where the array contains null values,
234
        // meaning an item in the array is null.
235
0
        if (param_value.is_null()) {
236
0
            return Status::OK();
237
0
        }
238
0
        std::shared_ptr<roaring::Roaring> roaring = std::make_shared<roaring::Roaring>();
239
0
        std::shared_ptr<roaring::Roaring> null_bitmap = std::make_shared<roaring::Roaring>();
240
0
        if (iter->has_null()) {
241
0
            segment_v2::InvertedIndexQueryCacheHandle null_bitmap_cache_handle;
242
0
            RETURN_IF_ERROR(iter->read_null_bitmap(&null_bitmap_cache_handle));
243
0
            null_bitmap = null_bitmap_cache_handle.get_bitmap();
244
0
        }
245
0
        const Array& query_val = param_value.get<TYPE_ARRAY>();
246
247
0
        InvertedIndexParam param;
248
0
        param.column_name = data_type_with_name.first;
249
0
        param.column_type = data_type_with_name.second;
250
0
        param.query_type = segment_v2::InvertedIndexQueryType::EQUAL_QUERY;
251
0
        param.num_rows = num_rows;
252
0
        for (auto nested_query_val : query_val) {
253
            // any element inside array is NULL, return NULL
254
            // by current arrays_overlap execute logic.
255
0
            if (nested_query_val.is_null()) {
256
0
                return Status::OK();
257
0
            }
258
0
            param.query_value = nested_query_val;
259
0
            param.roaring = std::make_shared<roaring::Roaring>();
260
0
            param.analyzer_ctx = analyzer_ctx;
261
0
            RETURN_IF_ERROR(iter->read_from_index(segment_v2::IndexParam {&param}));
262
0
            *roaring |= *param.roaring;
263
0
        }
264
265
0
        segment_v2::InvertedIndexResultBitmap result(roaring, null_bitmap);
266
0
        bitmap_result = result;
267
0
        bitmap_result.mask_out_null();
268
269
0
        return Status::OK();
270
0
    }
271
272
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
273
7
                        uint32_t result, size_t input_rows_count) const override {
274
7
        DBUG_EXECUTE_IF("array_func.arrays_overlap", {
275
7
            auto req_id = DebugPoints::instance()->get_debug_param_or_default<int32_t>(
276
7
                    "array_func.arrays_overlap", "req_id", 0);
277
7
            return Status::Error<ErrorCode::INTERNAL_ERROR>(
278
7
                    "{} has already execute inverted index req_id {} , should not execute expr "
279
7
                    "with rows: {}",
280
7
                    get_name(), req_id, input_rows_count);
281
7
        });
282
7
        auto left_column =
283
7
                block.get_by_position(arguments[0]).column->convert_to_full_column_if_const();
284
7
        auto right_column =
285
7
                block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
286
7
        ColumnArrayExecutionData left_exec_data;
287
7
        ColumnArrayExecutionData right_exec_data;
288
289
7
        Status ret = Status::InvalidArgument(
290
7
                "execute failed, unsupported types for function {}({}, {})", get_name(),
291
7
                block.get_by_position(arguments[0]).type->get_name(),
292
7
                block.get_by_position(arguments[1]).type->get_name());
293
294
        // extract array column
295
7
        if (!extract_column_array_info(*left_column, left_exec_data) ||
296
7
            !extract_column_array_info(*right_column, right_exec_data)) {
297
0
            return ret;
298
0
        }
299
        // prepare return column
300
7
        auto dst_nested_col = ColumnUInt8::create(input_rows_count, 0);
301
7
        auto dst_null_map = ColumnUInt8::create(input_rows_count, 0);
302
7
        UInt8* dst_null_map_data = dst_null_map->get_data().data();
303
304
7
        RETURN_IF_ERROR(_execute_nullable(left_exec_data, dst_null_map_data));
305
7
        RETURN_IF_ERROR(_execute_nullable(right_exec_data, dst_null_map_data));
306
307
        // execute overlap check
308
7
        auto array_type = remove_nullable(block.get_by_position(arguments[0]).type);
309
7
        auto left_element_type = remove_nullable(
310
7
                assert_cast<const DataTypeArray*>(array_type.get())->get_nested_type());
311
312
7
        auto call = [&](const auto& type) -> bool {
313
7
            using DispatchType = std::decay_t<decltype(type)>;
314
7
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
7
                    left_exec_data, right_exec_data, dst_null_map_data,
316
7
                    dst_nested_col->get_data().data());
317
7
            return true;
318
7
        };
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE2EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE3EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE4EEEEEbSC_
_ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE5EEEEEbSC_
Line
Count
Source
312
1
        auto call = [&](const auto& type) -> bool {
313
1
            using DispatchType = std::decay_t<decltype(type)>;
314
1
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
1
                    left_exec_data, right_exec_data, dst_null_map_data,
316
1
                    dst_nested_col->get_data().data());
317
1
            return true;
318
1
        };
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE6EEEEEbSC_
_ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE7EEEEEbSC_
Line
Count
Source
312
1
        auto call = [&](const auto& type) -> bool {
313
1
            using DispatchType = std::decay_t<decltype(type)>;
314
1
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
1
                    left_exec_data, right_exec_data, dst_null_map_data,
316
1
                    dst_nested_col->get_data().data());
317
1
            return true;
318
1
        };
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE8EEEEEbSC_
_ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE9EEEEEbSC_
Line
Count
Source
312
1
        auto call = [&](const auto& type) -> bool {
313
1
            using DispatchType = std::decay_t<decltype(type)>;
314
1
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
1
                    left_exec_data, right_exec_data, dst_null_map_data,
316
1
                    dst_nested_col->get_data().data());
317
1
            return true;
318
1
        };
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE28EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE29EEEEEbSC_
_ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE20EEEEEbSC_
Line
Count
Source
312
2
        auto call = [&](const auto& type) -> bool {
313
2
            using DispatchType = std::decay_t<decltype(type)>;
314
2
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
2
                    left_exec_data, right_exec_data, dst_null_map_data,
316
2
                    dst_nested_col->get_data().data());
317
2
            return true;
318
2
        };
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE30EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE35EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE11EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE25EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE26EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE12EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE27EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE42EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE36EEEEEbSC_
Unexecuted instantiation: _ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE37EEEEEbSC_
_ZZNK5doris21FunctionArraysOverlap12execute_implEPNS_15FunctionContextERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE23EEEEEbSC_
Line
Count
Source
312
2
        auto call = [&](const auto& type) -> bool {
313
2
            using DispatchType = std::decay_t<decltype(type)>;
314
2
            ret = _execute_internal<typename DispatchType::ColumnType>(
315
2
                    left_exec_data, right_exec_data, dst_null_map_data,
316
2
                    dst_nested_col->get_data().data());
317
2
            return true;
318
2
        };
319
320
7
        if (!dispatch_switch_all(left_element_type->get_primitive_type(), call)) {
321
0
            ret = Status::InvalidArgument("execute failed, not support type {} in function {}",
322
0
                                          left_element_type->get_name(), get_name());
323
0
        }
324
325
7
        RETURN_IF_ERROR(ret);
326
327
7
        block.replace_by_position(
328
7
                result, ColumnNullable::create(std::move(dst_nested_col), std::move(dst_null_map)));
329
330
7
        return Status::OK();
331
7
    }
332
333
private:
334
14
    static Status _execute_nullable(const ColumnArrayExecutionData& data, UInt8* dst_nullmap_data) {
335
94
        for (ssize_t row = 0; row < data.offsets_ptr->size(); ++row) {
336
80
            if (dst_nullmap_data[row]) {
337
5
                continue;
338
5
            }
339
340
75
            if (data.array_nullmap_data && data.array_nullmap_data[row]) {
341
6
                dst_nullmap_data[row] = 1;
342
6
                continue;
343
6
            }
344
75
        }
345
14
        return Status::OK();
346
14
    }
347
348
    template <typename T>
349
    Status _execute_internal(const ColumnArrayExecutionData& left_data,
350
                             const ColumnArrayExecutionData& right_data, UInt8* dst_nullmap_data,
351
7
                             UInt8* dst_data) const {
352
7
        using ExecutorImpl = OverlapSetImpl<T>;
353
47
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
40
            if (dst_nullmap_data[row]) {
356
6
                continue;
357
6
            }
358
34
            dst_nullmap_data[row] = 0;
359
34
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
34
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
34
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
34
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
34
            if (left_size == 0 || right_size == 0) {
364
7
                dst_data[row] = 0;
365
7
                continue;
366
7
            }
367
368
27
            const auto* small_data = &left_data;
369
27
            const auto* large_data = &right_data;
370
371
27
            ssize_t small_start = left_start;
372
27
            ssize_t large_start = right_start;
373
27
            ssize_t small_size = left_size;
374
27
            ssize_t large_size = right_size;
375
27
            if (right_size < left_size) {
376
19
                std::swap(small_data, large_data);
377
19
                std::swap(small_start, large_start);
378
19
                std::swap(small_size, large_size);
379
19
            }
380
381
27
            ExecutorImpl impl;
382
27
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
27
                              small_start, small_size);
384
27
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
27
                                          large_data->nested_nullmap_data, large_start, large_size);
386
27
        }
387
7
        return Status::OK();
388
7
    }
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE3EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE4EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
_ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE5EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Line
Count
Source
351
1
                             UInt8* dst_data) const {
352
1
        using ExecutorImpl = OverlapSetImpl<T>;
353
5
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
4
            if (dst_nullmap_data[row]) {
356
1
                continue;
357
1
            }
358
3
            dst_nullmap_data[row] = 0;
359
3
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
3
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
3
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
3
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
3
            if (left_size == 0 || right_size == 0) {
364
1
                dst_data[row] = 0;
365
1
                continue;
366
1
            }
367
368
2
            const auto* small_data = &left_data;
369
2
            const auto* large_data = &right_data;
370
371
2
            ssize_t small_start = left_start;
372
2
            ssize_t large_start = right_start;
373
2
            ssize_t small_size = left_size;
374
2
            ssize_t large_size = right_size;
375
2
            if (right_size < left_size) {
376
2
                std::swap(small_data, large_data);
377
2
                std::swap(small_start, large_start);
378
2
                std::swap(small_size, large_size);
379
2
            }
380
381
2
            ExecutorImpl impl;
382
2
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
2
                              small_start, small_size);
384
2
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
2
                                          large_data->nested_nullmap_data, large_start, large_size);
386
2
        }
387
1
        return Status::OK();
388
1
    }
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE6EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
_ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE7EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Line
Count
Source
351
1
                             UInt8* dst_data) const {
352
1
        using ExecutorImpl = OverlapSetImpl<T>;
353
4
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
3
            if (dst_nullmap_data[row]) {
356
1
                continue;
357
1
            }
358
2
            dst_nullmap_data[row] = 0;
359
2
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
2
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
2
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
2
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
2
            if (left_size == 0 || right_size == 0) {
364
1
                dst_data[row] = 0;
365
1
                continue;
366
1
            }
367
368
1
            const auto* small_data = &left_data;
369
1
            const auto* large_data = &right_data;
370
371
1
            ssize_t small_start = left_start;
372
1
            ssize_t large_start = right_start;
373
1
            ssize_t small_size = left_size;
374
1
            ssize_t large_size = right_size;
375
1
            if (right_size < left_size) {
376
1
                std::swap(small_data, large_data);
377
1
                std::swap(small_start, large_start);
378
1
                std::swap(small_size, large_size);
379
1
            }
380
381
1
            ExecutorImpl impl;
382
1
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
1
                              small_start, small_size);
384
1
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
1
                                          large_data->nested_nullmap_data, large_start, large_size);
386
1
        }
387
1
        return Status::OK();
388
1
    }
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE8EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
_ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE9EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Line
Count
Source
351
1
                             UInt8* dst_data) const {
352
1
        using ExecutorImpl = OverlapSetImpl<T>;
353
4
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
3
            if (dst_nullmap_data[row]) {
356
1
                continue;
357
1
            }
358
2
            dst_nullmap_data[row] = 0;
359
2
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
2
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
2
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
2
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
2
            if (left_size == 0 || right_size == 0) {
364
1
                dst_data[row] = 0;
365
1
                continue;
366
1
            }
367
368
1
            const auto* small_data = &left_data;
369
1
            const auto* large_data = &right_data;
370
371
1
            ssize_t small_start = left_start;
372
1
            ssize_t large_start = right_start;
373
1
            ssize_t small_size = left_size;
374
1
            ssize_t large_size = right_size;
375
1
            if (right_size < left_size) {
376
1
                std::swap(small_data, large_data);
377
1
                std::swap(small_start, large_start);
378
1
                std::swap(small_size, large_size);
379
1
            }
380
381
1
            ExecutorImpl impl;
382
1
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
1
                              small_start, small_size);
384
1
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
1
                                          large_data->nested_nullmap_data, large_start, large_size);
386
1
        }
387
1
        return Status::OK();
388
1
    }
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
_ZNK5doris21FunctionArraysOverlap17_execute_internalINS_13ColumnDecimalILNS_13PrimitiveTypeE20EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Line
Count
Source
351
2
                             UInt8* dst_data) const {
352
2
        using ExecutorImpl = OverlapSetImpl<T>;
353
16
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
14
            if (dst_nullmap_data[row]) {
356
2
                continue;
357
2
            }
358
12
            dst_nullmap_data[row] = 0;
359
12
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
12
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
12
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
12
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
12
            if (left_size == 0 || right_size == 0) {
364
2
                dst_data[row] = 0;
365
2
                continue;
366
2
            }
367
368
10
            const auto* small_data = &left_data;
369
10
            const auto* large_data = &right_data;
370
371
10
            ssize_t small_start = left_start;
372
10
            ssize_t large_start = right_start;
373
10
            ssize_t small_size = left_size;
374
10
            ssize_t large_size = right_size;
375
10
            if (right_size < left_size) {
376
6
                std::swap(small_data, large_data);
377
6
                std::swap(small_start, large_start);
378
6
                std::swap(small_size, large_size);
379
6
            }
380
381
10
            ExecutorImpl impl;
382
10
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
10
                              small_start, small_size);
384
10
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
10
                                          large_data->nested_nullmap_data, large_start, large_size);
386
10
        }
387
2
        return Status::OK();
388
2
    }
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE11EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE25EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE26EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE12EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE27EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE42EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE36EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
Unexecuted instantiation: _ZNK5doris21FunctionArraysOverlap17_execute_internalINS_12ColumnVectorILNS_13PrimitiveTypeE37EEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES8_PhS9_
_ZNK5doris21FunctionArraysOverlap17_execute_internalINS_9ColumnStrIjEEEENS_6StatusERKNS_24ColumnArrayExecutionDataES7_PhS8_
Line
Count
Source
351
2
                             UInt8* dst_data) const {
352
2
        using ExecutorImpl = OverlapSetImpl<T>;
353
18
        for (ssize_t row = 0; row < left_data.offsets_ptr->size(); ++row) {
354
            // arrays_overlap(null, null) -> null
355
16
            if (dst_nullmap_data[row]) {
356
1
                continue;
357
1
            }
358
15
            dst_nullmap_data[row] = 0;
359
15
            ssize_t left_start = (*left_data.offsets_ptr)[row - 1];
360
15
            ssize_t left_size = (*left_data.offsets_ptr)[row] - left_start;
361
15
            ssize_t right_start = (*right_data.offsets_ptr)[row - 1];
362
15
            ssize_t right_size = (*right_data.offsets_ptr)[row] - right_start;
363
15
            if (left_size == 0 || right_size == 0) {
364
2
                dst_data[row] = 0;
365
2
                continue;
366
2
            }
367
368
13
            const auto* small_data = &left_data;
369
13
            const auto* large_data = &right_data;
370
371
13
            ssize_t small_start = left_start;
372
13
            ssize_t large_start = right_start;
373
13
            ssize_t small_size = left_size;
374
13
            ssize_t large_size = right_size;
375
13
            if (right_size < left_size) {
376
9
                std::swap(small_data, large_data);
377
9
                std::swap(small_start, large_start);
378
9
                std::swap(small_size, large_size);
379
9
            }
380
381
13
            ExecutorImpl impl;
382
13
            impl.insert_array(small_data->nested_col.get(), small_data->nested_nullmap_data,
383
13
                              small_start, small_size);
384
13
            dst_data[row] = impl.find_any(large_data->nested_col.get(),
385
13
                                          large_data->nested_nullmap_data, large_start, large_size);
386
13
        }
387
2
        return Status::OK();
388
2
    }
389
};
390
391
} // namespace doris