This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch branch-c108335-hive-sql in repository https://gitbox.apache.org/repos/asf/doris.git
commit f2099b0a41efd22c543f8436957e24a8e1d73e4b Author: morningman <yun...@selectdb.com> AuthorDate: Thu Apr 10 09:01:14 2025 +0800 patch Support hive compatible output format #49036 for nested boolean --- be/src/vec/data_types/serde/data_type_array_serde.cpp | 2 ++ be/src/vec/data_types/serde/data_type_map_serde.cpp | 4 ++++ be/src/vec/data_types/serde/data_type_number_serde.cpp | 6 +++--- be/src/vec/data_types/serde/data_type_serde.h | 6 ++++++ be/src/vec/data_types/serde/data_type_struct_serde.cpp | 2 ++ 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/be/src/vec/data_types/serde/data_type_array_serde.cpp b/be/src/vec/data_types/serde/data_type_array_serde.cpp index ea748cdd6c4..a98d9622720 100644 --- a/be/src/vec/data_types/serde/data_type_array_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_array_serde.cpp @@ -341,6 +341,7 @@ Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column, return Status::InternalError("pack mysql buffer failed."); } } else { + ++options.level; if (is_nested_string && options.wrapper_len > 0) { if (0 != result.push_string(options.nested_string_wrapper, options.wrapper_len)) { return Status::InternalError("pack mysql buffer failed."); @@ -354,6 +355,7 @@ Status DataTypeArraySerDe::_write_column_to_mysql(const IColumn& column, RETURN_IF_ERROR( nested_serde->write_column_to_mysql(data, result, j, false, options)); } + --options.level; } } if (0 != result.push_string("]", 1)) { diff --git a/be/src/vec/data_types/serde/data_type_map_serde.cpp b/be/src/vec/data_types/serde/data_type_map_serde.cpp index d2c311b70d9..118a2841f5f 100644 --- a/be/src/vec/data_types/serde/data_type_map_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_map_serde.cpp @@ -429,6 +429,7 @@ Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, return Status::InternalError("pack mysql buffer failed."); } } else { + ++options.level; if (is_key_string && options.wrapper_len > 0) { if (0 != result.push_string(options.nested_string_wrapper, options.wrapper_len)) { return Status::InternalError("pack mysql buffer failed."); @@ -442,6 +443,7 @@ Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, RETURN_IF_ERROR(key_serde->write_column_to_mysql(nested_keys_column, result, j, false, options)); } + --options.level; } if (0 != result.push_string(&options.map_key_delim, 1)) { return Status::InternalError("pack mysql buffer failed."); @@ -451,6 +453,7 @@ Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, return Status::InternalError("pack mysql buffer failed."); } } else { + ++options.level; if (is_val_string && options.wrapper_len > 0) { if (0 != result.push_string(options.nested_string_wrapper, options.wrapper_len)) { return Status::InternalError("pack mysql buffer failed."); @@ -464,6 +467,7 @@ Status DataTypeMapSerDe::_write_column_to_mysql(const IColumn& column, RETURN_IF_ERROR(value_serde->write_column_to_mysql(nested_values_column, result, j, false, options)); } + --options.level; } } if (0 != result.push_string("}", 1)) { diff --git a/be/src/vec/data_types/serde/data_type_number_serde.cpp b/be/src/vec/data_types/serde/data_type_number_serde.cpp index 69e3271715f..2eb972cbf1a 100644 --- a/be/src/vec/data_types/serde/data_type_number_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_number_serde.cpp @@ -280,11 +280,11 @@ Status DataTypeNumberSerDe<T>::_write_column_to_mysql(const IColumn& column, if constexpr (std::is_same_v<T, Int8>) { buf_ret = result.push_tinyint(data[col_index]); } else if constexpr (std::is_same_v<T, UInt8>) { - if (options.is_bool_value_num) { - buf_ret = result.push_tinyint(data[col_index]); - } else { + if (options.level > 0 && !options.is_bool_value_num) { std::string bool_value = data[col_index] ? "true" : "false"; result.push_string(bool_value.c_str(), bool_value.size()); + } else { + buf_ret = result.push_tinyint(data[col_index]); } } else if constexpr (std::is_same_v<T, Int16> || std::is_same_v<T, UInt16>) { buf_ret = result.push_smallint(data[col_index]); diff --git a/be/src/vec/data_types/serde/data_type_serde.h b/be/src/vec/data_types/serde/data_type_serde.h index a53c3dd5136..7705db33699 100644 --- a/be/src/vec/data_types/serde/data_type_serde.h +++ b/be/src/vec/data_types/serde/data_type_serde.h @@ -195,6 +195,12 @@ public: */ bool is_bool_value_num = true; + /** + * indicate the nested level of column. + * it is used to control some behavior of serde + */ + mutable int level = 0; + [[nodiscard]] char get_collection_delimiter( int hive_text_complex_type_delimiter_level) const { CHECK(0 <= hive_text_complex_type_delimiter_level && diff --git a/be/src/vec/data_types/serde/data_type_struct_serde.cpp b/be/src/vec/data_types/serde/data_type_struct_serde.cpp index 8cbfb3d360c..a4bc60a19f1 100644 --- a/be/src/vec/data_types/serde/data_type_struct_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_struct_serde.cpp @@ -374,6 +374,7 @@ Status DataTypeStructSerDe::_write_column_to_mysql(const IColumn& column, return Status::InternalError("pack mysql buffer failed."); } } else { + ++options.level; if (remove_nullable(col.get_column_ptr(j))->is_column_string() && options.wrapper_len > 0) { if (0 != result.push_string(options.nested_string_wrapper, options.wrapper_len)) { @@ -388,6 +389,7 @@ Status DataTypeStructSerDe::_write_column_to_mysql(const IColumn& column, RETURN_IF_ERROR(elem_serdes_ptrs[j]->write_column_to_mysql( col.get_column(j), result, col_index, false, options)); } + --options.level; } begin = false; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org