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]