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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]