diff --git a/be/src/vec/columns/column_variant.cpp b/be/src/vec/columns/column_variant.cpp index aa31646b1cc669..6f7f43da9cd989 100644 --- a/be/src/vec/columns/column_variant.cpp +++ b/be/src/vec/columns/column_variant.cpp @@ -2090,8 +2090,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 53d3bd2775788e..74258fb0b15941 100644 --- a/be/src/vec/columns/column_variant.h +++ b/be/src/vec/columns/column_variant.h @@ -490,7 +490,7 @@ class ColumnVariant final : public COWHelper { template 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 272e3cbe15037e..c4722375d8fc79 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 a99bc3a2be9d62..077702ab6d2fd1 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