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