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