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(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"""
   }
 }

Reply via email to