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

Reply via email to