This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 983ef77d3f893163cedbc51d0ffc507c587e188c
Author: zhangstar333 <87313068+zhangstar...@users.noreply.github.com>
AuthorDate: Fri Feb 10 16:19:02 2023 +0800

    [bug](jdbc) fix jdbc can't get object of PGobject  (#16496)
    
    when pg table have some  unsupported column type like: point, polygon, 
jsonb......
    jdbc catalog will convert it to string type in doris. but get result set in 
java is org.postgresql.util.PGobject
    
    Some test need this pr: #16442
---
 be/src/vec/exec/vjdbc_connector.cpp                |  17 +-
 be/src/vec/exec/vjdbc_connector.h                  |   1 +
 .../java/org/apache/doris/udf/JdbcExecutor.java    | 689 +++++++++++++++++----
 .../suites/jdbc_p0/test_jdbc_query_mysql.groovy    |   3 +-
 .../suites/jdbc_p0/test_jdbc_query_pg.groovy       |   3 +-
 5 files changed, 590 insertions(+), 123 deletions(-)

diff --git a/be/src/vec/exec/vjdbc_connector.cpp 
b/be/src/vec/exec/vjdbc_connector.cpp
index 3af00dbc62..f6708d09ed 100644
--- a/be/src/vec/exec/vjdbc_connector.cpp
+++ b/be/src/vec/exec/vjdbc_connector.cpp
@@ -460,7 +460,20 @@ Status JdbcConnector::_convert_batch_result_set(JNIEnv* 
env, jobject jcolumn_dat
                                       address[1]);
         break;
     }
-    case TYPE_CHAR:
+    case TYPE_CHAR: {
+        bool need_trim_spaces = false;
+        if ((_conn_param.table_type == TOdbcTableType::POSTGRESQL) ||
+            (_conn_param.table_type == TOdbcTableType::ORACLE)) {
+            need_trim_spaces = true;
+        }
+        auto column_string = 
reinterpret_cast<vectorized::ColumnString*>(col_ptr);
+        address[1] = 
reinterpret_cast<int64_t>(column_string->get_offsets().data());
+        auto chars_addres = 
reinterpret_cast<int64_t>(&column_string->get_chars());
+        env->CallNonvirtualVoidMethod(_executor_obj, _executor_clazz, 
_executor_get_char_result,
+                                      jcolumn_data, column_is_nullable, 
num_rows, address[0],
+                                      address[1], chars_addres, 
need_trim_spaces);
+        break;
+    }
     case TYPE_STRING:
     case TYPE_VARCHAR: {
         auto column_string = 
reinterpret_cast<vectorized::ColumnString*>(col_ptr);
@@ -592,6 +605,8 @@ Status JdbcConnector::_register_func_id(JNIEnv* env) {
                                 JDBC_EXECUTOR_COPY_BATCH_SIGNATURE, 
_executor_get_double_result));
     RETURN_IF_ERROR(register_id(_executor_clazz, "copyBatchStringResult",
                                 "(Ljava/lang/Object;ZIJJJ)V", 
_executor_get_string_result));
+    RETURN_IF_ERROR(register_id(_executor_clazz, "copyBatchCharResult",
+                                "(Ljava/lang/Object;ZIJJJZ)V", 
_executor_get_char_result));
 
     RETURN_IF_ERROR(register_id(_executor_clazz, "copyBatchDateResult",
                                 JDBC_EXECUTOR_COPY_BATCH_SIGNATURE, 
_executor_get_date_result));
diff --git a/be/src/vec/exec/vjdbc_connector.h 
b/be/src/vec/exec/vjdbc_connector.h
index b7c8b6166a..fecedbb6fc 100644
--- a/be/src/vec/exec/vjdbc_connector.h
+++ b/be/src/vec/exec/vjdbc_connector.h
@@ -127,6 +127,7 @@ private:
     jmethodID _executor_get_largeint_result;
     jmethodID _executor_get_float_result;
     jmethodID _executor_get_double_result;
+    jmethodID _executor_get_char_result;
     jmethodID _executor_get_string_result;
     jmethodID _executor_get_date_result;
     jmethodID _executor_get_datev2_result;
diff --git a/fe/java-udf/src/main/java/org/apache/doris/udf/JdbcExecutor.java 
b/fe/java-udf/src/main/java/org/apache/doris/udf/JdbcExecutor.java
index d2bc7d9622..84f766456e 100644
--- a/fe/java-udf/src/main/java/org/apache/doris/udf/JdbcExecutor.java
+++ b/fe/java-udf/src/main/java/org/apache/doris/udf/JdbcExecutor.java
@@ -57,7 +57,7 @@ public class JdbcExecutor {
     private List<String> resultColumnTypeNames = null;
     private int baseTypeInt = 0;
     private List<Object[]> block = null;
-    private int bacthSizeNum = 0;
+    private int batchSizeNum = 0;
     private int curBlockRows = 0;
     private static final byte[] emptyBytes = new byte[0];
     private DruidDataSource druidDataSource = null;
@@ -98,14 +98,11 @@ public class JdbcExecutor {
             block = new ArrayList<>(columnCount);
             for (int i = 0; i < columnCount; ++i) {
                 
resultColumnTypeNames.add(resultSetMetaData.getColumnClassName(i + 1));
-                Class<?> clazz = 
Class.forName(resultSetMetaData.getColumnClassName(i + 1));
-                block.add((Object[]) Array.newInstance(clazz, bacthSizeNum));
+                block.add((Object[]) Array.newInstance(Object.class, 
batchSizeNum));
             }
             return columnCount;
         } catch (SQLException e) {
             throw new UdfRuntimeException("JDBC executor sql has error: ", e);
-        } catch (ClassNotFoundException e) {
-            throw new UdfRuntimeException("JDBC executor sql 
ClassNotFoundException: ", e);
         }
     }
 
@@ -177,8 +174,6 @@ public class JdbcExecutor {
             } while (curBlockRows < batchSize && resultSet.next());
         } catch (SQLException e) {
             throw new UdfRuntimeException("get next block failed: ", e);
-        } catch (Exception e) {
-            throw new UdfRuntimeException("unable to get next : ", e);
         }
         return block;
     }
@@ -198,63 +193,6 @@ public class JdbcExecutor {
         }
     }
 
-    public long convertDateToLong(Object obj, boolean isDateV2) {
-        LocalDate date;
-        if (obj instanceof LocalDate) {
-            date = (LocalDate) obj;
-        } else {
-            date = ((Date) obj).toLocalDate();
-        }
-        if (isDateV2) {
-            return UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth());
-        }
-        return UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
-                0, 0, 0, true);
-    }
-
-    public long convertDateTimeToLong(Object obj, boolean isDateTimeV2) throws 
UdfRuntimeException {
-        LocalDateTime date = null;
-        // TODO: not for sure: https://bugs.mysql.com/bug.php?id=101413
-        if (obj instanceof LocalDateTime) {
-            date = (LocalDateTime) obj;
-        } else if (obj instanceof java.sql.Timestamp) {
-            date = ((java.sql.Timestamp) obj).toLocalDateTime();
-        } else if (obj instanceof oracle.sql.TIMESTAMP) {
-            try {
-                date = ((oracle.sql.TIMESTAMP) 
obj).timestampValue().toLocalDateTime();
-            } catch (SQLException e) {
-                throw new UdfRuntimeException("Convert oracle.sql.TIMESTAMP"
-                        + " to LocalDateTime failed: ", e);
-            }
-        }
-        if (isDateTimeV2) {
-            return UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
-                    date.getHour(), date.getMinute(), date.getSecond());
-        }
-        return UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
-                date.getHour(), date.getMinute(), date.getSecond(), false);
-    }
-
-    public byte convertTinyIntToByte(Object obj) {
-        byte res = 0;
-        if (obj instanceof Integer) {
-            res = ((Integer) obj).byteValue();
-        } else if (obj instanceof Short) {
-            res = ((Short) obj).byteValue();
-        }
-        return res;
-    }
-
-    public short convertSmallIntToShort(Object obj) {
-        short res = 0;
-        if (obj instanceof Integer) {
-            res = ((Integer) obj).shortValue();
-        } else if (obj instanceof Short) {
-            res = (short) obj;
-        }
-        return res;
-    }
-
     public Object convertArrayToObject(Object obj, int idx) {
         Object[] columnData = (Object[]) obj;
         if (columnData[idx] instanceof String) {
@@ -290,7 +228,7 @@ public class JdbcExecutor {
                 stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY,
                         ResultSet.FETCH_FORWARD);
                 stmt.setFetchSize(batchSize);
-                bacthSizeNum = batchSize;
+                batchSizeNum = batchSize;
             } else {
                 stmt = conn.createStatement();
             }
@@ -305,18 +243,71 @@ public class JdbcExecutor {
 
     public void copyBatchBooleanResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
-        Boolean[] column = (Boolean[]) columnObj;
+        Object[] column = (Object[]) columnObj;
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putByte(columnAddr + i, column[i] ? (byte) 
1 : 0);
+                    UdfUtils.UNSAFE.putByte(columnAddr + i, (Boolean) 
column[i] ? (byte) 1 : 0);
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putByte(columnAddr + i, column[i] ? (byte) 1 : 
0);
+                UdfUtils.UNSAFE.putByte(columnAddr + i, (Boolean) column[i] ? 
(byte) 1 : 0);
+            }
+        }
+    }
+
+    private void bigDecimalPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    Short res = ((BigDecimal) column[i]).shortValueExact();
+                    UdfUtils.UNSAFE.putByte(columnAddr + i, res.byteValue());
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                Short res = ((BigDecimal) column[i]).shortValueExact();
+                UdfUtils.UNSAFE.putByte(columnAddr + i, res.byteValue());
+            }
+        }
+    }
+
+    private void integerPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putByte(columnAddr + i, ((Integer) 
column[i]).byteValue());
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putByte(columnAddr + i, ((Integer) 
column[i]).byteValue());
+            }
+        }
+    }
+
+    private void shortPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putByte(columnAddr + i, ((Short) 
column[i]).byteValue());
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putByte(columnAddr + i, ((Short) 
column[i]).byteValue());
             }
         }
     }
@@ -324,17 +315,62 @@ public class JdbcExecutor {
     public void copyBatchTinyIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
         Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Integer) {
+            integerPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Short) {
+            shortPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    private void bigDecimalPutToShort(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putByte(columnAddr + i, 
convertTinyIntToByte(column[i]));
+                    UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), 
((BigDecimal) column[i]).shortValueExact());
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putByte(columnAddr + i, 
convertTinyIntToByte(column[i]));
+                UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), ((BigDecimal) 
column[i]).shortValueExact());
+            }
+        }
+    }
+
+    private void integerPutToShort(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), ((Integer) 
column[i]).shortValue());
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), ((Integer) 
column[i]).shortValue());
+            }
+        }
+    }
+
+    private void shortPutToShort(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), (Short) 
column[i]);
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putShort(columnAddr + (i * 2L), (Short) 
column[i]);
             }
         }
     }
@@ -342,123 +378,283 @@ public class JdbcExecutor {
     public void copyBatchSmallIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
         Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToShort(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Integer) {
+            integerPutToShort(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Short) {
+            shortPutToShort(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+
+    private void bigDecimalPutToInt(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L), 
((BigDecimal) column[i]).intValueExact());
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L), ((BigDecimal) 
column[i]).intValueExact());
+            }
+        }
+    }
+
+    private void integerPutToInt(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putShort(columnAddr + (i * 2), 
convertSmallIntToShort(column[i]));
+                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L), (Integer) 
column[i]);
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putShort(columnAddr + (i * 2), 
convertSmallIntToShort(column[i]));
+                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L), (Integer) 
column[i]);
             }
         }
     }
 
     public void copyBatchIntResult(Object columnObj, boolean isNullable, int 
numRows, long nullMapAddr,
             long columnAddr) {
-        Integer[] column = (Integer[]) columnObj;
+        Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToInt(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Integer) {
+            integerPutToInt(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    private void bigDecimalPutToLong(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4), (int) 
column[i]);
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L), 
((BigDecimal) column[i]).longValueExact());
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4), (int) column[i]);
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L), ((BigDecimal) 
column[i]).longValueExact());
             }
         }
     }
 
-    public void copyBatchBigIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+    private void longPutToLong(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
             long columnAddr) {
-        Long[] column = (Long[]) columnObj;
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), (long) 
column[i]);
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L), (Long) 
column[i]);
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), (long) 
column[i]);
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L), (Long) 
column[i]);
             }
         }
     }
 
-    public void copyBatchLargeIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+    public void copyBatchBigIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr) {
+        Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Long) {
+            longPutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    private void bigDecimalPutToBigInteger(Object[] column, boolean 
isNullable, int numRows, long nullMapAddr,
+            long columnAddr) {
+        BigInteger[] data = new BigInteger[numRows];
+        for (int i = 0; i < numRows; i++) {
+            if (column[i] == null) {
+                data[i] = null;
+                UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+            } else {
+                data[i] = ((BigDecimal) column[i]).toBigInteger();
+            }
+        }
+        copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 16);
+    }
+
+    private void bigIntegerPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
             long columnAddr) {
-        BigInteger[] column = (BigInteger[]) columnObj;
         if (isNullable == true) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    byte[] bytes = 
UdfUtils.convertByteOrder(column[i].toByteArray());
+                    BigInteger columnValue = (BigInteger) column[i];
+                    byte[] bytes = 
UdfUtils.convertByteOrder(columnValue.toByteArray());
                     byte[] value = new byte[16];
-                    if (column[i].signum() == -1) {
+                    if (columnValue.signum() == -1) {
                         Arrays.fill(value, (byte) -1);
                     }
                     for (int index = 0; index < Math.min(bytes.length, 
value.length); ++index) {
                         value[index] = bytes[index];
                     }
-                    UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, 
null, columnAddr + (i * 16), 16);
+                    UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, 
null, columnAddr + (i * 16L), 16);
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                byte[] bytes = 
UdfUtils.convertByteOrder(column[i].toByteArray());
+                BigInteger columnValue = (BigInteger) column[i];
+                byte[] bytes = 
UdfUtils.convertByteOrder(columnValue.toByteArray());
                 byte[] value = new byte[16];
-                if (column[i].signum() == -1) {
+                if (columnValue.signum() == -1) {
                     Arrays.fill(value, (byte) -1);
                 }
                 for (int index = 0; index < Math.min(bytes.length, 
value.length); ++index) {
                     value[index] = bytes[index];
                 }
-                UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, null, 
columnAddr + (i * 16), 16);
+                UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, null, 
columnAddr + (i * 16L), 16);
             }
         }
     }
 
+    public void copyBatchLargeIntResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr) {
+        Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToBigInteger(column, isNullable, numRows, 
nullMapAddr, columnAddr);
+        } else if (column[0] instanceof BigInteger) {
+            bigIntegerPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
     public void copyBatchFloatResult(Object columnObj, boolean isNullable, int 
numRows, long nullMapAddr,
             long columnAddr) {
-        Float[] column = (Float[]) columnObj;
+        Object[] column = (Object[]) columnObj;
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putFloat(columnAddr + (i * 4L), (Float) 
column[i]);
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putFloat(columnAddr + (i * 4L), (Float) 
column[i]);
+            }
+        }
+    }
+
+    private void bigDecimalPutToDouble(Object[] column, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putFloat(columnAddr + (i * 4), (float) 
column[i]);
+                    UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8L), 
((BigDecimal) column[i]).doubleValue());
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putFloat(columnAddr + (i * 4), (float) 
column[i]);
+                UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8L), ((BigDecimal) 
column[i]).doubleValue());
+            }
+        }
+    }
+
+
+    private void doublePutToDouble(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8L), (Double) 
column[i]);
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8L), (Double) 
column[i]);
             }
         }
     }
 
     public void copyBatchDoubleResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
-        Double[] column = (Double[]) columnObj;
+        Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof BigDecimal) {
+            bigDecimalPutToDouble(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Double) {
+            doublePutToDouble(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    //TODO: now array type need this function, can remove after refactor read 
array type
+    public long convertDateToLong(Object obj, boolean isDateV2) {
+        LocalDate date;
+        if (obj instanceof LocalDate) {
+            date = (LocalDate) obj;
+        } else {
+            date = ((Date) obj).toLocalDate();
+        }
+        if (isDateV2) {
+            return UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth());
+        }
+        return UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                0, 0, 0, true);
+    }
+
+    private void localDatePutToLong(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDate date = (LocalDate) column[i];
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), 0, 0, 0, true));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDate date = (LocalDate) column[i];
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                date.getDayOfMonth(), 0, 0, 0, true));
+            }
+        }
+    }
+
+    private void datePutToLong(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8), (double) 
column[i]);
+                    LocalDate date = ((Date) column[i]).toLocalDate();
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), 0, 0, 0, true));
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putDouble(columnAddr + (i * 8), (double) 
column[i]);
+                LocalDate date = ((Date) column[i]).toLocalDate();
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                date.getDayOfMonth(), 0, 0, 0, true));
             }
         }
     }
@@ -466,17 +662,53 @@ public class JdbcExecutor {
     public void copyBatchDateResult(Object columnObj, boolean isNullable, int 
numRows, long nullMapAddr,
             long columnAddr) {
         Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof LocalDate) {
+            localDatePutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Date) {
+            datePutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    private void localDatePutToInt(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDate date = (LocalDate) column[i];
+                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L),
+                            UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth()));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDate date = (LocalDate) column[i];
+                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L),
+                        UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(),
+                                date.getDayOfMonth()));
+            }
+        }
+    }
+
+    private void datePutToInt(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateToLong(column[i], false));
+                    LocalDate date = ((Date) column[i]).toLocalDate();
+                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L),
+                            UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth()));
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateToLong(column[i], false));
+                LocalDate date = ((Date) column[i]).toLocalDate();
+                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4L),
+                        UdfUtils.convertToDateV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth()));
             }
         }
     }
@@ -484,60 +716,264 @@ public class JdbcExecutor {
     public void copyBatchDateV2Result(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
         Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof LocalDate) {
+            localDatePutToInt(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof Date) {
+            datePutToInt(column, isNullable, numRows, nullMapAddr, columnAddr);
+        }
+    }
+
+    //TODO: now array type need this function, can remove after refactor read 
array type
+    public long convertDateTimeToLong(Object obj, boolean isDateTimeV2) throws 
UdfRuntimeException {
+        LocalDateTime date = null;
+        // TODO: not for sure: https://bugs.mysql.com/bug.php?id=101413
+        if (obj instanceof LocalDateTime) {
+            date = (LocalDateTime) obj;
+        } else if (obj instanceof java.sql.Timestamp) {
+            date = ((java.sql.Timestamp) obj).toLocalDateTime();
+        } else if (obj instanceof oracle.sql.TIMESTAMP) {
+            try {
+                date = ((oracle.sql.TIMESTAMP) 
obj).timestampValue().toLocalDateTime();
+            } catch (SQLException e) {
+                throw new UdfRuntimeException("Convert oracle.sql.TIMESTAMP"
+                        + " to LocalDateTime failed: ", e);
+            }
+        }
+        if (isDateTimeV2) {
+            return UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                    date.getHour(), date.getMinute(), date.getSecond());
+        }
+        return UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                date.getHour(), date.getMinute(), date.getSecond(), false);
+    }
+
+    private void localDateTimePutToLong(Object[] column, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDateTime date = (LocalDateTime) column[i];
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(),
+                                    date.getSecond(), false));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDateTime date = (LocalDateTime) column[i];
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                date.getDayOfMonth(), date.getHour(), 
date.getMinute(),
+                                date.getSecond(), false));
+            }
+        }
+    }
+
+    private void timestampPutToLong(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDateTime date = ((java.sql.Timestamp) 
column[i]).toLocalDateTime();
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(), date.getSecond(), false));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDateTime date = ((java.sql.Timestamp) 
column[i]).toLocalDateTime();
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                                date.getHour(), date.getMinute(), 
date.getSecond(), false));
+            }
+        }
+    }
+
+    private void oracleTimetampPutToLong(Object[] column, boolean isNullable, 
int numRows,
+            long nullMapAddr,
+            long columnAddr) throws SQLException {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putInt(columnAddr + (i * 4), (int) 
convertDateToLong(column[i], true));
+                    LocalDateTime date = ((oracle.sql.TIMESTAMP) 
column[i]).timestampValue().toLocalDateTime();
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(), date.getSecond(), false));
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putInt(columnAddr + (i * 4), (int) 
convertDateToLong(column[i], true));
+                LocalDateTime date = ((oracle.sql.TIMESTAMP) 
column[i]).timestampValue().toLocalDateTime();
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTime(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                                date.getHour(), date.getMinute(), 
date.getSecond(), false));
             }
         }
     }
 
     public void copyBatchDateTimeResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
-            long columnAddr) throws UdfRuntimeException {
+            long columnAddr) throws SQLException {
         Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof LocalDateTime) {
+            localDateTimePutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof java.sql.Timestamp) {
+            timestampPutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof oracle.sql.TIMESTAMP) {
+            oracleTimetampPutToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        }
+    }
+
+    private void localDateTimePutToLongV2(Object[] column, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDateTime date = (LocalDateTime) column[i];
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(),
+                                    date.getSecond()));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDateTime date = (LocalDateTime) column[i];
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(),
+                                date.getDayOfMonth(), date.getHour(), 
date.getMinute(),
+                                date.getSecond()));
+            }
+        }
+    }
+
+    private void timestampPutToLongV2(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long columnAddr) {
+        if (isNullable) {
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] == null) {
+                    UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
+                } else {
+                    LocalDateTime date = ((java.sql.Timestamp) 
column[i]).toLocalDateTime();
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(), date.getSecond()));
+                }
+            }
+        } else {
+            for (int i = 0; i < numRows; i++) {
+                LocalDateTime date = ((java.sql.Timestamp) 
column[i]).toLocalDateTime();
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                                date.getHour(), date.getMinute(), 
date.getSecond()));
+            }
+        }
+    }
+
+    private void oracleTimetampPutToLongV2(Object[] column, boolean 
isNullable, int numRows,
+            long nullMapAddr, long columnAddr) throws SQLException {
         if (isNullable) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateTimeToLong(column[i], false));
+                    LocalDateTime date = ((oracle.sql.TIMESTAMP) 
column[i]).timestampValue().toLocalDateTime();
+                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                            UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(),
+                                    date.getDayOfMonth(), date.getHour(), 
date.getMinute(), date.getSecond()));
                 }
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateTimeToLong(column[i], false));
+                LocalDateTime date = ((oracle.sql.TIMESTAMP) 
column[i]).timestampValue().toLocalDateTime();
+                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8L),
+                        UdfUtils.convertToDateTimeV2(date.getYear(), 
date.getMonthValue(), date.getDayOfMonth(),
+                                date.getHour(), date.getMinute(), 
date.getSecond()));
             }
         }
     }
 
     public void copyBatchDateTimeV2Result(Object columnObj, boolean 
isNullable, int numRows, long nullMapAddr,
-            long columnAddr) throws UdfRuntimeException {
+            long columnAddr) throws SQLException {
         Object[] column = (Object[]) columnObj;
-        if (isNullable) {
+        if (column[0] instanceof LocalDateTime) {
+            localDateTimePutToLongV2(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof java.sql.Timestamp) {
+            timestampPutToLongV2(column, isNullable, numRows, nullMapAddr, 
columnAddr);
+        } else if (column[0] instanceof oracle.sql.TIMESTAMP) {
+            oracleTimetampPutToLongV2(column, isNullable, numRows, 
nullMapAddr, columnAddr);
+        }
+    }
+
+    public String trimSpaces(String str) {
+        int end = str.length() - 1;
+        while (end >= 0 && str.charAt(end) == ' ') {
+            end--;
+        }
+        return str.substring(0, end + 1);
+    }
+
+    public void copyBatchCharResult(Object columnObj, boolean isNullable, int 
numRows, long nullMapAddr,
+            long offsetsAddr, long charsAddr, boolean needTrimSpaces) {
+        if (needTrimSpaces == true) {
+            Object[] column = (Object[]) columnObj;
+            for (int i = 0; i < numRows; i++) {
+                if (column[i] != null) {
+                    column[i] = trimSpaces((String) column[i]);
+                }
+            }
+            copyBatchStringResult(column, isNullable, numRows, nullMapAddr, 
offsetsAddr, charsAddr);
+        } else {
+            copyBatchStringResult(columnObj, isNullable, numRows, nullMapAddr, 
offsetsAddr, charsAddr);
+        }
+    }
+
+    private void objectPutToString(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
+            long offsetsAddr, long charsAddr) {
+        int[] offsets = new int[numRows];
+        byte[][] byteRes = new byte[numRows][];
+        int offset = 0;
+        if (isNullable == true) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] == null) {
+                    byteRes[i] = emptyBytes;
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateTimeToLong(column[i], true));
+                    byteRes[i] = 
column[i].toString().getBytes(StandardCharsets.UTF_8);
                 }
+                offset += byteRes[i].length;
+                offsets[i] = offset;
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putLong(columnAddr + (i * 8), 
convertDateTimeToLong(column[i], true));
+                byteRes[i] = 
column[i].toString().getBytes(StandardCharsets.UTF_8);
+                offset += byteRes[i].length;
+                offsets[i] = offset;
+            }
+        }
+        byte[] bytes = new byte[offsets[numRows - 1]];
+        long bytesAddr = JNINativeMethod.resizeColumn(charsAddr, 
offsets[numRows - 1]);
+        int dst = 0;
+        for (int i = 0; i < numRows; i++) {
+            for (int j = 0; j < byteRes[i].length; j++) {
+                bytes[dst++] = byteRes[i][j];
             }
         }
+        UdfUtils.copyMemory(offsets, UdfUtils.INT_ARRAY_OFFSET, null, 
offsetsAddr, numRows * 4L);
+        UdfUtils.copyMemory(bytes, UdfUtils.BYTE_ARRAY_OFFSET, null, 
bytesAddr, offsets[numRows - 1]);
     }
 
-    public void copyBatchStringResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+    private void stringPutToString(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr,
             long offsetsAddr, long charsAddr) {
-        String[] column = (String[]) columnObj;
         int[] offsets = new int[numRows];
         byte[][] byteRes = new byte[numRows][];
         int offset = 0;
@@ -547,14 +983,14 @@ public class JdbcExecutor {
                     byteRes[i] = emptyBytes;
                     UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
                 } else {
-                    byteRes[i] = column[i].getBytes(StandardCharsets.UTF_8);
+                    byteRes[i] = ((String) 
column[i]).getBytes(StandardCharsets.UTF_8);
                 }
                 offset += byteRes[i].length;
                 offsets[i] = offset;
             }
         } else {
             for (int i = 0; i < numRows; i++) {
-                byteRes[i] = column[i].getBytes(StandardCharsets.UTF_8);
+                byteRes[i] = ((String) 
column[i]).getBytes(StandardCharsets.UTF_8);
                 offset += byteRes[i].length;
                 offsets[i] = offset;
             }
@@ -571,16 +1007,28 @@ public class JdbcExecutor {
         UdfUtils.copyMemory(bytes, UdfUtils.BYTE_ARRAY_OFFSET, null, 
bytesAddr, offsets[numRows - 1]);
     }
 
+    public void copyBatchStringResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
+            long offsetsAddr, long charsAddr) {
+        Object[] column = (Object[]) columnObj;
+        if (column[0] instanceof String) {
+            stringPutToString(column, isNullable, numRows, nullMapAddr, 
offsetsAddr, charsAddr);
+        } else {
+            //object like in pg type point, polygon, jsonb..... get object is 
org.postgresql.util.PGobject.....
+            //here object put to string, so the object must have impl 
toString() function
+            objectPutToString(column, isNullable, numRows, nullMapAddr, 
offsetsAddr, charsAddr);
+        }
+    }
+
     public void copyBatchDecimalV2Result(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr) {
-        BigDecimal[] column = (BigDecimal[]) columnObj;
+        Object[] column = (Object[]) columnObj;
         BigInteger[] data = new BigInteger[numRows];
         for (int i = 0; i < numRows; i++) {
             if (column[i] == null) {
                 data[i] = null;
                 UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
             } else {
-                data[i] = column[i].setScale(9, 
RoundingMode.HALF_EVEN).unscaledValue();
+                data[i] = ((BigDecimal) column[i]).setScale(9, 
RoundingMode.HALF_EVEN).unscaledValue();
             }
         }
         copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 16);
@@ -588,14 +1036,14 @@ public class JdbcExecutor {
 
     public void copyBatchDecimal32Result(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr, int scale) {
-        BigDecimal[] column = (BigDecimal[]) columnObj;
+        Object[] column = (Object[]) columnObj;
         BigInteger[] data = new BigInteger[numRows];
         for (int i = 0; i < numRows; i++) {
             if (column[i] == null) {
                 data[i] = null;
                 UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
             } else {
-                data[i] = column[i].setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
+                data[i] = ((BigDecimal) column[i]).setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
             }
         }
         copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 4);
@@ -603,14 +1051,14 @@ public class JdbcExecutor {
 
     public void copyBatchDecimal64Result(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr, int scale) {
-        BigDecimal[] column = (BigDecimal[]) columnObj;
+        Object[] column = (Object[]) columnObj;
         BigInteger[] data = new BigInteger[numRows];
         for (int i = 0; i < numRows; i++) {
             if (column[i] == null) {
                 data[i] = null;
                 UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
             } else {
-                data[i] = column[i].setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
+                data[i] = ((BigDecimal) column[i]).setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
             }
         }
         copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 8);
@@ -618,22 +1066,21 @@ public class JdbcExecutor {
 
     public void copyBatchDecimal128Result(Object columnObj, boolean 
isNullable, int numRows, long nullMapAddr,
             long columnAddr, int scale) {
-        BigDecimal[] column = (BigDecimal[]) columnObj;
+        Object[] column = (Object[]) columnObj;
         BigInteger[] data = new BigInteger[numRows];
         for (int i = 0; i < numRows; i++) {
             if (column[i] == null) {
                 data[i] = null;
                 UdfUtils.UNSAFE.putByte(nullMapAddr + i, (byte) 1);
             } else {
-                data[i] = column[i].setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
+                data[i] = ((BigDecimal) column[i]).setScale(scale, 
RoundingMode.HALF_EVEN).unscaledValue();
             }
         }
         copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 16);
     }
 
-    public void copyBatchDecimalResult(Object columnObj, boolean isNullable, 
int numRows,
+    private void copyBatchDecimalResult(BigInteger[] column, boolean 
isNullable, int numRows,
             long columnAddr, int typeLen) {
-        BigInteger[] column = (BigInteger[]) columnObj;
         if (isNullable == true) {
             for (int i = 0; i < numRows; i++) {
                 if (column[i] != null) {
@@ -645,7 +1092,8 @@ public class JdbcExecutor {
                     for (int index = 0; index < Math.min(bytes.length, 
value.length); ++index) {
                         value[index] = bytes[index];
                     }
-                    UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, 
null, columnAddr + (i * typeLen), typeLen);
+                    UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, 
null, columnAddr + ((long) i * typeLen),
+                            typeLen);
                 }
             }
         } else {
@@ -658,7 +1106,8 @@ public class JdbcExecutor {
                 for (int index = 0; index < Math.min(bytes.length, 
value.length); ++index) {
                     value[index] = bytes[index];
                 }
-                UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, null, 
columnAddr + (i * typeLen), typeLen);
+                UdfUtils.copyMemory(value, UdfUtils.BYTE_ARRAY_OFFSET, null, 
columnAddr + ((long) i * typeLen),
+                        typeLen);
             }
         }
     }
diff --git a/regression-test/suites/jdbc_p0/test_jdbc_query_mysql.groovy 
b/regression-test/suites/jdbc_p0/test_jdbc_query_mysql.groovy
index 778291a401..ed9aabcc26 100644
--- a/regression-test/suites/jdbc_p0/test_jdbc_query_mysql.groovy
+++ b/regression-test/suites/jdbc_p0/test_jdbc_query_mysql.groovy
@@ -795,6 +795,7 @@ suite("test_jdbc_query_mysql", "p0") {
                                 FROM ( SELECT id AS a, id % 3 AS b FROM 
${exMysqlTable}) t1
                             JOIN ${exMysqlTable} t2 ON t1.a = t2.id GROUP BY 
t1.a) o
                             ON l.b = o.d AND l.a = o.a order by l.a desc limit 
3"""
+        // this pr fixed, wait for merge: 
https://github.com/apache/doris/pull/16442                    
         order_qt_sql48 """ SELECT x, y, COUNT(*) as c FROM (SELECT k8, 0 AS x 
FROM $jdbcMysql57Table1) a
                             JOIN (SELECT k8, 1 AS y FROM $jdbcMysql57Table1) b 
ON a.k8 = b.k8 group by x, y order by c desc limit 3 """
         order_qt_sql49 """ SELECT * FROM (SELECT * FROM $jdbcMysql57Table1 
WHERE k8 % 120 > 110) l
@@ -934,7 +935,7 @@ suite("test_jdbc_query_mysql", "p0") {
         order_qt_sql111 """ SELECT rank() OVER () FROM (SELECT k8 FROM 
$jdbcMysql57Table1 LIMIT 10) as t LIMIT 3 """
         order_qt_sql112 """ SELECT k7, count(DISTINCT k8) FROM 
$jdbcMysql57Table1 WHERE k8 > 110 GROUP BY GROUPING SETS ((), (k7)) """
 
-
+        // TODO: check this, maybe caused by datasource in JDBC
         // test alter resource
         sql """alter resource $jdbcResourceMysql57 properties("password" = 
"1234567")"""
         test {
diff --git a/regression-test/suites/jdbc_p0/test_jdbc_query_pg.groovy 
b/regression-test/suites/jdbc_p0/test_jdbc_query_pg.groovy
index a18156527c..d29c2e7a6b 100644
--- a/regression-test/suites/jdbc_p0/test_jdbc_query_pg.groovy
+++ b/regression-test/suites/jdbc_p0/test_jdbc_query_pg.groovy
@@ -69,7 +69,7 @@ suite("test_jdbc_query_pg", "p0") {
             );
             """
         order_qt_sql1 """select count(*) from $jdbcPg14Table1"""
-        order_qt_sql2 """select * from $jdbcPg14Table1"""
+        order_qt_sql2 """select * from $jdbcPg14Table1 order by 
k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;"""
 
 
         // test for : doris query external table which is pg table's view
@@ -497,6 +497,7 @@ suite("test_jdbc_query_pg", "p0") {
                                 FROM ( SELECT id AS a, id % 3 AS b FROM 
${dorisExTable1}) t1
                             JOIN ${dorisExTable1} t2 ON t1.a = t2.id GROUP BY 
t1.a) o
                             ON l.b = o.d AND l.a = o.a order by l.a desc limit 
3"""
+        // this pr fixed, wait for merge: 
https://github.com/apache/doris/pull/16442   
         order_qt_sql48 """ SELECT x, y, COUNT(*) as c FROM (SELECT k8, 0 AS x 
FROM $jdbcPg14Table1) a
                             JOIN (SELECT k8, 1 AS y FROM $jdbcPg14Table1) b ON 
a.k8 = b.k8 group by x, y order by c desc limit 3 """
         order_qt_sql49 """ SELECT * FROM (SELECT * FROM $jdbcPg14Table1 WHERE 
k8 % 120 > 110) l


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to