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