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

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


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new e04a4aac216 [fix](serde)fix write to orc file  (#52884)
e04a4aac216 is described below

commit e04a4aac216b94c7ef6fa0a274ad9e5fb8fcf77b
Author: amory <[email protected]>
AuthorDate: Wed Jul 9 09:52:08 2025 +0800

    [fix](serde)fix write to orc file  (#52884)
    
    ### What problem does this PR solve?
    backport https://github.com/apache/doris/pull/52676
    Issue Number: close #xxx
---
 .../data_types/serde/data_type_bitmap_serde.cpp    | 34 +++++++++++---
 .../data_types/serde/data_type_date64_serde.cpp    | 46 +++++++++++++-----
 .../vec/data_types/serde/data_type_hll_serde.cpp   | 34 +++++++++++---
 .../vec/data_types/serde/data_type_ipv6_serde.cpp  | 47 ++++++++++++++-----
 .../vec/data_types/serde/data_type_jsonb_serde.cpp | 51 ++++++++++++++------
 .../data_types/serde/data_type_number_serde.cpp    | 37 ++++++++++++---
 .../data_types/serde/data_type_object_serde.cpp    | 54 +++++++++++++++-------
 .../serde/data_type_quantilestate_serde.h          | 34 +++++++++++---
 be/src/vec/data_types/serde/data_type_serde.h      | 25 ----------
 9 files changed, 257 insertions(+), 105 deletions(-)

diff --git a/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp 
b/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp
index f60d054df31..9697a3b71bb 100644
--- a/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_bitmap_serde.cpp
@@ -191,23 +191,43 @@ Status DataTypeBitMapSerDe::write_column_to_orc(const 
std::string& timezone, con
                                                 std::vector<StringRef>& 
buffer_list) const {
     auto& col_data = assert_cast<const ColumnBitmap&>(column);
     orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
-
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
         if (cur_batch->notNull[row_id] == 1) {
             auto bitmap_value = 
const_cast<BitmapValue&>(col_data.get_element(row_id));
             size_t len = bitmap_value.getSizeInBytes();
-
-            REALLOC_MEMORY_FOR_ORC_WRITER()
-
+            total_size += len;
+        }
+    }
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t row_id = start; row_id < end; row_id++) {
+        if (cur_batch->notNull[row_id] == 1) {
+            auto bitmap_value = 
const_cast<BitmapValue&>(col_data.get_element(row_id));
+            size_t len = bitmap_value.getSizeInBytes();
+            if (offset + len > total_size) {
+                return Status::InternalError(
+                        "Buffer overflow when writing column data to ORC file. 
offset {} with len "
+                        "{} exceed total_size {} . ",
+                        offset, len, total_size);
+            }
             bitmap_value.write_to(const_cast<char*>(bufferRef.data) + offset);
             cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
             cur_batch->length[row_id] = len;
             offset += len;
         }
     }
-
     cur_batch->numElements = end - start;
     return Status::OK();
 }
diff --git a/be/src/vec/data_types/serde/data_type_date64_serde.cpp 
b/be/src/vec/data_types/serde/data_type_date64_serde.cpp
index 1ce0ff54ac8..0aa81907180 100644
--- a/be/src/vec/data_types/serde/data_type_date64_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_date64_serde.cpp
@@ -324,23 +324,47 @@ Status DataTypeDate64SerDe::write_column_to_orc(const 
std::string& timezone, con
     auto& col_data = static_cast<const 
ColumnVector<Int64>&>(column).get_data();
     orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
 
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    std::vector<std::string> serialized_values;
+    std::vector<size_t> valid_row_indices;
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
-        if (cur_batch->notNull[row_id] == 0) {
-            continue;
+        if (cur_batch->notNull[row_id] == 1) {
+            char buf[64];
+            size_t len = binary_cast<Int64, 
VecDateTimeValue>(col_data[row_id]).to_buffer(buf);
+            total_size += len;
+            // avoid copy
+            serialized_values.emplace_back(buf, len);
+            valid_row_indices.push_back(row_id);
         }
-
-        int len = binary_cast<Int64, VecDateTimeValue>(col_data[row_id])
-                          .to_buffer(const_cast<char*>(bufferRef.data) + 
offset);
-
-        REALLOC_MEMORY_FOR_ORC_WRITER()
-
+    }
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t i = 0; i < serialized_values.size(); i++) {
+        const auto& serialized_value = serialized_values[i];
+        size_t row_id = valid_row_indices[i];
+        size_t len = serialized_value.length();
+        if (offset + len > total_size) {
+            return Status::InternalError(
+                    "Buffer overflow when writing column data to ORC file. 
offset {} with len {} "
+                    "exceed total_size {} . ",
+                    offset, len, total_size);
+        }
+        memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value.data(), len);
         cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + offset;
         cur_batch->length[row_id] = len;
         offset += len;
     }
-
     cur_batch->numElements = end - start;
     return Status::OK();
 }
diff --git a/be/src/vec/data_types/serde/data_type_hll_serde.cpp 
b/be/src/vec/data_types/serde/data_type_hll_serde.cpp
index aba3a9d0619..156e1dce7b6 100644
--- a/be/src/vec/data_types/serde/data_type_hll_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_hll_serde.cpp
@@ -184,23 +184,43 @@ Status DataTypeHLLSerDe::write_column_to_orc(const 
std::string& timezone, const
                                              int end, std::vector<StringRef>& 
buffer_list) const {
     auto& col_data = assert_cast<const ColumnHLL&>(column);
     orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
-
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
         if (cur_batch->notNull[row_id] == 1) {
             auto hll_value = 
const_cast<HyperLogLog&>(col_data.get_element(row_id));
             size_t len = hll_value.max_serialized_size();
-
-            REALLOC_MEMORY_FOR_ORC_WRITER()
-
+            total_size += len;
+        }
+    }
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t row_id = start; row_id < end; row_id++) {
+        if (cur_batch->notNull[row_id] == 1) {
+            auto hll_value = 
const_cast<HyperLogLog&>(col_data.get_element(row_id));
+            size_t len = hll_value.max_serialized_size();
+            if (offset + len > total_size) {
+                return Status::InternalError(
+                        "Buffer overflow when writing column data to ORC file. 
offset {} with len "
+                        "{} exceed total_size {} ",
+                        offset, len, total_size);
+            }
             hll_value.serialize((uint8_t*)(bufferRef.data) + offset);
             cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
             cur_batch->length[row_id] = len;
             offset += len;
         }
     }
-
     cur_batch->numElements = end - start;
     return Status::OK();
 }
diff --git a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp 
b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
index 83acbf9cda1..a25628f62b5 100644
--- a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
@@ -198,20 +198,45 @@ Status DataTypeIPv6SerDe::write_column_to_orc(const 
std::string& timezone, const
     const auto& col_data = assert_cast<const ColumnIPv6&>(column).get_data();
     orc::StringVectorBatch* cur_batch = 
assert_cast<orc::StringVectorBatch*>(orc_col_batch);
 
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    std::vector<std::string> serialized_values;
+    std::vector<size_t> valid_row_indices;
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
         if (cur_batch->notNull[row_id] == 1) {
-            std::string ipv6_str = IPv6Value::to_string(col_data[row_id]);
-            size_t len = ipv6_str.size();
-
-            REALLOC_MEMORY_FOR_ORC_WRITER()
-
-            strcpy(const_cast<char*>(bufferRef.data) + offset, 
ipv6_str.c_str());
-            cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
-            cur_batch->length[row_id] = len;
-            offset += len;
+            auto serialized_value = IPv6Value::to_string(col_data[row_id]);
+            serialized_values.push_back(std::move(serialized_value));
+            size_t len = serialized_values.back().length();
+            total_size += len;
+            valid_row_indices.push_back(row_id);
+        }
+    }
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t i = 0; i < serialized_values.size(); i++) {
+        const auto& serialized_value = serialized_values[i];
+        size_t row_id = valid_row_indices[i];
+        size_t len = serialized_value.length();
+        if (offset + len > total_size) {
+            return Status::InternalError(
+                    "Buffer overflow when writing column data to ORC file. 
offset {} with len {} "
+                    "exceed total_size {} . ",
+                    offset, len, total_size);
         }
+        memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value.data(), len);
+        cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + offset;
+        cur_batch->length[row_id] = len;
+        offset += len;
     }
 
     cur_batch->numElements = end - start;
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 eb6c783cf28..181669555d6 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
@@ -142,25 +142,48 @@ Status DataTypeJsonbSerDe::write_column_to_orc(const 
std::string& timezone, cons
                                                int end, 
std::vector<StringRef>& buffer_list) const {
     auto* cur_batch = dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
     const auto& string_column = assert_cast<const ColumnString&>(column);
-
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    std::vector<std::string> serialized_values;
+    std::vector<size_t> valid_row_indices;
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
         if (cur_batch->notNull[row_id] == 1) {
             std::string_view string_ref = 
string_column.get_data_at(row_id).to_string_view();
-            auto serialized_value = std::make_unique<std::string>(
-                    JsonbToJson::jsonb_to_json_string(string_ref.data(), 
string_ref.size()));
-            auto len = serialized_value->size();
-
-            REALLOC_MEMORY_FOR_ORC_WRITER()
-
-            memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value->data(), len);
-            cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
-            cur_batch->length[row_id] = len;
-            offset += len;
+            auto serialized_value =
+                    JsonbToJson::jsonb_to_json_string(string_ref.data(), 
string_ref.size());
+            serialized_values.push_back(std::move(serialized_value));
+            size_t len = serialized_values.back().length();
+            total_size += len;
+            valid_row_indices.push_back(row_id);
         }
     }
-
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t i = 0; i < serialized_values.size(); i++) {
+        const auto& serialized_value = serialized_values[i];
+        size_t row_id = valid_row_indices[i];
+        size_t len = serialized_value.length();
+        if (offset + len > total_size) {
+            return Status::InternalError(
+                    "Buffer overflow when writing column data to ORC file. 
offset {} with len {} "
+                    "exceed total_size {} . ",
+                    offset, len, total_size);
+        }
+        memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value.data(), len);
+        cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + offset;
+        cur_batch->length[row_id] = len;
+        offset += len;
+    }
     cur_batch->numElements = end - start;
     return Status::OK();
 }
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 20ce78bf9c2..c691c55d8d2 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
@@ -351,17 +351,40 @@ Status DataTypeNumberSerDe<T>::write_column_to_orc(const 
std::string& timezone,
 
     if constexpr (std::is_same_v<T, Int128>) { // largeint
         orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
-
-        INIT_MEMORY_FOR_ORC_WRITER()
-
+        // First pass: calculate total memory needed and collect serialized 
values
+        size_t total_size = 0;
         for (size_t row_id = start; row_id < end; row_id++) {
             if (cur_batch->notNull[row_id] == 1) {
                 std::string value_str = fmt::format("{}", col_data[row_id]);
                 size_t len = value_str.size();
-
-                REALLOC_MEMORY_FOR_ORC_WRITER()
-
-                strcpy(const_cast<char*>(bufferRef.data) + offset, 
value_str.c_str());
+                total_size += len;
+            }
+        }
+        // Allocate continues memory based on calculated size
+        char* ptr = (char*)malloc(total_size);
+        if (!ptr) {
+            return Status::InternalError(
+                    "malloc memory {} error when write variant column data to 
orc file.",
+                    total_size);
+        }
+        StringRef bufferRef;
+        bufferRef.data = ptr;
+        bufferRef.size = total_size;
+        buffer_list.emplace_back(bufferRef);
+        // Second pass: fill the data and update the batch
+        size_t offset = 0;
+        for (size_t row_id = start; row_id < end; row_id++) {
+            if (cur_batch->notNull[row_id] == 1) {
+                std::string value_str = fmt::format("{}", col_data[row_id]);
+                size_t len = value_str.size();
+                if (offset + len > total_size) {
+                    return Status::InternalError(
+                            "Buffer overflow when writing column data to ORC 
file. offset {} with "
+                            "len {} exceed total_size {} . ",
+                            offset, len, total_size);
+                }
+                // do not use strcpy here, because this buffer is not 
null-terminated
+                memcpy(const_cast<char*>(bufferRef.data) + offset, 
value_str.c_str(), len);
                 cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
                 cur_batch->length[row_id] = len;
                 offset += len;
diff --git a/be/src/vec/data_types/serde/data_type_object_serde.cpp 
b/be/src/vec/data_types/serde/data_type_object_serde.cpp
index 31d91444823..3a944904e54 100644
--- a/be/src/vec/data_types/serde/data_type_object_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_object_serde.cpp
@@ -208,27 +208,47 @@ Status DataTypeObjectSerDe::write_column_to_orc(const 
std::string& timezone, con
                                                 std::vector<StringRef>& 
buffer_list) const {
     const auto* var = check_and_get_column<ColumnObject>(column);
     orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
-
-    INIT_MEMORY_FOR_ORC_WRITER()
-
+    // First pass: calculate total memory needed and collect serialized values
+    std::vector<std::string> serialized_values;
+    std::vector<size_t> valid_row_indices;
+    size_t total_size = 0;
     for (size_t row_id = start; row_id < end; row_id++) {
         if (cur_batch->notNull[row_id] == 1) {
-            auto serialized_value = std::make_unique<std::string>();
-            if (!var->serialize_one_row_to_string(row_id, 
serialized_value.get())) {
-                throw doris::Exception(ErrorCode::INTERNAL_ERROR, "Failed to 
serialize variant {}",
-                                       var->dump_structure());
-            }
-            auto len = serialized_value->length();
-
-            REALLOC_MEMORY_FOR_ORC_WRITER()
-
-            memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value->data(), len);
-            cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
-            cur_batch->length[row_id] = len;
-            offset += len;
+            // avoid move the string data, use emplace_back to construct in 
place
+            serialized_values.emplace_back();
+            RETURN_IF_ERROR(var->serialize_one_row_to_string(row_id, 
&serialized_values.back()));
+            size_t len = serialized_values.back().length();
+            total_size += len;
+            valid_row_indices.push_back(row_id);
         }
     }
-
+    // Allocate continues memory based on calculated size
+    char* ptr = (char*)malloc(total_size);
+    if (!ptr) {
+        return Status::InternalError(
+                "malloc memory {} error when write variant column data to orc 
file.", total_size);
+    }
+    StringRef bufferRef;
+    bufferRef.data = ptr;
+    bufferRef.size = total_size;
+    buffer_list.emplace_back(bufferRef);
+    // Second pass: copy data to allocated memory
+    size_t offset = 0;
+    for (size_t i = 0; i < serialized_values.size(); i++) {
+        const auto& serialized_value = serialized_values[i];
+        size_t row_id = valid_row_indices[i];
+        size_t len = serialized_value.length();
+        if (offset + len > total_size) {
+            return Status::InternalError(
+                    "Buffer overflow when writing column data to ORC file. 
offset {} with len {} "
+                    "exceed total_size {} . ",
+                    offset, len, total_size);
+        }
+        memcpy(const_cast<char*>(bufferRef.data) + offset, 
serialized_value.data(), len);
+        cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + offset;
+        cur_batch->length[row_id] = len;
+        offset += len;
+    }
     cur_batch->numElements = end - start;
     return Status::OK();
 }
diff --git a/be/src/vec/data_types/serde/data_type_quantilestate_serde.h 
b/be/src/vec/data_types/serde/data_type_quantilestate_serde.h
index e24a3a29543..67530000810 100644
--- a/be/src/vec/data_types/serde/data_type_quantilestate_serde.h
+++ b/be/src/vec/data_types/serde/data_type_quantilestate_serde.h
@@ -154,16 +154,38 @@ public:
                                std::vector<StringRef>& buffer_list) const 
override {
         auto& col_data = assert_cast<const ColumnQuantileState&>(column);
         orc::StringVectorBatch* cur_batch = 
dynamic_cast<orc::StringVectorBatch*>(orc_col_batch);
-
-        INIT_MEMORY_FOR_ORC_WRITER()
-
+        // First pass: calculate total memory needed and collect serialized 
values
+        size_t total_size = 0;
         for (size_t row_id = start; row_id < end; row_id++) {
             if (cur_batch->notNull[row_id] == 1) {
                 auto quantilestate_value = 
const_cast<QuantileState&>(col_data.get_element(row_id));
                 size_t len = quantilestate_value.get_serialized_size();
-
-                REALLOC_MEMORY_FOR_ORC_WRITER()
-
+                total_size += len;
+            }
+        }
+        // Allocate continues memory based on calculated size
+        char* ptr = (char*)malloc(total_size);
+        if (!ptr) {
+            return Status::InternalError(
+                    "malloc memory {} error when write variant column data to 
orc file.",
+                    total_size);
+        }
+        StringRef bufferRef;
+        bufferRef.data = ptr;
+        bufferRef.size = total_size;
+        buffer_list.push_back(bufferRef);
+        // Second pass: copy data to allocated memory
+        size_t offset = 0;
+        for (size_t row_id = start; row_id < end; row_id++) {
+            if (cur_batch->notNull[row_id] == 1) {
+                auto quantilestate_value = 
const_cast<QuantileState&>(col_data.get_element(row_id));
+                size_t len = quantilestate_value.get_serialized_size();
+                if (offset + len > total_size) {
+                    return Status::InternalError(
+                            "Buffer overflow when writing column data to ORC 
file. offset {} with "
+                            "len {} exceed total_size {} . ",
+                            offset, len, total_size);
+                }
                 quantilestate_value.serialize((uint8_t*)(bufferRef.data) + 
offset);
                 cur_batch->data[row_id] = const_cast<char*>(bufferRef.data) + 
offset;
                 cur_batch->length[row_id] = len;
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 f7446d5c52a..d9da4dd872c 100644
--- a/be/src/vec/data_types/serde/data_type_serde.h
+++ b/be/src/vec/data_types/serde/data_type_serde.h
@@ -75,31 +75,6 @@ struct ColumnVectorBatch;
         ++*num_deserialized;                                                   
          \
     }
 
-#define INIT_MEMORY_FOR_ORC_WRITER()                                           
      \
-    char* ptr = (char*)malloc(BUFFER_UNIT_SIZE);                               
      \
-    if (!ptr) {                                                                
      \
-        return Status::InternalError(                                          
      \
-                "malloc memory error when write largeint column data to orc 
file."); \
-    }                                                                          
      \
-    StringRef bufferRef;                                                       
      \
-    bufferRef.data = ptr;                                                      
      \
-    bufferRef.size = BUFFER_UNIT_SIZE;                                         
      \
-    size_t offset = 0;                                                         
      \
-    buffer_list.emplace_back(bufferRef);
-
-#define REALLOC_MEMORY_FOR_ORC_WRITER()                                        
          \
-    while (bufferRef.size - BUFFER_RESERVED_SIZE < offset + len) {             
          \
-        char* new_ptr = (char*)malloc(bufferRef.size + BUFFER_UNIT_SIZE);      
          \
-        if (!new_ptr) {                                                        
          \
-            return Status::InternalError(                                      
          \
-                    "malloc memory error when write largeint column data to 
orc file."); \
-        }                                                                      
          \
-        memcpy(new_ptr, bufferRef.data, bufferRef.size);                       
          \
-        free(const_cast<char*>(bufferRef.data));                               
          \
-        bufferRef.data = new_ptr;                                              
          \
-        bufferRef.size = bufferRef.size + BUFFER_UNIT_SIZE;                    
          \
-    }
-
 namespace doris {
 class PValues;
 class JsonbValue;


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

Reply via email to