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..3eb131b29bdda3 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;