/root/doris/be/src/vec/functions/in.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 |  | // This file is copied from | 
| 18 |  |  | 
| 19 |  | #pragma once | 
| 20 |  |  | 
| 21 |  | #include <glog/logging.h> | 
| 22 |  |  | 
| 23 |  | #include <boost/iterator/iterator_facade.hpp> | 
| 24 |  | #include <cstddef> | 
| 25 |  | #include <memory> | 
| 26 |  | #include <utility> | 
| 27 |  | #include <vector> | 
| 28 |  |  | 
| 29 |  | #include "common/status.h" | 
| 30 |  | #include "exprs/create_predicate_function.h" | 
| 31 |  | #include "exprs/hybrid_set.h" | 
| 32 |  | #include "olap/rowset/segment_v2/index_reader_helper.h" | 
| 33 |  | #include "runtime/define_primitive_type.h" | 
| 34 |  | #include "runtime/types.h" | 
| 35 |  | #include "udf/udf.h" | 
| 36 |  | #include "vec/aggregate_functions/aggregate_function.h" | 
| 37 |  | #include "vec/columns/column.h" | 
| 38 |  | #include "vec/columns/column_const.h" | 
| 39 |  | #include "vec/columns/column_nullable.h" | 
| 40 |  | #include "vec/columns/column_vector.h" | 
| 41 |  | #include "vec/common/string_ref.h" | 
| 42 |  | #include "vec/core/block.h" | 
| 43 |  | #include "vec/core/column_numbers.h" | 
| 44 |  | #include "vec/core/column_with_type_and_name.h" | 
| 45 |  | #include "vec/core/types.h" | 
| 46 |  | #include "vec/data_types/data_type.h" | 
| 47 |  | #include "vec/data_types/data_type_nullable.h" | 
| 48 |  | #include "vec/data_types/data_type_number.h" | 
| 49 |  | #include "vec/functions/function.h" | 
| 50 |  |  | 
| 51 |  | namespace doris::vectorized { | 
| 52 |  |  | 
| 53 |  | template <typename T> | 
| 54 |  | class ColumnStr; | 
| 55 |  | using ColumnString = ColumnStr<UInt32>; | 
| 56 |  |  | 
| 57 |  | struct InState { | 
| 58 |  |     bool use_set = true; | 
| 59 |  |     std::unique_ptr<HybridSetBase> hybrid_set; | 
| 60 |  | }; | 
| 61 |  |  | 
| 62 |  | template <bool negative> | 
| 63 |  | class FunctionIn : public IFunction { | 
| 64 |  | public: | 
| 65 |  |     static constexpr auto name = negative ? "not_in" : "in"; | 
| 66 |  |  | 
| 67 | 9 |     static FunctionPtr create() { return std::make_shared<FunctionIn>(); }_ZN5doris10vectorized10FunctionInILb0EE6createEv| Line | Count | Source |  | 67 | 5 |     static FunctionPtr create() { return std::make_shared<FunctionIn>(); } | 
_ZN5doris10vectorized10FunctionInILb1EE6createEv| Line | Count | Source |  | 67 | 4 |     static FunctionPtr create() { return std::make_shared<FunctionIn>(); } | 
 | 
| 68 |  |  | 
| 69 | 0 |     String get_name() const override { return name; }Unexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb0EE8get_nameB5cxx11EvUnexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb1EE8get_nameB5cxx11Ev | 
| 70 |  |  | 
| 71 | 7 |     bool is_variadic() const override { return true; }_ZNK5doris10vectorized10FunctionInILb0EE11is_variadicEv| Line | Count | Source |  | 71 | 4 |     bool is_variadic() const override { return true; } | 
_ZNK5doris10vectorized10FunctionInILb1EE11is_variadicEv| Line | Count | Source |  | 71 | 3 |     bool is_variadic() const override { return true; } | 
 | 
| 72 |  |  | 
| 73 | 0 |     size_t get_number_of_arguments() const override { return 0; }Unexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb0EE23get_number_of_argumentsEvUnexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb1EE23get_number_of_argumentsEv | 
| 74 |  |  | 
| 75 | 5 |     DataTypePtr get_return_type_impl(const DataTypes& args) const override { | 
| 76 | 6 |         for (const auto& arg : args) { | 
| 77 | 6 |             if (arg->is_nullable()) { | 
| 78 | 5 |                 return make_nullable(std::make_shared<DataTypeUInt8>()); | 
| 79 | 5 |             } | 
| 80 | 6 |         } | 
| 81 | 0 |         return std::make_shared<DataTypeUInt8>(); | 
| 82 | 5 |     } _ZNK5doris10vectorized10FunctionInILb0EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS0_9IDataTypeEESaIS7_EE| Line | Count | Source |  | 75 | 3 |     DataTypePtr get_return_type_impl(const DataTypes& args) const override { |  | 76 | 3 |         for (const auto& arg : args) { |  | 77 | 3 |             if (arg->is_nullable()) { |  | 78 | 3 |                 return make_nullable(std::make_shared<DataTypeUInt8>()); |  | 79 | 3 |             } |  | 80 | 3 |         } |  | 81 | 0 |         return std::make_shared<DataTypeUInt8>(); |  | 82 | 3 |     } | 
_ZNK5doris10vectorized10FunctionInILb1EE20get_return_type_implERKSt6vectorISt10shared_ptrIKNS0_9IDataTypeEESaIS7_EE| Line | Count | Source |  | 75 | 2 |     DataTypePtr get_return_type_impl(const DataTypes& args) const override { |  | 76 | 3 |         for (const auto& arg : args) { |  | 77 | 3 |             if (arg->is_nullable()) { |  | 78 | 2 |                 return make_nullable(std::make_shared<DataTypeUInt8>()); |  | 79 | 2 |             } |  | 80 | 3 |         } |  | 81 | 0 |         return std::make_shared<DataTypeUInt8>(); |  | 82 | 2 |     } | 
 | 
| 83 |  |  | 
| 84 | 5 |     bool use_default_implementation_for_nulls() const override { return false; }_ZNK5doris10vectorized10FunctionInILb0EE36use_default_implementation_for_nullsEv| Line | Count | Source |  | 84 | 3 |     bool use_default_implementation_for_nulls() const override { return false; } | 
_ZNK5doris10vectorized10FunctionInILb1EE36use_default_implementation_for_nullsEv| Line | Count | Source |  | 84 | 2 |     bool use_default_implementation_for_nulls() const override { return false; } | 
 | 
| 85 |  |  | 
| 86 |  |     // size of [ in ( 1 , 2  , 3 , null) ]  is 3 | 
| 87 | 0 |     size_t get_size_with_out_null(FunctionContext* context) { | 
| 88 | 0 |         if ((context->get_num_args() - 1) > FIXED_CONTAINER_MAX_SIZE) { | 
| 89 | 0 |             return context->get_num_args() - 1; | 
| 90 | 0 |         } | 
| 91 | 0 |         size_t sz = 0; | 
| 92 | 0 |         for (int i = 1; i < context->get_num_args(); ++i) { | 
| 93 | 0 |             const auto& const_column_ptr = context->get_constant_col(i); | 
| 94 | 0 |             if (const_column_ptr != nullptr) { | 
| 95 | 0 |                 auto const_data = const_column_ptr->column_ptr->get_data_at(0); | 
| 96 | 0 |                 if (const_data.data != nullptr) { | 
| 97 | 0 |                     sz++; | 
| 98 | 0 |                 } | 
| 99 | 0 |             } | 
| 100 | 0 |         } | 
| 101 | 0 |         return sz; | 
| 102 | 0 |     } Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE22get_size_with_out_nullEPNS_15FunctionContextEUnexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE22get_size_with_out_nullEPNS_15FunctionContextE | 
| 103 |  |  | 
| 104 | 0 |     Status open(FunctionContext* context, FunctionContext::FunctionStateScope scope) override { | 
| 105 | 0 |         if (scope == FunctionContext::THREAD_LOCAL) { | 
| 106 | 0 |             return Status::OK(); | 
| 107 | 0 |         } | 
| 108 | 0 |         std::shared_ptr<InState> state = std::make_shared<InState>(); | 
| 109 | 0 |         context->set_function_state(scope, state); | 
| 110 | 0 |         DCHECK(context->get_num_args() >= 1); | 
| 111 | 0 |         if (context->get_arg_type(0)->get_primitive_type() == PrimitiveType::TYPE_NULL) { | 
| 112 | 0 |             state->hybrid_set.reset(create_set(TYPE_BOOLEAN, 0, true)); | 
| 113 | 0 |         } else if (context->get_arg_type(0)->get_primitive_type() == PrimitiveType::TYPE_CHAR || | 
| 114 | 0 |                    context->get_arg_type(0)->get_primitive_type() == PrimitiveType::TYPE_VARCHAR || | 
| 115 | 0 |                    context->get_arg_type(0)->get_primitive_type() == PrimitiveType::TYPE_STRING) { | 
| 116 |  |             // the StringValue's memory is held by FunctionContext, so we can use StringValueSet here directly | 
| 117 | 0 |             state->hybrid_set.reset(create_string_value_set(get_size_with_out_null(context))); | 
| 118 | 0 |         } else { | 
| 119 | 0 |             state->hybrid_set.reset(create_set(context->get_arg_type(0)->get_primitive_type(), | 
| 120 | 0 |                                                get_size_with_out_null(context), true)); | 
| 121 | 0 |         } | 
| 122 |  | 
 | 
| 123 | 0 |         for (int i = 1; i < context->get_num_args(); ++i) { | 
| 124 | 0 |             const auto& const_column_ptr = context->get_constant_col(i); | 
| 125 | 0 |             if (const_column_ptr != nullptr) { | 
| 126 | 0 |                 auto const_data = const_column_ptr->column_ptr->get_data_at(0); | 
| 127 | 0 |                 state->hybrid_set->insert((void*)const_data.data, const_data.size); | 
| 128 | 0 |             } else { | 
| 129 | 0 |                 state->use_set = false; | 
| 130 | 0 |                 state->hybrid_set.reset(); | 
| 131 | 0 |                 break; | 
| 132 | 0 |             } | 
| 133 | 0 |         } | 
| 134 | 0 |         return Status::OK(); | 
| 135 | 0 |     } Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE4openEPNS_15FunctionContextENS3_18FunctionStateScopeEUnexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE4openEPNS_15FunctionContextENS3_18FunctionStateScopeE | 
| 136 |  |  | 
| 137 |  |     Status evaluate_inverted_index( | 
| 138 |  |             const ColumnsWithTypeAndName& arguments, | 
| 139 |  |             const std::vector<vectorized::IndexFieldNameAndTypePair>& data_type_with_names, | 
| 140 |  |             std::vector<segment_v2::IndexIterator*> iterators, uint32_t num_rows, | 
| 141 | 0 |             segment_v2::InvertedIndexResultBitmap& bitmap_result) const override { | 
| 142 | 0 |         DCHECK(data_type_with_names.size() == 1); | 
| 143 | 0 |         DCHECK(iterators.size() == 1); | 
| 144 | 0 |         auto* iter = iterators[0]; | 
| 145 | 0 |         auto data_type_with_name = data_type_with_names[0]; | 
| 146 | 0 |         std::shared_ptr<roaring::Roaring> roaring = std::make_shared<roaring::Roaring>(); | 
| 147 | 0 |         std::shared_ptr<roaring::Roaring> null_bitmap = std::make_shared<roaring::Roaring>(); | 
| 148 |  | 
 | 
| 149 | 0 |         if (iter == nullptr) { | 
| 150 | 0 |             return Status::OK(); | 
| 151 | 0 |         } | 
| 152 | 0 |         if (!segment_v2::IndexReaderHelper::has_string_or_bkd_index(iter)) { | 
| 153 |  |             //NOT support in list when parser is FULLTEXT for expr inverted index evaluate. | 
| 154 | 0 |             return Status::OK(); | 
| 155 | 0 |         } | 
| 156 | 0 |         if (iter->has_null()) { | 
| 157 | 0 |             segment_v2::InvertedIndexQueryCacheHandle null_bitmap_cache_handle; | 
| 158 | 0 |             RETURN_IF_ERROR(iter->read_null_bitmap(&null_bitmap_cache_handle)); | 
| 159 | 0 |             null_bitmap = null_bitmap_cache_handle.get_bitmap(); | 
| 160 | 0 |         } | 
| 161 | 0 |         for (const auto& arg : arguments) { | 
| 162 | 0 |             Field param_value; | 
| 163 | 0 |             arg.column->get(0, param_value); | 
| 164 | 0 |             auto param_type = arg.type->get_primitive_type(); | 
| 165 | 0 |             if (param_value.is_null()) { | 
| 166 |  |                 // predicate like column NOT IN (NULL, '') should not push down to index. | 
| 167 | 0 |                 if (negative) { | 
| 168 | 0 |                     return Status::OK(); | 
| 169 | 0 |                 } | 
| 170 | 0 |                 *roaring |= *null_bitmap; | 
| 171 | 0 |                 continue; | 
| 172 | 0 |             } | 
| 173 | 0 |             std::unique_ptr<InvertedIndexQueryParamFactory> query_param = nullptr; | 
| 174 | 0 |             RETURN_IF_ERROR(InvertedIndexQueryParamFactory::create_query_value( | 
| 175 | 0 |                     param_type, ¶m_value, query_param)); | 
| 176 | 0 |             InvertedIndexQueryType query_type = InvertedIndexQueryType::EQUAL_QUERY; | 
| 177 | 0 |             segment_v2::InvertedIndexParam param; | 
| 178 | 0 |             param.column_name = data_type_with_name.first; | 
| 179 | 0 |             param.column_type = data_type_with_name.second; | 
| 180 | 0 |             param.query_value = query_param->get_value(); | 
| 181 | 0 |             param.query_type = query_type; | 
| 182 | 0 |             param.num_rows = num_rows; | 
| 183 | 0 |             param.roaring = std::make_shared<roaring::Roaring>(); | 
| 184 | 0 |             RETURN_IF_ERROR(iter->read_from_index(¶m)); | 
| 185 | 0 |             *roaring |= *param.roaring; | 
| 186 | 0 |         } | 
| 187 | 0 |         segment_v2::InvertedIndexResultBitmap result(roaring, null_bitmap); | 
| 188 | 0 |         bitmap_result = result; | 
| 189 | 0 |         bitmap_result.mask_out_null(); | 
| 190 | 0 |         if constexpr (negative) { | 
| 191 | 0 |             roaring::Roaring full_result; | 
| 192 | 0 |             full_result.addRange(0, num_rows); | 
| 193 | 0 |             bitmap_result.op_not(&full_result); | 
| 194 | 0 |         } | 
| 195 | 0 |         return Status::OK(); | 
| 196 | 0 |     } Unexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb0EE23evaluate_inverted_indexERKSt6vectorINS0_21ColumnWithTypeAndNameESaIS4_EERKS3_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIKNS0_9IDataTypeEEESaISK_EES3_IPNS_10segment_v213IndexIteratorESaISR_EEjRNSP_25InvertedIndexResultBitmapEUnexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb1EE23evaluate_inverted_indexERKSt6vectorINS0_21ColumnWithTypeAndNameESaIS4_EERKS3_ISt4pairINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt10shared_ptrIKNS0_9IDataTypeEEESaISK_EES3_IPNS_10segment_v213IndexIteratorESaISR_EEjRNSP_25InvertedIndexResultBitmapE | 
| 197 |  |  | 
| 198 |  |     Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, | 
| 199 | 0 |                         uint32_t result, size_t input_rows_count) const override { | 
| 200 | 0 |         auto* in_state = reinterpret_cast<InState*>( | 
| 201 | 0 |                 context->get_function_state(FunctionContext::FRAGMENT_LOCAL)); | 
| 202 | 0 |         if (!in_state) { | 
| 203 | 0 |             return Status::RuntimeError("funciton context for function '{}' must have Set;", | 
| 204 | 0 |                                         get_name()); | 
| 205 | 0 |         } | 
| 206 | 0 |         auto res = ColumnUInt8::create(); | 
| 207 | 0 |         ColumnUInt8::Container& vec_res = res->get_data(); | 
| 208 | 0 |         vec_res.resize(input_rows_count); | 
| 209 |  | 
 | 
| 210 | 0 |         ColumnUInt8::MutablePtr col_null_map_to; | 
| 211 | 0 |         col_null_map_to = ColumnUInt8::create(input_rows_count, false); | 
| 212 | 0 |         auto& vec_null_map_to = col_null_map_to->get_data(); | 
| 213 |  | 
 | 
| 214 | 0 |         const ColumnWithTypeAndName& left_arg = block.get_by_position(arguments[0]); | 
| 215 | 0 |         const auto& [materialized_column, col_const] = unpack_if_const(left_arg.column); | 
| 216 |  | 
 | 
| 217 | 0 |         if (in_state->use_set) { | 
| 218 | 0 |             if (materialized_column->is_nullable()) { | 
| 219 | 0 |                 const auto* null_col_ptr = | 
| 220 | 0 |                         vectorized::check_and_get_column<vectorized::ColumnNullable>( | 
| 221 | 0 |                                 materialized_column.get()); | 
| 222 | 0 |                 const auto& null_map = assert_cast<const vectorized::ColumnUInt8&>( | 
| 223 | 0 |                                                null_col_ptr->get_null_map_column()) | 
| 224 | 0 |                                                .get_data(); | 
| 225 | 0 |                 const auto* nested_col_ptr = null_col_ptr->get_nested_column_ptr().get(); | 
| 226 |  | 
 | 
| 227 | 0 |                 if (nested_col_ptr->is_column_string()) { | 
| 228 | 0 |                     const auto* column_string_ptr = | 
| 229 | 0 |                             assert_cast<const vectorized::ColumnString*>(nested_col_ptr); | 
| 230 | 0 |                     search_hash_set_check_null(in_state, input_rows_count, vec_res, null_map, | 
| 231 | 0 |                                                column_string_ptr); | 
| 232 | 0 |                 } else { | 
| 233 |  |                     //TODO: support other column type | 
| 234 | 0 |                     search_hash_set_check_null(in_state, input_rows_count, vec_res, null_map, | 
| 235 | 0 |                                                nested_col_ptr); | 
| 236 | 0 |                 } | 
| 237 |  | 
 | 
| 238 | 0 |                 if (!in_state->hybrid_set->contain_null()) { | 
| 239 | 0 |                     for (size_t i = 0; i < input_rows_count; ++i) { | 
| 240 | 0 |                         vec_null_map_to[i] = null_map[i]; | 
| 241 | 0 |                     } | 
| 242 | 0 |                 } else { | 
| 243 | 0 |                     for (size_t i = 0; i < input_rows_count; ++i) { | 
| 244 | 0 |                         vec_null_map_to[i] = null_map[i] || negative == vec_res[i]; | 
| 245 | 0 |                     } | 
| 246 | 0 |                 } | 
| 247 |  | 
 | 
| 248 | 0 |             } else { // non-nullable | 
| 249 | 0 |                 if (is_string_type(left_arg.type->get_primitive_type())) { | 
| 250 | 0 |                     const auto* column_string_ptr = | 
| 251 | 0 |                             assert_cast<const vectorized::ColumnString*>(materialized_column.get()); | 
| 252 | 0 |                     search_hash_set(in_state, input_rows_count, vec_res, column_string_ptr); | 
| 253 | 0 |                 } else { | 
| 254 | 0 |                     search_hash_set(in_state, input_rows_count, vec_res, materialized_column.get()); | 
| 255 | 0 |                 } | 
| 256 |  | 
 | 
| 257 | 0 |                 if (in_state->hybrid_set->contain_null()) { | 
| 258 | 0 |                     for (size_t i = 0; i < input_rows_count; ++i) { | 
| 259 | 0 |                         vec_null_map_to[i] = negative == vec_res[i]; | 
| 260 | 0 |                     } | 
| 261 | 0 |                 } | 
| 262 | 0 |             } | 
| 263 | 0 |         } else { //!in_state->use_set | 
| 264 | 0 |             std::vector<ColumnPtr> set_columns; | 
| 265 | 0 |             for (int i = 1; i < arguments.size(); ++i) { | 
| 266 | 0 |                 set_columns.emplace_back(block.get_by_position(arguments[i]).column); | 
| 267 | 0 |             } | 
| 268 | 0 |             if (col_const) { | 
| 269 | 0 |                 impl_without_set<true>(context, set_columns, input_rows_count, vec_res, | 
| 270 | 0 |                                        vec_null_map_to, materialized_column); | 
| 271 | 0 |             } else { | 
| 272 | 0 |                 impl_without_set<false>(context, set_columns, input_rows_count, vec_res, | 
| 273 | 0 |                                         vec_null_map_to, materialized_column); | 
| 274 | 0 |             } | 
| 275 | 0 |         } | 
| 276 |  | 
 | 
| 277 | 0 |         if (block.get_by_position(result).type->is_nullable()) { | 
| 278 | 0 |             block.replace_by_position( | 
| 279 | 0 |                     result, ColumnNullable::create(std::move(res), std::move(col_null_map_to))); | 
| 280 | 0 |         } else { | 
| 281 | 0 |             block.replace_by_position(result, std::move(res)); | 
| 282 | 0 |         } | 
| 283 |  | 
 | 
| 284 | 0 |         return Status::OK(); | 
| 285 | 0 |     } Unexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb0EE12execute_implEPNS_15FunctionContextERNS0_5BlockERKSt6vectorIjSaIjEEjmUnexecuted instantiation: _ZNK5doris10vectorized10FunctionInILb1EE12execute_implEPNS_15FunctionContextERNS0_5BlockERKSt6vectorIjSaIjEEjm | 
| 286 |  |  | 
| 287 |  | private: | 
| 288 |  |     template <typename T> | 
| 289 |  |     static void search_hash_set_check_null(InState* in_state, size_t input_rows_count, | 
| 290 |  |                                            ColumnUInt8::Container& vec_res, | 
| 291 | 0 |                                            const ColumnUInt8::Container& null_map, T* col_ptr) { | 
| 292 | 0 |         if constexpr (!negative) { | 
| 293 | 0 |             in_state->hybrid_set->find_batch_nullable(*col_ptr, input_rows_count, null_map, | 
| 294 | 0 |                                                       vec_res); | 
| 295 | 0 |         } else { | 
| 296 | 0 |             in_state->hybrid_set->find_batch_nullable_negative(*col_ptr, input_rows_count, null_map, | 
| 297 | 0 |                                                                vec_res); | 
| 298 | 0 |         } | 
| 299 | 0 |     } Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE26search_hash_set_check_nullIKNS0_9ColumnStrIjEEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEERKSD_PT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE26search_hash_set_check_nullIKNS0_7IColumnEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEERKSC_PT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE26search_hash_set_check_nullIKNS0_9ColumnStrIjEEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEERKSD_PT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE26search_hash_set_check_nullIKNS0_7IColumnEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEERKSC_PT_ | 
| 300 |  |  | 
| 301 |  |     template <typename T> | 
| 302 |  |     static void search_hash_set(InState* in_state, size_t input_rows_count, | 
| 303 | 0 |                                 ColumnUInt8::Container& vec_res, T* col_ptr) { | 
| 304 | 0 |         if constexpr (!negative) { | 
| 305 | 0 |             in_state->hybrid_set->find_batch(*col_ptr, input_rows_count, vec_res); | 
| 306 | 0 |         } else { | 
| 307 | 0 |             in_state->hybrid_set->find_batch_negative(*col_ptr, input_rows_count, vec_res); | 
| 308 | 0 |         } | 
| 309 | 0 |     } Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE15search_hash_setIKNS0_9ColumnStrIjEEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEEPT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE15search_hash_setIKNS0_7IColumnEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEEPT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE15search_hash_setIKNS0_9ColumnStrIjEEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEEPT_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE15search_hash_setIKNS0_7IColumnEEEvPNS0_7InStateEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEEPT_ | 
| 310 |  |  | 
| 311 |  |     template <bool Const> | 
| 312 |  |     static void impl_without_set(FunctionContext* context, | 
| 313 |  |                                  const std::vector<ColumnPtr>& set_columns, size_t input_rows_count, | 
| 314 |  |                                  ColumnUInt8::Container& vec_res, | 
| 315 |  |                                  ColumnUInt8::Container& vec_null_map_to, | 
| 316 | 0 |                                  const ColumnPtr& materialized_column) { | 
| 317 | 0 |         for (size_t i = 0; i < input_rows_count; ++i) { | 
| 318 | 0 |             const auto& ref_data = materialized_column->get_data_at(index_check_const(i, Const)); | 
| 319 | 0 |             if (ref_data.data == nullptr) { | 
| 320 | 0 |                 vec_null_map_to[i] = true; | 
| 321 | 0 |                 continue; | 
| 322 | 0 |             } | 
| 323 |  |  | 
| 324 | 0 |             std::vector<StringRef> set_datas; | 
| 325 |  |             // To comply with the SQL standard, IN() returns NULL not only if the expression on the left hand side is NULL, | 
| 326 |  |             // but also if no match is found in the list and one of the expressions in the list is NULL. | 
| 327 | 0 |             bool null_in_set = false; | 
| 328 |  | 
 | 
| 329 | 0 |             for (const auto& set_column : set_columns) { | 
| 330 | 0 |                 auto set_data = set_column->get_data_at(i); | 
| 331 | 0 |                 if (set_data.data == nullptr) { | 
| 332 | 0 |                     null_in_set = true; | 
| 333 | 0 |                 } else { | 
| 334 | 0 |                     set_datas.push_back(set_data); | 
| 335 | 0 |                 } | 
| 336 | 0 |             } | 
| 337 | 0 |             std::unique_ptr<HybridSetBase> hybrid_set(create_set( | 
| 338 | 0 |                     context->get_arg_type(0)->get_primitive_type(), set_datas.size(), true)); | 
| 339 | 0 |             for (auto& set_data : set_datas) { | 
| 340 | 0 |                 hybrid_set->insert((void*)(set_data.data), set_data.size); | 
| 341 | 0 |             } | 
| 342 |  | 
 | 
| 343 | 0 |             vec_res[i] = negative ^ hybrid_set->find((void*)ref_data.data, ref_data.size); | 
| 344 | 0 |             if (null_in_set) { | 
| 345 | 0 |                 vec_null_map_to[i] = negative == vec_res[i]; | 
| 346 | 0 |             } else { | 
| 347 | 0 |                 vec_null_map_to[i] = false; | 
| 348 | 0 |             } | 
| 349 | 0 |         } | 
| 350 | 0 |     } Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE16impl_without_setILb1EEEvPNS_15FunctionContextERKSt6vectorINS_3COWINS0_7IColumnEE13immutable_ptrIS8_EESaISB_EEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEESL_RKSB_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb0EE16impl_without_setILb0EEEvPNS_15FunctionContextERKSt6vectorINS_3COWINS0_7IColumnEE13immutable_ptrIS8_EESaISB_EEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEESL_RKSB_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE16impl_without_setILb1EEEvPNS_15FunctionContextERKSt6vectorINS_3COWINS0_7IColumnEE13immutable_ptrIS8_EESaISB_EEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEESL_RKSB_Unexecuted instantiation: _ZN5doris10vectorized10FunctionInILb1EE16impl_without_setILb0EEEvPNS_15FunctionContextERKSt6vectorINS_3COWINS0_7IColumnEE13immutable_ptrIS8_EESaISB_EEmRNS0_8PODArrayIhLm4096ENS_9AllocatorILb0ELb0ELb0ENS_22DefaultMemoryAllocatorELb0EEELm16ELm15EEESL_RKSB_ | 
| 351 |  | }; | 
| 352 |  |  | 
| 353 |  | } // namespace doris::vectorized |