Mryange commented on code in PR #60612:
URL: https://github.com/apache/doris/pull/60612#discussion_r2786175819


##########
be/src/vec/functions/array/function_array_join.h:
##########
@@ -65,91 +68,81 @@ struct ArrayJoinImpl {
                     block.get_by_position(arguments[0]).type->get_name()));
         }
 
-        ColumnPtr sep_column =
-                
block.get_by_position(arguments[1]).column->convert_to_full_column_if_const();
-        ColumnPtr null_replace_column =
-                (arguments.size() > 2 ? block.get_by_position(arguments[2])
-                                                
.column->convert_to_full_column_if_const()
-                                      : nullptr);
-
-        std::string sep_str = _get_string_from_column(sep_column);
-        std::string null_replace_str = 
_get_string_from_column(null_replace_column);
-
         auto nested_type = data_type_array->get_nested_type();
         auto dest_column_ptr = ColumnString::create();
-        DCHECK(dest_column_ptr);
 
-        auto res_val = _execute_string(*src.nested_col, *src.offsets_ptr, 
src.nested_nullmap_data,
-                                       sep_str, null_replace_str, 
dest_column_ptr.get());
-        if (!res_val) {
-            return Status::RuntimeError(fmt::format(
-                    "execute failed or unsupported types for function 
{}({},{},{})", "array_join",
-                    block.get_by_position(arguments[0]).type->get_name(),
-                    block.get_by_position(arguments[1]).type->get_name(),
-                    (arguments.size() > 2 ? 
block.get_by_position(arguments[2]).type->get_name()
-                                          : "")));
+        auto sep_column =
+                
ColumnView<TYPE_STRING>::create(block.get_by_position(arguments[1]).column);
+
+        if (arguments.size() > 2) {
+            auto null_replace_column =
+                    
ColumnView<TYPE_STRING>::create(block.get_by_position(arguments[2]).column);
+
+            _execute_string(*src.nested_col, *src.offsets_ptr, 
src.nested_nullmap_data, sep_column,
+                            null_replace_column, dest_column_ptr.get());
+
+        } else {
+            auto tmp_column_string = ColumnString::create();
+            // insert default value for null replacement, which is empty string
+            tmp_column_string->insert_default();
+            ColumnPtr tmp_const_column =
+                    ColumnConst::create(std::move(tmp_column_string), 
sep_column.size());
+
+            auto null_replace_column = 
ColumnView<TYPE_STRING>::create(tmp_const_column);
+
+            _execute_string(*src.nested_col, *src.offsets_ptr, 
src.nested_nullmap_data, sep_column,
+                            null_replace_column, dest_column_ptr.get());
         }
 
         block.replace_by_position(result, std::move(dest_column_ptr));
         return Status::OK();
     }
 
 private:
-    static std::string _get_string_from_column(const ColumnPtr& column_ptr) {
-        if (!column_ptr) {
-            return std::string("");
-        }
-        const ColumnString* column_string_ptr = 
check_and_get_column<ColumnString>(*column_ptr);
-        StringRef str_ref = column_string_ptr->get_data_at(0);
-        std::string str(str_ref.data, str_ref.size);
-        return str;
-    }
-
-    static void _fill_result_string(const std::string& input_str, const 
std::string& sep_str,
+    static void _fill_result_string(const StringRef& input_str, const 
StringRef& sep_str,
                                     std::string& result_str, bool& 
is_first_elem) {
         if (is_first_elem) {
-            result_str.append(input_str);
+            result_str.append(input_str.data, input_str.size);
             is_first_elem = false;
         } else {
-            result_str.append(sep_str);
-            result_str.append(input_str);
+            result_str.append(sep_str.data, sep_str.size);
+            result_str.append(input_str.data, input_str.size);
         }
-        return;
     }
 
-    static bool _execute_string(const IColumn& src_column,
+    static void _execute_string(const IColumn& src_column,
                                 const ColumnArray::Offsets64& src_offsets,
-                                const UInt8* src_null_map, const std::string& 
sep_str,
-                                const std::string& null_replace_str,
+                                const UInt8* src_null_map, 
ColumnView<TYPE_STRING>& sep_column,
+                                ColumnView<TYPE_STRING>& null_replace_column,
                                 ColumnString* dest_column_ptr) {
-        const ColumnString* src_data_concrete = assert_cast<const 
ColumnString*>(&src_column);
-        if (!src_data_concrete) {
-            return false;
-        }
+        const auto& src_data = assert_cast<const ColumnString&>(src_column);
+
+        std::string result_str;

Review Comment:
   之前的代码就是这个逻辑。



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to