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

zouxinyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 123c649328c [fix](memory) Fix `PODArray::add_num_element` (#50756)
123c649328c is described below

commit 123c649328cb84f6394db29a149b11fdc5809c9b
Author: Xinyi Zou <zouxi...@selectdb.com>
AuthorDate: Sat May 10 15:23:39 2025 +0800

    [fix](memory) Fix `PODArray::add_num_element` (#50756)
    
    ### What problem does this PR solve?
    
    In `add_num_element`, after `reserve`, the value of `c_end` will be
    changed.
---
 be/src/vec/common/pod_array.h         |  6 +++---
 be/test/vec/common/pod_array_test.cpp | 26 ++++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/be/src/vec/common/pod_array.h b/be/src/vec/common/pod_array.h
index df379b5f54f..a8abce8385f 100644
--- a/be/src/vec/common/pod_array.h
+++ b/be/src/vec/common/pod_array.h
@@ -413,12 +413,12 @@ public:
     template <typename U, typename... TAllocatorParams>
     void add_num_element(U&& x, uint32_t num, TAllocatorParams&&... 
allocator_params) {
         if (num != 0) {
-            const auto new_end = this->c_end + this->byte_size(num);
-            if (UNLIKELY(new_end > this->c_end_of_storage)) {
+            const auto growth_size = this->byte_size(num);
+            if (UNLIKELY(this->c_end + growth_size > this->c_end_of_storage)) {
                 this->reserve(this->size() + num);
             }
             std::fill(t_end(), t_end() + num, x);
-            this->c_end = new_end;
+            this->c_end = this->c_end + growth_size;
         }
     }
 
diff --git a/be/test/vec/common/pod_array_test.cpp 
b/be/test/vec/common/pod_array_test.cpp
index e8b0a67ffa0..db022a12729 100644
--- a/be/test/vec/common/pod_array_test.cpp
+++ b/be/test/vec/common/pod_array_test.cpp
@@ -498,6 +498,32 @@ TEST(PODArrayTest, PODArrayInsert) {
 //     }
 // }
 
+TEST(PODArrayTest, PODArrayAddNumElement) {
+    static constexpr size_t initial_bytes = 32;
+    using Array = vectorized::PODArray<uint64_t, initial_bytes>;
+    size_t element_size = 8; // sizeof(uint64_t)
+    {
+        Array array;
+
+        array.add_num_element(1, 4);
+        ASSERT_EQ(array.size(), 4);
+        ASSERT_EQ(array.capacity(), 32 / element_size);
+        ASSERT_EQ(array, Array({1, 1, 1, 1}));
+
+        // call reserve
+        array.add_num_element(1, 2);
+        ASSERT_EQ(array.size(), 6);
+        ASSERT_EQ(array.capacity(), 64 / element_size);
+        ASSERT_EQ(array, Array({1, 1, 1, 1, 1, 1}));
+
+        // call reserve
+        array.add_num_element_without_reserve(1, 1);
+        ASSERT_EQ(array.size(), 7);
+        ASSERT_EQ(array.capacity(), 64 / element_size);
+        ASSERT_EQ(array, Array({1, 1, 1, 1, 1, 1, 1}));
+    }
+}
+
 TEST(PODArrayTest, PODArrayAssign) {
     {
         vectorized::PaddedPODArray<uint64_t> array;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to