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]