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