github-actions[bot] commented on code in PR #18310: URL: https://github.com/apache/doris/pull/18310#discussion_r1159859338
########## be/src/vec/functions/function_conv.cpp: ########## @@ -49,58 +52,92 @@ class FunctionConv : public IFunction { auto result_column = ColumnString::create(); auto result_null_map_column = ColumnUInt8::create(input_rows_count, 0); + bool col_const[3]; ColumnPtr argument_columns[3]; - for (int i = 0; i < 3; ++i) { - argument_columns[i] = - block.get_by_position(arguments[i]).column->convert_to_full_column_if_const(); - if (auto* nullable = check_and_get_column<ColumnNullable>(*argument_columns[i])) { - // Danger: Here must dispose the null map data first! Because - // argument_columns[i]=nullable->get_nested_column_ptr(); will release the mem - // of column nullable mem of null map - VectorizedUtils::update_null_map(result_null_map_column->get_data(), - nullable->get_null_map_data()); - argument_columns[i] = nullable->get_nested_column_ptr(); - } + col_const[i] = is_column_const(*block.get_by_position(arguments[i]).column); } + argument_columns[0] = col_const[0] ? static_cast<const ColumnConst&>( + *block.get_by_position(arguments[0]).column) + .convert_to_full_column() + : block.get_by_position(arguments[0]).column; - execute_straight( - context, - assert_cast<const typename Impl::DataType::ColumnType*>(argument_columns[0].get()), - assert_cast<const ColumnInt8*>(argument_columns[1].get()), - assert_cast<const ColumnInt8*>(argument_columns[2].get()), - assert_cast<ColumnString*>(result_column.get()), - assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(), - input_rows_count); + default_preprocess_parameter_columns(argument_columns, col_const, {1, 2}, block, arguments); + + for (int i = 0; i < 3; i++) { + check_set_nullable(argument_columns[i], result_null_map_column); + } + + if (col_const[1] && col_const[2]) { + execute_scalar_args( + context, + assert_cast<const typename Impl::DataType::ColumnType*>( + argument_columns[0].get()), + assert_cast<const ColumnInt8*>(argument_columns[1].get())->get_element(0), + assert_cast<const ColumnInt8*>(argument_columns[2].get())->get_element(0), + assert_cast<ColumnString*>(result_column.get()), + assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(), + input_rows_count); + } else { + execute_straight(context, + assert_cast<const typename Impl::DataType::ColumnType*>( + argument_columns[0].get()), + assert_cast<const ColumnInt8*>(argument_columns[1].get()), + assert_cast<const ColumnInt8*>(argument_columns[2].get()), + assert_cast<ColumnString*>(result_column.get()), + assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(), + input_rows_count); + } block.get_by_position(result).column = ColumnNullable::create(std::move(result_column), std::move(result_null_map_column)); return Status::OK(); } private: - void execute_straight(FunctionContext* context, - const typename Impl::DataType::ColumnType* data_column, - const ColumnInt8* src_base_column, const ColumnInt8* dst_base_column, - ColumnString* result_column, NullMap& result_null_map, - size_t input_rows_count) { + // check out of bound. + static bool _check_oob(const Int8 src_base, const Int8 dst_base) { + return std::abs(src_base) < MathFunctions::MIN_BASE || + std::abs(src_base) > MathFunctions::MAX_BASE || + std::abs(dst_base) < MathFunctions::MIN_BASE || + std::abs(dst_base) > MathFunctions::MAX_BASE; + } + static void execute_straight(FunctionContext* context, + const typename Impl::DataType::ColumnType* data_column, + const ColumnInt8* src_base_column, + const ColumnInt8* dst_base_column, ColumnString* result_column, + NullMap& result_null_map, size_t input_rows_count) { for (size_t i = 0; i < input_rows_count; i++) { if (result_null_map[i]) { result_column->insert_default(); continue; } - Int8 src_base = src_base_column->get_element(i); Int8 dst_base = dst_base_column->get_element(i); - if (std::abs(src_base) < MathFunctions::MIN_BASE || - std::abs(src_base) > MathFunctions::MAX_BASE || - std::abs(dst_base) < MathFunctions::MIN_BASE || - std::abs(dst_base) > MathFunctions::MAX_BASE) { + if (_check_oob(src_base, dst_base)) { result_null_map[i] = true; result_column->insert_default(); + } else { + Impl::calculate_cell(context, data_column, src_base, dst_base, result_column, + result_null_map, i); + } + } + } + static void execute_scalar_args(FunctionContext* context, + const typename Impl::DataType::ColumnType* data_column, + const Int8 src_base, const Int8 dst_base, + ColumnString* result_column, NullMap& result_null_map, + size_t input_rows_count) { + if (_check_oob(src_base, dst_base)) { + result_null_map.assign(input_rows_count, true); Review Comment: warning: no matching member function for call to 'assign' [clang-diagnostic-error] ```cpp result_null_map.assign(input_rows_count, true); ^ ``` **be/src/vec/functions/function_conv.cpp:71:** in instantiation of member function 'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::execute_scalar_args' requested here ```cpp execute_scalar_args( ^ ``` **/usr/include/c++/11/ext/new_allocator.h:161:** in instantiation of member function 'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::execute_impl' requested here ```cpp { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ^ ``` **/usr/include/c++/11/bits/alloc_traits.h:515:** in instantiation of function template specialization '__gnu_cxx::new_allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>::construct<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>' requested here ```cpp __a.construct(__p, std::forward<_Args>(__args)...); ^ ``` **/usr/include/c++/11/bits/shared_ptr_base.h:518:** in instantiation of function template specialization 'std::allocator_traits<std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>>::construct<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>' requested here ```cpp allocator_traits<_Alloc>::construct(__a, _M_ptr(), ^ ``` **/usr/include/c++/11/bits/shared_ptr_base.h:650:** in instantiation of function template specialization 'std::_Sp_counted_ptr_inplace<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>, std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>, __gnu_cxx::_S_atomic>::_Sp_counted_ptr_inplace<>' requested here ```cpp _Sp_cp_type(__a._M_a, std::forward<_Args>(__args)...); ^ ``` **/usr/include/c++/11/bits/shared_ptr_base.h:1341:** (skipping 3 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all) ```cpp : _M_ptr(), _M_refcount(_M_ptr, __tag, std::forward<_Args>(__args)...) ^ ``` **/usr/include/c++/11/bits/shared_ptr.h:877:** in instantiation of function template specialization 'std::allocate_shared<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>, std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>>' requested here ```cpp return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(), ^ ``` **be/src/vec/functions/function_conv.cpp:33:** in instantiation of function template specialization 'std::make_shared<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>' requested here ```cpp static FunctionPtr create() { return std::make_shared<FunctionConv<Impl>>(); } ^ ``` **be/src/vec/functions/simple_function_factory.h:171:** in instantiation of member function 'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::create' requested here ```cpp return std::make_shared<DefaultFunctionBuilder>(Function::create()); ^ ``` **be/src/vec/functions/simple_function_factory.h:121:** in instantiation of function template specialization 'doris::vectorized::SimpleFunctionFactory::createDefaultFunction<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>' requested here ```cpp register_function(Function::name, &createDefaultFunction<Function>); ^ ``` **be/src/vec/functions/function_conv.cpp:200:** in instantiation of function template specialization 'doris::vectorized::SimpleFunctionFactory::register_function<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>' requested here ```cpp factory.register_function<FunctionConv<ConvStringImpl>>(); ^ ``` **be/src/vec/common/pod_array.h:573:** candidate template ignored: substitution failure [with It1 = unsigned long, It2 = bool] ```cpp void assign(It1 from_begin, It2 from_end) { ^ ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org