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

zykkk pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 7bd6818350f [branch-2.1][improvement](jdbc catalog) Added support for 
Oracle Raw type  (#37776)
7bd6818350f is described below

commit 7bd6818350f6aa28ef4fc52c4551343f5f23792a
Author: zy-kkk <zhongy...@gmail.com>
AuthorDate: Mon Jul 15 14:43:05 2024 +0800

    [branch-2.1][improvement](jdbc catalog) Added support for Oracle Raw type  
(#37776)
    
    pick (#37078)
    In previous versions, we adopted the strategy of reading the object
    address for Oracle's raw type, which would lead to unstable and
    meaningless results. Here I changed it to read hexadecimal or UTF8
---
 .../org/apache/doris/jdbc/OracleJdbcExecutor.java  | 34 ++++++++++++++++++++++
 .../jdbc/test_oracle_jdbc_catalog.out              | 27 ++---------------
 .../jdbc/test_oracle_jdbc_catalog.groovy           |  4 +--
 3 files changed, 38 insertions(+), 27 deletions(-)

diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/OracleJdbcExecutor.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/OracleJdbcExecutor.java
index 47055facabb..662f324eb23 100644
--- 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/OracleJdbcExecutor.java
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/OracleJdbcExecutor.java
@@ -27,6 +27,10 @@ import org.apache.log4j.Logger;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.StandardCharsets;
 import java.sql.Clob;
 import java.sql.SQLException;
 import java.time.LocalDate;
@@ -34,6 +38,7 @@ import java.time.LocalDateTime;
 
 public class OracleJdbcExecutor extends BaseJdbcExecutor {
     private static final Logger LOG = 
Logger.getLogger(OracleJdbcExecutor.class);
+    private final CharsetDecoder utf8Decoder = 
StandardCharsets.UTF_8.newDecoder();
 
     public OracleJdbcExecutor(byte[] thriftParams) throws Exception {
         super(thriftParams);
@@ -117,6 +122,8 @@ public class OracleJdbcExecutor extends BaseJdbcExecutor {
                             LOG.error("Failed to get string from clob", e);
                             return null;
                         }
+                    } else if (input instanceof byte[]) {
+                        return convertByteArrayToString((byte[]) input);
                     } else {
                         return input.toString();
                     }
@@ -125,4 +132,31 @@ public class OracleJdbcExecutor extends BaseJdbcExecutor {
                 return null;
         }
     }
+
+    private String convertByteArrayToString(byte[] bytes) {
+        if (isValidUtf8(bytes)) {
+            return new String(bytes, StandardCharsets.UTF_8);
+        } else {
+            // Convert byte[] to hexadecimal string with "0x" prefix
+            return "0x" + bytesToHex(bytes);
+        }
+    }
+
+    private boolean isValidUtf8(byte[] bytes) {
+        utf8Decoder.reset();
+        try {
+            utf8Decoder.decode(ByteBuffer.wrap(bytes));
+            return true;
+        } catch (CharacterCodingException e) {
+            return false;
+        }
+    }
+
+    private String bytesToHex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02X", b));
+        }
+        return sb.toString();
+    }
 }
diff --git 
a/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out 
b/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
index c5473a451e8..74e3ee619cd 100644
--- a/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
+++ b/regression-test/data/external_table_p0/jdbc/test_oracle_jdbc_catalog.out
@@ -136,30 +136,9 @@ mysql
 -- !date7 --
 3      \N      2019-11-12T20:33:57.999 \N      \N      \N      \N      \N
 
--- !filter4_old_plan --
-1      alice   20      99.5
-3      jerry   23      88.0
-4      andy    21      93.0
-
--- !filter5_old_plan --
-1      alice   20      99.5
-2      bob     21      90.5
-3      jerry   23      88.0
-4      andy    21      93.0
-
--- !filter6_old_plan --
-1      alice   20      99.5
-4      andy    21      93.0
-
--- !filter7_old_plan --
-3      jerry   23      88.0
-
--- !filter8_old_plan --
-4      andy    21      93.0
-
--- !filter9_old_plan --
-3      jerry   23      88.0
-4      andy    21      93.0
+-- !raw --
+1      0xFFFF  0xAAAA
+2      beijing shanghai
 
 -- !test_insert1 --
 doris1 18
diff --git 
a/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy 
b/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
index dc23e601b2b..057723a808e 100644
--- 
a/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
+++ 
b/regression-test/suites/external_table_p0/jdbc/test_oracle_jdbc_catalog.groovy
@@ -141,9 +141,7 @@ suite("test_oracle_jdbc_catalog", 
"p0,external,oracle,external_docker,external_d
             contains """SELECT "ID", "NAME", "AGE", "SCORE" FROM 
"DORIS_TEST"."STUDENT" WHERE ((nvl("SCORE", 0.0) < 95.0))"""
         }
 
-        // The result of TEST_RAW will change
-        // So instead of qt, we're using sql here.
-        sql  """ select * from TEST_RAW order by ID; """
+        order_qt_raw  """ select * from TEST_RAW order by ID; """
 
         // test insert
         String uuid1 = UUID.randomUUID().toString();


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

Reply via email to