This is an automated email from the ASF dual-hosted git repository. eldenmoon pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 3ab97fbae4d [fix](is_exclusive) fix is_exlusive func for nested types (#41646) 3ab97fbae4d is described below commit 3ab97fbae4d2e97086fc9a00bb41f49404f0ad95 Author: amory <wangqian...@selectdb.com> AuthorDate: Tue Oct 15 09:52:23 2024 +0800 [fix](is_exclusive) fix is_exlusive func for nested types (#41646) ## Proposed changes backport: https://github.com/apache/doris/pull/40398 Issue Number: close #xxx <!--Describe your changes.--> --- be/src/vec/columns/column_array.h | 5 ++ be/src/vec/columns/column_map.h | 4 ++ be/src/vec/columns/column_struct.h | 9 +++ be/test/vec/core/column_test.cpp | 123 +++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+) diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index 65455310ac7..93636d51cc1 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -129,6 +129,11 @@ public: bool is_column_array() const override { return true; } bool can_be_inside_nullable() const override { return true; } bool is_variable_length() const override { return true; } + + bool is_exclusive() const override { + return IColumn::is_exclusive() && data->is_exclusive() && offsets->is_exclusive(); + } + MutableColumnPtr clone_resized(size_t size) const override; size_t size() const override; void resize(size_t n) override; diff --git a/be/src/vec/columns/column_map.h b/be/src/vec/columns/column_map.h index 706888528ed..1414f75311e 100644 --- a/be/src/vec/columns/column_map.h +++ b/be/src/vec/columns/column_map.h @@ -96,6 +96,10 @@ public: bool is_variable_length() const override { return true; } bool can_be_inside_nullable() const override { return true; } + bool is_exclusive() const override { + return IColumn::is_exclusive() && keys_column->is_exclusive() && + values_column->is_exclusive() && offsets_column->is_exclusive(); + } Field operator[](size_t n) const override; void get(size_t n, Field& res) const override; diff --git a/be/src/vec/columns/column_struct.h b/be/src/vec/columns/column_struct.h index c276bf419b0..07ce85acbce 100644 --- a/be/src/vec/columns/column_struct.h +++ b/be/src/vec/columns/column_struct.h @@ -89,6 +89,15 @@ public: MutableColumnPtr clone_resized(size_t size) const override; size_t size() const override { return columns.at(0)->size(); } + bool is_exclusive() const override { + for (const auto& col : columns) { + if (!col->is_exclusive()) { + return false; + } + } + return IColumn::is_exclusive(); + } + Field operator[](size_t n) const override; void get(size_t n, Field& res) const override; diff --git a/be/test/vec/core/column_test.cpp b/be/test/vec/core/column_test.cpp new file mode 100644 index 00000000000..f1aa5e3e50f --- /dev/null +++ b/be/test/vec/core/column_test.cpp @@ -0,0 +1,123 @@ +// 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 <gtest/gtest.h> + +#include "vec/columns/column_array.h" +#include "vec/columns/column_map.h" +#include "vec/columns/column_string.h" +#include "vec/columns/columns_number.h" +#include "vec/common/string_ref.h" +#include "vec/core/types.h" +#include "vec/data_types/data_type.h" +#include "vec/data_types/data_type_number.h" +#include "vec/data_types/data_type_string.h" +#include "vec/data_types/data_type_struct.h" + +namespace doris::vectorized { + +class ColumnTest : public ::testing::Test { +protected: + void SetUp() override { + col_str = ColumnString::create(); + col_str->insert_data("aaa", 3); + col_str->insert_data("bb", 2); + col_str->insert_data("cccc", 4); + + col_int = ColumnInt64::create(); + col_int->insert_value(1); + col_int->insert_value(2); + col_int->insert_value(3); + + col_dcm = ColumnDecimal64::create(0, 3); + col_dcm->insert_value(1.23); + col_dcm->insert_value(4.56); + col_dcm->insert_value(7.89); + + col_arr = ColumnArray::create(ColumnInt64::create(), ColumnArray::ColumnOffsets::create()); + Array array1 = {1, 2, 3}; + Array array2 = {4}; + col_arr->insert(array1); + col_arr->insert(Array()); + col_arr->insert(array2); + + col_map = ColumnMap::create(ColumnString::create(), ColumnInt64::create(), + ColumnArray::ColumnOffsets::create()); + Array k1 = {"a", "b", "c"}; + Array v1 = {1, 2, 3}; + Array k2 = {"d"}; + Array v2 = {4}; + Array a = Array(); + Map map1, map2, map3; + map1.push_back(k1); + map1.push_back(v1); + col_map->insert(map1); + map3.push_back(a); + map3.push_back(a); + col_map->insert(map3); + map2.push_back(k2); + map2.push_back(v2); + col_map->insert(map2); + } + + ColumnString::MutablePtr col_str; + ColumnInt64::MutablePtr col_int; + ColumnDecimal64::MutablePtr col_dcm; + ColumnArray::MutablePtr col_arr; + ColumnMap::MutablePtr col_map; +}; + +TEST_F(ColumnTest, IsExclusiveColumnArray) { + EXPECT_TRUE(col_arr->is_exclusive()); + auto data_col = assert_cast<const ColumnArray&>(*col_arr).get_data_ptr(); + MutableColumnPtr col = data_col->clone_resized(1); + std::cout << data_col->use_count() << std::endl; + std::cout << col->use_count() << std::endl; + std::cout << col_arr->use_count() << std::endl; + EXPECT_FALSE(col_arr->is_exclusive()); +} + +TEST_F(ColumnTest, IsExclusiveColumnMap) { + EXPECT_TRUE(col_map->is_exclusive()); + auto data_col = assert_cast<const ColumnMap&>(*col_map).get_values_ptr(); + MutableColumnPtr col = data_col->clone_resized(1); + std::cout << data_col->use_count() << std::endl; + std::cout << col->use_count() << std::endl; + std::cout << col_map->use_count() << std::endl; + EXPECT_FALSE(col_map->is_exclusive()); +} + +TEST_F(ColumnTest, IsExclusiveColumnStruct) { + DataTypePtr n1 = std::make_shared<DataTypeInt64>(); + DataTypes dataTypes = {n1}; + + DataTypePtr a = std::make_shared<DataTypeStruct>(dataTypes); + auto col_struct = a->create_column(); + Tuple tuple, tuple1; + tuple.push_back(1); + tuple1.push_back(2); + col_struct->insert(tuple); + col_struct->insert(tuple1); + EXPECT_TRUE(col_struct->is_exclusive()); + auto data_col = assert_cast<const ColumnStruct&>(*col_struct).get_column_ptr(0); + MutableColumnPtr col = data_col->clone_resized(1); + std::cout << col->use_count() << std::endl; + std::cout << data_col->use_count() << std::endl; + std::cout << col_struct->use_count() << std::endl; + EXPECT_FALSE(col_struct->is_exclusive()); +} +} // namespace doris::vectorized --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org