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 |