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

Reply via email to