This is an automated email from the ASF dual-hosted git repository. eldenmoon pushed a commit to branch variant-sparse in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/variant-sparse by this push: new c60133a437b [fix](column) add variant deep clone() (#48613) c60133a437b is described below commit c60133a437b37a042d1a3889393dfc5e05f34403 Author: Sun Chenyang <suncheny...@selectdb.com> AuthorDate: Wed Mar 5 10:59:27 2025 +0800 [fix](column) add variant deep clone() (#48613) --- be/src/vec/columns/column_object.cpp | 31 ++++++++++++++++++++++++++++-- be/src/vec/columns/column_object.h | 2 ++ be/test/vec/columns/column_object_test.cpp | 2 ++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/be/src/vec/columns/column_object.cpp b/be/src/vec/columns/column_object.cpp index d2528bdb76c..ea2b50ef2c0 100644 --- a/be/src/vec/columns/column_object.cpp +++ b/be/src/vec/columns/column_object.cpp @@ -651,8 +651,11 @@ MutableColumnPtr ColumnObject::apply_for_columns(Func&& func) const { continue; } auto new_subcolumn = func(subcolumn->data.get_finalized_column_ptr()); - res->add_sub_column(subcolumn->path, new_subcolumn->assume_mutable(), - subcolumn->data.get_least_common_type()); + if (!res->add_sub_column(subcolumn->path, new_subcolumn->assume_mutable(), + subcolumn->data.get_least_common_type())) { + throw doris::Exception(ErrorCode::INTERNAL_ERROR, "add path {} is error", + subcolumn->path.get_path()); + } } auto sparse_column = func(serialized_sparse_column); res->serialized_sparse_column = sparse_column->assume_mutable(); @@ -2513,4 +2516,28 @@ void ColumnObject::fill_path_column_from_sparse_data(Subcolumn& subcolumn, NullM } } +MutableColumnPtr ColumnObject::clone() const { + auto res = ColumnObject::create(_max_subcolumns_count); + Subcolumns new_subcolumns; + for (const auto& subcolumn : subcolumns) { + auto new_subcolumn = subcolumn->data; + if (subcolumn->data.is_root) { + new_subcolumns.create_root(std::move(new_subcolumn)); + } else if (!new_subcolumns.add(subcolumn->path, std::move(new_subcolumn))) { + throw doris::Exception(ErrorCode::INTERNAL_ERROR, "add path {} is error in clone()", + subcolumn->path.get_path()); + } + } + if (!new_subcolumns.get_root()) { + throw doris::Exception(ErrorCode::INTERNAL_ERROR, "root is nullptr in clone()"); + } + res->subcolumns = std::move(new_subcolumns); + auto&& column = serialized_sparse_column->get_ptr(); + auto sparse_column = std::move(*column).mutate(); + res->serialized_sparse_column = sparse_column->assume_mutable(); + res->set_num_rows(num_rows); + ENABLE_CHECK_CONSISTENCY(res.get()); + return res; +} + } // namespace doris::vectorized diff --git a/be/src/vec/columns/column_object.h b/be/src/vec/columns/column_object.h index 8d90cc1aac1..77d35d76f77 100644 --- a/be/src/vec/columns/column_object.h +++ b/be/src/vec/columns/column_object.h @@ -402,6 +402,8 @@ public: return finalized; } + MutableColumnPtr clone() const override; + void clear() override; void resize(size_t n) override; diff --git a/be/test/vec/columns/column_object_test.cpp b/be/test/vec/columns/column_object_test.cpp index a6b68f6b972..e4c9a6f09af 100644 --- a/be/test/vec/columns/column_object_test.cpp +++ b/be/test/vec/columns/column_object_test.cpp @@ -158,6 +158,7 @@ TEST(ColumnVariantTest, basic_inset_range_from) { // sparse_column->subcolumn v.b.d v.c.d // sparse_column->sparse_column v.d.d dst->insert_range_from(*src, 0, 10); + dst->finalize(); EXPECT_EQ(dst->size(), 10); // 5 subcolumn @@ -498,6 +499,7 @@ TEST(ColumnVariantTest, advanced_insert_range_from) { // sparse_column->subcolumn v.b.d v.c.d // sparse_column->sparse_column v.d.d dst->insert_range_from(*src, 0, src->size()); + dst->finalize(); EXPECT_EQ(dst->size(), 15); EXPECT_EQ(dst->subcolumns.size(), 6); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org