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 20279a25390 [cherry-pick](branch-30) pick (#50913) (#51073)
20279a25390 is described below
commit 20279a253901c033cca5e283de28c8e2909b03b6
Author: zhangstar333 <[email protected]>
AuthorDate: Wed Jun 11 11:16:35 2025 +0800
[cherry-pick](branch-30) pick (#50913) (#51073)
### What problem does this PR solve?
Problem Summary:
pick from master (#50913)
---
.../exprs/lambda_function/varray_map_function.cpp | 17 +++++++-------
.../array_functions/test_array_map_function.out | Bin 2417 -> 2522 bytes
.../array_functions/test_array_map_function.groovy | 26 +++++++++++++++++++++
3 files changed, 35 insertions(+), 8 deletions(-)
diff --git a/be/src/vec/exprs/lambda_function/varray_map_function.cpp
b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
index 63b47f0bb22..23050b6593c 100644
--- a/be/src/vec/exprs/lambda_function/varray_map_function.cpp
+++ b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
@@ -159,20 +159,20 @@ public:
}
// here is the array column
- const ColumnArray& col_array = assert_cast<const
ColumnArray&>(*column_array);
+ const auto& col_array = assert_cast<const
ColumnArray&>(*column_array);
const auto& col_type = assert_cast<const
DataTypeArray&>(*type_array);
if (i == 0) {
nested_array_column_rows = col_array.get_data_ptr()->size();
first_array_offsets = col_array.get_offsets_ptr();
- auto& off_data = assert_cast<const
ColumnArray::ColumnOffsets&>(
+ const auto& off_data = assert_cast<const
ColumnArray::ColumnOffsets&>(
col_array.get_offsets_column());
array_column_offset =
off_data.clone_resized(col_array.get_offsets_column().size());
args.offsets_ptr = &col_array.get_offsets();
} else {
// select array_map((x,y)->x+y,c_array1,[0,1,2,3]) from
array_test2;
// c_array1: [0,1,2,3,4,5,6,7,8,9]
- auto& array_offsets =
+ const auto& array_offsets =
assert_cast<const
ColumnArray::ColumnOffsets&>(*first_array_offsets)
.get_data();
if (nested_array_column_rows !=
col_array.get_data_ptr()->size() ||
@@ -198,9 +198,10 @@ public:
//process first row
args.array_start = (*args.offsets_ptr)[args.current_row_idx - 1];
- args.cur_size = (*args.offsets_ptr)[args.current_row_idx] -
args.array_start;
-
- while (args.current_row_idx < block->rows()) {
+ args.cur_size = (*args.offsets_ptr).size()
+ ? (*args.offsets_ptr)[args.current_row_idx] -
args.array_start
+ : 0;
+ do {
Block lambda_block;
for (int i = 0; i < names.size(); i++) {
ColumnWithTypeAndName data_column;
@@ -220,7 +221,7 @@ public:
long current_step =
std::min(max_step, (long)(args.cur_size -
args.current_offset_in_array));
size_t pos = args.array_start + args.current_offset_in_array;
- for (int i = 0; i < arguments.size(); ++i) {
+ for (int i = 0; i < arguments.size() && current_step > 0; ++i)
{
columns[gap + i]->insert_range_from(*lambda_datas[i], pos,
current_step);
}
args.current_offset_in_array += current_step;
@@ -256,7 +257,7 @@ public:
MutableColumnPtr column = (*std::move(result_col)).mutate();
column->insert_range_from(*res_col, 0, res_col->size());
}
- }
+ } while (args.current_row_idx < block->rows());
//4. get the result column after execution, reassemble it into a new
array column, and return.
ColumnWithTypeAndName result_arr;
diff --git
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_map_function.out
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_map_function.out
index 39649ca512e..211092f3875 100644
Binary files
a/regression-test/data/query_p0/sql_functions/array_functions/test_array_map_function.out
and
b/regression-test/data/query_p0/sql_functions/array_functions/test_array_map_function.out
differ
diff --git
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_map_function.groovy
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_map_function.groovy
index 17de93942bf..acf6dba0600 100644
---
a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_map_function.groovy
+++
b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_map_function.groovy
@@ -103,4 +103,30 @@ suite("test_array_map_function") {
}
sql "DROP TABLE IF EXISTS ${tableName}"
+
+sql "DROP TABLE IF EXISTS array_map_test"
+ sql """ CREATE TABLE IF NOT EXISTS array_map_test (
+ id INT,
+ int_array ARRAY<INT>,
+ string_array ARRAY<STRING>,
+ double_array ARRAY<DOUBLE>,
+ nested_array ARRAY<ARRAY<INT>>,
+ nullable_array ARRAY<INT> NULL
+ ) ENGINE=OLAP
+ DUPLICATE KEY(id)
+ DISTRIBUTED BY HASH(id) BUCKETS 10
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+ sql """ INSERT INTO array_map_test VALUES
+ (1, [1,2,3], ['a','b','c'], [1.1,2.2,3.3], [[1,2],[3,4]], NULL),
+ (2, [10,20], ['x','y'], [10.5,20.5], [[5,6],[7,8]], [1,2,3]),
+ (3, [], [], [], [], []),
+ (4, [100,200,300], ['one','two','three'], [100.1,200.2,300.3],
[[9,10],[11,12]], [4,5,6]),
+ (5, [5], ['single'], [5.5], [[13]], [7]);
+ """
+ qt_select_25 """
+ SELECT id, array_map(x -> array_map(y -> y * 10, x), nested_array)
FROM array_map_test order by id;
+ """
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]