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

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


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

commit d85816a4a6af7a037907927c4415595fcdb159e0
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sun Mar 30 10:40:41 2025 +0800

    branch-3.0: [fix](variant) update least common type in 
ColumnObject::pop_back #48935 (#48978)
    
    Cherry-picked from #48935
    
    Co-authored-by: Sun Chenyang <suncheny...@selectdb.com>
---
 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 f531bdb1466..250c5d3be56 100644
--- a/be/src/vec/columns/column_object.cpp
+++ b/be/src/vec/columns/column_object.cpp
@@ -734,6 +734,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