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

wuchunfu 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 312ee866fb [Improve][Jdbc] Optimize index name conflicts when create 
table for postgresql (#7875)
312ee866fb is described below

commit 312ee866fb1612e7a98e68c592da321e56175db4
Author: hailin0 <[email protected]>
AuthorDate: Mon Oct 21 09:54:35 2024 +0800

    [Improve][Jdbc] Optimize index name conflicts when create table for 
postgresql (#7875)
---
 .../psql/PostgresCreateTableSqlBuilder.java        | 22 ++++++++--------------
 .../psql/PostgresCreateTableSqlBuilderTest.java    | 16 +++++++++-------
 2 files changed, 17 insertions(+), 21 deletions(-)

diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilder.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilder.java
index f7b98c1bb1..1fbfd7c095 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilder.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilder.java
@@ -30,11 +30,14 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
+@Slf4j
 public class PostgresCreateTableSqlBuilder {
     private List<Column> columns;
     private PrimaryKey primaryKey;
@@ -161,10 +164,7 @@ public class PostgresCreateTableSqlBuilder {
     }
 
     private String buildUniqueKeySql(ConstraintKey constraintKey) {
-        String constraintName = constraintKey.getConstraintName();
-        if (constraintName.length() > 25) {
-            constraintName = constraintName.substring(0, 25);
-        }
+        String constraintName = UUID.randomUUID().toString().replace("-", "");
         String indexColumns =
                 constraintKey.getColumnNames().stream()
                         .map(
@@ -175,16 +175,12 @@ public class PostgresCreateTableSqlBuilder {
                                                         
constraintKeyColumn.getColumnName(),
                                                         fieldIde)))
                         .collect(Collectors.joining(", "));
-        return "CONSTRAINT " + constraintName + " UNIQUE (" + indexColumns + 
")";
+        return "CONSTRAINT \"" + constraintName + "\" UNIQUE (" + indexColumns 
+ ")";
     }
 
     private String buildIndexKeySql(TablePath tablePath, ConstraintKey 
constraintKey) {
-        // We add table name to index name to avoid name conflict in PG
-        // Since index name in PG should unique in the schema
-        String constraintName = tablePath.getTableName() + "_" + 
constraintKey.getConstraintName();
-        if (constraintName.length() > 25) {
-            constraintName = constraintName.substring(0, 25);
-        }
+        // If the index name is omitted, PostgreSQL will choose an appropriate 
name based on table
+        // name and indexed columns.
         String indexColumns =
                 constraintKey.getColumnNames().stream()
                         .map(
@@ -196,9 +192,7 @@ public class PostgresCreateTableSqlBuilder {
                                                         fieldIde)))
                         .collect(Collectors.joining(", "));
 
-        return "CREATE INDEX "
-                + constraintName
-                + " ON "
+        return "CREATE INDEX ON "
                 + tablePath.getSchemaAndTableName("\"")
                 + "("
                 + indexColumns
diff --git 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilderTest.java
 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilderTest.java
index 37049eced3..bc204a913a 100644
--- 
a/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilderTest.java
+++ 
b/seatunnel-connectors-v2/connector-jdbc/src/test/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCreateTableSqlBuilderTest.java
@@ -35,6 +35,7 @@ import com.google.common.collect.Lists;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.regex.Pattern;
 
 class PostgresCreateTableSqlBuilderTest {
 
@@ -49,17 +50,18 @@ class PostgresCreateTableSqlBuilderTest {
                             String createTableSql =
                                     postgresCreateTableSqlBuilder.build(
                                             
catalogTable.getTableId().toTablePath());
-                            Assertions.assertEquals(
-                                    "CREATE TABLE \"test\" (\n"
+                            String pattern =
+                                    "CREATE TABLE \"test\" \\(\n"
                                             + "\"id\" int4 NOT NULL PRIMARY 
KEY,\n"
                                             + "\"name\" text NOT NULL,\n"
                                             + "\"age\" int4 NOT NULL,\n"
-                                            + "\tCONSTRAINT unique_name UNIQUE 
(\"name\")\n"
-                                            + ");",
-                                    createTableSql);
+                                            + "\tCONSTRAINT \"([a-zA-Z0-9]+)\" 
UNIQUE \\(\"name\"\\)\n"
+                                            + "\\);";
+                            Assertions.assertTrue(
+                                    
Pattern.compile(pattern).matcher(createTableSql).find());
+
                             Assertions.assertEquals(
-                                    Lists.newArrayList(
-                                            "CREATE INDEX test_index_age ON 
\"test\"(\"age\");"),
+                                    Lists.newArrayList("CREATE INDEX ON 
\"test\"(\"age\");"),
                                     
postgresCreateTableSqlBuilder.getCreateIndexSqls());
 
                             // skip index

Reply via email to