This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.0 by this push:
new ee45f9828f1 branch-4.0: [Improve](variant) optimize cast performance
when variant only contains null values #57003 (#57054)
ee45f9828f1 is described below
commit ee45f9828f1f0109b2de8d0a860e6c3ad2e5a87a
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Oct 17 16:30:40 2025 +0800
branch-4.0: [Improve](variant) optimize cast performance when variant only
contains null values #57003 (#57054)
Cherry-picked from #57003
Co-authored-by: Sun Chenyang <[email protected]>
---
be/src/vec/columns/column_variant.cpp | 9 +++++++--
be/src/vec/columns/column_variant.h | 2 +-
be/src/vec/functions/cast/cast_to_variant.h | 3 +--
be/test/vec/columns/column_variant_test.cpp | 7 +++++++
4 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/be/src/vec/columns/column_variant.cpp
b/be/src/vec/columns/column_variant.cpp
index 58c74ef85dd..4def55ee246 100644
--- a/be/src/vec/columns/column_variant.cpp
+++ b/be/src/vec/columns/column_variant.cpp
@@ -2087,8 +2087,13 @@ void ColumnVariant::ensure_root_node_type(const
DataTypePtr& expected_root_type)
}
}
-bool ColumnVariant::empty() const {
- return subcolumns.empty() || subcolumns.begin()->get()->path.get_path() ==
COLUMN_NAME_DUMMY;
+bool ColumnVariant::only_have_default_values() const {
+ for (const auto& entry : subcolumns) {
+ if (entry->data.least_common_type.get_base_type_id() !=
PrimitiveType::INVALID_TYPE) {
+ return false;
+ }
+ }
+ return true;
}
ColumnPtr ColumnVariant::filter(const Filter& filter, ssize_t count) const {
diff --git a/be/src/vec/columns/column_variant.h
b/be/src/vec/columns/column_variant.h
index 046ead820df..25fa9083cc0 100644
--- a/be/src/vec/columns/column_variant.h
+++ b/be/src/vec/columns/column_variant.h
@@ -490,7 +490,7 @@ public:
template <typename Func>
MutableColumnPtr apply_for_columns(Func&& func) const;
- bool empty() const;
+ bool only_have_default_values() const;
// Check if all columns and types are aligned, only in debug mode
Status sanitize() const;
diff --git a/be/src/vec/functions/cast/cast_to_variant.h
b/be/src/vec/functions/cast/cast_to_variant.h
index 272e3cbe150..c4722375d8f 100644
--- a/be/src/vec/functions/cast/cast_to_variant.h
+++ b/be/src/vec/functions/cast/cast_to_variant.h
@@ -70,8 +70,7 @@ struct CastFromVariant {
{0}, 1, input_rows_count);
}
} else {
- if (variant.empty()) {
- // TODO not found root cause, a tmp fix
+ if (variant.only_have_default_values()) {
col_to->assume_mutable()->insert_many_defaults(input_rows_count);
col_to = make_nullable(col_to, true);
} else if (is_string_type(data_type_to->get_primitive_type())) {
diff --git a/be/test/vec/columns/column_variant_test.cpp
b/be/test/vec/columns/column_variant_test.cpp
index a99bc3a2be9..077702ab6d2 100644
--- a/be/test/vec/columns/column_variant_test.cpp
+++ b/be/test/vec/columns/column_variant_test.cpp
@@ -3799,4 +3799,11 @@ TEST_F(ColumnVariantTest,
subcolumn_insert_range_from_test_advanced) {
}
}
+TEST_F(ColumnVariantTest, test_variant_no_data_insert) {
+ auto variant = ColumnVariant::create(1);
+ variant->insert_many_defaults(10);
+ EXPECT_EQ(variant->size(), 10);
+ EXPECT_TRUE(variant->only_have_default_values());
+}
+
} // namespace doris::vectorized
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]