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
commit 46bf03d14ce2eaecabe5f6c99e7f10182dc21d5f 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 | 4 ++-- 4 files changed, 20 insertions(+), 21 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 bd39824ef8..d850bc3090 100644 --- a/be/src/vec/sink/vmysql_result_writer.cpp +++ b/be/src/vec/sink/vmysql_result_writer.cpp @@ -214,10 +214,10 @@ Status VMysqlResultWriter<is_binary_format>::_add_one_column( } else { if (WhichDataType(remove_nullable(sub_types[j])).is_string()) { buf_ret = rows_buffer[i].push_string("'", 1); - buf_ret = _add_one_cell(data, j, sub_types[j], rows_buffer[i]); + buf_ret = _add_one_cell(data, i, sub_types[j], rows_buffer[i]); buf_ret = rows_buffer[i].push_string("'", 1); } else { - buf_ret = _add_one_cell(data, j, sub_types[j], rows_buffer[i]); + buf_ret = _add_one_cell(data, i, sub_types[j], rows_buffer[i]); } } begin = false; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org