Skip to content

Commit 6d71069

Browse files
authored
[Fix] Fix Oracle type converter handle negative scale in number type (apache#6758)
1 parent 007a994 commit 6d71069

File tree

4 files changed

+69
-10
lines changed

4 files changed

+69
-10
lines changed

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverter.java

+9-8
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,22 @@ public Column convert(BasicTypeDefine typeDefine) {
117117
scale = 127;
118118
}
119119

120-
if (scale == 0) {
121-
if (precision == 1) {
120+
if (scale <= 0) {
121+
int newPrecision = (int) (precision - scale);
122+
if (newPrecision == 1) {
122123
builder.dataType(BasicType.BOOLEAN_TYPE);
123-
} else if (precision <= 9) {
124+
} else if (newPrecision <= 9) {
124125
builder.dataType(BasicType.INT_TYPE);
125-
} else if (precision <= 18) {
126+
} else if (newPrecision <= 18) {
126127
builder.dataType(BasicType.LONG_TYPE);
127-
} else if (precision < 38) {
128-
builder.dataType(new DecimalType(precision.intValue(), 0));
129-
builder.columnLength(precision);
128+
} else if (newPrecision < 38) {
129+
builder.dataType(new DecimalType(newPrecision, 0));
130+
builder.columnLength((long) newPrecision);
130131
} else {
131132
builder.dataType(new DecimalType(DEFAULT_PRECISION, 0));
132133
builder.columnLength((long) DEFAULT_PRECISION);
133134
}
134-
} else if (scale > 0 && scale <= DEFAULT_SCALE) {
135+
} else if (scale <= DEFAULT_SCALE) {
135136
builder.dataType(new DecimalType(precision.intValue(), scale));
136137
builder.columnLength(precision);
137138
builder.scale(scale);

Diff for: seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/oracle/OracleTypeConverterTest.java

+55
Original file line numberDiff line numberDiff line change
@@ -754,4 +754,59 @@ public void testReconvertDatetime() {
754754
typeDefine.getDataType());
755755
Assertions.assertEquals(column.getScale(), typeDefine.getScale());
756756
}
757+
758+
@Test
759+
public void testNumberWithNegativeScale() {
760+
BasicTypeDefine<Object> typeDefine =
761+
BasicTypeDefine.builder()
762+
.name("test")
763+
.columnType("number(38,-1)")
764+
.dataType("number")
765+
.precision(38L)
766+
.scale(-1)
767+
.build();
768+
Column column = OracleTypeConverter.INSTANCE.convert(typeDefine);
769+
Assertions.assertEquals(typeDefine.getName(), column.getName());
770+
Assertions.assertEquals(new DecimalType(38, 0), column.getDataType());
771+
Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType());
772+
773+
typeDefine =
774+
BasicTypeDefine.builder()
775+
.name("test")
776+
.columnType("number(5,-2)")
777+
.dataType("number")
778+
.precision(5L)
779+
.scale(-2)
780+
.build();
781+
column = OracleTypeConverter.INSTANCE.convert(typeDefine);
782+
Assertions.assertEquals(typeDefine.getName(), column.getName());
783+
Assertions.assertEquals(BasicType.INT_TYPE, column.getDataType());
784+
Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType());
785+
786+
typeDefine =
787+
BasicTypeDefine.builder()
788+
.name("test")
789+
.columnType("number(9,-2)")
790+
.dataType("number")
791+
.precision(9L)
792+
.scale(-2)
793+
.build();
794+
column = OracleTypeConverter.INSTANCE.convert(typeDefine);
795+
Assertions.assertEquals(typeDefine.getName(), column.getName());
796+
Assertions.assertEquals(BasicType.LONG_TYPE, column.getDataType());
797+
Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType());
798+
799+
typeDefine =
800+
BasicTypeDefine.builder()
801+
.name("test")
802+
.columnType("number(14,-11)")
803+
.dataType("number")
804+
.precision(14L)
805+
.scale(-11)
806+
.build();
807+
column = OracleTypeConverter.INSTANCE.convert(typeDefine);
808+
Assertions.assertEquals(typeDefine.getName(), column.getName());
809+
Assertions.assertEquals(new DecimalType(25, 0), column.getDataType());
810+
Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType());
811+
}
757812
}

Diff for: 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

+3
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public class JdbcOracleIT extends AbstractJdbcIT {
7373
+ " CHAR_10_COL char(10),\n"
7474
+ " CLOB_COL clob,\n"
7575
+ " NUMBER_3_SF_2_DP number(3, 2),\n"
76+
+ " NUMBER_7_SF_N2_DP number(7, -2),\n"
7677
+ " INTEGER_COL integer,\n"
7778
+ " FLOAT_COL float(10),\n"
7879
+ " REAL_COL real,\n"
@@ -90,6 +91,7 @@ public class JdbcOracleIT extends AbstractJdbcIT {
9091
"CHAR_10_COL",
9192
"CLOB_COL",
9293
"NUMBER_3_SF_2_DP",
94+
"NUMBER_7_SF_N2_DP",
9395
"INTEGER_COL",
9496
"FLOAT_COL",
9597
"REAL_COL",
@@ -170,6 +172,7 @@ Pair<String[], List<SeaTunnelRow>> initTestData() {
170172
String.format("f%s", i),
171173
String.format("f%s", i),
172174
BigDecimal.valueOf(1.1),
175+
BigDecimal.valueOf(2400),
173176
i,
174177
Float.parseFloat("2.2"),
175178
Float.parseFloat("2.2"),

Diff for: seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-1/src/test/resources/jdbc_oracle_source_to_sink.conf

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ source {
3030
url = "jdbc:oracle:thin:@e2e_oracleDb:1521/TESTUSER"
3131
user = testUser
3232
password = testPassword
33-
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"
33+
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"
3434
properties {
3535
database.oracle.jdbc.timezoneAsRegion = "false"
3636
}
@@ -46,7 +46,7 @@ sink {
4646
url = "jdbc:oracle:thin:@e2e_oracleDb:1521/TESTUSER"
4747
user = testUser
4848
password = testPassword
49-
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(?,?,?,?,?,?,?,?,?,?,?,?,?)"
49+
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(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
5050
properties {
5151
database.oracle.jdbc.timezoneAsRegion = "false"
5252
}

0 commit comments

Comments
 (0)