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 4a2740990fc2f2659105f7d83b0b1af041e97aa8
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

Reply via email to