This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 3feea9095ae branch-4.0: [Refactor](Mysql output)Refactor PRESTO and 
HIVE dialect output #58279 (#58481)
3feea9095ae is described below

commit 3feea9095ae9169e3d16b84aa09b5aad294d7fe1
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Nov 28 16:36:59 2025 +0800

    branch-4.0: [Refactor](Mysql output)Refactor PRESTO and HIVE dialect output 
#58279 (#58481)
    
    Cherry-picked from #58279
    
    Co-authored-by: Mryange <[email protected]>
---
 .../vec/data_types/serde/data_type_array_serde.cpp | 40 ++++++++++++++++++
 .../vec/data_types/serde/data_type_array_serde.h   |  6 +++
 .../vec/data_types/serde/data_type_jsonb_serde.cpp | 14 +++++++
 .../vec/data_types/serde/data_type_jsonb_serde.h   |  3 ++
 .../vec/data_types/serde/data_type_map_serde.cpp   | 48 ++++++++++++++++++++++
 be/src/vec/data_types/serde/data_type_map_serde.h  |  5 +++
 .../data_types/serde/data_type_nullable_serde.cpp  | 38 +++++++++++++++++
 .../data_types/serde/data_type_nullable_serde.h    |  6 +++
 .../data_types/serde/data_type_number_serde.cpp    | 30 ++++++++++++++
 .../vec/data_types/serde/data_type_number_serde.h  |  5 +++
 be/src/vec/data_types/serde/data_type_serde.cpp    | 12 ++++++
 be/src/vec/data_types/serde/data_type_serde.h      |  6 +++
 .../data_types/serde/data_type_string_serde.cpp    | 11 +++++
 .../vec/data_types/serde/data_type_string_serde.h  |  3 ++
 .../data_types/serde/data_type_struct_serde.cpp    | 34 +++++++++++++++
 .../vec/data_types/serde/data_type_struct_serde.h  |  6 +++
 be/src/vec/sink/vmysql_result_writer.cpp           | 22 +++++++---
 17 files changed, 283 insertions(+), 6 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 431fc153a4d..ca80647344d 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
@@ -596,4 +596,44 @@ void DataTypeArraySerDe::to_string(const IColumn& column, 
size_t row_num,
     bw.write("]", 1);
 }
 
+bool DataTypeArraySerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                     int64_t row_idx) const {
+    const auto& data_column = assert_cast<const ColumnArray&>(column);
+    const auto& offsets = data_column.get_offsets();
+
+    size_t offset = offsets[row_idx - 1];
+    size_t next_offset = offsets[row_idx];
+
+    const IColumn& nested_column = data_column.get_data();
+    bw.write("[", 1);
+    for (size_t i = offset; i < next_offset; ++i) {
+        if (i != offset) {
+            bw.write(", ", 2);
+        }
+        nested_serde->write_column_to_presto_text(nested_column, bw, i);
+    }
+    bw.write("]", 1);
+    return true;
+}
+
+bool DataTypeArraySerDe::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                                   int64_t row_idx) const {
+    const auto& data_column = assert_cast<const ColumnArray&>(column);
+    const auto& offsets = data_column.get_offsets();
+
+    size_t offset = offsets[row_idx - 1];
+    size_t next_offset = offsets[row_idx];
+
+    const IColumn& nested_column = data_column.get_data();
+    bw.write("[", 1);
+    for (size_t i = offset; i < next_offset; ++i) {
+        if (i != offset) {
+            bw.write(",", 1);
+        }
+        nested_serde->write_column_to_hive_text(nested_column, bw, i);
+    }
+    bw.write("]", 1);
+    return true;
+}
+
 } // namespace doris::vectorized
diff --git a/be/src/vec/data_types/serde/data_type_array_serde.h 
b/be/src/vec/data_types/serde/data_type_array_serde.h
index d215a72a33e..a1657be8558 100644
--- a/be/src/vec/data_types/serde/data_type_array_serde.h
+++ b/be/src/vec/data_types/serde/data_type_array_serde.h
@@ -97,6 +97,12 @@ public:
                                       int64_t row_idx, bool col_const,
                                       const FormatOptions& options) const 
override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+
+    bool write_column_to_hive_text(const IColumn& column, BufferWritable& bw,
+                                   int64_t row_idx) const override;
+
     Status write_column_to_orc(const std::string& timezone, const IColumn& 
column,
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
diff --git a/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp 
b/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp
index 609bab36e03..930d30dacc7 100644
--- a/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_jsonb_serde.cpp
@@ -367,5 +367,19 @@ void DataTypeJsonbSerDe::to_string(const IColumn& column, 
size_t row_num,
         bw.write("NULL", 4);
     }
 }
+
+bool DataTypeJsonbSerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                     int64_t row_idx) const {
+    const auto& col = assert_cast<const ColumnString&, 
TypeCheckOnRelease::DISABLE>(column);
+    const auto& data_ref = col.get_data_at(row_idx);
+    if (data_ref.size > 0) {
+        std::string str = JsonbToJson::jsonb_to_json_string(data_ref.data, 
data_ref.size);
+        bw.write(str.c_str(), str.size());
+    } else {
+        bw.write("NULL", 4);
+    }
+    return true;
+}
+
 } // namespace vectorized
 } // namespace doris
diff --git a/be/src/vec/data_types/serde/data_type_jsonb_serde.h 
b/be/src/vec/data_types/serde/data_type_jsonb_serde.h
index cab03032eea..f53df1d07b8 100644
--- a/be/src/vec/data_types/serde/data_type_jsonb_serde.h
+++ b/be/src/vec/data_types/serde/data_type_jsonb_serde.h
@@ -67,6 +67,9 @@ public:
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+
     Status write_column_to_pb(const IColumn& column, PValues& result, int64_t 
start,
                               int64_t end) const override;
 
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 22a6075f0d5..1a1068b34e3 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
@@ -715,5 +715,53 @@ void DataTypeMapSerDe::to_string(const IColumn& column, 
size_t row_num, BufferWr
     bw.write("}", 1);
 }
 
+bool DataTypeMapSerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                   int64_t row_idx) const {
+    const auto& map_column = assert_cast<const ColumnMap&>(column);
+    const ColumnArray::Offsets64& offsets = map_column.get_offsets();
+
+    size_t offset = offsets[row_idx - 1];
+    size_t next_offset = offsets[row_idx];
+
+    const IColumn& nested_keys_column = map_column.get_keys();
+    const IColumn& nested_values_column = map_column.get_values();
+    bw.write("{", 1);
+    for (size_t i = offset; i < next_offset; ++i) {
+        if (i != offset) {
+            bw.write(", ", 2);
+        }
+        key_serde->write_column_to_presto_text(nested_keys_column, bw, i);
+        bw.write("=", 1);
+        value_serde->write_column_to_presto_text(nested_values_column, bw, i);
+    }
+    bw.write("}", 1);
+
+    return true;
+}
+
+bool DataTypeMapSerDe::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                                 int64_t row_idx) const {
+    const auto& map_column = assert_cast<const ColumnMap&>(column);
+    const ColumnArray::Offsets64& offsets = map_column.get_offsets();
+
+    size_t offset = offsets[row_idx - 1];
+    size_t next_offset = offsets[row_idx];
+
+    const IColumn& nested_keys_column = map_column.get_keys();
+    const IColumn& nested_values_column = map_column.get_values();
+    bw.write("{", 1);
+    for (size_t i = offset; i < next_offset; ++i) {
+        if (i != offset) {
+            bw.write(",", 1);
+        }
+        key_serde->write_column_to_hive_text(nested_keys_column, bw, i);
+        bw.write(":", 1);
+        value_serde->write_column_to_hive_text(nested_values_column, bw, i);
+    }
+    bw.write("}", 1);
+
+    return true;
+}
+
 } // namespace vectorized
 } // namespace doris
diff --git a/be/src/vec/data_types/serde/data_type_map_serde.h 
b/be/src/vec/data_types/serde/data_type_map_serde.h
index f45e5e18177..241564bcaf9 100644
--- a/be/src/vec/data_types/serde/data_type_map_serde.h
+++ b/be/src/vec/data_types/serde/data_type_map_serde.h
@@ -97,6 +97,11 @@ public:
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+    bool write_column_to_hive_text(const IColumn& column, BufferWritable& bw,
+                                   int64_t row_idx) const override;
+
     void set_return_object_as_string(bool value) override {
         DataTypeSerDe::set_return_object_as_string(value);
         key_serde->set_return_object_as_string(value);
diff --git a/be/src/vec/data_types/serde/data_type_nullable_serde.cpp 
b/be/src/vec/data_types/serde/data_type_nullable_serde.cpp
index 6e9b29c918b..187a5c4e27d 100644
--- a/be/src/vec/data_types/serde/data_type_nullable_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_nullable_serde.cpp
@@ -363,6 +363,44 @@ bool 
DataTypeNullableSerDe::write_column_to_mysql_text(const IColumn& column, Bu
     }
 }
 
+bool DataTypeNullableSerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                        int64_t row_idx) const 
{
+    if (column.is_null_at(row_idx)) {
+        if (_nesting_level > 1) {
+            // if is nested type
+            //  array: [abc, def, , NULL]
+            //  map: {k1=NULL, k2=v3}
+            bw.write("NULL", 4);
+            return true;
+        } else {
+            // NULL
+            return false;
+        }
+    } else {
+        const auto& col = assert_cast<const ColumnNullable&>(column);
+        return 
nested_serde->write_column_to_presto_text(col.get_nested_column(), bw, row_idx);
+    }
+}
+
+bool DataTypeNullableSerDe::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                                      int64_t row_idx) const {
+    if (column.is_null_at(row_idx)) {
+        if (_nesting_level > 1) {
+            // if is nested type
+            //  array: ["abc","def","",null]
+            //  map: {"k1":null,"k2":"v3"}
+            bw.write("null", 4);
+            return true;
+        } else {
+            // NULL
+            return false;
+        }
+    } else {
+        const auto& col = assert_cast<const ColumnNullable&>(column);
+        return 
nested_serde->write_column_to_hive_text(col.get_nested_column(), bw, row_idx);
+    }
+}
+
 template <bool is_binary_format>
 Status DataTypeNullableSerDe::_write_column_to_mysql(const IColumn& column,
                                                      
MysqlRowBuffer<is_binary_format>& result,
diff --git a/be/src/vec/data_types/serde/data_type_nullable_serde.h 
b/be/src/vec/data_types/serde/data_type_nullable_serde.h
index e85bea68a25..5033f83cc67 100644
--- a/be/src/vec/data_types/serde/data_type_nullable_serde.h
+++ b/be/src/vec/data_types/serde/data_type_nullable_serde.h
@@ -98,6 +98,12 @@ public:
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+
+    bool write_column_to_hive_text(const IColumn& column, BufferWritable& bw,
+                                   int64_t row_idx) const override;
+
     void set_return_object_as_string(bool value) override {
         DataTypeSerDe::set_return_object_as_string(value);
         nested_serde->set_return_object_as_string(value);
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 753c863e8d4..92c89ff1011 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
@@ -931,6 +931,36 @@ void DataTypeNumberSerDe<T>::to_string(const IColumn& 
column, size_t row_num,
     }
 }
 
+template <PrimitiveType T>
+bool DataTypeNumberSerDe<T>::write_column_to_presto_text(const IColumn& 
column, BufferWritable& bw,
+                                                         int64_t row_idx) 
const {
+    auto& data = assert_cast<const ColumnType&, 
TypeCheckOnRelease::DISABLE>(column).get_data();
+    value_to_string<T>(data[row_idx], bw, get_scale());
+    return true;
+}
+
+template <PrimitiveType T>
+bool DataTypeNumberSerDe<T>::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                                       int64_t row_idx) const {
+    auto& data = assert_cast<const ColumnType&, 
TypeCheckOnRelease::DISABLE>(column).get_data();
+    if constexpr (is_date_type(T) || is_time_type(T) || is_ip(T)) {
+        if (_nesting_level > 1) {
+            bw.write('"');
+        }
+        value_to_string<T>(data[row_idx], bw, get_scale());
+        if (_nesting_level > 1) {
+            bw.write('"');
+        }
+    } else if constexpr (T == TYPE_BOOLEAN) {
+        // In Hive, boolean values are represented as 'true' and 'false' 
strings.
+        std::string bool_value = data[row_idx] ? "true" : "false";
+        bw.write(bool_value.data(), bool_value.size());
+    } else {
+        value_to_string<T>(data[row_idx], bw, get_scale());
+    }
+    return true;
+}
+
 template <PrimitiveType T>
 void DataTypeNumberSerDe<T>::to_string_batch(const IColumn& column, 
ColumnString& column_to) const {
     auto& data = assert_cast<const ColumnType&>(column).get_data();
diff --git a/be/src/vec/data_types/serde/data_type_number_serde.h 
b/be/src/vec/data_types/serde/data_type_number_serde.h
index 9af5498a8dd..c3da442d05c 100644
--- a/be/src/vec/data_types/serde/data_type_number_serde.h
+++ b/be/src/vec/data_types/serde/data_type_number_serde.h
@@ -130,6 +130,11 @@ public:
     void write_one_cell_to_binary(const IColumn& src_column, 
ColumnString::Chars& chars,
                                   int64_t row_num) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+    bool write_column_to_hive_text(const IColumn& column, BufferWritable& bw,
+                                   int64_t row_idx) const override;
+
     void to_string(const IColumn& column, size_t row_num, BufferWritable& bw) 
const override;
 
     void to_string_batch(const IColumn& column, ColumnString& column_to) const 
override;
diff --git a/be/src/vec/data_types/serde/data_type_serde.cpp 
b/be/src/vec/data_types/serde/data_type_serde.cpp
index 1eb86a78ea2..6a190140ae6 100644
--- a/be/src/vec/data_types/serde/data_type_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_serde.cpp
@@ -141,6 +141,18 @@ bool DataTypeSerDe::write_column_to_mysql_text(const 
IColumn& column, BufferWrit
     return true;
 }
 
+bool DataTypeSerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                int64_t row_idx) const {
+    to_string(column, row_idx, bw);
+    return true;
+}
+
+bool DataTypeSerDe::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                              int64_t row_idx) const {
+    to_string(column, row_idx, bw);
+    return true;
+}
+
 const std::string DataTypeSerDe::NULL_IN_COMPLEX_TYPE = "null";
 const std::string DataTypeSerDe::NULL_IN_CSV_FOR_ORDINARY_TYPE = "\\N";
 
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 03a71368cb4..61c56cc9f82 100644
--- a/be/src/vec/data_types/serde/data_type_serde.h
+++ b/be/src/vec/data_types/serde/data_type_serde.h
@@ -436,6 +436,12 @@ public:
     virtual bool write_column_to_mysql_text(const IColumn& column, 
BufferWritable& bw,
                                             int64_t row_idx) const;
 
+    virtual bool write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                             int64_t row_idx) const;
+
+    virtual bool write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                           int64_t row_idx) const;
+
     virtual Status write_column_to_mysql_binary(const IColumn& column,
                                                 MysqlRowBinaryBuffer& 
row_buffer, int64_t row_idx,
                                                 bool col_const,
diff --git a/be/src/vec/data_types/serde/data_type_string_serde.cpp 
b/be/src/vec/data_types/serde/data_type_string_serde.cpp
index 3b80d707151..f69c7a79aa2 100644
--- a/be/src/vec/data_types/serde/data_type_string_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_string_serde.cpp
@@ -448,6 +448,17 @@ void DataTypeStringSerDeBase<ColumnType>::to_string(const 
IColumn& column, size_
     }
 }
 
+template <typename ColumnType>
+bool DataTypeStringSerDeBase<ColumnType>::write_column_to_presto_text(const 
IColumn& column,
+                                                                      
BufferWritable& bw,
+                                                                      int64_t 
row_idx) const {
+    const auto& value =
+            assert_cast<const ColumnType&, 
TypeCheckOnRelease::DISABLE>(column).get_data_at(
+                    row_idx);
+    bw.write(value.data, value.size);
+    return true;
+}
+
 template <typename ColumnType>
 Status DataTypeStringSerDeBase<ColumnType>::from_string(StringRef& str, 
IColumn& column,
                                                         const FormatOptions& 
options) const {
diff --git a/be/src/vec/data_types/serde/data_type_string_serde.h 
b/be/src/vec/data_types/serde/data_type_string_serde.h
index 5ef482d950e..880a14f11c3 100644
--- a/be/src/vec/data_types/serde/data_type_string_serde.h
+++ b/be/src/vec/data_types/serde/data_type_string_serde.h
@@ -215,6 +215,9 @@ public:
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+
     void write_one_cell_to_binary(const IColumn& src_column, 
ColumnString::Chars& chars,
                                   int64_t row_num) const override {
         const uint8_t type = 
static_cast<uint8_t>(FieldType::OLAP_FIELD_TYPE_STRING);
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 18b77fe2367..85dd0c12eb1 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
@@ -671,5 +671,39 @@ void DataTypeStructSerDe::to_string(const IColumn& column, 
size_t row_num,
     bw.write("}", 1);
 }
 
+bool DataTypeStructSerDe::write_column_to_presto_text(const IColumn& column, 
BufferWritable& bw,
+                                                      int64_t row_idx) const {
+    const auto& struct_column = assert_cast<const ColumnStruct&>(column);
+    bw.write("{", 1);
+    for (size_t idx = 0; idx < elem_serdes_ptrs.size(); idx++) {
+        if (idx != 0) {
+            bw.write(", ", 2);
+        }
+        std::string col_name = elem_names[idx] + "=";
+        bw.write(col_name.c_str(), col_name.length());
+        
elem_serdes_ptrs[idx]->write_column_to_presto_text(struct_column.get_column(idx),
 bw,
+                                                           row_idx);
+    }
+    bw.write("}", 1);
+    return true;
+}
+
+bool DataTypeStructSerDe::write_column_to_hive_text(const IColumn& column, 
BufferWritable& bw,
+                                                    int64_t row_idx) const {
+    const auto& struct_column = assert_cast<const ColumnStruct&>(column);
+    bw.write("{", 1);
+    for (size_t idx = 0; idx < elem_serdes_ptrs.size(); idx++) {
+        if (idx != 0) {
+            bw.write(",", 1);
+        }
+        std::string col_name = "\"" + elem_names[idx] + "\":";
+        bw.write(col_name.c_str(), col_name.length());
+        
elem_serdes_ptrs[idx]->write_column_to_hive_text(struct_column.get_column(idx), 
bw,
+                                                         row_idx);
+    }
+    bw.write("}", 1);
+    return true;
+}
+
 } // namespace vectorized
 } // namespace doris
diff --git a/be/src/vec/data_types/serde/data_type_struct_serde.h 
b/be/src/vec/data_types/serde/data_type_struct_serde.h
index 3d09f652f88..c31d423b93c 100644
--- a/be/src/vec/data_types/serde/data_type_struct_serde.h
+++ b/be/src/vec/data_types/serde/data_type_struct_serde.h
@@ -98,6 +98,12 @@ public:
                                const NullMap* null_map, 
orc::ColumnVectorBatch* orc_col_batch,
                                int64_t start, int64_t end, vectorized::Arena& 
arena) const override;
 
+    bool write_column_to_presto_text(const IColumn& column, BufferWritable& bw,
+                                     int64_t row_idx) const override;
+
+    bool write_column_to_hive_text(const IColumn& column, BufferWritable& bw,
+                                   int64_t row_idx) const override;
+
     Status serialize_column_to_jsonb(const IColumn& from_column, int64_t 
row_num,
                                      JsonbWriter& writer) const override;
 
diff --git a/be/src/vec/sink/vmysql_result_writer.cpp 
b/be/src/vec/sink/vmysql_result_writer.cpp
index fad638b0374..9f6a2af472c 100644
--- a/be/src/vec/sink/vmysql_result_writer.cpp
+++ b/be/src/vec/sink/vmysql_result_writer.cpp
@@ -269,20 +269,30 @@ Status 
VMysqlResultWriter<is_binary_format>::_write_one_block(RuntimeState* stat
                         num_rows, argument.column->get_name(), 
argument.column->size());
             }
         }
-
-        const auto& serde_dialect = state->query_options().serde_dialect;
-
         auto mysql_output_tmp_col = ColumnString::create();
         BufferWriter write_buffer(*mysql_output_tmp_col);
         size_t write_buffer_index = 0;
-        if (serde_dialect == TSerdeDialect::DORIS && !is_binary_format) {
+        if (!is_binary_format) {
+            const auto& serde_dialect = state->query_options().serde_dialect;
+            auto write_to_text = [serde_dialect](DataTypeSerDeSPtr& serde, 
const IColumn* column,
+                                                 BufferWriter& write_buffer, 
size_t col_index) {
+                if (serde_dialect == TSerdeDialect::DORIS) {
+                    return serde->write_column_to_mysql_text(*column, 
write_buffer, col_index);
+                } else if (serde_dialect == TSerdeDialect::PRESTO) {
+                    return serde->write_column_to_presto_text(*column, 
write_buffer, col_index);
+                } else if (serde_dialect == TSerdeDialect::HIVE) {
+                    return serde->write_column_to_hive_text(*column, 
write_buffer, col_index);
+                } else {
+                    return false;
+                }
+            };
+
             for (int row_idx = 0; row_idx < num_rows; ++row_idx) {
                 auto& mysql_rows = result->result_batch.rows[row_idx];
                 for (size_t col_idx = 0; col_idx < num_cols; ++col_idx) {
                     const auto col_index = index_check_const(row_idx, 
arguments[col_idx].is_const);
                     const auto* column = arguments[col_idx].column;
-                    if 
(arguments[col_idx].serde->write_column_to_mysql_text(*column, write_buffer,
-                                                                             
col_index)) {
+                    if (write_to_text(arguments[col_idx].serde, column, 
write_buffer, col_index)) {
                         write_buffer.commit();
                         auto str = 
mysql_output_tmp_col->get_data_at(write_buffer_index);
                         direct_write_to_mysql_result_string(mysql_rows, 
str.data, str.size);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to