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

gaojun2048 pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/seatunnel.git


The following commit(s) were added to refs/heads/dev by this push:
     new 6d710690c5 [Fix] Fix Oracle type converter handle negative scale in 
number type (#6758)
6d710690c5 is described below

commit 6d710690c5f73f869bd70578655997c3cfb6fe78
Author: Jia Fan <[email protected]>
AuthorDate: Sun Apr 28 10:35:12 2024 +0800

    [Fix] Fix Oracle type converter handle negative scale in number type (#6758)
---
 .../dialect/oracle/OracleTypeConverter.java        | 17 +++----
 .../dialect/oracle/OracleTypeConverterTest.java    | 55 ++++++++++++++++++++++
 .../connectors/seatunnel/jdbc/JdbcOracleIT.java    |  3 ++
 .../test/resources/jdbc_oracle_source_to_sink.conf |  4 +-
 4 files changed, 69 insertions(+), 10 deletions(-)

diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverter.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverter.java
index 6497bf6ab5..d359f3fef0 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverter.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverter.java
@@ -117,21 +117,22 @@ public class OracleTypeConverter implements 
TypeConverter<BasicTypeDefine> {
                     scale = 127;
                 }
 
-                if (scale == 0) {
-                    if (precision == 1) {
+                if (scale <= 0) {
+                    int newPrecision = (int) (precision - scale);
+                    if (newPrecision == 1) {
                         builder.dataType(BasicType.BOOLEAN_TYPE);
-                    } else if (precision <= 9) {
+                    } else if (newPrecision <= 9) {
                         builder.dataType(BasicType.INT_TYPE);
-                    } else if (precision <= 18) {
+                    } else if (newPrecision <= 18) {
                         builder.dataType(BasicType.LONG_TYPE);
-                    } else if (precision < 38) {
-                        builder.dataType(new DecimalType(precision.intValue(), 
0));
-                        builder.columnLength(precision);
+                    } else if (newPrecision < 38) {
+                        builder.dataType(new DecimalType(newPrecision, 0));
+                        builder.columnLength((long) newPrecision);
                     } else {
                         builder.dataType(new DecimalType(DEFAULT_PRECISION, 
0));
                         builder.columnLength((long) DEFAULT_PRECISION);
                     }
-                } else if (scale > 0 && scale <= DEFAULT_SCALE) {
+                } else if (scale <= DEFAULT_SCALE) {
                     builder.dataType(new DecimalType(precision.intValue(), 
scale));
                     builder.columnLength(precision);
                     builder.scale(scale);
diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverterTest.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverterTest.java
index c8ce48e309..26238bad30 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverterTest.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverterTest.java
@@ -754,4 +754,59 @@ public class OracleTypeConverterTest {
                 typeDefine.getDataType());
         Assertions.assertEquals(column.getScale(), typeDefine.getScale());
     }
+
+    @Test
+    public void testNumberWithNegativeScale() {
+        BasicTypeDefine<Object> typeDefine =
+                BasicTypeDefine.builder()
+                        .name("test")
+                        .columnType("number(38,-1)")
+                        .dataType("number")
+                        .precision(38L)
+                        .scale(-1)
+                        .build();
+        Column column = OracleTypeConverter.INSTANCE.convert(typeDefine);
+        Assertions.assertEquals(typeDefine.getName(), column.getName());
+        Assertions.assertEquals(new DecimalType(38, 0), column.getDataType());
+        Assertions.assertEquals(typeDefine.getColumnType(), 
column.getSourceType());
+
+        typeDefine =
+                BasicTypeDefine.builder()
+                        .name("test")
+                        .columnType("number(5,-2)")
+                        .dataType("number")
+                        .precision(5L)
+                        .scale(-2)
+                        .build();
+        column = OracleTypeConverter.INSTANCE.convert(typeDefine);
+        Assertions.assertEquals(typeDefine.getName(), column.getName());
+        Assertions.assertEquals(BasicType.INT_TYPE, column.getDataType());
+        Assertions.assertEquals(typeDefine.getColumnType(), 
column.getSourceType());
+
+        typeDefine =
+                BasicTypeDefine.builder()
+                        .name("test")
+                        .columnType("number(9,-2)")
+                        .dataType("number")
+                        .precision(9L)
+                        .scale(-2)
+                        .build();
+        column = OracleTypeConverter.INSTANCE.convert(typeDefine);
+        Assertions.assertEquals(typeDefine.getName(), column.getName());
+        Assertions.assertEquals(BasicType.LONG_TYPE, column.getDataType());
+        Assertions.assertEquals(typeDefine.getColumnType(), 
column.getSourceType());
+
+        typeDefine =
+                BasicTypeDefine.builder()
+                        .name("test")
+                        .columnType("number(14,-11)")
+                        .dataType("number")
+                        .precision(14L)
+                        .scale(-11)
+                        .build();
+        column = OracleTypeConverter.INSTANCE.convert(typeDefine);
+        Assertions.assertEquals(typeDefine.getName(), column.getName());
+        Assertions.assertEquals(new DecimalType(25, 0), column.getDataType());
+        Assertions.assertEquals(typeDefine.getColumnType(), 
column.getSourceType());
+    }
 }
diff --git 
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleIT.java
 
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleIT.java
index e5a9165e8a..fa588cbd52 100644
--- 
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleIT.java
+++ 
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcOracleIT.java
@@ -73,6 +73,7 @@ public class JdbcOracleIT extends AbstractJdbcIT {
                     + "    CHAR_10_COL                   char(10),\n"
                     + "    CLOB_COL                      clob,\n"
                     + "    NUMBER_3_SF_2_DP              number(3, 2),\n"
+                    + "    NUMBER_7_SF_N2_DP             number(7, -2),\n"
                     + "    INTEGER_COL                   integer,\n"
                     + "    FLOAT_COL                     float(10),\n"
                     + "    REAL_COL                      real,\n"
@@ -90,6 +91,7 @@ public class JdbcOracleIT extends AbstractJdbcIT {
                 "CHAR_10_COL",
                 "CLOB_COL",
                 "NUMBER_3_SF_2_DP",
+                "NUMBER_7_SF_N2_DP",
                 "INTEGER_COL",
                 "FLOAT_COL",
                 "REAL_COL",
@@ -170,6 +172,7 @@ public class JdbcOracleIT extends AbstractJdbcIT {
                                 String.format("f%s", i),
                                 String.format("f%s", i),
                                 BigDecimal.valueOf(1.1),
+                                BigDecimal.valueOf(2400),
                                 i,
                                 Float.parseFloat("2.2"),
                                 Float.parseFloat("2.2"),
diff --git 
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/resources/jdbc_oracle_source_to_sink.conf
 
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/resources/jdbc_oracle_source_to_sink.conf
index f0c9f634f8..d956894c34 100644
--- 
a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/resources/jdbc_oracle_source_to_sink.conf
+++ 
b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/resources/jdbc_oracle_source_to_sink.conf
@@ -30,7 +30,7 @@ source {
     url = "jdbc:oracle:thin:@e2e_oracleDb:1521/TESTUSER"
     user = testUser
     password = testPassword
-    query = "SELECT 
VARCHAR_10_COL,CHAR_10_COL,CLOB_COL,NUMBER_3_SF_2_DP,INTEGER_COL,FLOAT_COL,REAL_COL,BINARY_FLOAT_COL,BINARY_DOUBLE_COL,DATE_COL,TIMESTAMP_WITH_3_FRAC_SEC_COL,TIMESTAMP_WITH_LOCAL_TZ,XML_TYPE_COL
 FROM E2E_TABLE_SOURCE"
+    query = "SELECT 
VARCHAR_10_COL,CHAR_10_COL,CLOB_COL,NUMBER_3_SF_2_DP,NUMBER_7_SF_N2_DP,INTEGER_COL,FLOAT_COL,REAL_COL,BINARY_FLOAT_COL,BINARY_DOUBLE_COL,DATE_COL,TIMESTAMP_WITH_3_FRAC_SEC_COL,TIMESTAMP_WITH_LOCAL_TZ,XML_TYPE_COL
 FROM E2E_TABLE_SOURCE"
     properties {
        database.oracle.jdbc.timezoneAsRegion = "false"
     }
@@ -46,7 +46,7 @@ sink {
     url = "jdbc:oracle:thin:@e2e_oracleDb:1521/TESTUSER"
     user = testUser
     password = testPassword
-    query = "INSERT INTO E2E_TABLE_SINK 
(VARCHAR_10_COL,CHAR_10_COL,CLOB_COL,NUMBER_3_SF_2_DP,INTEGER_COL,FLOAT_COL,REAL_COL,BINARY_FLOAT_COL,BINARY_DOUBLE_COL,DATE_COL,TIMESTAMP_WITH_3_FRAC_SEC_COL,TIMESTAMP_WITH_LOCAL_TZ,XML_TYPE_COL)
 VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)"
+    query = "INSERT INTO E2E_TABLE_SINK 
(VARCHAR_10_COL,CHAR_10_COL,CLOB_COL,NUMBER_3_SF_2_DP,NUMBER_7_SF_N2_DP,INTEGER_COL,FLOAT_COL,REAL_COL,BINARY_FLOAT_COL,BINARY_DOUBLE_COL,DATE_COL,TIMESTAMP_WITH_3_FRAC_SEC_COL,TIMESTAMP_WITH_LOCAL_TZ,XML_TYPE_COL)
 VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
     properties {
        database.oracle.jdbc.timezoneAsRegion = "false"
     }

Reply via email to