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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]