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

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

commit 11c8eca9f0ae4db23dabff76e1589156238a8ea5
Author: camby <104178...@qq.com>
AuthorDate: Mon Jan 16 21:10:54 2023 +0800

    [fix](struct-type) support struct type insert (#15941)
    
    Co-authored-by: cambyzju <zhuxiaol...@baidu.com>
---
 be/src/olap/rowset/segment_v2/column_writer.cpp | 28 ++++++++++++-------------
 be/src/olap/rowset/segment_v2/column_writer.h   |  1 -
 be/src/vec/olap/olap_data_convertor.cpp         |  8 +++----
 be/src/vec/sink/vmysql_result_writer.cpp        |  6 +++---
 4 files changed, 21 insertions(+), 22 deletions(-)

diff --git a/be/src/olap/rowset/segment_v2/column_writer.cpp 
b/be/src/olap/rowset/segment_v2/column_writer.cpp
index 5b37d48fa6..d94a0200f0 100644
--- a/be/src/olap/rowset/segment_v2/column_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/column_writer.cpp
@@ -647,21 +647,21 @@ 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 data_cursor = reinterpret_cast<const void**>(ptr);
-    auto null_map_cursor = data_cursor + _num_sub_column_writers;
-    for (auto& column_writer : _sub_column_writers) {
-        RETURN_IF_ERROR(column_writer->append(reinterpret_cast<const 
uint8_t*>(*null_map_cursor),
-                                              *data_cursor, num_rows));
-        data_cursor++;
-        null_map_cursor++;
+    auto results = reinterpret_cast<const uint64_t*>(*ptr);
+    for (size_t i = 0; i < _num_sub_column_writers; ++i) {
+        auto nullmap = *(results + _num_sub_column_writers + i);
+        auto data = *(results + i);
+        RETURN_IF_ERROR(_sub_column_writers[i]->append(reinterpret_cast<const 
uint8_t*>(nullmap),
+                                                       reinterpret_cast<const 
void*>(data),
+                                                       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));
+        }
     }
     return Status::OK();
 }
diff --git a/be/src/olap/rowset/segment_v2/column_writer.h 
b/be/src/olap/rowset/segment_v2/column_writer.h
index 007a69a6d9..c1329f2404 100644
--- a/be/src/olap/rowset/segment_v2/column_writer.h
+++ b/be/src/olap/rowset/segment_v2/column_writer.h
@@ -274,7 +274,6 @@ public:
 
     Status init() override;
 
-    Status append_nullable(const uint8_t* null_map, const uint8_t** data, 
size_t num_rows);
     Status append_data(const uint8_t** ptr, size_t num_rows) override;
 
     uint64_t estimate_buffer_size() override;
diff --git a/be/src/vec/olap/olap_data_convertor.cpp 
b/be/src/vec/olap/olap_data_convertor.cpp
index cd683e5283..da0910ca2c 100644
--- a/be/src/vec/olap/olap_data_convertor.cpp
+++ b/be/src/vec/olap/olap_data_convertor.cpp
@@ -660,7 +660,7 @@ void 
OlapBlockDataConvertor::OlapColumnDataConvertorStruct::set_source_column(
 }
 
 const void* OlapBlockDataConvertor::OlapColumnDataConvertorStruct::get_data() 
const {
-    return _results[0];
+    return _results.data();
 }
 
 const void* OlapBlockDataConvertor::OlapColumnDataConvertorStruct::get_data_at(
@@ -688,10 +688,10 @@ Status 
OlapBlockDataConvertor::OlapColumnDataConvertorStruct::convert_to_olap()
     assert(column_struct);
     assert(data_type_struct);
 
-    size_t data_size = column_struct->tuple_size();
+    size_t fields_num = column_struct->tuple_size();
     size_t data_cursor = 0;
-    size_t null_map_cursor = data_cursor + data_size;
-    for (size_t i = 0; i < data_size; i++) {
+    size_t null_map_cursor = data_cursor + fields_num;
+    for (size_t i = 0; i < fields_num; i++) {
         ColumnPtr sub_column = column_struct->get_column_ptr(i);
         DataTypePtr sub_type = data_type_struct->get_element(i);
         ColumnWithTypeAndName sub_typed_column = {sub_column, sub_type, ""};
diff --git a/be/src/vec/sink/vmysql_result_writer.cpp 
b/be/src/vec/sink/vmysql_result_writer.cpp
index 4d30e17227..78fa7d4ccb 100644
--- a/be/src/vec/sink/vmysql_result_writer.cpp
+++ b/be/src/vec/sink/vmysql_result_writer.cpp
@@ -211,15 +211,15 @@ Status 
VMysqlResultWriter<is_binary_format>::_add_one_column(
                     buf_ret = _buffer.push_string(", ", 2);
                 }
                 const auto& data = column_struct.get_column_ptr(j);
-                if (data->is_null_at(j)) {
+                if (data->is_null_at(i)) {
                     buf_ret = _buffer.push_string("NULL", strlen("NULL"));
                 } else {
                     if 
(WhichDataType(remove_nullable(sub_types[j])).is_string()) {
                         buf_ret = _buffer.push_string("'", 1);
-                        buf_ret = _add_one_cell(data, j, sub_types[j], 
_buffer);
+                        buf_ret = _add_one_cell(data, i, sub_types[j], 
_buffer);
                         buf_ret = _buffer.push_string("'", 1);
                     } else {
-                        buf_ret = _add_one_cell(data, j, sub_types[j], 
_buffer);
+                        buf_ret = _add_one_cell(data, i, sub_types[j], 
_buffer);
                     }
                 }
                 begin = false;


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

Reply via email to