This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.1 by this push:
new 4633683898e [fix](variant) fix array contains null (#53999)
4633683898e is described below
commit 4633683898ed0c73c9483284e1208bfeed0a9406
Author: Sun Chenyang <[email protected]>
AuthorDate: Tue Jul 29 15:11:14 2025 +0800
[fix](variant) fix array contains null (#53999)
---
be/src/vec/columns/column_object.cpp | 10 +++++++
be/test/vec/columns/column_object_test.cpp | 29 +++++++++++++++++++++
.../predefine/test_all_prdefine_type_to_sparse.out | Bin 371285 -> 372581 bytes
.../test_all_prdefine_type_to_sparse.groovy | 14 +++++-----
4 files changed, 46 insertions(+), 7 deletions(-)
diff --git a/be/src/vec/columns/column_object.cpp
b/be/src/vec/columns/column_object.cpp
index f825be48f80..e9099f12d16 100644
--- a/be/src/vec/columns/column_object.cpp
+++ b/be/src/vec/columns/column_object.cpp
@@ -966,13 +966,18 @@ const char* parse_binary_from_sparse_column(FieldType
type, const char* data, Fi
res = Array(size);
auto& array = res.get<Array>();
info_res.num_dimensions++;
+ FieldType nested_filed_type = FieldType::OLAP_FIELD_TYPE_NONE;
for (size_t i = 0; i < size; ++i) {
Field nested_field;
const auto nested_type =
static_cast<FieldType>(*reinterpret_cast<const
uint8_t*>(data++));
data = parse_binary_from_sparse_column(nested_type, data,
nested_field, info_res);
array[i] = std::move(nested_field);
+ if (nested_type != FieldType::OLAP_FIELD_TYPE_NONE) {
+ nested_filed_type = nested_type;
+ }
}
+ info_res.scalar_type_id = fieldTypeToTypeIndex(nested_filed_type);
end = data;
break;
}
@@ -1062,6 +1067,11 @@ const char* parse_binary_from_sparse_column(FieldType
type, const char* data, Fi
info_res.need_wrapped = true;
break;
}
+ case FieldType::OLAP_FIELD_TYPE_NONE: {
+ res = Field();
+ end = data;
+ break;
+ }
default:
throw doris::Exception(ErrorCode::OUT_OF_BOUND,
"Type ({}) for deserialize_from_sparse_column
is invalid", type);
diff --git a/be/test/vec/columns/column_object_test.cpp
b/be/test/vec/columns/column_object_test.cpp
index 25a41722f95..9078b73f7f5 100644
--- a/be/test/vec/columns/column_object_test.cpp
+++ b/be/test/vec/columns/column_object_test.cpp
@@ -1470,4 +1470,33 @@ TEST(ColumnVariantTest,
test_serialize_to_sparse_column_and_deserialize) {
EXPECT_EQ(tmp_col10->get_data_at(1), StringRef("1", 1));
}
+TEST(ColumnVariantTest, test_array_field_contains_null_field) {
+ ColumnObject::Subcolumn subcolumn(0, true /* is_nullable */, false /*
is_root */);
+ Field null_field = Field();
+ Field int_field = Field(1);
+ Field array_field = Array(2);
+ auto& array = array_field.get<Array>();
+ array[0] = int_field;
+ array[1] = null_field;
+ subcolumn.insert(array_field);
+ subcolumn.finalize();
+ EXPECT_EQ(subcolumn.data.size(), 1);
+ EXPECT_EQ(subcolumn.data[0]->size(), 1);
+
+ auto serialized_sparse_column = ColumnMap::create(
+ ColumnString::create(), ColumnString::create(),
ColumnArray::ColumnOffsets::create());
+ auto& column_map = assert_cast<ColumnMap&>(*serialized_sparse_column);
+ auto& sparse_column_keys =
assert_cast<ColumnString&>(column_map.get_keys());
+ auto& sparse_column_values =
assert_cast<ColumnString&>(column_map.get_values());
+ subcolumn.serialize_to_sparse_column(&sparse_column_keys, "array",
&sparse_column_values, 0);
+
+ auto column_object3 = ColumnObject::create(0);
+ const auto& [field, field_info] =
+
column_object3->deserialize_from_sparse_column(&sparse_column_values, 0);
+ EXPECT_EQ(field.get<Array>().size(), 2);
+ EXPECT_EQ(field.get<Array>()[0].get<Field>(), int_field);
+ EXPECT_EQ(field.get<Array>()[1].get<Field>(), null_field);
+ EXPECT_EQ(field_info.scalar_type_id, TypeIndex::Int8);
+}
+
} // namespace doris::vectorized
diff --git
a/regression-test/data/variant_p0/predefine/test_all_prdefine_type_to_sparse.out
b/regression-test/data/variant_p0/predefine/test_all_prdefine_type_to_sparse.out
index 8c0bc1d8e8d..107118ed2fc 100644
Binary files
a/regression-test/data/variant_p0/predefine/test_all_prdefine_type_to_sparse.out
and
b/regression-test/data/variant_p0/predefine/test_all_prdefine_type_to_sparse.out
differ
diff --git
a/regression-test/suites/variant_p0/predefine/test_all_prdefine_type_to_sparse.groovy
b/regression-test/suites/variant_p0/predefine/test_all_prdefine_type_to_sparse.groovy
index eb7cd047cea..32644622fcb 100644
---
a/regression-test/suites/variant_p0/predefine/test_all_prdefine_type_to_sparse.groovy
+++
b/regression-test/suites/variant_p0/predefine/test_all_prdefine_type_to_sparse.groovy
@@ -94,11 +94,11 @@ suite("test_all_prdefine_type_to_sparse", "p0"){
"ipv4_1": "192.168.1.1",
"ipv6_1": "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"array_boolean_1": [true],
- "array_tinyint_1": [1],
- "array_smallint_1": [1],
- "array_int_1": [1],
- "array_bigint_1": [1],
- "array_largeint_1": [1],
+ "array_tinyint_1": [1, null],
+ "array_smallint_1": [1, null],
+ "array_int_1": [1, null],
+ "array_bigint_1": [1, null],
+ "array_largeint_1": [1, null],
"array_char_1": ["1"],
"array_string_1": ["1"],
"array_float_1": [1.12],
@@ -240,7 +240,7 @@ suite("test_all_prdefine_type_to_sparse", "p0"){
check_table();
- sql """ insert into ${tableName} values (192, '{"array_smallint_1":
[1]}'),(193, '{"array_smallint_1": [2]}'),(194, '{"array_smallint_1":
[3]}'),(195, '{"array_smallint_1": [4]}'),
+ sql """ insert into ${tableName} values (192, '{"array_smallint_1":
[1]}'),(193, '{"array_smallint_1": [2, null]}'),(194, '{"array_smallint_1":
[3]}'),(195, '{"array_smallint_1": [4]}'),
(196, '{"array_smallint_1": [5]}'),(197, '{"array_smallint_1":
[6]}'),(198, '{"array_smallint_1": [7]}'),(199, '{"array_smallint_1":
[8]}'),(200, '{"array_smallint_1": [9]}'),(201, '{"array_smallint_1": [10]}'),
(202, '{"array_smallint_1": [11]}'),(203, '{"array_smallint_1":
[12]}'),(204, '{"array_smallint_1": [13]}'),(205, '{"array_smallint_1":
[14]}'),(206, '{"array_smallint_1": [15]}'),(207, '{"array_smallint_1": [16]}'),
(208, '{"array_smallint_1": [17]}'),(209, '{"array_smallint_1":
[18]}'),(210, '{"array_smallint_1": [19]}'); """
@@ -261,7 +261,7 @@ suite("test_all_prdefine_type_to_sparse", "p0"){
check_table();
- sql """ insert into ${tableName} values (252, '{"array_largeint_1":
[1]}'),(253, '{"array_largeint_1": [2]}'),(254, '{"array_largeint_1":
[3]}'),(255, '{"array_largeint_1": [4]}'),
+ sql """ insert into ${tableName} values (252, '{"array_largeint_1": [1,
null]}'),(253, '{"array_largeint_1": [2]}'),(254, '{"array_largeint_1":
[3]}'),(255, '{"array_largeint_1": [4]}'),
(256, '{"array_largeint_1": [5]}'),(257, '{"array_largeint_1":
[6]}'),(258, '{"array_largeint_1": [7]}'),(259, '{"array_largeint_1":
[8]}'),(260, '{"array_largeint_1": [9]}'),(261, '{"array_largeint_1": [10]}'),
(262, '{"array_largeint_1": [11]}'),(263, '{"array_largeint_1":
[12]}'),(264, '{"array_largeint_1": [13]}'),(265, '{"array_largeint_1":
[14]}'),(266, '{"array_largeint_1": [15]}'),(267, '{"array_largeint_1": [16]}'),
(268, '{"array_largeint_1": [17]}'),(269, '{"array_largeint_1":
[18]}'),(270, '{"array_largeint_1": [19]}'),(271, '{"array_largeint_1":
[20]}'),(272, '{"array_largeint_1": [21]}'),(273, '{"array_largeint_1":
[22]}'); """
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]