HappenLee commented on code in PR #18310:
URL: https://github.com/apache/doris/pull/18310#discussion_r1156876241


##########
be/src/vec/functions/function_conv.cpp:
##########
@@ -49,58 +52,99 @@ 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;
+
+        default_preprocess_parameter_columns(argument_columns, col_const, {1, 
2}, block, arguments);
 
-        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);
+        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) {
+    static bool _check_set_oob(const Int8 src_base, const Int8 dst_base,
+                               ColumnString* result_column, UInt8& 
result_null) {
+        if (std::abs(src_base) < MathFunctions::MIN_BASE ||

Review Comment:
   ```
   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
   ``` should be a function



##########
be/src/vec/functions/function_conv.cpp:
##########
@@ -49,58 +52,99 @@ 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;
+
+        default_preprocess_parameter_columns(argument_columns, col_const, {1, 
2}, block, arguments);
 
-        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);
+        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) {
+    static bool _check_set_oob(const Int8 src_base, const Int8 dst_base,
+                               ColumnString* result_column, UInt8& 
result_null) {
+        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) { //out of bound
+            result_null = true;
+            result_column->insert_default();
+            return true;
+        }
+        return false;
+    }
+    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_set_oob(src_base, dst_base, result_column, 
result_null_map[i])) {
+                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 (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) { //out of bound
+            for (int i = 0; i < input_rows_count; i++) {
                 result_null_map[i] = true;
                 result_column->insert_default();

Review Comment:
   do not use for loop
   ```
   memset->result_null_map
   result_column->insert_many_default
   ```



-- 
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