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

terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 7ca70b559c6 Move index name length budget to dialect metadata (#38893)
7ca70b559c6 is described below

commit 7ca70b559c6e211ab043e57ca1d6f9cb487cf625
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Jun 23 11:39:06 2026 +0800

    Move index name length budget to dialect metadata (#38893)
    
    Add indexNameMaxLength to DialectIndexOption and configure the existing
    PostgreSQL, openGauss, and Oracle index name limits in their dialect 
metadata.
    
    Update IndexMetaDataUtils to read the budget through DatabaseTypedSPILoader 
and
    fall back to unlimited length when no dialect metadata is available, 
preserving
    unknown database behavior.
    
    Add coverage for default, dialect-specific, and no-SPI fallback behavior.
---
 .../database/metadata/DialectDatabaseMetaData.java |  2 +-
 .../metadata/option/index/DialectIndexOption.java  |  2 ++
 .../metadata/DialectDatabaseMetaDataTest.java      |  5 ++++-
 .../database/OpenGaussDatabaseMetaData.java        |  4 +++-
 .../database/OpenGaussDatabaseMetaDataTest.java    |  5 ++++-
 .../metadata/database/OracleDatabaseMetaData.java  |  4 +++-
 .../database/OracleDatabaseMetaDataTest.java       |  5 ++++-
 .../database/PostgreSQLDatabaseMetaData.java       |  4 +++-
 .../database/PostgreSQLDatabaseMetaDataTest.java   |  5 ++++-
 .../database/schema/util/IndexMetaDataUtils.java   | 23 ++++------------------
 .../schema/util/IndexMetaDataUtilsTest.java        | 12 +++++++++++
 11 files changed, 44 insertions(+), 27 deletions(-)

diff --git 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
index b84874ecdfd..2f49dbe6e1d 100644
--- 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
+++ 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
@@ -123,7 +123,7 @@ public interface DialectDatabaseMetaData extends 
DatabaseTypedSPI {
      * @return index option
      */
     default DialectIndexOption getIndexOption() {
-        return new DialectIndexOption(false);
+        return new DialectIndexOption(false, Integer.MAX_VALUE);
     }
     
     /**
diff --git 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/index/DialectIndexOption.java
 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/index/DialectIndexOption.java
index 42b23afb172..1f593fe2c12 100644
--- 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/index/DialectIndexOption.java
+++ 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/option/index/DialectIndexOption.java
@@ -28,4 +28,6 @@ import lombok.RequiredArgsConstructor;
 public final class DialectIndexOption {
     
     private final boolean isSchemaUniquenessLevel;
+    
+    private final int indexNameMaxLength;
 }
diff --git 
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaDataTest.java
 
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaDataTest.java
index e7fa7444486..c76ee531b8a 100644
--- 
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaDataTest.java
+++ 
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaDataTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.database.connector.core.metadata.database.meta
 
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.connection.DialectConnectionOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.datatype.DefaultDataTypeOption;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.join.DialectJoinOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
@@ -69,7 +70,9 @@ class DialectDatabaseMetaDataTest {
     
     @Test
     void assertGetIndexOption() {
-        
assertFalse(dialectDatabaseMetaData.getIndexOption().isSchemaUniquenessLevel());
+        DialectIndexOption actual = dialectDatabaseMetaData.getIndexOption();
+        assertFalse(actual.isSchemaUniquenessLevel());
+        assertThat(actual.getIndexNameMaxLength(), is(Integer.MAX_VALUE));
     }
     
     @Test
diff --git 
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
 
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
index a09be3bd13b..39f6b53f9bb 100644
--- 
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
+++ 
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
@@ -42,6 +42,8 @@ import java.util.Optional;
  */
 public final class OpenGaussDatabaseMetaData implements 
DialectDatabaseMetaData {
     
+    private static final int INDEX_NAME_MAX_LENGTH = 63;
+    
     @Override
     public QuoteCharacter getQuoteCharacter() {
         return QuoteCharacter.QUOTE;
@@ -74,7 +76,7 @@ public final class OpenGaussDatabaseMetaData implements 
DialectDatabaseMetaData
     
     @Override
     public DialectIndexOption getIndexOption() {
-        return new DialectIndexOption(true);
+        return new DialectIndexOption(true, INDEX_NAME_MAX_LENGTH);
     }
     
     @Override
diff --git 
a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
 
b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
index 626f2f6d68f..74f5c8cf9db 100644
--- 
a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
+++ 
b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaDataTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.table.DialectDriverQuerySystemCatalogOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
@@ -91,7 +92,9 @@ class OpenGaussDatabaseMetaDataTest {
     
     @Test
     void assertGetIndexOption() {
-        
assertTrue(dialectDatabaseMetaData.getIndexOption().isSchemaUniquenessLevel());
+        DialectIndexOption actual = dialectDatabaseMetaData.getIndexOption();
+        assertTrue(actual.isSchemaUniquenessLevel());
+        assertThat(actual.getIndexNameMaxLength(), is(63));
     }
     
     @Test
diff --git 
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
 
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
index 441e08c96b7..effbfb466d2 100644
--- 
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
+++ 
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaData.java
@@ -43,6 +43,8 @@ import java.util.Optional;
  */
 public final class OracleDatabaseMetaData implements DialectDatabaseMetaData {
     
+    private static final int INDEX_NAME_MAX_LENGTH = 30;
+    
     @Override
     public QuoteCharacter getQuoteCharacter() {
         return QuoteCharacter.QUOTE;
@@ -70,7 +72,7 @@ public final class OracleDatabaseMetaData implements 
DialectDatabaseMetaData {
     
     @Override
     public DialectIndexOption getIndexOption() {
-        return new DialectIndexOption(true);
+        return new DialectIndexOption(true, INDEX_NAME_MAX_LENGTH);
     }
     
     @Override
diff --git 
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
 
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
index f57ff786ec8..cfc7ada75e9 100644
--- 
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
+++ 
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/database/OracleDatabaseMetaDataTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.altertable.DialectAlterTableOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.connection.DialectConnectionOption;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.pagination.DialectPaginationOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
@@ -74,7 +75,9 @@ class OracleDatabaseMetaDataTest {
     
     @Test
     void assertGetIndexOption() {
-        
assertTrue(dialectDatabaseMetaData.getIndexOption().isSchemaUniquenessLevel());
+        DialectIndexOption actual = dialectDatabaseMetaData.getIndexOption();
+        assertTrue(actual.isSchemaUniquenessLevel());
+        assertThat(actual.getIndexNameMaxLength(), is(30));
     }
     
     @Test
diff --git 
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
 
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
index 6e9006e1dc0..dfca3f5130b 100644
--- 
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
+++ 
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
@@ -39,6 +39,8 @@ import java.util.Collections;
  */
 public final class PostgreSQLDatabaseMetaData implements 
DialectDatabaseMetaData {
     
+    private static final int INDEX_NAME_MAX_LENGTH = 63;
+    
     @Override
     public QuoteCharacter getQuoteCharacter() {
         return QuoteCharacter.QUOTE;
@@ -66,7 +68,7 @@ public final class PostgreSQLDatabaseMetaData implements 
DialectDatabaseMetaData
     
     @Override
     public DialectIndexOption getIndexOption() {
-        return new DialectIndexOption(true);
+        return new DialectIndexOption(true, INDEX_NAME_MAX_LENGTH);
     }
     
     @Override
diff --git 
a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
 
b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
index a9e7a553172..4db33c90470 100644
--- 
a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
+++ 
b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaDataTest.java
@@ -21,6 +21,7 @@ import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.index.DialectIndexOption;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.transaction.DialectTransactionOption;
 import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -76,7 +77,9 @@ class PostgreSQLDatabaseMetaDataTest {
     
     @Test
     void assertGetIndexOption() {
-        
assertTrue(dialectDatabaseMetaData.getIndexOption().isSchemaUniquenessLevel());
+        DialectIndexOption actual = dialectDatabaseMetaData.getIndexOption();
+        assertTrue(actual.isSchemaUniquenessLevel());
+        assertThat(actual.getIndexNameMaxLength(), is(63));
     }
     
     @Test
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
index 44fb15f8848..4d6346149f6 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtils.java
@@ -20,6 +20,8 @@ package 
org.apache.shardingsphere.infra.metadata.database.schema.util;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -61,12 +63,6 @@ public final class IndexMetaDataUtils {
     
     private static final Pattern TRUNCATED_INDEX_NAME_SUFFIX_PATTERN = 
Pattern.compile("_t[0-9a-z]{8}$");
     
-    private static final int POSTGRESQL_INDEX_NAME_MAX_LENGTH = 63;
-    
-    private static final int OPENGAUSS_INDEX_NAME_MAX_LENGTH = 63;
-    
-    private static final int ORACLE_INDEX_NAME_MAX_LENGTH = 30;
-    
     /**
      * Get logic index name.
      *
@@ -278,19 +274,8 @@ public final class IndexMetaDataUtils {
     }
     
     private static int getIndexNameMaxLength(final DatabaseType databaseType) {
-        if (null == databaseType) {
-            return Integer.MAX_VALUE;
-        }
-        switch (databaseType.getType()) {
-            case "PostgreSQL":
-                return POSTGRESQL_INDEX_NAME_MAX_LENGTH;
-            case "openGauss":
-                return OPENGAUSS_INDEX_NAME_MAX_LENGTH;
-            case "Oracle":
-                return ORACLE_INDEX_NAME_MAX_LENGTH;
-            default:
-                return Integer.MAX_VALUE;
-        }
+        return null == databaseType ? Integer.MAX_VALUE
+                : 
DatabaseTypedSPILoader.findService(DialectDatabaseMetaData.class, 
databaseType).map(optional -> 
optional.getIndexOption().getIndexNameMaxLength()).orElse(Integer.MAX_VALUE);
     }
     
     private static int getLengthSafeGeneratedSuffixLength() {
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtilsTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtilsTest.java
index 15aec39871a..3703efc9695 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtilsTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/IndexMetaDataUtilsTest.java
@@ -36,6 +36,7 @@ import org.junit.jupiter.api.Test;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Properties;
 
 import static org.hamcrest.Matchers.is;
@@ -44,6 +45,7 @@ import static org.hamcrest.Matchers.startsWith;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class IndexMetaDataUtilsTest {
     
@@ -133,6 +135,16 @@ class IndexMetaDataUtilsTest {
         assertThat(actual.getBytes(StandardCharsets.UTF_8).length, is(30));
     }
     
+    @Test
+    void assertGetActualIndexNameKeepsLegacyFormatWithoutDialectMetaData() {
+        DatabaseType databaseType = mock(DatabaseType.class);
+        when(databaseType.getType()).thenReturn("UNKNOWN");
+        when(databaseType.getTrunkDatabaseType()).thenReturn(Optional.empty());
+        String logicIndexName = 
"very_long_named_index_boundary_case_for_sharding_length_safety_validation";
+        String actual = IndexMetaDataUtils.getActualIndexName(logicIndexName, 
"t_account_0", databaseType);
+        assertThat(actual, 
is("very_long_named_index_boundary_case_for_sharding_length_safety_validation_t_account_0"));
+    }
+    
     @Test
     void assertFindGeneratedLogicIndexNameWithTruncatedActualIndexName() {
         String logicIndexName = 
"very_long_named_index_boundary_case_for_sharding_length_safety_validation";

Reply via email to