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

Reply via email to