This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/dev/pr-11686-67941ddefacebbcadab6ba72f7e3877d10cbaee9 in repository https://gitbox.apache.org/repos/asf/seatunnel.git
commit c77bcf93b8d5e195b2569a7ab28632f9330b0a20 Author: zhengxiang378928908-code <[email protected]> AuthorDate: Wed Oct 14 11:03:05 2026 +0000 [Fix][Connector-V2] Support YashanDB VARCHAR2 and NVARCHAR2 type conversion (#11686) Co-authored-by: zhengxiang <[email protected]> Co-authored-by: David Zollo <[email protected]> Co-authored-by: Claude Sonnet 5.5 <[email protected]> --- .../dialect/yashandb/YashanDbTypeConverter.java | 3 +++ .../yashandb/YashanDbTypeConverterTest.java | 30 ++++++++++++++++++++++ .../connectors/seatunnel/jdbc/JdbcYashanDbIT.java | 7 +++++ .../resources/jdbc_yashandb_source_to_sink.conf | 4 +-- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverter.java b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverter.java index 11cdc6aa92..022dc54c2d 100644 --- a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverter.java +++ b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverter.java @@ -71,11 +71,14 @@ public class YashanDbTypeConverter implements TypeConverter<BasicTypeDefine> { // ============================ Character Data Types ============================ // CHAR: [1,8000] bytes; VARCHAR: [1,65534] bytes + // VARCHAR2 is the Oracle-compatible synonym of VARCHAR and shares its byte length semantics. public static final String CHAR = "CHAR"; public static final String VARCHAR = "VARCHAR"; public static final String VARCHAR2 = "VARCHAR2"; // NCHAR: [1,4000]; NVARCHAR: [1,32767] (Unicode) + // NVARCHAR2 is the Oracle-compatible synonym of NVARCHAR and shares its character length + // semantics. public static final String NCHAR = "NCHAR"; public static final String NVARCHAR = "NVARCHAR"; public static final String NVARCHAR2 = "NVARCHAR2"; diff --git a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverterTest.java b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverterTest.java index c64664d210..aae1380160 100644 --- a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverterTest.java +++ b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/yashandb/YashanDbTypeConverterTest.java @@ -258,6 +258,36 @@ public class YashanDbTypeConverterTest { Assertions.assertEquals(BasicType.STRING_TYPE, column.getDataType()); Assertions.assertEquals(200L, column.getColumnLength()); + // VARCHAR2 is an alias of VARCHAR and must behave identically. + // YashanDbCatalog always feeds BasicTypeDefine#length from cols.data_length, which is a + // byte count, so a declared VARCHAR2(200) arrives as length=200 -> 200 * 4. + typeDefine = + BasicTypeDefine.builder() + .name("test") + .columnType("VARCHAR2(200)") + .dataType("VARCHAR2") + .length(200L) + .build(); + column = INSTANCE.convert(typeDefine); + Assertions.assertEquals(BasicType.STRING_TYPE, column.getDataType()); + Assertions.assertEquals(800L, column.getColumnLength()); + Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType()); + + // NVARCHAR2 is an alias of NVARCHAR and must behave identically. + // A declared NVARCHAR2(100) holds 100 characters at 2 bytes each, so data_length is 200 + // and the double-byte rule yields 200 * 2 = 400, i.e. 100 characters at 4 bytes. + typeDefine = + BasicTypeDefine.builder() + .name("test") + .columnType("NVARCHAR2(100)") + .dataType("NVARCHAR2") + .length(200L) + .build(); + column = INSTANCE.convert(typeDefine); + Assertions.assertEquals(BasicType.STRING_TYPE, column.getDataType()); + Assertions.assertEquals(400L, column.getColumnLength()); + Assertions.assertEquals(typeDefine.getColumnType(), column.getSourceType()); + // VARCHAR2(100) -> STRING with columnLength = 100 * 4 (byte-length semantics, same as // VARCHAR) typeDefine = diff --git a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcYashanDbIT.java b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcYashanDbIT.java index ddb0069f56..b66b7c7025 100644 --- a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcYashanDbIT.java +++ b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/JdbcYashanDbIT.java @@ -71,6 +71,8 @@ public class JdbcYashanDbIT extends AbstractJdbcIT { + " YAS_NUMBER NUMBER(10, 2),\n" + " YAS_CHAR CHAR(20),\n" + " YAS_VARCHAR VARCHAR(200),\n" + + " YAS_VARCHAR2 VARCHAR2(200),\n" + + " YAS_NVARCHAR2 NVARCHAR2(100),\n" + " YAS_CLOB CLOB,\n" + " YAS_DATE DATE,\n" + " YAS_TIMESTAMP TIMESTAMP,\n" @@ -89,6 +91,8 @@ public class JdbcYashanDbIT extends AbstractJdbcIT { "YAS_NUMBER", "YAS_CHAR", "YAS_VARCHAR", + "YAS_VARCHAR2", + "YAS_NVARCHAR2", "YAS_CLOB", "YAS_DATE", "YAS_TIMESTAMP", @@ -150,6 +154,9 @@ public class JdbcYashanDbIT extends AbstractJdbcIT { BigDecimal.valueOf(i, 2), String.format("char_%s", i), String.format("varchar_%s", i), + String.format("varchar2_%s", i), + // multi-byte content exercises the NVARCHAR2 length rule + String.format("崖山_%s", i), String.format("clob_%s", i), Date.valueOf(rowDate), Timestamp.valueOf(rowDateTime), diff --git a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/resources/jdbc_yashandb_source_to_sink.conf b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/resources/jdbc_yashandb_source_to_sink.conf index 1ccfc6cdf0..e57c34bc55 100644 --- a/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/resources/jdbc_yashandb_source_to_sink.conf +++ b/seatunnel-e2e/seatunnel-connector-v2-e2e/connector-jdbc-e2e/connector-jdbc-e2e-part-7/src/test/resources/jdbc_yashandb_source_to_sink.conf @@ -41,7 +41,7 @@ sink { user = "SYS" password = "Cod-2022" query = """INSERT INTO SYS.E2E_TABLE_SINK - (YAS_TINYINT, YAS_SMALLINT, YAS_INT, YAS_BIGINT, YAS_FLOAT, YAS_DOUBLE, YAS_NUMBER, YAS_CHAR, YAS_VARCHAR, YAS_CLOB, YAS_DATE, YAS_TIMESTAMP, YAS_BOOLEAN) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""" + (YAS_TINYINT, YAS_SMALLINT, YAS_INT, YAS_BIGINT, YAS_FLOAT, YAS_DOUBLE, YAS_NUMBER, YAS_CHAR, YAS_VARCHAR, YAS_VARCHAR2, YAS_NVARCHAR2, YAS_CLOB, YAS_DATE, YAS_TIMESTAMP, YAS_BOOLEAN) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""" } }
