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]

Reply via email to