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