From d71a5bb866b6163d9838ca4cbfcc057dc3133c26 Mon Sep 17 00:00:00 2001 From: Mryange Date: Tue, 30 Jun 2026 21:24:46 +0800 Subject: [PATCH] upd --- be/src/core/column/column.h | 3 ++- be/src/core/column/column_decimal.h | 3 ++- be/src/core/column/column_dictionary.h | 17 ++++++++++------- be/src/core/column/column_nullable.cpp | 10 ++++------ be/src/core/column/column_nullable.h | 3 ++- be/src/core/column/column_string.cpp | 3 ++- be/src/core/column/column_string.h | 3 ++- be/src/core/column/column_vector.h | 3 ++- be/test/core/column/column_dictionary_test.cpp | 12 ++++++------ be/test/core/column/column_nullable_test.cpp | 3 ++- be/test/core/column/column_string_test.cpp | 4 ++-- 11 files changed, 36 insertions(+), 28 deletions(-) diff --git a/be/src/core/column/column.h b/be/src/core/column/column.h index ecd0245d718c18..f83a8ded6ce4d6 100644 --- a/be/src/core/column/column.h +++ b/be/src/core/column/column.h @@ -452,7 +452,8 @@ class IColumn : public COW { * // nullable -> predict_column * // string (dictionary) -> column_dictionary */ - virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) { + virtual Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const { throw doris::Exception(ErrorCode::NOT_IMPLEMENTED_ERROR, "Method filter_by_selector is not supported for {}, only " "column_nullable, column_dictionary and predict_column support", diff --git a/be/src/core/column/column_decimal.h b/be/src/core/column/column_decimal.h index 9c0e859d54d0bb..5afecb2d1b5037 100644 --- a/be/src/core/column/column_decimal.h +++ b/be/src/core/column/column_decimal.h @@ -148,7 +148,8 @@ class ColumnDecimal final : public COWHelper> { memset(data.data() + old_size, 0, length * sizeof(data[0])); } - Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override { + Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const override { Self* output = assert_cast(col_ptr); auto& res_data = output->get_data(); DCHECK(res_data.empty()) diff --git a/be/src/core/column/column_dictionary.h b/be/src/core/column/column_dictionary.h index 57d6ab66e8e358..7c60c7613e4a7c 100644 --- a/be/src/core/column/column_dictionary.h +++ b/be/src/core/column/column_dictionary.h @@ -152,19 +152,23 @@ class ColumnDictI32 final : public COWHelper { "permute not supported in ColumnDictionary"); } - Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override { + Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const override { auto* res_col = assert_cast(col_ptr); - _strings.resize(sel_size); + if (sel_size == 0) { + return Status::OK(); + } + std::vector strings(sel_size); size_t length = 0; for (size_t i = 0; i != sel_size; ++i) { - auto& value = _dict.get_value(_codes[sel[i]]); - _strings[i].data = value.data; - _strings[i].size = value.size; + const auto& value = _dict.get_value(_codes[sel[i]]); + strings[i].data = value.data; + strings[i].size = value.size; length += value.size; } res_col->get_offsets().reserve(sel_size + res_col->get_offsets().size()); res_col->get_chars().reserve(length + res_col->get_chars().size()); - res_col->insert_many_strings_without_reserve(_strings.data(), sel_size); + res_col->insert_many_strings_without_reserve(strings.data(), sel_size); return Status::OK(); } @@ -454,7 +458,6 @@ class ColumnDictI32 final : public COWHelper { Dictionary _dict; Container _codes; std::pair _rowset_segment_id; - std::vector _strings; }; } // namespace doris diff --git a/be/src/core/column/column_nullable.cpp b/be/src/core/column/column_nullable.cpp index d3ce21fc8e39ab..52c4bccee83806 100644 --- a/be/src/core/column/column_nullable.cpp +++ b/be/src/core/column/column_nullable.cpp @@ -450,17 +450,15 @@ size_t ColumnNullable::filter(const Filter& filter) { return data_result_size; } -Status ColumnNullable::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) { +Status ColumnNullable::filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const { auto* nullable_col_ptr = assert_cast(col_ptr); - // Access the nested column via const path to avoid assert_mutable_ref (which requires - // exclusive ownership). The output col_ptr was just created, so its nested column is exclusive. - auto nest_col_raw = const_cast( - static_cast(nullable_col_ptr->_nested_column).get()); + auto nested_column = nullable_col_ptr->get_nested_column_ptr(); /// `get_null_map_data` will set `_need_update_has_null` to true auto& res_nullmap = nullable_col_ptr->get_null_map_data(); - RETURN_IF_ERROR(get_nested_column().filter_by_selector(sel, sel_size, nest_col_raw)); + RETURN_IF_ERROR(get_nested_column().filter_by_selector(sel, sel_size, nested_column.get())); DCHECK(res_nullmap.empty()); res_nullmap.resize(sel_size); auto& cur_nullmap = get_null_map_column().get_data(); diff --git a/be/src/core/column/column_nullable.h b/be/src/core/column/column_nullable.h index 563d5e7011ddbf..14a764c4aca319 100644 --- a/be/src/core/column/column_nullable.h +++ b/be/src/core/column/column_nullable.h @@ -213,7 +213,8 @@ class ColumnNullable final : public COWHelper { size_t filter(const Filter& filter) override; - Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override; + Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const override; MutableColumnPtr permute(const Permutation& perm, size_t limit) const override; // ColumnPtr index(const IColumn & indexes, size_t limit) const override; int compare_at(size_t n, size_t m, const IColumn& rhs_, int null_direction_hint) const override; diff --git a/be/src/core/column/column_string.cpp b/be/src/core/column/column_string.cpp index 399c0952b892da..a2e128d0d790ef 100644 --- a/be/src/core/column/column_string.cpp +++ b/be/src/core/column/column_string.cpp @@ -365,7 +365,8 @@ size_t ColumnStr::filter(const IColumn::Filter& filter) { } template -Status ColumnStr::filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) { +Status ColumnStr::filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const { if constexpr (std::is_same_v) { auto* col = static_cast*>(col_ptr); Chars& res_chars = col->chars; diff --git a/be/src/core/column/column_string.h b/be/src/core/column/column_string.h index 7bae712f849721..9ca55caa9c6aa5 100644 --- a/be/src/core/column/column_string.h +++ b/be/src/core/column/column_string.h @@ -502,7 +502,8 @@ class ColumnStr final : public COWHelper> { ColumnPtr filter(const IColumn::Filter& filt, ssize_t result_size_hint) const override; size_t filter(const IColumn::Filter& filter) override; - Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override; + Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const override; MutableColumnPtr permute(const IColumn::Permutation& perm, size_t limit) const override; diff --git a/be/src/core/column/column_vector.h b/be/src/core/column/column_vector.h index d39326fa8c07f3..47755f95861da8 100644 --- a/be/src/core/column/column_vector.h +++ b/be/src/core/column/column_vector.h @@ -271,7 +271,8 @@ class ColumnVector final : public COWHelper> { void insert_value(const value_type value) { data.push_back(value); } - Status filter_by_selector(const uint16_t* sel, size_t sel_size, IColumn* col_ptr) override { + Status filter_by_selector(const uint16_t* sel, size_t sel_size, + IColumn* col_ptr) const override { Self* output = assert_cast(col_ptr); auto& res_data = output->get_data(); DCHECK(res_data.empty()) diff --git a/be/test/core/column/column_dictionary_test.cpp b/be/test/core/column/column_dictionary_test.cpp index e802eae7541c9f..389485e2181272 100644 --- a/be/test/core/column/column_dictionary_test.cpp +++ b/be/test/core/column/column_dictionary_test.cpp @@ -248,8 +248,9 @@ TEST_F(ColumnDictionaryTest, permute) { } TEST_F(ColumnDictionaryTest, filter_by_selector) { auto test_func = [&](const auto& source_column) { - auto src_size = source_column->size(); - const auto& codes_data = source_column->get_data(); + const auto& source = *source_column; + auto src_size = source.size(); + const auto& codes_data = source.get_data(); EXPECT_TRUE(src_size <= UINT16_MAX); auto target_column = ColumnString::create(); @@ -262,13 +263,12 @@ TEST_F(ColumnDictionaryTest, filter_by_selector) { size_t sel_size = src_size / 2; indices.resize(sel_size); - auto status = - source_column->filter_by_selector(indices.data(), sel_size, target_column.get()); + auto status = source.filter_by_selector(indices.data(), sel_size, target_column.get()); EXPECT_TRUE(status.ok()); EXPECT_EQ(target_column->size(), sel_size); for (size_t i = 0; i != sel_size; ++i) { auto real_data = target_column->get_data_at(i); - auto expect_data = source_column->get_value(codes_data[indices[i]]); + auto expect_data = source.get_value(codes_data[indices[i]]); if (real_data != expect_data) { std::cout << "index: " << i << ", real_data: " << real_data.to_string() << "\nexpect_data: " << expect_data.to_string() << std::endl; @@ -364,4 +364,4 @@ std::vector ColumnDictionaryTest::dict_array; ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_char; ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_varchar; ColumnDictI32::MutablePtr ColumnDictionaryTest::column_dict_str; -} // namespace doris \ No newline at end of file +} // namespace doris diff --git a/be/test/core/column/column_nullable_test.cpp b/be/test/core/column/column_nullable_test.cpp index 6e6a7d8b4f960b..79cdcbdb33b2d0 100644 --- a/be/test/core/column/column_nullable_test.cpp +++ b/be/test/core/column/column_nullable_test.cpp @@ -106,7 +106,8 @@ TEST(ColumnNullableTest, PredicateTest) { EXPECT_FALSE(null_dst->has_null()); uint16_t selector[] = {5, 8}; // both null - EXPECT_EQ(nullable_pred->filter_by_selector(selector, 2, null_dst.get()), Status::OK()); + const IColumn& nullable_src = *nullable_pred; + EXPECT_EQ(nullable_src.filter_by_selector(selector, 2, null_dst.get()), Status::OK()); // filter_by_selector must announce to update has_null to make below right. EXPECT_TRUE(null_dst->has_null()); } diff --git a/be/test/core/column/column_string_test.cpp b/be/test/core/column/column_string_test.cpp index 6d29b555367b1f..37de6fe56e265a 100644 --- a/be/test/core/column/column_string_test.cpp +++ b/be/test/core/column/column_string_test.cpp @@ -978,8 +978,8 @@ TEST_F(ColumnStringTest, filter_by_selector) { } std::cout << std::endl; - auto status = - source_column->filter_by_selector(indices.data(), sel_size, target_column.get()); + const auto& source = *source_column; + auto status = source.filter_by_selector(indices.data(), sel_size, target_column.get()); EXPECT_TRUE(status.ok()); EXPECT_EQ(target_column->size(), sel_size); for (size_t i = 0; i != sel_size; ++i) {