You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by xu...@apache.org on 2023/01/18 08:11:14 UTC

[doris] branch struct-type updated: [fix](struct-type) fix insert null and explain for struct type (#16054)

This is an automated email from the ASF dual-hosted git repository.

xuyang pushed a commit to branch struct-type
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/struct-type by this push:
     new 5175a45f46 [fix](struct-type) fix insert null and explain for struct type (#16054)
5175a45f46 is described below

commit 5175a45f46119ae75fefe5a7c89da460eab96d23
Author: camby <10...@qq.com>
AuthorDate: Wed Jan 18 16:11:07 2023 +0800

    [fix](struct-type) fix insert null and explain for struct type (#16054)
    
    1、support insert null for struct type;
    2、fix explain const exprs for strut type got wrong result;
    Co-authored-by: cambyzju <zh...@baidu.com>
---
 be/src/olap/rowset/segment_v2/column_writer.cpp    | 25 ++++++++++++++++------
 be/src/olap/rowset/segment_v2/column_writer.h      |  3 ++-
 be/src/vec/data_types/data_type_struct.cpp         |  2 +-
 .../org/apache/doris/analysis/StructLiteral.java   |  2 +-
 4 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/be/src/olap/rowset/segment_v2/column_writer.cpp b/be/src/olap/rowset/segment_v2/column_writer.cpp
index 2fc64f741d..5e2de337aa 100644
--- a/be/src/olap/rowset/segment_v2/column_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/column_writer.cpp
@@ -648,6 +648,13 @@ Status StructColumnWriter::write_inverted_index() {
     return Status::OK();
 }
 
+Status StructColumnWriter::append_nullable(const uint8_t* null_map, const uint8_t** ptr,
+                                           size_t num_rows) {
+    RETURN_IF_ERROR(append_data(ptr, num_rows));
+    RETURN_IF_ERROR(_null_writer->append_data(&null_map, num_rows));
+    return Status::OK();
+}
+
 Status StructColumnWriter::append_data(const uint8_t** ptr, size_t num_rows) {
     auto results = reinterpret_cast<const uint64_t*>(*ptr);
     for (size_t i = 0; i < _num_sub_column_writers; ++i) {
@@ -658,11 +665,9 @@ Status StructColumnWriter::append_data(const uint8_t** ptr, size_t num_rows) {
                                                        num_rows));
     }
     if (is_nullable()) {
-        uint8_t null_sign = 0;
-        const uint8_t* null_sign_ptr = &null_sign;
-        for (size_t i = 0; i < num_rows; ++i) {
-            RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, 1));
-        }
+        std::vector<vectorized::UInt8> null_signs(num_rows, 0);
+        const uint8_t* null_sign_ptr = null_signs.data();
+        RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, num_rows));
     }
     return Status::OK();
 }
@@ -707,7 +712,15 @@ Status StructColumnWriter::write_ordinal_index() {
 }
 
 Status StructColumnWriter::append_nulls(size_t num_rows) {
-    return Status::NotSupported("struct writer not support append nulls");
+    for (auto& column_writer : _sub_column_writers) {
+        RETURN_IF_ERROR(column_writer->append_nulls(num_rows));
+    }
+    if (is_nullable()) {
+        std::vector<vectorized::UInt8> null_signs(num_rows, 1);
+        const uint8_t* null_sign_ptr = null_signs.data();
+        RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, num_rows));
+    }
+    return Status::OK();
 }
 
 Status StructColumnWriter::finish_current_page() {
diff --git a/be/src/olap/rowset/segment_v2/column_writer.h b/be/src/olap/rowset/segment_v2/column_writer.h
index c1329f2404..274c9be6f3 100644
--- a/be/src/olap/rowset/segment_v2/column_writer.h
+++ b/be/src/olap/rowset/segment_v2/column_writer.h
@@ -113,7 +113,7 @@ public:
     Status append_nullable(const uint8_t* nullmap, const void* data, size_t num_rows);
 
     // use only in vectorized load
-    Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows);
+    virtual Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows);
 
     virtual Status append_nulls(size_t num_rows) = 0;
 
@@ -274,6 +274,7 @@ public:
 
     Status init() override;
 
+    Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows) override;
     Status append_data(const uint8_t** ptr, size_t num_rows) override;
 
     uint64_t estimate_buffer_size() override;
diff --git a/be/src/vec/data_types/data_type_struct.cpp b/be/src/vec/data_types/data_type_struct.cpp
index a3a54966b0..7249977295 100644
--- a/be/src/vec/data_types/data_type_struct.cpp
+++ b/be/src/vec/data_types/data_type_struct.cpp
@@ -272,7 +272,7 @@ bool DataTypeStruct::equals(const IDataType& rhs) const {
     }
 
     for (size_t i = 0; i < size; ++i) {
-        if (!elems[i]->equals(*rhs_tuple.elems[i]) || names[i] != rhs_tuple.names[i]) {
+        if (!elems[i]->equals(*rhs_tuple.elems[i])) {
             return false;
         }
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
index a9209f1c5a..95362a37ab 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java
@@ -58,7 +58,7 @@ public class StructLiteral extends LiteralExpr {
     @Override
     protected String toSqlImpl() {
         List<String> list = new ArrayList<>(children.size());
-        children.forEach(v -> list.add(v.toDigestImpl()));
+        children.forEach(v -> list.add(v.toSqlImpl()));
         return "STRUCT(" + StringUtils.join(list, ", ") + ")";
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org