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

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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 35651eb33ce [fix](array_range) fix array_range func for large param 
which should return error #38284 (#38712)
35651eb33ce is described below

commit 35651eb33ce7f82fda11e030f05c5a8431356ddf
Author: amory <[email protected]>
AuthorDate: Thu Aug 1 23:24:07 2024 +0800

    [fix](array_range) fix array_range func for large param which should return 
error #38284 (#38712)
---
 .../vec/functions/array/function_array_range.cpp   | 25 +++++++++++++++-------
 .../array_functions/test_array_functions.groovy    | 16 +++++++++++++-
 2 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/be/src/vec/functions/array/function_array_range.cpp 
b/be/src/vec/functions/array/function_array_range.cpp
index 356941e2616..874614a5a3e 100644
--- a/be/src/vec/functions/array/function_array_range.cpp
+++ b/be/src/vec/functions/array/function_array_range.cpp
@@ -122,9 +122,9 @@ struct RangeImplUtil {
         dest_nested_column->reserve(input_rows_count);
         dest_nested_null_map.reserve(input_rows_count);
 
-        vector(start_column->get_data(), end_column->get_data(), 
step_column->get_data(),
-               args_null_map->get_data(), nested_column->get_data(), 
dest_nested_null_map,
-               dest_offsets);
+        RETURN_IF_ERROR(vector(start_column->get_data(), 
end_column->get_data(),
+                               step_column->get_data(), 
args_null_map->get_data(),
+                               nested_column->get_data(), 
dest_nested_null_map, dest_offsets));
 
         block.get_by_position(result).column =
                 ColumnNullable::create(std::move(dest_array_column_ptr), 
std::move(args_null_map));
@@ -132,11 +132,11 @@ struct RangeImplUtil {
     }
 
 private:
-    static void vector(const PaddedPODArray<Int32>& start, const 
PaddedPODArray<Int32>& end,
-                       const PaddedPODArray<Int32>& step, NullMap& 
args_null_map,
-                       PaddedPODArray<Int32>& nested_column,
-                       PaddedPODArray<UInt8>& dest_nested_null_map,
-                       ColumnArray::Offsets64& dest_offsets) {
+    static Status vector(const PaddedPODArray<Int32>& start, const 
PaddedPODArray<Int32>& end,
+                         const PaddedPODArray<Int32>& step, NullMap& 
args_null_map,
+                         PaddedPODArray<Int32>& nested_column,
+                         PaddedPODArray<UInt8>& dest_nested_null_map,
+                         ColumnArray::Offsets64& dest_offsets) {
         int rows = start.size();
         for (auto row = 0; row < rows; ++row) {
             if (args_null_map[row] || start[row] < 0 || end[row] < 0 || 
step[row] < 0) {
@@ -145,6 +145,14 @@ private:
                 dest_nested_null_map.push_back(1);
                 args_null_map[row] = 1;
             } else {
+                // to avoid large array make oom
+                if (start[row] < end[row] && step[row] > 0 &&
+                    ((static_cast<__int128_t>(end[row]) - 
static_cast<__int128_t>(step[row]) - 1) /
+                             static_cast<__int128_t>(step[row]) +
+                     1) > max_array_size_as_field) {
+                    return Status::InvalidArgument("Array size exceeds the 
limit {}",
+                                                   max_array_size_as_field);
+                }
                 int offset = dest_offsets.back();
                 for (auto idx = start[row]; idx < end[row]; idx = idx + 
step[row]) {
                     nested_column.push_back(idx);
@@ -154,6 +162,7 @@ private:
                 dest_offsets.push_back(offset);
             }
         }
+        return Status::OK();
     }
 };
 
diff --git 
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
 
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
index f278483e707..56ab9a7c3c1 100644
--- 
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_functions.groovy
@@ -337,5 +337,19 @@ suite("test_array_functions") {
             (12, 1.200, 1.200000000  , 1.200, 1.20000, 1.200000000, 
[1.200000000, 1.200000000]); """
 
     qt_sql """ select array_position(kadcml, kdcmls1), kadcml, kdcmls1 from 
fn_test;"""
-
+    // test large size of array
+    test {
+        sql """ select sequence(1, 10000000000); """
+        check{result, exception, startTime, endTime ->
+            assertTrue(exception != null)
+            logger.info(exception.message)
+        }
+    }
+    test {
+        sql """ select sequence(1, 10000000000, 2); """
+        check{result, exception, startTime, endTime ->
+            assertTrue(exception != null)
+            logger.info(exception.message)
+        }
+    }
 }


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

Reply via email to