morningman commented on code in PR #26317:
URL: https://github.com/apache/doris/pull/26317#discussion_r1384767458


##########
fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java:
##########
@@ -483,1071 +362,402 @@ private void setValidationQuery(DruidDataSource ds, 
TOdbcTableType tableType) {
         }
     }
 
-    public void booleanPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr, long columnAddr,
-            int startRow) {
-        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, (Boolean) 
column[i] ? (byte) 1 : 0);
-                }
-            }
-        } else {
-            for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putByte(columnAddr + i, (Boolean) column[i] ? 
(byte) 1 : 0);
-            }
-        }
+    public boolean isNebula() {
+        return tableType == TOdbcTableType.NEBULA;
     }
 
-    public void copyBatchBooleanResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
-            long columnAddr) {
-        Object[] column = (Object[]) columnObj;
-        int firstNotNullIndex = 0;
-        if (isNullable) {
-            firstNotNullIndex = getFirstNotNullObject(column, numRows, 
nullMapAddr);
-        }
-        if (firstNotNullIndex == numRows) {
-            return;
-        }
-        if (column[firstNotNullIndex] instanceof Boolean) {
-            booleanPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
-        } else if (column[firstNotNullIndex] instanceof Integer) {
-            integerPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
-        } else if (column[firstNotNullIndex] instanceof Byte) {
-            bytePutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
+    private Class<?> findNonNullClass(Object[] columnData) {
+        for (Object data : columnData) {
+            if (data != null) {
+                return data.getClass();
+            }
+        }
+        return Object.class;
+    }
+
+    public Object getColumnValue(TOdbcTableType tableType, int columnIndex, 
boolean isBitmapOrHll)
+            throws SQLException {
+        Object result;
+        if (tableType == TOdbcTableType.NEBULA) {
+            result = UdfUtils.convertObject((ValueWrapper) 
resultSet.getObject(columnIndex + 1));
+        } else {
+            result =
+                    isBitmapOrHll
+                            ? resultSet.getBytes(columnIndex + 1)
+                            : resultSet.getObject(columnIndex + 1);
+        }
+        return result;
+    }
+
+    /*
+    | Type                                        | Java Array Type            
|
+    
|---------------------------------------------|----------------------------|
+    | BOOLEAN                                     | Boolean[]                  
|
+    | TINYINT                                     | Byte[]                     
|
+    | SMALLINT                                    | Short[]                    
|
+    | INT                                         | Integer[]                  
|
+    | BIGINT                                      | Long[]                     
|
+    | LARGEINT                                    | BigInteger[]               
|
+    | FLOAT                                       | Float[]                    
|
+    | DOUBLE                                      | Double[]                   
|
+    | DECIMALV2, DECIMAL32, DECIMAL64, DECIMAL128 | BigDecimal[]               
|
+    | DATE, DATEV2                                | LocalDate[]                
|
+    | DATETIME, DATETIMEV2                        | LocalDateTime[]            
|
+    | CHAR, VARCHAR, STRING                       | String[]                   
|
+    | ARRAY                                       | List<Object>[]             
|
+    | MAP                                         | Map<Object, Object>[]      
|
+    | STRUCT                                      | Map<String, Object>[]      
|
+    */
+
+    private ColumnValueConverter getOutputConverter(
+            ColumnType columnType, Class clz, String replaceString) {
+        switch (columnType.getType()) {
+            case BOOLEAN:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) input) != 0, 
Boolean.class);
+                }
+                if (Byte.class.equals(clz)) {
+                    return createConverter(input -> ((Byte) input) != 0, 
Boolean.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input ->
+                                    Boolean.parseBoolean(
+                                            String.valueOf(input).equals("1") 
? "true" : "false"),
+                            Boolean.class);
+                }
+                break;
+            case TINYINT:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).byteValue(), Byte.class);
+                }
+                if (Short.class.equals(clz)) {
+                    return createConverter(input -> ((Short) 
input).byteValue(), Byte.class);
+                }
+                if (Object.class.equals(clz)) {
+                    return createConverter(
+                            input -> (byte) 
Integer.parseInt(String.valueOf(input)), Byte.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).byteValue(), Byte.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Byte.parseByte(String.valueOf(input)), 
Byte.class);
+                }
+                break;
+            case SMALLINT:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).shortValue(), Short.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).shortValue(), Short.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Short.parseShort(String.valueOf(input)), 
Short.class);
+                }
+                if (Byte.class.equals(clz)) {
+                    return createConverter(input -> ((Byte) 
input).shortValue(), Short.class);
+                }
+                if (com.clickhouse.data.value.UnsignedByte.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedByte) input).shortValue(), 
Short.class);
+                }
+                break;
+            case INT:
+                if (Long.class.equals(clz)) {
+                    return createConverter(input -> ((Long) input).intValue(), 
Integer.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).intValue(), Integer.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Integer.parseInt(String.valueOf(input)), 
Integer.class);
+                }
+                if (Short.class.equals(clz)) {
+                    return createConverter(input -> ((Short) 
input).intValue(), Integer.class);
+                }
+                if (com.clickhouse.data.value.UnsignedShort.class.equals(clz)) 
{
+                    return createConverter(
+                            input -> ((UnsignedShort) input).intValue(), 
Integer.class);
+                }
+                break;
+            case BIGINT:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).longValue(), Long.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Long.parseLong(String.valueOf(input)), 
Long.class);
+                }
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).longValue(), Long.class);
+                }
+                if 
(com.clickhouse.data.value.UnsignedInteger.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedInteger) input).longValue(), 
Long.class);
+                }
+                break;
+            case LARGEINT:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((BigDecimal) input).toBigInteger(), 
BigInteger.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> new BigInteger(String.valueOf(input)), 
BigInteger.class);
+                }
+                if (Long.class.equals(clz)) {
+                    return createConverter(
+                            input -> BigInteger.valueOf((Long) input), 
BigInteger.class);
+                }
+                if (com.clickhouse.data.value.UnsignedLong.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedLong) input).bigIntegerValue(), 
BigInteger.class);
+                }
+                break;
+            case DOUBLE:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((BigDecimal) input).doubleValue(), 
Double.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> 
Double.parseDouble(String.valueOf(input)), Double.class);
+                }
+                break;
+            case FLOAT:
+                return createConverter(
+                        input -> Float.parseFloat(String.valueOf(input)), 
Float.class);
+            case DECIMALV2:
+            case DECIMAL32:
+            case DECIMAL64:
+            case DECIMAL128:
+                return createConverter(
+                        input -> new BigDecimal(String.valueOf(input)), 
BigDecimal.class);
+            case DATE:
+            case DATEV2:
+                if (Date.class.equals(clz)) {
+                    return createConverter(input -> ((Date) 
input).toLocalDate(), LocalDate.class);
+                }
+                if (Timestamp.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) 
input).toLocalDateTime().toLocalDate(),
+                            LocalDate.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> LocalDate.parse(String.valueOf(input)), 
LocalDate.class);
+                }
+                break;
+            case DATETIME:
+            case DATETIMEV2:
+                if (Timestamp.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) input).toLocalDateTime(), 
LocalDateTime.class);
+                }
+                if (OffsetDateTime.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) input).toLocalDateTime(), 
LocalDateTime.class);
+                }
+                if (oracle.sql.TIMESTAMP.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    return ((oracle.sql.TIMESTAMP) input)
+                                            .timestampValue()
+                                            .toLocalDateTime();
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            LocalDateTime.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input ->
+                                    LocalDateTime.parse(
+                                            String.valueOf(input),
+                                            
getDateTimeFormatter(String.valueOf(input))),
+                            LocalDateTime.class);
+                }
+                break;
+            case CHAR:
+                return createConverter(
+                        input -> trimSpaces(tableType, input.toString()), 
String.class);
+            case VARCHAR:
+            case STRING:
+                if (byte[].class.equals(clz)) {
+                    if (replaceString.equals("bitmap") || 
replaceString.equals("hll")) {
+                        break;
+                    } else {
+                        return createConverter(
+                                input -> byteArrayToHexString(tableType, 
(byte[]) input),
+                                String.class);
+                    }
+                }
+                if (Time.class.equals(clz)) {
+                    return createConverter(
+                            input -> timeToString((java.sql.Time) input), 
String.class);
+                }
+                if (oracle.sql.CLOB.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    oracle.sql.CLOB clob = (oracle.sql.CLOB) 
input;
+                                    return clob.getSubString(1, (int) 
clob.length());
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            String.class);
+                }
+                if (java.net.Inet4Address.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((InetAddress) input).getHostAddress(), 
String.class);
+                }
+                if (java.net.Inet6Address.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                String inetAddress = ((InetAddress) 
input).getHostAddress();
+                                return simplifyIPv6Address(inetAddress);
+                            },
+                            String.class);
+                } else {
+                    return createConverter(Object::toString, String.class);
+                }
+            case ARRAY:
+                if (java.sql.Array.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    return Arrays.asList(
+                                            (Object[]) ((java.sql.Array) 
input).getArray());
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            List.class);
+                } else if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                List<Object> list = 
parseArray(String.valueOf(input));
+                                return convertArray(list, 
columnType.getChildTypes().get(0));
+                            },
+                            List.class);
+                } else {
+                    return createConverter(
+                            input -> {
+                                List<Object> list = 
convertClickHouseArray(input);
+                                return convertArray(list, 
columnType.getChildTypes().get(0));
+                            },
+                            List.class);
+                }
+            default:
+                throw new IllegalArgumentException(

Review Comment:
   Don't support MAP and STRUCT?



##########
fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java:
##########
@@ -483,1071 +362,402 @@ private void setValidationQuery(DruidDataSource ds, 
TOdbcTableType tableType) {
         }
     }
 
-    public void booleanPutToByte(Object[] column, boolean isNullable, int 
numRows, long nullMapAddr, long columnAddr,
-            int startRow) {
-        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, (Boolean) 
column[i] ? (byte) 1 : 0);
-                }
-            }
-        } else {
-            for (int i = 0; i < numRows; i++) {
-                UdfUtils.UNSAFE.putByte(columnAddr + i, (Boolean) column[i] ? 
(byte) 1 : 0);
-            }
-        }
+    public boolean isNebula() {
+        return tableType == TOdbcTableType.NEBULA;
     }
 
-    public void copyBatchBooleanResult(Object columnObj, boolean isNullable, 
int numRows, long nullMapAddr,
-            long columnAddr) {
-        Object[] column = (Object[]) columnObj;
-        int firstNotNullIndex = 0;
-        if (isNullable) {
-            firstNotNullIndex = getFirstNotNullObject(column, numRows, 
nullMapAddr);
-        }
-        if (firstNotNullIndex == numRows) {
-            return;
-        }
-        if (column[firstNotNullIndex] instanceof Boolean) {
-            booleanPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
-        } else if (column[firstNotNullIndex] instanceof Integer) {
-            integerPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
-        } else if (column[firstNotNullIndex] instanceof Byte) {
-            bytePutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
+    private Class<?> findNonNullClass(Object[] columnData) {
+        for (Object data : columnData) {
+            if (data != null) {
+                return data.getClass();
+            }
+        }
+        return Object.class;
+    }
+
+    public Object getColumnValue(TOdbcTableType tableType, int columnIndex, 
boolean isBitmapOrHll)
+            throws SQLException {
+        Object result;
+        if (tableType == TOdbcTableType.NEBULA) {
+            result = UdfUtils.convertObject((ValueWrapper) 
resultSet.getObject(columnIndex + 1));
+        } else {
+            result =
+                    isBitmapOrHll
+                            ? resultSet.getBytes(columnIndex + 1)
+                            : resultSet.getObject(columnIndex + 1);
+        }
+        return result;
+    }
+
+    /*
+    | Type                                        | Java Array Type            
|
+    
|---------------------------------------------|----------------------------|
+    | BOOLEAN                                     | Boolean[]                  
|
+    | TINYINT                                     | Byte[]                     
|
+    | SMALLINT                                    | Short[]                    
|
+    | INT                                         | Integer[]                  
|
+    | BIGINT                                      | Long[]                     
|
+    | LARGEINT                                    | BigInteger[]               
|
+    | FLOAT                                       | Float[]                    
|
+    | DOUBLE                                      | Double[]                   
|
+    | DECIMALV2, DECIMAL32, DECIMAL64, DECIMAL128 | BigDecimal[]               
|
+    | DATE, DATEV2                                | LocalDate[]                
|
+    | DATETIME, DATETIMEV2                        | LocalDateTime[]            
|
+    | CHAR, VARCHAR, STRING                       | String[]                   
|
+    | ARRAY                                       | List<Object>[]             
|
+    | MAP                                         | Map<Object, Object>[]      
|
+    | STRUCT                                      | Map<String, Object>[]      
|
+    */
+
+    private ColumnValueConverter getOutputConverter(
+            ColumnType columnType, Class clz, String replaceString) {
+        switch (columnType.getType()) {
+            case BOOLEAN:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) input) != 0, 
Boolean.class);
+                }
+                if (Byte.class.equals(clz)) {
+                    return createConverter(input -> ((Byte) input) != 0, 
Boolean.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input ->
+                                    Boolean.parseBoolean(
+                                            String.valueOf(input).equals("1") 
? "true" : "false"),
+                            Boolean.class);
+                }
+                break;
+            case TINYINT:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).byteValue(), Byte.class);
+                }
+                if (Short.class.equals(clz)) {
+                    return createConverter(input -> ((Short) 
input).byteValue(), Byte.class);
+                }
+                if (Object.class.equals(clz)) {
+                    return createConverter(
+                            input -> (byte) 
Integer.parseInt(String.valueOf(input)), Byte.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).byteValue(), Byte.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Byte.parseByte(String.valueOf(input)), 
Byte.class);
+                }
+                break;
+            case SMALLINT:
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).shortValue(), Short.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).shortValue(), Short.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Short.parseShort(String.valueOf(input)), 
Short.class);
+                }
+                if (Byte.class.equals(clz)) {
+                    return createConverter(input -> ((Byte) 
input).shortValue(), Short.class);
+                }
+                if (com.clickhouse.data.value.UnsignedByte.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedByte) input).shortValue(), 
Short.class);
+                }
+                break;
+            case INT:
+                if (Long.class.equals(clz)) {
+                    return createConverter(input -> ((Long) input).intValue(), 
Integer.class);
+                }
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).intValue(), Integer.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Integer.parseInt(String.valueOf(input)), 
Integer.class);
+                }
+                if (Short.class.equals(clz)) {
+                    return createConverter(input -> ((Short) 
input).intValue(), Integer.class);
+                }
+                if (com.clickhouse.data.value.UnsignedShort.class.equals(clz)) 
{
+                    return createConverter(
+                            input -> ((UnsignedShort) input).intValue(), 
Integer.class);
+                }
+                break;
+            case BIGINT:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(input -> ((BigDecimal) 
input).longValue(), Long.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> Long.parseLong(String.valueOf(input)), 
Long.class);
+                }
+                if (Integer.class.equals(clz)) {
+                    return createConverter(input -> ((Integer) 
input).longValue(), Long.class);
+                }
+                if 
(com.clickhouse.data.value.UnsignedInteger.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedInteger) input).longValue(), 
Long.class);
+                }
+                break;
+            case LARGEINT:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((BigDecimal) input).toBigInteger(), 
BigInteger.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> new BigInteger(String.valueOf(input)), 
BigInteger.class);
+                }
+                if (Long.class.equals(clz)) {
+                    return createConverter(
+                            input -> BigInteger.valueOf((Long) input), 
BigInteger.class);
+                }
+                if (com.clickhouse.data.value.UnsignedLong.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((UnsignedLong) input).bigIntegerValue(), 
BigInteger.class);
+                }
+                break;
+            case DOUBLE:
+                if (BigDecimal.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((BigDecimal) input).doubleValue(), 
Double.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> 
Double.parseDouble(String.valueOf(input)), Double.class);
+                }
+                break;
+            case FLOAT:
+                return createConverter(
+                        input -> Float.parseFloat(String.valueOf(input)), 
Float.class);
+            case DECIMALV2:
+            case DECIMAL32:
+            case DECIMAL64:
+            case DECIMAL128:
+                return createConverter(
+                        input -> new BigDecimal(String.valueOf(input)), 
BigDecimal.class);
+            case DATE:
+            case DATEV2:
+                if (Date.class.equals(clz)) {
+                    return createConverter(input -> ((Date) 
input).toLocalDate(), LocalDate.class);
+                }
+                if (Timestamp.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) 
input).toLocalDateTime().toLocalDate(),
+                            LocalDate.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> LocalDate.parse(String.valueOf(input)), 
LocalDate.class);
+                }
+                break;
+            case DATETIME:
+            case DATETIMEV2:
+                if (Timestamp.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) input).toLocalDateTime(), 
LocalDateTime.class);
+                }
+                if (OffsetDateTime.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((Timestamp) input).toLocalDateTime(), 
LocalDateTime.class);
+                }
+                if (oracle.sql.TIMESTAMP.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    return ((oracle.sql.TIMESTAMP) input)
+                                            .timestampValue()
+                                            .toLocalDateTime();
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            LocalDateTime.class);
+                }
+                if (String.class.equals(clz)) {
+                    return createConverter(
+                            input ->
+                                    LocalDateTime.parse(
+                                            String.valueOf(input),
+                                            
getDateTimeFormatter(String.valueOf(input))),
+                            LocalDateTime.class);
+                }
+                break;
+            case CHAR:
+                return createConverter(
+                        input -> trimSpaces(tableType, input.toString()), 
String.class);
+            case VARCHAR:
+            case STRING:
+                if (byte[].class.equals(clz)) {
+                    if (replaceString.equals("bitmap") || 
replaceString.equals("hll")) {
+                        break;
+                    } else {
+                        return createConverter(
+                                input -> byteArrayToHexString(tableType, 
(byte[]) input),
+                                String.class);
+                    }
+                }
+                if (Time.class.equals(clz)) {
+                    return createConverter(
+                            input -> timeToString((java.sql.Time) input), 
String.class);
+                }
+                if (oracle.sql.CLOB.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    oracle.sql.CLOB clob = (oracle.sql.CLOB) 
input;
+                                    return clob.getSubString(1, (int) 
clob.length());
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            String.class);
+                }
+                if (java.net.Inet4Address.class.equals(clz)) {
+                    return createConverter(
+                            input -> ((InetAddress) input).getHostAddress(), 
String.class);
+                }
+                if (java.net.Inet6Address.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                String inetAddress = ((InetAddress) 
input).getHostAddress();
+                                return simplifyIPv6Address(inetAddress);
+                            },
+                            String.class);
+                } else {
+                    return createConverter(Object::toString, String.class);
+                }
+            case ARRAY:
+                if (java.sql.Array.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                try {
+                                    return Arrays.asList(
+                                            (Object[]) ((java.sql.Array) 
input).getArray());
+                                } catch (SQLException e) {
+                                    throw new RuntimeException(e);
+                                }
+                            },
+                            List.class);
+                } else if (String.class.equals(clz)) {
+                    return createConverter(
+                            input -> {
+                                List<Object> list = 
parseArray(String.valueOf(input));
+                                return convertArray(list, 
columnType.getChildTypes().get(0));
+                            },
+                            List.class);
+                } else {
+                    return createConverter(
+                            input -> {
+                                List<Object> list = 
convertClickHouseArray(input);

Review Comment:
   How to determine that we should call `convertClickHouseArray` here?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


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

Reply via email to