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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]