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 de0139d5cc60e17829facefe9bc5612a74c743ab
Author: yongkang.zhong <[email protected]>
AuthorDate: Tue May 9 17:34:48 2023 +0800

    [fix](catalog) fix doris jdbc catalog largeint select error (#19407)
    
    when I use mysql-jdbc 5.1.47 create a doris jdbc catalog, the largeint 
cannot select
    When mysql-jdbc reads largeint, it will convert the format to string 
because it is too long
    
    mysql> select `largeint` from type3;
    ERROR 1105 (HY000): errCode = 2, detailMessage = 
(127.0.0.1)[INTERNAL_ERROR]Fail to convert jdbc type of java.lang.String to 
doris type LARGEINT on column: largeint. You need to check this column type 
between external table and doris table.
---
 be/src/vec/exec/vjdbc_connector.cpp                      |  2 +-
 .../src/main/java/org/apache/doris/udf/JdbcExecutor.java | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/be/src/vec/exec/vjdbc_connector.cpp 
b/be/src/vec/exec/vjdbc_connector.cpp
index 572be9e733..a01809e561 100644
--- a/be/src/vec/exec/vjdbc_connector.cpp
+++ b/be/src/vec/exec/vjdbc_connector.cpp
@@ -271,7 +271,7 @@ Status JdbcConnector::_check_type(SlotDescriptor* 
slot_desc, const std::string&
     case TYPE_BIGINT:
     case TYPE_LARGEINT: {
         if (type_str != "java.lang.Long" && type_str != "java.math.BigDecimal" 
&&
-            type_str != "java.math.BigInteger" &&
+            type_str != "java.math.BigInteger" && type_str != 
"java.lang.String" &&
             type_str != "com.clickhouse.data.value.UnsignedInteger" &&
             type_str != "com.clickhouse.data.value.UnsignedLong") {
             return Status::InternalError(error_msg);
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 c8ba6ee1ad..8e20d8cc4c 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
@@ -710,6 +710,20 @@ public class JdbcExecutor {
         }
     }
 
+    private void stringPutToBigInteger(Object[] column, boolean isNullable, 
int numRows, long nullMapAddr,
+            long columnAddr, int startRowForNullable) {
+        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] = new BigInteger((String) column[i]);
+            }
+        }
+        copyBatchDecimalResult(data, isNullable, numRows, columnAddr, 16, 
startRowForNullable);
+    }
+
     private void clickHouseUInt64ToLong(Object[] column, boolean isNullable, 
int numRows, long nullMapAddr,
             long columnAddr, int startRowForNullable) {
         if (isNullable) {
@@ -741,6 +755,8 @@ public class JdbcExecutor {
             bigDecimalPutToBigInteger(column, isNullable, numRows, 
nullMapAddr, columnAddr, firstNotNullIndex);
         } else if (column[firstNotNullIndex] instanceof BigInteger) {
             bigIntegerPutToByte(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
+        } else if (column[firstNotNullIndex] instanceof String) {
+            stringPutToBigInteger(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
         } else if (column[firstNotNullIndex] instanceof 
com.clickhouse.data.value.UnsignedLong) {
             clickHouseUInt64ToLong(column, isNullable, numRows, nullMapAddr, 
columnAddr, firstNotNullIndex);
         }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to