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

davidzollo 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 893a2abfe8 [Fix][Connector-V2][Jdbc][Dameng] Fix Dameng 
auto-create-table fails when table has column comments (#10934)
893a2abfe8 is described below

commit 893a2abfe851eacb19e1f87e1840d8df8e9d7093
Author: yusiwen <[email protected]>
AuthorDate: Wed May 27 16:59:28 2026 +0800

    [Fix][Connector-V2][Jdbc][Dameng] Fix Dameng auto-create-table fails when 
table has column comments (#10934)
    
    Co-authored-by: yusiwen <[email protected]>
    Co-authored-by: yusiwen <[email protected]>
---
 .../seatunnel/jdbc/catalog/dm/DamengCatalog.java   |   6 +
 .../catalog/dm/DamengCreateTableSqlBuilder.java    |  15 +-
 .../dm/DamengCreateTableSqlBuilderTest.java        | 193 +++++++++++++--------
 3 files changed, 136 insertions(+), 78 deletions(-)

diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalog.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalog.java
index 0878dd007f..55dc298165 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalog.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalog.java
@@ -108,6 +108,12 @@ public class DamengCatalog extends AbstractJdbcCatalog {
     @Override
     protected String getCreateTableSql(
             TablePath tablePath, CatalogTable table, boolean createIndex) {
+        return getCreateTableSqls(tablePath, table, createIndex).get(0);
+    }
+
+    @Override
+    protected List<String> getCreateTableSqls(
+            TablePath tablePath, CatalogTable table, boolean createIndex) {
         return new DamengCreateTableSqlBuilder(table, 
createIndex).build(tablePath);
     }
 
diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilder.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilder.java
index 8683346ceb..38b406f785 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilder.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilder.java
@@ -31,6 +31,7 @@ import 
org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.dm.DmdbTy
 
 import org.apache.commons.collections4.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -52,7 +53,9 @@ public class DamengCreateTableSqlBuilder extends 
AbstractJdbcCreateTableSqlBuild
         this.createIndex = createIndex;
     }
 
-    public String build(TablePath tablePath) {
+    public List<String> build(TablePath tablePath) {
+        List<String> sqls = new ArrayList<>();
+
         StringBuilder createTableSql = new StringBuilder();
         createTableSql
                 .append("CREATE TABLE ")
@@ -90,6 +93,7 @@ public class DamengCreateTableSqlBuilder extends 
AbstractJdbcCreateTableSqlBuild
 
         createTableSql.append(String.join(",\n", columnSqls));
         createTableSql.append("\n)");
+        sqls.add(createTableSql.toString());
 
         List<String> commentSqls =
                 columns.stream()
@@ -99,14 +103,9 @@ public class DamengCreateTableSqlBuilder extends 
AbstractJdbcCreateTableSqlBuild
                                         buildColumnCommentSql(
                                                 column, 
tablePath.getSchemaAndTableName("\"")))
                         .collect(Collectors.toList());
+        sqls.addAll(commentSqls);
 
-        if (!commentSqls.isEmpty()) {
-            createTableSql.append(";\n");
-            createTableSql.append(String.join(";\n", commentSqls));
-            createTableSql.append(";");
-        }
-
-        return createTableSql.toString();
+        return sqls;
     }
 
     String buildColumnSql(Column column) {
diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilderTest.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilderTest.java
index 3b0e4b7e58..a6718cf00a 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilderTest.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCreateTableSqlBuilderTest.java
@@ -21,22 +21,20 @@ import 
org.apache.seatunnel.shade.com.google.common.collect.Lists;
 
 import org.apache.seatunnel.api.table.catalog.CatalogTable;
 import org.apache.seatunnel.api.table.catalog.Column;
-import org.apache.seatunnel.api.table.catalog.ConstraintKey;
 import org.apache.seatunnel.api.table.catalog.PhysicalColumn;
 import org.apache.seatunnel.api.table.catalog.PrimaryKey;
 import org.apache.seatunnel.api.table.catalog.TableIdentifier;
 import org.apache.seatunnel.api.table.catalog.TablePath;
 import org.apache.seatunnel.api.table.catalog.TableSchema;
 import org.apache.seatunnel.api.table.type.BasicType;
-import org.apache.seatunnel.api.table.type.LocalTimeType;
 import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
+import java.util.List;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -44,7 +42,7 @@ import static org.mockito.Mockito.when;
 public class DamengCreateTableSqlBuilderTest {
 
     @Test
-    public void TestCreateTableSqlBuilder() {
+    public void testCreateTableSqlsWithComments() {
         TablePath tablePath = TablePath.of("test_database", "test_schema", 
"test_table");
         TableSchema tableSchema =
                 TableSchema.builder()
@@ -55,37 +53,94 @@ public class DamengCreateTableSqlBuilderTest {
                         .column(
                                 PhysicalColumn.of(
                                         "age", BasicType.INT_TYPE, (Long) 
null, true, null, "age"))
+                        .primaryKey(PrimaryKey.of("id", 
Lists.newArrayList("id")))
+                        .build();
+
+        CatalogTable catalogTable =
+                CatalogTable.of(
+                        TableIdentifier.of("test_catalog", tablePath),
+                        tableSchema,
+                        new HashMap<>(),
+                        new ArrayList<>(),
+                        "User table");
+
+        List<String> sqls = new DamengCreateTableSqlBuilder(catalogTable, 
true).build(tablePath);
+
+        // 1 CREATE TABLE + 3 COMMENT ON COLUMN
+        Assertions.assertEquals(4, sqls.size());
+
+        String createTable = sqls.get(0);
+        Assertions.assertTrue(
+                createTable.startsWith("CREATE TABLE 
\"test_schema\".\"test_table\" ("),
+                "First element should be CREATE TABLE");
+        Assertions.assertTrue(
+                createTable.contains("\"id\" BIGINT NOT NULL"),
+                "CREATE TABLE should contain id column");
+        Assertions.assertTrue(
+                createTable.contains("\"name\" VARCHAR2(128) NOT NULL"),
+                "CREATE TABLE should contain name column");
+        Assertions.assertTrue(
+                createTable.contains("\"age\" INT"), "CREATE TABLE should 
contain age column");
+
+        Assertions.assertEquals(
+                "COMMENT ON COLUMN \"test_schema\".\"test_table\".\"id\" IS 
'id'", sqls.get(1));
+        Assertions.assertEquals(
+                "COMMENT ON COLUMN \"test_schema\".\"test_table\".\"name\" IS 
'name'", sqls.get(2));
+        Assertions.assertEquals(
+                "COMMENT ON COLUMN \"test_schema\".\"test_table\".\"age\" IS 
'age'", sqls.get(3));
+    }
+
+    @Test
+    public void testCreateTableSqlsSkipIndex() {
+        TablePath tablePath = TablePath.of("test_database", "test_schema", 
"test_table");
+        TableSchema tableSchema =
+                TableSchema.builder()
+                        .column(PhysicalColumn.of("id", BasicType.LONG_TYPE, 
22, false, null, "id"))
                         .column(
                                 PhysicalColumn.of(
-                                        "createTime",
-                                        LocalTimeType.LOCAL_DATE_TIME_TYPE,
-                                        3,
+                                        "name", BasicType.STRING_TYPE, 128, 
false, null, "name"))
+                        .primaryKey(PrimaryKey.of("id", 
Lists.newArrayList("id")))
+                        .build();
+
+        CatalogTable catalogTable =
+                CatalogTable.of(
+                        TableIdentifier.of("test_catalog", tablePath),
+                        tableSchema,
+                        new HashMap<>(),
+                        new ArrayList<>(),
+                        "User table");
+
+        List<String> sqls = new DamengCreateTableSqlBuilder(catalogTable, 
false).build(tablePath);
+
+        // 1 CREATE TABLE + 2 COMMENT ON COLUMN
+        Assertions.assertEquals(3, sqls.size());
+        Assertions.assertTrue(sqls.get(0).startsWith("CREATE TABLE"));
+
+        // With createIndex=false, no CONSTRAINT should appear
+        Assertions.assertFalse(sqls.get(0).contains("CONSTRAINT"));
+    }
+
+    @Test
+    public void testCommentWithSemicolonNotSplit() {
+        TablePath tablePath = TablePath.of("test_database", "test_schema", 
"test_table");
+        TableSchema tableSchema =
+                TableSchema.builder()
+                        .column(
+                                PhysicalColumn.of(
+                                        "col1",
+                                        BasicType.STRING_TYPE,
+                                        64,
                                         true,
                                         null,
-                                        "createTime"))
+                                        "comment with a;b semicolon"))
                         .column(
                                 PhysicalColumn.of(
-                                        "lastUpdateTime",
-                                        LocalTimeType.LOCAL_DATE_TIME_TYPE,
-                                        3,
+                                        "col2",
+                                        BasicType.INT_TYPE,
+                                        (Long) null,
                                         true,
                                         null,
-                                        "lastUpdateTime"))
-                        .primaryKey(PrimaryKey.of("id", 
Lists.newArrayList("id")))
-                        .constraintKey(
-                                Arrays.asList(
-                                        ConstraintKey.of(
-                                                
ConstraintKey.ConstraintType.UNIQUE_KEY,
-                                                "name",
-                                                Lists.newArrayList(
-                                                        
ConstraintKey.ConstraintKeyColumn.of(
-                                                                "name", 
null))),
-                                        ConstraintKey.of(
-                                                
ConstraintKey.ConstraintType.INDEX_KEY,
-                                                "age",
-                                                Lists.newArrayList(
-                                                        
ConstraintKey.ConstraintKeyColumn.of(
-                                                                "age", 
null)))))
+                                        "normal comment"))
                         .build();
 
         CatalogTable catalogTable =
@@ -94,50 +149,48 @@ public class DamengCreateTableSqlBuilderTest {
                         tableSchema,
                         new HashMap<>(),
                         new ArrayList<>(),
-                        "User table");
+                        "Test table");
+
+        List<String> sqls = new DamengCreateTableSqlBuilder(catalogTable, 
false).build(tablePath);
+
+        // 1 CREATE TABLE + 2 COMMENT ON COLUMN
+        Assertions.assertEquals(
+                3, sqls.size(), "Should have exactly 3 statements: 1 CREATE 
TABLE + 2 COMMENTs");
+
+        // The comment with semicolon must remain intact as a single statement
+        Assertions.assertEquals(
+                "COMMENT ON COLUMN \"test_schema\".\"test_table\".\"col1\" IS 
'comment with a;b semicolon'",
+                sqls.get(1),
+                "Comment containing ';' must not be split");
+        Assertions.assertEquals(
+                "COMMENT ON COLUMN \"test_schema\".\"test_table\".\"col2\" IS 
'normal comment'",
+                sqls.get(2));
+    }
+
+    @Test
+    public void testNoCommentColumns() {
+        TablePath tablePath = TablePath.of("test_database", "test_schema", 
"test_table");
+        TableSchema tableSchema =
+                TableSchema.builder()
+                        .column(PhysicalColumn.of("id", BasicType.LONG_TYPE, 
22, false, null, null))
+                        .column(
+                                PhysicalColumn.of(
+                                        "name", BasicType.STRING_TYPE, 128, 
false, null, null))
+                        .build();
+
+        CatalogTable catalogTable =
+                CatalogTable.of(
+                        TableIdentifier.of("test_catalog", tablePath),
+                        tableSchema,
+                        new HashMap<>(),
+                        new ArrayList<>(),
+                        "Table without comments");
+
+        List<String> sqls = new DamengCreateTableSqlBuilder(catalogTable, 
false).build(tablePath);
 
-        String createTableSql =
-                new DamengCreateTableSqlBuilder(catalogTable, 
true).build(tablePath);
-        String expect =
-                "CREATE TABLE \"test_schema\".\"test_table\" (\n"
-                        + "\"id\" BIGINT NOT NULL,\n"
-                        + "\"name\" VARCHAR2(128) NOT NULL,\n"
-                        + "\"age\" INT,\n"
-                        + "\"createTime\" TIMESTAMP,\n"
-                        + "\"lastUpdateTime\" TIMESTAMP,\n"
-                        + "CONSTRAINT id_63d5 PRIMARY KEY (\"id\"),\n"
-                        + "\tCONSTRAINT name_49b6 UNIQUE (\"name\")\n"
-                        + ");\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"id\" IS 'id';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"name\" IS 'name';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"age\" IS 'age';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"createTime\" IS 'createTime';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"lastUpdateTime\" IS 'lastUpdateTime';";
-
-        String regex1 = "id_\\w+";
-        String regex2 = "name_\\w+";
-        String replacedStr1 = createTableSql.replaceAll(regex1, 
"id_").replaceAll(regex2, "name_");
-        String replacedStr2 = expect.replaceAll(regex1, 
"id_").replaceAll(regex2, "name_");
-        Assertions.assertEquals(replacedStr2, replacedStr1);
-
-        // skip index
-        String createTableSqlSkipIndex =
-                new DamengCreateTableSqlBuilder(catalogTable, 
false).build(tablePath);
-        // create table sql is change; The old unit tests are no longer 
applicable
-        String expectSkipIndex =
-                "CREATE TABLE \"test_schema\".\"test_table\" (\n"
-                        + "\"id\" BIGINT NOT NULL,\n"
-                        + "\"name\" VARCHAR2(128) NOT NULL,\n"
-                        + "\"age\" INT,\n"
-                        + "\"createTime\" TIMESTAMP,\n"
-                        + "\"lastUpdateTime\" TIMESTAMP\n"
-                        + ");\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"id\" IS 'id';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"name\" IS 'name';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"age\" IS 'age';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"createTime\" IS 'createTime';\n"
-                        + "COMMENT ON COLUMN 
\"test_schema\".\"test_table\".\"lastUpdateTime\" IS 'lastUpdateTime';";
-        Assertions.assertEquals(expectSkipIndex, createTableSqlSkipIndex);
+        // Only CREATE TABLE, no COMMENT statements
+        Assertions.assertEquals(1, sqls.size());
+        Assertions.assertTrue(sqls.get(0).startsWith("CREATE TABLE"));
     }
 
     @Test

Reply via email to