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 844f394b06 [fix](struct-type) support struct type insert (#15941)
844f394b06 is described below

commit 844f394b064be90f19cf5220d2e870984285b441
Author: camby <[email protected]>
AuthorDate: Mon Jan 16 21:10:54 2023 +0800

    [fix](struct-type) support struct type insert (#15941)
    
    Co-authored-by: cambyzju <[email protected]>
---
 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 fdd42f9444..2fc64f741d 100644
--- a/be/src/olap/rowset/segment_v2/column_writer.cpp
+++ b/be/src/olap/rowset/segment_v2/column_writer.cpp
@@ -648,21 +648,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 0b3ad4ae03..c96726d5fe 100644
--- a/be/src/vec/olap/olap_data_convertor.cpp
+++ b/be/src/vec/olap/olap_data_convertor.cpp
@@ -656,7 +656,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(
@@ -684,10 +684,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 2accb4dd03..3eb131b29b 100644
--- a/be/src/vec/sink/vmysql_result_writer.cpp
+++ b/be/src/vec/sink/vmysql_result_writer.cpp
@@ -213,15 +213,15 @@ Status VMysqlResultWriter::_add_one_column(const 
ColumnPtr& column_ptr,
                     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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to