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";