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


##########
be/src/vec/data_types/data_type_array.cpp:
##########
@@ -71,45 +72,116 @@ size_t DataTypeArray::get_number_of_dimensions() const {
            nested_array
                    ->get_number_of_dimensions(); /// Every modern C++ compiler 
optimizes tail recursion.
 }
-
+// binary : const flag | row num | offsets | data
+// offsets: data_off1 | data_off2 | ...
+// data   : data1 | data2 | ...
 int64_t DataTypeArray::get_uncompressed_serialized_bytes(const IColumn& column,
                                                          int be_exec_version) 
const {
-    auto ptr = column.convert_to_full_column_if_const();
-    const auto& data_column = assert_cast<const ColumnArray&>(*ptr.get());
-    return sizeof(ColumnArray::Offset64) * (column.size() + 1) +
-           
get_nested_type()->get_uncompressed_serialized_bytes(data_column.get_data(),
-                                                                
be_exec_version);
+    if (be_exec_version >= USE_CONST_SERDE) {
+        auto size = sizeof(bool);
+        bool is_const_column = is_column_const(column);
+        auto real_need_copy_num = is_const_column ? 1 : column.size();
+        const IColumn* array_column = &column;
+        if (is_const_column) {
+            const auto& const_column = assert_cast<const ColumnConst&>(column);
+            array_column = &(const_column.get_data_column());
+        }
+        const auto& data_column = assert_cast<const 
ColumnArray&>(*array_column);
+        size = size + sizeof(ColumnArray::Offset64) * (real_need_copy_num + 1);
+        return size + 
get_nested_type()->get_uncompressed_serialized_bytes(data_column.get_data(),
+                                                                           
be_exec_version);
+    } else {
+        auto ptr = column.convert_to_full_column_if_const();
+        const auto& data_column = assert_cast<const ColumnArray&>(*ptr.get());
+        return sizeof(ColumnArray::Offset64) * (column.size() + 1) +
+               
get_nested_type()->get_uncompressed_serialized_bytes(data_column.get_data(),
+                                                                    
be_exec_version);
+    }
 }
 
 char* DataTypeArray::serialize(const IColumn& column, char* buf, int 
be_exec_version) const {
-    auto ptr = column.convert_to_full_column_if_const();
-    const auto& data_column = assert_cast<const ColumnArray&>(*ptr.get());
-
-    // row num
-    *reinterpret_cast<ColumnArray::Offset64*>(buf) = column.size();
-    buf += sizeof(ColumnArray::Offset64);
-    // offsets
-    memcpy(buf, data_column.get_offsets().data(), column.size() * 
sizeof(ColumnArray::Offset64));
-    buf += column.size() * sizeof(ColumnArray::Offset64);
-    // children
-    return get_nested_type()->serialize(data_column.get_data(), buf, 
be_exec_version);
+    if (be_exec_version >= USE_CONST_SERDE) {
+        // const flag
+        bool is_const_column = is_column_const(column);
+        *reinterpret_cast<bool*>(buf) = is_const_column;
+        buf += sizeof(bool);
+
+        // row num
+        const auto row_num = column.size();
+        *reinterpret_cast<ColumnArray::Offset64*>(buf) = row_num;

Review Comment:
   row_num why use `ColumnArray::Offset64*`



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