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 5175a45f46 [fix](struct-type) fix insert null and explain for struct type (#16054) 5175a45f46 is described below commit 5175a45f46119ae75fefe5a7c89da460eab96d23 Author: camby <104178...@qq.com> AuthorDate: Wed Jan 18 16:11:07 2023 +0800 [fix](struct-type) fix insert null and explain for struct type (#16054) 1、support insert null for struct type; 2、fix explain const exprs for strut type got wrong result; Co-authored-by: cambyzju <zhuxiaol...@baidu.com> --- be/src/olap/rowset/segment_v2/column_writer.cpp | 25 ++++++++++++++++------ be/src/olap/rowset/segment_v2/column_writer.h | 3 ++- be/src/vec/data_types/data_type_struct.cpp | 2 +- .../org/apache/doris/analysis/StructLiteral.java | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/column_writer.cpp b/be/src/olap/rowset/segment_v2/column_writer.cpp index 2fc64f741d..5e2de337aa 100644 --- a/be/src/olap/rowset/segment_v2/column_writer.cpp +++ b/be/src/olap/rowset/segment_v2/column_writer.cpp @@ -648,6 +648,13 @@ 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 results = reinterpret_cast<const uint64_t*>(*ptr); for (size_t i = 0; i < _num_sub_column_writers; ++i) { @@ -658,11 +665,9 @@ Status StructColumnWriter::append_data(const uint8_t** ptr, size_t num_rows) { 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)); - } + std::vector<vectorized::UInt8> null_signs(num_rows, 0); + const uint8_t* null_sign_ptr = null_signs.data(); + RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, num_rows)); } return Status::OK(); } @@ -707,7 +712,15 @@ Status StructColumnWriter::write_ordinal_index() { } Status StructColumnWriter::append_nulls(size_t num_rows) { - return Status::NotSupported("struct writer not support append nulls"); + for (auto& column_writer : _sub_column_writers) { + RETURN_IF_ERROR(column_writer->append_nulls(num_rows)); + } + if (is_nullable()) { + std::vector<vectorized::UInt8> null_signs(num_rows, 1); + const uint8_t* null_sign_ptr = null_signs.data(); + RETURN_IF_ERROR(_null_writer->append_data(&null_sign_ptr, num_rows)); + } + return Status::OK(); } Status StructColumnWriter::finish_current_page() { diff --git a/be/src/olap/rowset/segment_v2/column_writer.h b/be/src/olap/rowset/segment_v2/column_writer.h index c1329f2404..274c9be6f3 100644 --- a/be/src/olap/rowset/segment_v2/column_writer.h +++ b/be/src/olap/rowset/segment_v2/column_writer.h @@ -113,7 +113,7 @@ public: Status append_nullable(const uint8_t* nullmap, const void* data, size_t num_rows); // use only in vectorized load - Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows); + virtual Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows); virtual Status append_nulls(size_t num_rows) = 0; @@ -274,6 +274,7 @@ public: Status init() override; + Status append_nullable(const uint8_t* null_map, const uint8_t** data, size_t num_rows) override; Status append_data(const uint8_t** ptr, size_t num_rows) override; uint64_t estimate_buffer_size() override; diff --git a/be/src/vec/data_types/data_type_struct.cpp b/be/src/vec/data_types/data_type_struct.cpp index a3a54966b0..7249977295 100644 --- a/be/src/vec/data_types/data_type_struct.cpp +++ b/be/src/vec/data_types/data_type_struct.cpp @@ -272,7 +272,7 @@ bool DataTypeStruct::equals(const IDataType& rhs) const { } for (size_t i = 0; i < size; ++i) { - if (!elems[i]->equals(*rhs_tuple.elems[i]) || names[i] != rhs_tuple.names[i]) { + if (!elems[i]->equals(*rhs_tuple.elems[i])) { return false; } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java index a9209f1c5a..95362a37ab 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StructLiteral.java @@ -58,7 +58,7 @@ public class StructLiteral extends LiteralExpr { @Override protected String toSqlImpl() { List<String> list = new ArrayList<>(children.size()); - children.forEach(v -> list.add(v.toDigestImpl())); + children.forEach(v -> list.add(v.toSqlImpl())); return "STRUCT(" + StringUtils.join(list, ", ") + ")"; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org