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 4711e47f6b4 [Bug](udf) get data address should after resize operator (#41709) 4711e47f6b4 is described below commit 4711e47f6b44b381ac4d32dbca4ddfefc45c6a26 Author: zhangstar333 <87313068+zhangstar...@users.noreply.github.com> AuthorDate: Tue Oct 15 15:40:41 2024 +0800 [Bug](udf) get data address should after resize operator (#41709) when get column data address, it's should be after the column resize operator, to get real address only in branch-2.0 --- .../aggregate_function_java_udaf.h | 8 +-- be/src/vec/functions/function_java_udf.cpp | 6 +- .../main/java/org/apache/doris/udf/UdfConvert.java | 66 +++++++++++----------- .../data/javaudf_p0/test_javaudf_array.out | 12 ++++ .../doris/udf/ArrayReturnArrayStringTest2.java | 40 +++++++++++++ .../suites/javaudf_p0/test_javaudf_array.groovy | 9 +++ 6 files changed, 101 insertions(+), 40 deletions(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h b/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h index 720e143d4a5..1abf9a80db9 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h +++ b/be/src/vec/aggregate_functions/aggregate_function_java_udaf.h @@ -341,7 +341,6 @@ private: auto offset_address = reinterpret_cast<int64_t>(offset_column.get_raw_data().data); auto& null_map_data = assert_cast<ColumnVector<UInt8>*>(data_column_null_map.get())->get_data(); - auto nested_nullmap_address = reinterpret_cast<int64_t>(null_map_data.data()); jmethodID list_size = env->GetMethodID(arraylist_class, "size", "()I"); size_t has_put_element_size = array_col->get_offsets().back(); @@ -349,6 +348,7 @@ private: size_t element_size = has_put_element_size + arrar_list_size; array_nested_nullable.resize(element_size); memset(null_map_data.data() + has_put_element_size, 0, arrar_list_size); + auto nested_nullmap_address = reinterpret_cast<int64_t>(null_map_data.data()); int64_t nested_data_address = 0, nested_offset_address = 0; if (data_column->is_column_string()) { ColumnString* str_col = assert_cast<ColumnString*>(data_column.get()); @@ -378,15 +378,12 @@ private: auto key_data_column = map_key_column_nullable.get_nested_column_ptr(); auto& key_null_map_data = assert_cast<ColumnVector<UInt8>*>(key_data_column_null_map.get())->get_data(); - auto key_nested_nullmap_address = reinterpret_cast<int64_t>(key_null_map_data.data()); ColumnNullable& map_value_column_nullable = assert_cast<ColumnNullable&>(map_col->get_values()); auto value_data_column_null_map = map_value_column_nullable.get_null_map_column_ptr(); auto value_data_column = map_value_column_nullable.get_nested_column_ptr(); auto& value_null_map_data = assert_cast<ColumnVector<UInt8>*>(value_data_column_null_map.get())->get_data(); - auto value_nested_nullmap_address = - reinterpret_cast<int64_t>(value_null_map_data.data()); jmethodID map_size = env->GetMethodID(hashmap_class, "size", "()I"); size_t has_put_element_size = map_col->get_offsets().back(); size_t hashmap_size = env->CallIntMethod(result_obj, map_size); @@ -395,6 +392,9 @@ private: memset(key_null_map_data.data() + has_put_element_size, 0, hashmap_size); map_value_column_nullable.resize(element_size); memset(value_null_map_data.data() + has_put_element_size, 0, hashmap_size); + auto key_nested_nullmap_address = reinterpret_cast<int64_t>(key_null_map_data.data()); + auto value_nested_nullmap_address = + reinterpret_cast<int64_t>(value_null_map_data.data()); int64_t key_nested_data_address = 0, key_nested_offset_address = 0; if (key_data_column->is_column_string()) { diff --git a/be/src/vec/functions/function_java_udf.cpp b/be/src/vec/functions/function_java_udf.cpp index fe4ac9a7859..70a1e7622be 100644 --- a/be/src/vec/functions/function_java_udf.cpp +++ b/be/src/vec/functions/function_java_udf.cpp @@ -310,7 +310,6 @@ Status JavaFunctionCall::execute_impl(FunctionContext* context, Block& block, auto offset_address = reinterpret_cast<int64_t>(offset_column.get_raw_data().data); auto& null_map_data = assert_cast<ColumnVector<UInt8>*>(data_column_null_map.get())->get_data(); - auto nested_nullmap_address = reinterpret_cast<int64_t>(null_map_data.data()); jmethodID list_size = env->GetMethodID(arraylist_class, "size", "()I"); int element_size = 0; // get all element size in num_rows of array column for (int i = 0; i < num_rows; ++i) { @@ -322,6 +321,7 @@ Status JavaFunctionCall::execute_impl(FunctionContext* context, Block& block, env->DeleteLocalRef(obj); } array_nested_nullable.resize(element_size); + auto nested_nullmap_address = reinterpret_cast<int64_t>(null_map_data.data()); memset(null_map_data.data(), 0, element_size); int64_t nested_data_address = 0, nested_offset_address = 0; // array type need pass address: [nullmap_address], offset_address, nested_nullmap_address, nested_data_address/nested_char_address,nested_offset_address @@ -348,14 +348,12 @@ Status JavaFunctionCall::execute_impl(FunctionContext* context, Block& block, auto key_data_column = map_key_column_nullable.get_nested_column_ptr(); auto& key_null_map_data = assert_cast<ColumnVector<UInt8>*>(key_data_column_null_map.get())->get_data(); - auto key_nested_nullmap_address = reinterpret_cast<int64_t>(key_null_map_data.data()); ColumnNullable& map_value_column_nullable = assert_cast<ColumnNullable&>(map_col->get_values()); auto value_data_column_null_map = map_value_column_nullable.get_null_map_column_ptr(); auto value_data_column = map_value_column_nullable.get_nested_column_ptr(); auto& value_null_map_data = assert_cast<ColumnVector<UInt8>*>(value_data_column_null_map.get())->get_data(); - auto value_nested_nullmap_address = reinterpret_cast<int64_t>(value_null_map_data.data()); jmethodID map_size = env->GetMethodID(hashmap_class, "size", "()I"); int element_size = 0; // get all element size in num_rows of map column for (int i = 0; i < num_rows; ++i) { @@ -370,6 +368,8 @@ Status JavaFunctionCall::execute_impl(FunctionContext* context, Block& block, memset(key_null_map_data.data(), 0, element_size); map_value_column_nullable.resize(element_size); memset(value_null_map_data.data(), 0, element_size); + auto key_nested_nullmap_address = reinterpret_cast<int64_t>(key_null_map_data.data()); + auto value_nested_nullmap_address = reinterpret_cast<int64_t>(value_null_map_data.data()); int64_t key_nested_data_address = 0, key_nested_offset_address = 0; if (key_data_column->is_column_string()) { ColumnString* str_col = assert_cast<ColumnString*>(key_data_column.get()); diff --git a/fe/be-java-extensions/java-udf/src/main/java/org/apache/doris/udf/UdfConvert.java b/fe/be-java-extensions/java-udf/src/main/java/org/apache/doris/udf/UdfConvert.java index aefaf511fb1..76615cc4fb9 100644 --- a/fe/be-java-extensions/java-udf/src/main/java/org/apache/doris/udf/UdfConvert.java +++ b/fe/be-java-extensions/java-udf/src/main/java/org/apache/doris/udf/UdfConvert.java @@ -718,7 +718,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Boolean value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putByte(dataAddr + ((hasPutElementNum + i)), value ? (byte) 1 : 0); } @@ -730,7 +730,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Boolean value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putByte(dataAddr + ((hasPutElementNum + i)), value ? (byte) 1 : 0); } @@ -752,7 +752,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Byte value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putByte(dataAddr + ((hasPutElementNum + i)), value); } @@ -764,7 +764,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Byte value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putByte(dataAddr + ((hasPutElementNum + i)), value); } @@ -786,7 +786,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Short value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putShort(dataAddr + ((hasPutElementNum + i) * 2L), value); } @@ -798,7 +798,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Short value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putShort(dataAddr + ((hasPutElementNum + i) * 2L), value); } @@ -820,7 +820,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Integer value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putInt(dataAddr + ((hasPutElementNum + i) * 4L), value); } @@ -832,7 +832,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Integer value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putInt(dataAddr + ((hasPutElementNum + i) * 4L), value); } @@ -854,7 +854,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Long value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), value); } @@ -866,7 +866,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Long value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), value); } @@ -888,7 +888,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Float value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putFloat(dataAddr + ((hasPutElementNum + i) * 4L), value); } @@ -900,7 +900,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Float value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putFloat(dataAddr + ((hasPutElementNum + i) * 4L), value); } @@ -922,7 +922,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Double value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putDouble(dataAddr + ((hasPutElementNum + i) * 8L), value); } @@ -934,7 +934,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { Double value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { UdfUtils.UNSAFE.putDouble(dataAddr + ((hasPutElementNum + i) * 8L), value); } @@ -956,7 +956,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDate value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDate(value, LocalDate.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -969,7 +969,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDate value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDate(value, LocalDate.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -992,7 +992,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDateTime value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDateTime(value, LocalDateTime.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -1005,7 +1005,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDateTime value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDateTime(value, LocalDateTime.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -1028,7 +1028,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDate value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { int time = UdfUtils.convertToDateV2(value, LocalDate.class); UdfUtils.UNSAFE.putInt(dataAddr + ((hasPutElementNum + i) * 4L), time); @@ -1041,7 +1041,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDate value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { int time = UdfUtils.convertToDateV2(value, LocalDate.class); UdfUtils.UNSAFE.putInt(dataAddr + ((hasPutElementNum + i) * 4L), time); @@ -1065,7 +1065,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDateTime value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDateTimeV2(value, LocalDateTime.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -1078,7 +1078,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { LocalDateTime value = data.get(i); if (value == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { long time = UdfUtils.convertToDateTimeV2(value, LocalDateTime.class); UdfUtils.UNSAFE.putLong(dataAddr + ((hasPutElementNum + i) * 8L), time); @@ -1101,7 +1101,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigInteger bigInteger = data.get(i); if (bigInteger == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); byte[] value = new byte[16]; @@ -1121,7 +1121,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigInteger bigInteger = data.get(i); if (bigInteger == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); byte[] value = new byte[16]; @@ -1151,7 +1151,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigDecimal bigDecimal = data.get(i); if (bigDecimal == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { BigInteger bigInteger = bigDecimal.setScale(9, RoundingMode.HALF_EVEN).unscaledValue(); byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); @@ -1172,7 +1172,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigDecimal bigDecimal = data.get(i); if (bigDecimal == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { BigInteger bigInteger = bigDecimal.setScale(9, RoundingMode.HALF_EVEN).unscaledValue(); byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); @@ -1205,7 +1205,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigDecimal bigDecimal = data.get(i); if (bigDecimal == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { BigInteger bigInteger = bigDecimal.setScale(scale, RoundingMode.HALF_EVEN).unscaledValue(); byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); @@ -1226,7 +1226,7 @@ public class UdfConvert { for (int i = 0; i < num; ++i) { BigDecimal bigDecimal = data.get(i); if (bigDecimal == null) { - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { BigInteger bigInteger = bigDecimal.setScale(scale, RoundingMode.HALF_EVEN).unscaledValue(); byte[] bytes = UdfUtils.convertByteOrder(bigInteger.toByteArray()); @@ -1263,14 +1263,14 @@ public class UdfConvert { String value = data.get(i); if (value == null) { byteRes[i] = emptyBytes; - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { byteRes[i] = value.getBytes(StandardCharsets.UTF_8); } offset += byteRes[i].length; offsets[i] = offset; } - int oldSzie = 0; + int oldSzie = oldOffsetNum; if (num > 0) { oldSzie = offsets[num - 1]; } @@ -1298,18 +1298,18 @@ public class UdfConvert { String value = data.get(i); if (value == null) { byteRes[i] = emptyBytes; - UdfUtils.UNSAFE.putByte(nestedNullMapAddr + row, (byte) 1); + UdfUtils.UNSAFE.putByte(nestedNullMapAddr + (hasPutElementNum + i), (byte) 1); } else { byteRes[i] = value.getBytes(StandardCharsets.UTF_8); } offset += byteRes[i].length; offsets[i] = offset; } - int oldSzie = 0; + int oldSzie = oldOffsetNum; if (num > 0) { oldSzie = offsets[num - 1]; } - byte[] bytes = new byte[oldSzie]; + byte[] bytes = new byte[oldSzie - oldOffsetNum]; long bytesAddr = JNINativeMethod.resizeStringColumn(dataAddr, oldSzie); int dst = 0; for (int i = 0; i < num; i++) { diff --git a/regression-test/data/javaudf_p0/test_javaudf_array.out b/regression-test/data/javaudf_p0/test_javaudf_array.out index 53b926132e4..577bf983cfc 100644 --- a/regression-test/data/javaudf_p0/test_javaudf_array.out +++ b/regression-test/data/javaudf_p0/test_javaudf_array.out @@ -131,3 +131,15 @@ a10b10 20 ["2022-01-01"] 18 ["2022-06-06"] 20 +-- !select_14 -- +["111", "aaa", null] 1 +[] 2 +[] 3 +[] 4 +[] 5 +[] 6 +[] 7 +[] 8 +[] 9 +[] 10 + diff --git a/regression-test/java-udf-src/src/main/java/org/apache/doris/udf/ArrayReturnArrayStringTest2.java b/regression-test/java-udf-src/src/main/java/org/apache/doris/udf/ArrayReturnArrayStringTest2.java new file mode 100644 index 00000000000..40ea33c89af --- /dev/null +++ b/regression-test/java-udf-src/src/main/java/org/apache/doris/udf/ArrayReturnArrayStringTest2.java @@ -0,0 +1,40 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.udf; + +import java.util.ArrayList; + +public class ArrayReturnArrayStringTest2 { + public ArrayList<String> evaluate(Integer res) { + ArrayList<String> result = new ArrayList<String>(); + if (res == null) { + return null; + } + switch (res.intValue()) { + case 1: { + result.add("111"); + result.add("aaa"); + result.add(null); + } + break; + default: + break; + } + return result; + } +} diff --git a/regression-test/suites/javaudf_p0/test_javaudf_array.groovy b/regression-test/suites/javaudf_p0/test_javaudf_array.groovy index ee02ca17cc3..468b7ef6829 100644 --- a/regression-test/suites/javaudf_p0/test_javaudf_array.groovy +++ b/regression-test/suites/javaudf_p0/test_javaudf_array.groovy @@ -117,10 +117,19 @@ suite("test_javaudf_array") { ); """ qt_select_13 """ SELECT java_udf_array_date_test(array(datev2_col)), tinyint_col as result FROM ${tableName} ORDER BY result; """ + sql """ DROP FUNCTION IF EXISTS java_udf_array_return_string_test2(array<string>); """ + sql """ CREATE FUNCTION java_udf_array_return_string_test2(int) RETURNS array<string> PROPERTIES ( + "file"="file://${jarPath}", + "symbol"="org.apache.doris.udf.ArrayReturnArrayStringTest2", + "type"="JAVA_UDF" + ); """ + qt_select_14 """ SELECT java_udf_array_return_string_test2(user_id), user_id as result FROM ${tableName} ORDER BY result; """ + } finally { try_sql("DROP FUNCTION IF EXISTS java_udf_array_int_test(array<int>);") try_sql("DROP FUNCTION IF EXISTS java_udf_array_return_int_test(array<int>);") try_sql("DROP FUNCTION IF EXISTS java_udf_array_return_string_test(array<string>);") + try_sql("DROP FUNCTION IF EXISTS java_udf_array_return_string_test2(int);") try_sql("DROP FUNCTION IF EXISTS java_udf_array_string_test(array<string>);") try_sql("DROP FUNCTION IF EXISTS java_udf_array_datatime_test(array<datetime>);") try_sql("DROP FUNCTION IF EXISTS java_udf_array_date_test(array<date>);") --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org