Coverage Report

Created: 2026-03-17 18:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/exprs/function/array/function_array_remove.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 <fmt/format.h>
21
#include <glog/logging.h>
22
#include <string.h>
23
24
#include <memory>
25
#include <ostream>
26
#include <string>
27
#include <string_view>
28
#include <type_traits>
29
#include <utility>
30
31
#include "common/status.h"
32
#include "core/assert_cast.h"
33
#include "core/block/block.h"
34
#include "core/block/column_numbers.h"
35
#include "core/block/column_with_type_and_name.h"
36
#include "core/block/columns_with_type_and_name.h"
37
#include "core/call_on_type_index.h"
38
#include "core/column/column.h"
39
#include "core/column/column_array.h"
40
#include "core/column/column_decimal.h"
41
#include "core/column/column_nullable.h"
42
#include "core/column/column_string.h"
43
#include "core/column/column_vector.h"
44
#include "core/data_type/data_type.h"
45
#include "core/data_type/data_type_array.h"
46
#include "core/data_type/data_type_nullable.h"
47
#include "core/data_type/primitive_type.h"
48
#include "core/pod_array_fwd.h"
49
#include "core/types.h"
50
#include "exprs/function/function.h"
51
52
namespace doris {
53
class FunctionContext;
54
} // namespace doris
55
56
namespace doris {
57
58
class FunctionArrayRemove : public IFunction {
59
public:
60
    static constexpr auto name = "array_remove";
61
2
    static FunctionPtr create() { return std::make_shared<FunctionArrayRemove>(); }
62
63
    /// Get function name.
64
1
    String get_name() const override { return name; }
65
66
1
    bool is_variadic() const override { return false; }
67
68
0
    size_t get_number_of_arguments() const override { return 2; }
69
70
0
    bool use_default_implementation_for_nulls() const override { return false; }
71
72
0
    DataTypePtr get_return_type_impl(const DataTypes& arguments) const override {
73
0
        return arguments[0];
74
0
    }
75
76
    Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments,
77
0
                        uint32_t result, size_t input_rows_count) const override {
78
        // For default implementation of nulls args
79
0
        ColumnsWithTypeAndName args = {block.get_by_position(arguments[0]),
80
0
                                       block.get_by_position(arguments[1])};
81
82
0
        auto res_column = _execute_dispatch(args, input_rows_count);
83
0
        if (!res_column) {
84
0
            return Status::RuntimeError(
85
0
                    fmt::format("unsupported types for function {}({}, {})", get_name(),
86
0
                                block.get_by_position(arguments[0]).type->get_name(),
87
0
                                block.get_by_position(arguments[1]).type->get_name()));
88
0
        }
89
0
        DCHECK_EQ(args[0].column->size(), res_column->size());
90
0
        block.replace_by_position(result, std::move(res_column));
91
0
        return Status::OK();
92
0
    }
93
94
private:
95
    template <typename NestedColumnType, typename RightColumnType>
96
    ColumnPtr _execute_number(const ColumnArray::Offsets64& offsets, const IColumn& nested_column,
97
                              const IColumn& right_column, const UInt8* nested_null_map,
98
                              const UInt8* right_nested_null_map,
99
0
                              const ColumnUInt8* array_null_map) const {
100
        // check array nested column type and get data
101
0
        const auto& src_data = reinterpret_cast<const NestedColumnType&>(nested_column).get_data();
102
103
        // check target column type and get data
104
0
        const auto& target_data = reinterpret_cast<const RightColumnType&>(right_column).get_data();
105
106
0
        PaddedPODArray<UInt8>* dst_null_map = nullptr;
107
0
        MutableColumnPtr array_nested_column = nullptr;
108
0
        IColumn* dst_column = nullptr;
109
0
        if (nested_null_map) {
110
0
            auto dst_nested_column =
111
0
                    ColumnNullable::create(nested_column.clone_empty(), ColumnUInt8::create());
112
0
            array_nested_column = dst_nested_column->get_ptr();
113
0
            dst_column = dst_nested_column->get_nested_column_ptr().get();
114
0
            dst_null_map = &dst_nested_column->get_null_map_data();
115
0
            dst_null_map->reserve(offsets.back());
116
0
        } else {
117
0
            auto dst_nested_column = nested_column.clone_empty();
118
0
            array_nested_column = dst_nested_column->get_ptr();
119
0
            dst_column = dst_nested_column.get();
120
0
        }
121
122
0
        auto& dst_data = reinterpret_cast<NestedColumnType&>(*dst_column).get_data();
123
0
        dst_data.reserve(offsets.back());
124
125
0
        auto dst_offsets_column = ColumnArray::ColumnOffsets::create();
126
0
        auto& dst_offsets = dst_offsets_column->get_data();
127
0
        dst_offsets.reserve(offsets.size());
128
129
0
        size_t cur = 0;
130
0
        for (size_t row = 0; row < offsets.size(); ++row) {
131
0
            size_t off = offsets[row - 1];
132
0
            size_t len = offsets[row] - off;
133
134
0
            if (len == 0) {
135
                // case: array:[], target:1 ==> []
136
0
                dst_offsets.push_back(cur);
137
0
                continue;
138
0
            }
139
140
0
            size_t cur_count = 0;
141
0
            for (size_t pos = 0; pos < len; ++pos) {
142
                // left is null, right is null
143
0
                if (nested_null_map && nested_null_map[off + pos] && right_nested_null_map &&
144
0
                    right_nested_null_map[row]) {
145
0
                    continue;
146
0
                }
147
148
                // left is null, right is not null
149
0
                if (nested_null_map && nested_null_map[off + pos]) {
150
                    // case: array:[Null], target:1 ==> [Null]
151
0
                    dst_data.push_back(typename NestedColumnType::value_type());
152
0
                    ++cur_count;
153
0
                    dst_null_map->push_back(1);
154
0
                    continue;
155
0
                }
156
157
                // left is not null, right is null
158
0
                if (right_nested_null_map && right_nested_null_map[row]) {
159
0
                    dst_data.push_back(src_data[off + pos]);
160
0
                    ++cur_count;
161
0
                    if (nested_null_map) {
162
0
                        dst_null_map->push_back(0);
163
0
                    }
164
0
                    continue;
165
0
                }
166
167
                // left is not null, right is not null
168
0
                if (src_data[off + pos] == target_data[row]) {
169
0
                    continue;
170
0
                } else {
171
0
                    dst_data.push_back(src_data[off + pos]);
172
0
                    ++cur_count;
173
0
                    if (nested_null_map) {
174
0
                        dst_null_map->push_back(0);
175
0
                    }
176
0
                }
177
0
            }
178
179
0
            cur += cur_count;
180
0
            dst_offsets.push_back(cur);
181
0
        }
182
183
0
        auto dst =
184
0
                ColumnArray::create(std::move(array_nested_column), std::move(dst_offsets_column));
185
0
        if (array_null_map) {
186
0
            auto dst_null_column = ColumnUInt8::create();
187
0
            dst_null_column->insert_range_from(*array_null_map, 0, offsets.size());
188
0
            return ColumnNullable::create(std::move(dst), std::move(dst_null_column));
189
0
        } else {
190
0
            return dst;
191
0
        }
192
0
    }
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE2EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKS4_
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE3EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE4EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE5EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE6EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE7EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE8EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE9EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_13ColumnDecimalILNS_13PrimitiveTypeE20EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE25EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE26EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE42EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE36EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove15_execute_numberINS_12ColumnVectorILNS_13PrimitiveTypeE37EEES4_EENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
193
194
    ColumnPtr _execute_string(const ColumnArray::Offsets64& offsets, const IColumn& nested_column,
195
                              const IColumn& right_column, const UInt8* nested_null_map,
196
                              const UInt8* right_nested_null_map,
197
0
                              const ColumnUInt8* array_null_map) const {
198
        // check array nested column type and get data
199
0
        const auto& src_offs = reinterpret_cast<const ColumnString&>(nested_column).get_offsets();
200
0
        const auto& src_chars = reinterpret_cast<const ColumnString&>(nested_column).get_chars();
201
202
        // check right column type and get data
203
0
        const auto& target_offs = reinterpret_cast<const ColumnString&>(right_column).get_offsets();
204
0
        const auto& target_chars = reinterpret_cast<const ColumnString&>(right_column).get_chars();
205
206
0
        PaddedPODArray<UInt8>* dst_null_map = nullptr;
207
0
        MutableColumnPtr array_nested_column = nullptr;
208
0
        IColumn* dst_column = nullptr;
209
0
        if (nested_null_map) {
210
0
            auto dst_nested_column =
211
0
                    ColumnNullable::create(nested_column.clone_empty(), ColumnUInt8::create());
212
0
            array_nested_column = dst_nested_column->get_ptr();
213
0
            dst_column = dst_nested_column->get_nested_column_ptr().get();
214
0
            dst_null_map = &dst_nested_column->get_null_map_data();
215
0
            dst_null_map->reserve(offsets.back());
216
0
        } else {
217
0
            auto dst_nested_column = nested_column.clone_empty();
218
0
            array_nested_column = dst_nested_column->get_ptr();
219
0
            dst_column = dst_nested_column.get();
220
0
        }
221
222
0
        auto& dst_offs = reinterpret_cast<ColumnString&>(*dst_column).get_offsets();
223
0
        auto& dst_chars = reinterpret_cast<ColumnString&>(*dst_column).get_chars();
224
0
        dst_offs.reserve(src_offs.size());
225
0
        dst_chars.reserve(src_offs.back());
226
227
0
        auto dst_offsets_column = ColumnArray::ColumnOffsets::create();
228
0
        auto& dst_offsets = dst_offsets_column->get_data();
229
0
        dst_offsets.reserve(offsets.size());
230
231
0
        size_t cur = 0;
232
0
        for (size_t row = 0; row < offsets.size(); ++row) {
233
0
            size_t off = offsets[row - 1];
234
0
            size_t len = offsets[row] - off;
235
236
0
            if (len == 0) {
237
                // case: array:[], target:'str' ==> []
238
0
                dst_offsets.push_back(cur);
239
0
                continue;
240
0
            }
241
242
0
            size_t target_off = target_offs[row - 1];
243
0
            size_t target_len = target_offs[row] - target_off;
244
245
0
            size_t cur_count = 0;
246
0
            for (size_t pos = 0; pos < len; ++pos) {
247
                // left is null, right is null
248
0
                if (nested_null_map && nested_null_map[off + pos] && right_nested_null_map &&
249
0
                    right_nested_null_map[row]) {
250
0
                    continue;
251
0
                }
252
253
                // left is null, right is not null
254
0
                if (nested_null_map && nested_null_map[off + pos]) {
255
                    // case: array:[Null], target:'str' ==> [Null]
256
                    // dst_chars.push_back(0);
257
0
                    dst_offs.push_back(dst_offs.back());
258
0
                    ++cur_count;
259
0
                    dst_null_map->push_back(1);
260
0
                    continue;
261
0
                }
262
0
                size_t src_pos = src_offs[pos + off - 1];
263
0
                size_t src_len = src_offs[pos + off] - src_pos;
264
265
                // left is not null, right is null
266
0
                if (right_nested_null_map && right_nested_null_map[row]) {
267
0
                    const size_t old_size = dst_chars.size();
268
0
                    const size_t new_size = old_size + src_len;
269
0
                    dst_chars.resize(new_size);
270
0
                    memcpy(&dst_chars[old_size], &src_chars[src_pos], src_len);
271
0
                    dst_offs.push_back(new_size);
272
0
                    ++cur_count;
273
0
                    if (nested_null_map) {
274
0
                        dst_null_map->push_back(0);
275
0
                    }
276
0
                    continue;
277
0
                }
278
279
                // left is not null, right is not null
280
0
                const char* src_raw_v = reinterpret_cast<const char*>(&src_chars[src_pos]);
281
0
                const char* target_raw_v = reinterpret_cast<const char*>(&target_chars[target_off]);
282
283
0
                if (std::string_view(src_raw_v, src_len) ==
284
0
                    std::string_view(target_raw_v, target_len)) {
285
0
                    continue;
286
0
                } else {
287
0
                    const size_t old_size = dst_chars.size();
288
0
                    const size_t new_size = old_size + src_len;
289
0
                    dst_chars.resize(new_size);
290
0
                    memcpy(&dst_chars[old_size], &src_chars[src_pos], src_len);
291
0
                    dst_offs.push_back(new_size);
292
0
                    ++cur_count;
293
0
                    if (nested_null_map) {
294
0
                        dst_null_map->push_back(0);
295
0
                    }
296
0
                }
297
0
            }
298
299
0
            cur += cur_count;
300
0
            dst_offsets.push_back(cur);
301
0
        }
302
303
0
        auto dst =
304
0
                ColumnArray::create(std::move(array_nested_column), std::move(dst_offsets_column));
305
0
        if (array_null_map) {
306
0
            auto dst_null_column = ColumnUInt8::create();
307
0
            dst_null_column->insert_range_from(*array_null_map, 0, offsets.size());
308
0
            return ColumnNullable::create(std::move(dst), std::move(dst_null_column));
309
0
        } else {
310
0
            return dst;
311
0
        }
312
0
    }
313
314
    template <typename NestedColumnType>
315
    ColumnPtr _execute_number_expanded(const ColumnArray::Offsets64& offsets,
316
                                       const IColumn& nested_column, const IColumn& right_column,
317
                                       const UInt8* nested_null_map,
318
                                       const UInt8* right_nested_null_map,
319
0
                                       const ColumnUInt8* array_null_map) const {
320
0
        if (is_column<NestedColumnType>(right_column)) {
321
0
            return _execute_number<NestedColumnType, NestedColumnType>(
322
0
                    offsets, nested_column, right_column, nested_null_map, right_nested_null_map,
323
0
                    array_null_map);
324
0
        }
325
0
        return nullptr;
326
0
    }
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE2EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKS4_
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE3EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE4EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE5EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE6EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE7EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE8EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE9EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_13ColumnDecimalILNS_13PrimitiveTypeE28EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_13ColumnDecimalILNS_13PrimitiveTypeE29EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_13ColumnDecimalILNS_13PrimitiveTypeE20EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_13ColumnDecimalILNS_13PrimitiveTypeE30EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_13ColumnDecimalILNS_13PrimitiveTypeE35EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS_12ColumnVectorILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE25EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE26EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE42EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE36EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
Unexecuted instantiation: _ZNK5doris19FunctionArrayRemove24_execute_number_expandedINS_12ColumnVectorILNS_13PrimitiveTypeE37EEEEENS_3COWINS_7IColumnEE13immutable_ptrIS6_EERKNS_8PODArrayImLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb1EEELm16ELm15EEERKS6_SI_PKhSK_PKNS2_ILS3_2EEE
327
328
    ColumnPtr _execute_dispatch(const ColumnsWithTypeAndName& arguments,
329
0
                                size_t input_rows_count) const {
330
        // check array nested column type and get data
331
0
        auto left_column = arguments[0].column->convert_to_full_column_if_const();
332
0
        const ColumnArray* array_column = nullptr;
333
0
        const ColumnUInt8* array_null_map = nullptr;
334
0
        if (left_column->is_nullable()) {
335
0
            auto nullable_array = reinterpret_cast<const ColumnNullable*>(left_column.get());
336
0
            array_column =
337
0
                    reinterpret_cast<const ColumnArray*>(&nullable_array->get_nested_column());
338
0
            array_null_map = &nullable_array->get_null_map_column();
339
0
            nullable_array->sanity_check();
340
0
        } else {
341
0
            array_column = reinterpret_cast<const ColumnArray*>(left_column.get());
342
0
        }
343
0
        const auto& offsets = array_column->get_offsets();
344
0
        const UInt8* nested_null_map = nullptr;
345
0
        ColumnPtr nested_column = nullptr;
346
0
        if (array_column->get_data().is_nullable()) {
347
0
            const auto& nested_null_column =
348
0
                    reinterpret_cast<const ColumnNullable&>(array_column->get_data());
349
0
            nested_null_column.sanity_check();
350
0
            nested_null_map = nested_null_column.get_null_map_column().get_data().data();
351
0
            nested_column = nested_null_column.get_nested_column_ptr();
352
0
        } else {
353
0
            nested_column = array_column->get_data_ptr();
354
0
        }
355
356
        // get right column
357
0
        ColumnPtr right_full_column = arguments[1].column->convert_to_full_column_if_const();
358
0
        ColumnPtr right_column = right_full_column;
359
0
        const UInt8* right_nested_null_map = nullptr;
360
0
        if (right_column->is_nullable()) {
361
0
            const auto& nested_null_column = assert_cast<const ColumnNullable&>(*right_full_column);
362
0
            right_column = nested_null_column.get_nested_column_ptr();
363
0
            right_nested_null_map = nested_null_column.get_null_map_column().get_data().data();
364
0
        }
365
        // execute
366
0
        auto array_type = remove_nullable(arguments[0].type);
367
0
        auto left_element_type =
368
0
                remove_nullable(assert_cast<const DataTypeArray&>(*array_type).get_nested_type());
369
0
        auto right_type = remove_nullable(arguments[1].type);
370
371
0
        ColumnPtr res = nullptr;
372
0
        if (is_string_type(right_type->get_primitive_type()) &&
373
0
            is_string_type(left_element_type->get_primitive_type())) {
374
0
            res = _execute_string(offsets, *nested_column, *right_column, nested_null_map,
375
0
                                  right_nested_null_map, array_null_map);
376
0
        } else if (is_number(right_type->get_primitive_type()) &&
377
0
                   is_number(left_element_type->get_primitive_type())) {
378
0
            auto call = [&](const auto& type) -> bool {
379
0
                using DispatchType = std::decay_t<decltype(type)>;
380
0
                res = _execute_number_expanded<typename DispatchType::ColumnType>(
381
0
                        offsets, *nested_column, *right_column, nested_null_map,
382
0
                        right_nested_null_map, array_null_map);
383
0
                return true;
384
0
            };
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE2EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE3EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE4EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE5EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE6EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE7EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE8EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE9EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE28EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE29EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE20EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE30EEEEEbS9_
Unexecuted instantiation: _ZZNK5doris19FunctionArrayRemove17_execute_dispatchERKSt6vectorINS_21ColumnWithTypeAndNameESaIS2_EEmENKUlRKT_E_clINS_16DispatchDataTypeILNS_13PrimitiveTypeE35EEEEEbS9_
385
386
0
            if (!dispatch_switch_number(left_element_type->get_primitive_type(), call)) {
387
0
                throw doris::Exception(doris::ErrorCode::INTERNAL_ERROR,
388
0
                                       "not support left type " + left_element_type->get_name());
389
0
            }
390
0
        } else if (is_date_v2_or_datetime_v2(right_type->get_primitive_type()) &&
391
0
                   is_date_v2_or_datetime_v2(left_element_type->get_primitive_type())) {
392
0
            if (left_element_type->get_primitive_type() == PrimitiveType::TYPE_DATEV2) {
393
0
                res = _execute_number_expanded<ColumnDateV2>(offsets, *nested_column, *right_column,
394
0
                                                             nested_null_map, right_nested_null_map,
395
0
                                                             array_null_map);
396
0
            } else if (left_element_type->get_primitive_type() == PrimitiveType::TYPE_DATETIMEV2) {
397
0
                res = _execute_number_expanded<ColumnDateTimeV2>(
398
0
                        offsets, *nested_column, *right_column, nested_null_map,
399
0
                        right_nested_null_map, array_null_map);
400
0
            }
401
0
        } else if (is_timestamptz_type(right_type->get_primitive_type()) &&
402
0
                   is_timestamptz_type(left_element_type->get_primitive_type())) {
403
0
            res = _execute_number_expanded<ColumnTimeStampTz>(
404
0
                    offsets, *nested_column, *right_column, nested_null_map, right_nested_null_map,
405
0
                    array_null_map);
406
0
        } else if (is_ip(right_type->get_primitive_type()) &&
407
0
                   is_ip(left_element_type->get_primitive_type())) {
408
0
            if (left_element_type->get_primitive_type() == TYPE_IPV4) {
409
0
                res = _execute_number_expanded<ColumnIPv4>(offsets, *nested_column, *right_column,
410
0
                                                           nested_null_map, right_nested_null_map,
411
0
                                                           array_null_map);
412
0
            } else if (left_element_type->get_primitive_type() == TYPE_IPV6) {
413
0
                res = _execute_number_expanded<ColumnIPv6>(offsets, *nested_column, *right_column,
414
0
                                                           nested_null_map, right_nested_null_map,
415
0
                                                           array_null_map);
416
0
            }
417
0
        }
418
0
        return res;
419
0
    }
420
};
421
422
} // namespace doris