From 0aaa5dbcba80e9fe6749e2b78d90a8fedd8afd44 Mon Sep 17 00:00:00 2001 From: cambyzju Date: Sun, 15 Jan 2023 12:58:32 +0800 Subject: [PATCH 1/2] bugfix for struct insert --- .../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 | 7 +++-- 4 files changed, 22 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 fdd42f9444552b..2fc64f741d83bd 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(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(*null_map_cursor), - *data_cursor, num_rows)); - data_cursor++; - null_map_cursor++; + auto results = reinterpret_cast(*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(nullmap), + reinterpret_cast(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 007a69a6d905de..c1329f24040c35 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 @@ class StructColumnWriter final : public ColumnWriter { 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 0b3ad4ae030003..c96726d5fe393d 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 2accb4dd036a8c..be3e76be82c2ed 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; @@ -482,6 +482,7 @@ int VMysqlResultWriter::_add_one_cell(const ColumnPtr& column_ptr, size_t row_id } Status VMysqlResultWriter::append_block(Block& input_block) { + LOG(WARNING) << "VMysqlResultWriter::append_block block=" << input_block.dump_data(); SCOPED_TIMER(_append_row_batch_timer); Status status = Status::OK(); if (UNLIKELY(input_block.rows() == 0)) { From 9972bdfd33ceaf4acb1f5e43a02f7874f01f1710 Mon Sep 17 00:00:00 2001 From: cambyzju Date: Sun, 15 Jan 2023 16:20:30 +0800 Subject: [PATCH 2/2] update --- be/src/vec/sink/vmysql_result_writer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/be/src/vec/sink/vmysql_result_writer.cpp b/be/src/vec/sink/vmysql_result_writer.cpp index be3e76be82c2ed..3eb131b29bdda3 100644 --- a/be/src/vec/sink/vmysql_result_writer.cpp +++ b/be/src/vec/sink/vmysql_result_writer.cpp @@ -482,7 +482,6 @@ int VMysqlResultWriter::_add_one_cell(const ColumnPtr& column_ptr, size_t row_id } Status VMysqlResultWriter::append_block(Block& input_block) { - LOG(WARNING) << "VMysqlResultWriter::append_block block=" << input_block.dump_data(); SCOPED_TIMER(_append_row_batch_timer); Status status = Status::OK(); if (UNLIKELY(input_block.rows() == 0)) {