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 709d4a79878dd9..a5673cff0aa445 100644 --- a/be/src/vec/exprs/lambda_function/varray_map_function.cpp +++ b/be/src/vec/exprs/lambda_function/varray_map_function.cpp @@ -139,6 +139,36 @@ class ArrayMapFunction : public LambdaFunction { lambda_block.insert(std::move(data_column)); } + ColumnWithTypeAndName result_arr; + if (std::any_of(lambda_block.begin(), lambda_block.end(), [](const auto& v) { + DCHECK(v.column != nullptr); + return v.column->empty(); + })) { + DataTypePtr nested_type; + bool is_nullable = result_type->is_nullable(); + if (is_nullable) { + nested_type = + assert_cast(result_type.get())->get_nested_type(); + } else { + nested_type = result_type; + } + auto empty_nested_column = assert_cast(nested_type.get()) + ->get_nested_type() + ->create_column(); + auto result_array_column = ColumnArray::create(std::move(empty_nested_column), + std::move(array_column_offset)); + if (is_nullable) { + result_arr = {ColumnNullable::create(std::move(result_array_column), + std::move(outside_null_map)), + result_type, "Result"}; + } else { + result_arr = {std::move(result_array_column), result_type, "Result"}; + } + + block->insert(std::move(result_arr)); + *result_column_id = block->columns() - 1; + return Status::OK(); + } //3. child[0]->execute(new_block) RETURN_IF_ERROR(children[0]->execute(context, &lambda_block, result_column_id)); @@ -148,7 +178,7 @@ class ArrayMapFunction : public LambdaFunction { auto res_name = lambda_block.get_by_position(*result_column_id).name; //4. get the result column after execution, reassemble it into a new array column, and return. - ColumnWithTypeAndName result_arr; + if (result_type->is_nullable()) { if (res_type->is_nullable()) { result_arr = {ColumnNullable::create( 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 39649ca512e16d..84734fb39e6d4f 100644 --- 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 @@ -116,3 +116,12 @@ 1 [1, 2, 3, 4, 5] [10, 20, -40, 80, -100] 2 [6, 7, 8] [10, 12, 13] +-- !select_26 -- +\N + +-- !select_27 -- +\N \N + +-- !select_28 -- +[] + 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 b699263c3540d7..c03291dfb779ff 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 @@ -96,4 +96,46 @@ suite("test_array_map_function") { } sql "DROP TABLE IF EXISTS ${tableName}" + + sql "DROP TABLE IF EXISTS db" + + sql """ CREATE TABLE `db` ( + `id` VARCHAR(255) NULL COMMENT '主键', + `QC_result_list` ARRAY NULL COMMENT '标签预刷' + ) ENGINE=OLAP + UNIQUE KEY(`id`) + DISTRIBUTED BY HASH(`id`) BUCKETS 10 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "is_being_synced" = "false", + "storage_medium" = "hdd", + "storage_format" = "V2", + "enable_unique_key_merge_on_write" = "true", + "light_schema_change" = "true", + "disable_auto_compaction" = "false", + "enable_single_replica_compaction" = "false" + ); + """ + + sql """insert into db values(1,null); + """ + + qt_select_26 """ + select array_map( + (x, y, z) -> concat( + '|', + x + "1", + '|', + x + "2", + '|', + x + "3" + ), + QC_result_list, + QC_result_list, + QC_result_list + ) FROM db; + """ + + qt_select_27 """ select QC_result_list, array_map( x -> concat( '|', x + "1" ), QC_result_list ) FROM db; """ + qt_select_28 """ select array_map(x->x,[]); """ }