be/src/exec/common/varbinaryop_subbinary.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 "core/block/block.h" |
21 | | #include "core/column/column_const.h" |
22 | | #include "core/column/column_varbinary.h" |
23 | | #include "core/data_type/data_type_number.h" |
24 | | #include "core/data_type/data_type_varbinary.h" |
25 | | #include "core/types.h" |
26 | | |
27 | | namespace doris { |
28 | | |
29 | | constexpr auto SIZE_OF_UINT = sizeof(uint32_t); |
30 | | |
31 | | struct VarBinaryOP { |
32 | | static void check_and_insert_data(doris::StringView& sView, const char* data, uint32_t len, |
33 | 33 | bool before_is_inline) { |
34 | 33 | if (before_is_inline) { |
35 | 25 | sView.set_size(len); |
36 | 25 | } else { |
37 | 8 | sView = doris::StringView(data, len); |
38 | 8 | } |
39 | 33 | } |
40 | | |
41 | 74 | static std::pair<bool, char*> alloc(ColumnVarbinary* res_col, size_t index, uint32_t len) { |
42 | 74 | bool is_inline = StringView::isInline(len); |
43 | 74 | char* dst = nullptr; |
44 | 74 | if (is_inline) { |
45 | 66 | dst = reinterpret_cast<char*>(&(res_col->get_data()[index])) + SIZE_OF_UINT; |
46 | 66 | } else { |
47 | 8 | dst = res_col->alloc(len); |
48 | 8 | } |
49 | 74 | return {is_inline, dst}; |
50 | 74 | } |
51 | | }; |
52 | | |
53 | | struct SubBinaryUtil { |
54 | | static void sub_binary_execute(Block& block, const ColumnNumbers& arguments, uint32_t result, |
55 | 1.02k | size_t input_rows_count) { |
56 | 1.02k | DCHECK_EQ(arguments.size(), 3); |
57 | 1.02k | auto res = ColumnVarbinary::create(); |
58 | | |
59 | 1.02k | bool col_const[3]; |
60 | 1.02k | ColumnPtr argument_columns[3]; |
61 | 4.08k | for (int i = 0; i < 3; ++i) { |
62 | 3.06k | std::tie(argument_columns[i], col_const[i]) = |
63 | 3.06k | unpack_if_const(block.get_by_position(arguments[i]).column); |
64 | 3.06k | } |
65 | | |
66 | 1.02k | const auto* specific_binary_column = |
67 | 1.02k | assert_cast<const ColumnVarbinary*>(argument_columns[0].get()); |
68 | 1.02k | const auto* specific_start_column = |
69 | 1.02k | assert_cast<const ColumnInt32*>(argument_columns[1].get()); |
70 | 1.02k | const auto* specific_len_column = |
71 | 1.02k | assert_cast<const ColumnInt32*>(argument_columns[2].get()); |
72 | | |
73 | 1.02k | std::visit( |
74 | 1.02k | [&](auto binary_const, auto start_const, auto len_const) { |
75 | 1.02k | vectors<binary_const, start_const, len_const>( |
76 | 1.02k | specific_binary_column, specific_start_column, specific_len_column, |
77 | 1.02k | res.get(), input_rows_count); |
78 | 1.02k | }, _ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb0EESE_SE_EEDaS8_S9_SA_ Line | Count | Source | 74 | 145 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 145 | vectors<binary_const, start_const, len_const>( | 76 | 145 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 145 | res.get(), input_rows_count); | 78 | 145 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb0EESE_SD_IbLb1EEEEDaS8_S9_SA_ Line | Count | Source | 74 | 144 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 144 | vectors<binary_const, start_const, len_const>( | 76 | 144 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 144 | res.get(), input_rows_count); | 78 | 144 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb0EESD_IbLb1EESE_EEDaS8_S9_SA_ Line | Count | Source | 74 | 144 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 144 | vectors<binary_const, start_const, len_const>( | 76 | 144 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 144 | res.get(), input_rows_count); | 78 | 144 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb0EESD_IbLb1EESF_EEDaS8_S9_SA_ Line | Count | Source | 74 | 156 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 156 | vectors<binary_const, start_const, len_const>( | 76 | 156 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 156 | res.get(), input_rows_count); | 78 | 156 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb1EESD_IbLb0EESF_EEDaS8_S9_SA_ Line | Count | Source | 74 | 144 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 144 | vectors<binary_const, start_const, len_const>( | 76 | 144 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 144 | res.get(), input_rows_count); | 78 | 144 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb1EESD_IbLb0EESE_EEDaS8_S9_SA_ Line | Count | Source | 74 | 144 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 144 | vectors<binary_const, start_const, len_const>( | 76 | 144 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 144 | res.get(), input_rows_count); | 78 | 144 | }, |
_ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb1EESE_SD_IbLb0EEEEDaS8_S9_SA_ Line | Count | Source | 74 | 144 | [&](auto binary_const, auto start_const, auto len_const) { | 75 | 144 | vectors<binary_const, start_const, len_const>( | 76 | 144 | specific_binary_column, specific_start_column, specific_len_column, | 77 | 144 | res.get(), input_rows_count); | 78 | 144 | }, |
Unexecuted instantiation: _ZZN5doris13SubBinaryUtil18sub_binary_executeERNS_5BlockERKSt6vectorIjSaIjEEjmENKUlT_T0_T1_E_clISt17integral_constantIbLb1EESE_SE_EEDaS8_S9_SA_ |
79 | 1.02k | make_bool_variant(col_const[0]), make_bool_variant(col_const[1]), |
80 | 1.02k | make_bool_variant(col_const[2])); |
81 | 1.02k | block.get_by_position(result).column = std::move(res); |
82 | 1.02k | } |
83 | | |
84 | | private: |
85 | | template <bool binary_const, bool start_const, bool len_const> |
86 | | static void vectors(const ColumnVarbinary* binarys, const ColumnInt32* start, |
87 | 1.02k | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { |
88 | 1.02k | res->get_data().reserve(size); |
89 | | |
90 | 2.36k | for (size_t i = 0; i < size; ++i) { |
91 | 1.34k | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; |
92 | 1.34k | int binary_size = static_cast<int>(binary.size()); |
93 | | |
94 | 1.34k | int start_value = start->get_data()[index_check_const<start_const>(i)]; |
95 | 1.34k | int len_value = len->get_data()[index_check_const<len_const>(i)]; |
96 | | |
97 | 1.34k | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); |
98 | 1.34k | bool len_non_positive = len_value <= 0; |
99 | 1.34k | bool input_empty = binary_size == 0; |
100 | | |
101 | 1.34k | if (start_out_of_range || len_non_positive || input_empty) { |
102 | 670 | res->insert_default(); |
103 | 670 | continue; |
104 | 670 | } |
105 | 672 | int fixed_pos = start_value - 1; |
106 | 672 | if (fixed_pos < 0) { |
107 | 240 | fixed_pos = binary_size + fixed_pos + 1; |
108 | 240 | } |
109 | 672 | int fixed_len = std::min(binary_size - fixed_pos, len_value); |
110 | | |
111 | 672 | res->insert_data(binary.data() + fixed_pos, fixed_len); |
112 | 672 | } |
113 | 1.02k | } _ZN5doris13SubBinaryUtil7vectorsILb0ELb0ELb0EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 145 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 145 | res->get_data().reserve(size); | 89 | | | 90 | 539 | for (size_t i = 0; i < size; ++i) { | 91 | 394 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 394 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 394 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 394 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 394 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 394 | bool len_non_positive = len_value <= 0; | 99 | 394 | bool input_empty = binary_size == 0; | 100 | | | 101 | 394 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 226 | res->insert_default(); | 103 | 226 | continue; | 104 | 226 | } | 105 | 168 | int fixed_pos = start_value - 1; | 106 | 168 | if (fixed_pos < 0) { | 107 | 72 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 72 | } | 109 | 168 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 168 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 168 | } | 113 | 145 | } |
_ZN5doris13SubBinaryUtil7vectorsILb0ELb0ELb1EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 144 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 144 | res->get_data().reserve(size); | 89 | | | 90 | 288 | for (size_t i = 0; i < size; ++i) { | 91 | 144 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 144 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 144 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 144 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 144 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 144 | bool len_non_positive = len_value <= 0; | 99 | 144 | bool input_empty = binary_size == 0; | 100 | | | 101 | 144 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 72 | res->insert_default(); | 103 | 72 | continue; | 104 | 72 | } | 105 | 72 | int fixed_pos = start_value - 1; | 106 | 72 | if (fixed_pos < 0) { | 107 | 24 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 24 | } | 109 | 72 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 72 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 72 | } | 113 | 144 | } |
_ZN5doris13SubBinaryUtil7vectorsILb0ELb1ELb0EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 144 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 144 | res->get_data().reserve(size); | 89 | | | 90 | 288 | for (size_t i = 0; i < size; ++i) { | 91 | 144 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 144 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 144 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 144 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 144 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 144 | bool len_non_positive = len_value <= 0; | 99 | 144 | bool input_empty = binary_size == 0; | 100 | | | 101 | 144 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 72 | res->insert_default(); | 103 | 72 | continue; | 104 | 72 | } | 105 | 72 | int fixed_pos = start_value - 1; | 106 | 72 | if (fixed_pos < 0) { | 107 | 24 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 24 | } | 109 | 72 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 72 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 72 | } | 113 | 144 | } |
_ZN5doris13SubBinaryUtil7vectorsILb0ELb1ELb1EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 156 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 156 | res->get_data().reserve(size); | 89 | | | 90 | 384 | for (size_t i = 0; i < size; ++i) { | 91 | 228 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 228 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 228 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 228 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 228 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 228 | bool len_non_positive = len_value <= 0; | 99 | 228 | bool input_empty = binary_size == 0; | 100 | | | 101 | 228 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 84 | res->insert_default(); | 103 | 84 | continue; | 104 | 84 | } | 105 | 144 | int fixed_pos = start_value - 1; | 106 | 144 | if (fixed_pos < 0) { | 107 | 48 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 48 | } | 109 | 144 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 144 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 144 | } | 113 | 156 | } |
_ZN5doris13SubBinaryUtil7vectorsILb1ELb0ELb0EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 144 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 144 | res->get_data().reserve(size); | 89 | | | 90 | 288 | for (size_t i = 0; i < size; ++i) { | 91 | 144 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 144 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 144 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 144 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 144 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 144 | bool len_non_positive = len_value <= 0; | 99 | 144 | bool input_empty = binary_size == 0; | 100 | | | 101 | 144 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 72 | res->insert_default(); | 103 | 72 | continue; | 104 | 72 | } | 105 | 72 | int fixed_pos = start_value - 1; | 106 | 72 | if (fixed_pos < 0) { | 107 | 24 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 24 | } | 109 | 72 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 72 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 72 | } | 113 | 144 | } |
_ZN5doris13SubBinaryUtil7vectorsILb1ELb0ELb1EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 144 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 144 | res->get_data().reserve(size); | 89 | | | 90 | 288 | for (size_t i = 0; i < size; ++i) { | 91 | 144 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 144 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 144 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 144 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 144 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 144 | bool len_non_positive = len_value <= 0; | 99 | 144 | bool input_empty = binary_size == 0; | 100 | | | 101 | 144 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 72 | res->insert_default(); | 103 | 72 | continue; | 104 | 72 | } | 105 | 72 | int fixed_pos = start_value - 1; | 106 | 72 | if (fixed_pos < 0) { | 107 | 24 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 24 | } | 109 | 72 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 72 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 72 | } | 113 | 144 | } |
_ZN5doris13SubBinaryUtil7vectorsILb1ELb1ELb0EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m Line | Count | Source | 87 | 144 | const ColumnInt32* len, ColumnVarbinary* res, size_t size) { | 88 | 144 | res->get_data().reserve(size); | 89 | | | 90 | 288 | for (size_t i = 0; i < size; ++i) { | 91 | 144 | doris::StringView binary = binarys->get_data()[index_check_const<binary_const>(i)]; | 92 | 144 | int binary_size = static_cast<int>(binary.size()); | 93 | | | 94 | 144 | int start_value = start->get_data()[index_check_const<start_const>(i)]; | 95 | 144 | int len_value = len->get_data()[index_check_const<len_const>(i)]; | 96 | | | 97 | 144 | bool start_out_of_range = (start_value > binary_size) || (start_value < -binary_size); | 98 | 144 | bool len_non_positive = len_value <= 0; | 99 | 144 | bool input_empty = binary_size == 0; | 100 | | | 101 | 144 | if (start_out_of_range || len_non_positive || input_empty) { | 102 | 72 | res->insert_default(); | 103 | 72 | continue; | 104 | 72 | } | 105 | 72 | int fixed_pos = start_value - 1; | 106 | 72 | if (fixed_pos < 0) { | 107 | 24 | fixed_pos = binary_size + fixed_pos + 1; | 108 | 24 | } | 109 | 72 | int fixed_len = std::min(binary_size - fixed_pos, len_value); | 110 | | | 111 | 72 | res->insert_data(binary.data() + fixed_pos, fixed_len); | 112 | 72 | } | 113 | 144 | } |
Unexecuted instantiation: _ZN5doris13SubBinaryUtil7vectorsILb1ELb1ELb1EEEvPKNS_15ColumnVarbinaryEPKNS_12ColumnVectorILNS_13PrimitiveTypeE5EEES9_PS2_m |
114 | | }; |
115 | | |
116 | | } // namespace doris |