This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 8ac1adf1834092de1fb55ad481d7619f5bfcd8f3 Author: lihangyu <15605149...@163.com> AuthorDate: Fri Mar 1 12:00:22 2024 +0800 [Fix](Variant) fix variant root may be emtpy in `OlapColumnDataConvertorVariant::set_source_column` (#31572) When compaction, if some segments miss variant root, there is chance to get emtpy root variant.So add some defence code in OlapColumnDataConvertorVariant to prevent from accessing null root ``` 5# doris::vectorized::ColumnObject::Subcolumn::get_finalized_column_ptr() const at /mnt/ssd01/selectdb-doris-package/enterprise-core/be/src/vec/columns/column_object.cpp:556 6# doris::vectorized::OlapBlockDataConvertor::OlapColumnDataConvertorVariant::set_source_column(doris::vectorized::ColumnWithTypeAndName const&, unsigned long, unsigned long) at /mnt/ssd01/selectdb-doris-package/enterprise-core/be/src /vec/olap/olap_data_convertor.cpp:1076 7# doris::vectorized::OlapBlockDataConvertor::set_source_content(doris::vectorized::Block const*, unsigned long, unsigned long) at /mnt/ssd01/selectdb-doris-package/enterprise-core/be/src/vec/olap/olap_data_convertor.cpp:207 8# doris::segment_v2::SegmentWriter::append_block(doris::vectorized::Block const*, unsigned long, unsigned long) at /mnt/ssd01/selectdb-doris-package/enterprise-core/be/src/olap/rowset/segment_v2/segment_writer.cpp:727 9# doris::VerticalBetaRowsetWriter::add_columns(doris::vectorized::Block const*, std::vector > const&, bool, unsigned int) at /mnt/ssd01/selectdb-doris-package/enterprise-core/be/src/olap/row set/vertical_beta_rowset_writer.cpp:125 ``` --- be/src/vec/olap/olap_data_convertor.cpp | 7 +++++++ regression-test/suites/variant_p0/multi_var.groovy | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/be/src/vec/olap/olap_data_convertor.cpp b/be/src/vec/olap/olap_data_convertor.cpp index 3a130a638b8..7213ded16e1 100644 --- a/be/src/vec/olap/olap_data_convertor.cpp +++ b/be/src/vec/olap/olap_data_convertor.cpp @@ -1073,6 +1073,13 @@ void OlapBlockDataConvertor::OlapColumnDataConvertorVariant::set_source_column( nullable_column->get_nested_column()); const_cast<ColumnObject&>(variant).finalize_if_not(); + if (variant.is_null_root()) { + auto root_type = make_nullable(std::make_shared<ColumnObject::MostCommonType>()); + auto root_col = root_type->create_column(); + root_col->insert_many_defaults(variant.rows()); + const_cast<ColumnObject&>(variant).create_root(root_type, std::move(root_col)); + variant.check_consistency(); + } auto root_of_variant = variant.get_root(); auto nullable = assert_cast<const ColumnNullable*>(root_of_variant.get()); CHECK(nullable); diff --git a/regression-test/suites/variant_p0/multi_var.groovy b/regression-test/suites/variant_p0/multi_var.groovy index 5f0eb22b4e5..91d5810a670 100644 --- a/regression-test/suites/variant_p0/multi_var.groovy +++ b/regression-test/suites/variant_p0/multi_var.groovy @@ -40,4 +40,9 @@ suite("regression_test_variant_multi_var", "variant_type"){ qt_sql """select cast(v["k1"] as tinyint), cast(v2["k2"] as text), cast(v3["k3"] as string), cast(v["k7"] as tinyint), cast(v2["k8"] as text), cast(v3["k9"] as double) from ${table_name} order by k, 1, 2, 3, 4, 5, 6 limit 10""" qt_sql """select cast(v["k1"] as tinyint), cast(v2["k2"] as text), cast(v3["k3"] as string), cast(v["k7"] as tinyint), cast(v2["k8"] as text), cast(v3["k9"] as double) from ${table_name} where k > 200 order by k, 1, 2, 3, 4, 5, 6 limit 10""" qt_sql """select cast(v["k1"] as tinyint), cast(v2["k2"] as text), cast(v3["k3"] as string), cast(v["k7"] as tinyint), cast(v2["k8"] as text), cast(v3["k9"] as double) from ${table_name} where k > 300 order by k, 1, 2, 3, 4, 5, 6 limit 10""" + + sql "alter table ${table_name} add column v4 variant default null" + for (int i = 0; i < 20; i++) { + sql """insert into ${table_name} values (1, '{"a" : 1}', '{"a" : 1}', '{"a" : 1}', '{"a" : 1}', '{"a" : 1}')""" + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org