This is an automated email from the ASF dual-hosted git repository.

eldenmoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new b982b148682 [fix](variant) update least common type in 
ColumnObject::pop_back (#48935)
b982b148682 is described below

commit b982b14868228014df474aa17f4c2333116fbe78
Author: Sun Chenyang <suncheny...@selectdb.com>
AuthorDate: Wed Mar 12 18:29:49 2025 +0800

    [fix](variant) update least common type in ColumnObject::pop_back (#48935)
    
    1. In a subcolumn, each time a different type of column is inserted, the
    `least_common_type` is updated.
    2. Similarly, each time a column is popped back, the `least_common_type`
    needs to be updated as well.
---
 be/src/vec/columns/column_object.cpp       |   3 +
 be/test/vec/columns/column_object_test.cpp | 130 +++++++++++++++++++++++++++++
 2 files changed, 133 insertions(+)

diff --git a/be/src/vec/columns/column_object.cpp 
b/be/src/vec/columns/column_object.cpp
index d2bc6a41b0f..6b5cd9db56d 100644
--- a/be/src/vec/columns/column_object.cpp
+++ b/be/src/vec/columns/column_object.cpp
@@ -735,6 +735,9 @@ void ColumnObject::Subcolumn::pop_back(size_t n) {
     size_t sz = data.size() - num_removed;
     data.resize(sz);
     data_types.resize(sz);
+    // need to update least_common_type when pop_back a column from the last
+    least_common_type = sz > 0 ? LeastCommonType {data_types[sz - 1]}
+                               : LeastCommonType 
{std::make_shared<DataTypeNothing>()};
     num_of_defaults_in_prefix -= n;
 }
 
diff --git a/be/test/vec/columns/column_object_test.cpp 
b/be/test/vec/columns/column_object_test.cpp
new file mode 100644
index 00000000000..d9c1b7da2ac
--- /dev/null
+++ b/be/test/vec/columns/column_object_test.cpp
@@ -0,0 +1,130 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "vec/columns/column_object.h"
+
+#include <gtest/gtest-message.h>
+#include <gtest/gtest-test-part.h>
+#include <gtest/gtest.h>
+
+namespace doris::vectorized {
+
+class ColumnObjectTest : public ::testing::Test {};
+
+// TEST
+TEST_F(ColumnObjectTest, test_pop_back) {
+    ColumnObject::Subcolumn subcolumn(0, true /* is_nullable */, false /* 
is_root */);
+
+    Field field_int(123);
+    Field field_string("hello");
+
+    subcolumn.insert(field_int);
+    subcolumn.insert(field_string);
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 1);
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)");
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 0);
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing");
+}
+
+TEST_F(ColumnObjectTest, test_pop_back_multiple_types) {
+    ColumnObject::Subcolumn subcolumn(0, true /* is_nullable */, false /* 
is_root */);
+
+    Field field_int8(42);
+    subcolumn.insert(field_int8);
+    EXPECT_EQ(subcolumn.size(), 1);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)");
+
+    Field field_int16(12345);
+    subcolumn.insert(field_int16);
+    EXPECT_EQ(subcolumn.size(), 2);
+    EXPECT_EQ(subcolumn.data_types.size(), 2);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)");
+    EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int16)");
+
+    Field field_int32(1234567);
+    subcolumn.insert(field_int32);
+    EXPECT_EQ(subcolumn.size(), 3);
+    EXPECT_EQ(subcolumn.data_types.size(), 3);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)");
+    EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)");
+    EXPECT_EQ(subcolumn.data_types[2]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int32)");
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 2);
+    EXPECT_EQ(subcolumn.data_types.size(), 2);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)");
+    EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(Int16)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int16)");
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 1);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int8)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nullable(Int8)");
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 0);
+    EXPECT_EQ(subcolumn.data_types.size(), 0);
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing");
+
+    subcolumn.insert(field_int32);
+    EXPECT_EQ(subcolumn.size(), 1);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int32)");
+
+    subcolumn.insert(field_int16);
+    EXPECT_EQ(subcolumn.size(), 2);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int32)");
+
+    subcolumn.insert(field_int8);
+    EXPECT_EQ(subcolumn.size(), 3);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int32)");
+
+    subcolumn.pop_back(1);
+    EXPECT_EQ(subcolumn.size(), 2);
+    EXPECT_EQ(subcolumn.data_types.size(), 1);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(Int32)");
+
+    Field field_string("hello");
+    subcolumn.insert(field_string);
+    EXPECT_EQ(subcolumn.size(), 3);
+    EXPECT_EQ(subcolumn.data_types.size(), 2);
+    EXPECT_EQ(subcolumn.data_types[0]->get_name(), "Nullable(Int32)");
+    EXPECT_EQ(subcolumn.data_types[1]->get_name(), "Nullable(JSONB)");
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), 
"Nullable(JSONB)");
+
+    subcolumn.pop_back(3);
+    EXPECT_EQ(subcolumn.size(), 0);
+    EXPECT_EQ(subcolumn.data_types.size(), 0);
+    EXPECT_EQ(subcolumn.get_least_common_type()->get_name(), "Nothing");
+}
+
+} // namespace doris::vectorized


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to