This is an automated email from the ASF dual-hosted git repository. zhangliang 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 0fe093bff0e Add DialectDatabaseMetaData.findExtraSQLTypeClass() (#35173) 0fe093bff0e is described below commit 0fe093bff0e3d9e49655ef31742aef240a9dff76 Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sat Apr 12 22:46:57 2025 +0800 Add DialectDatabaseMetaData.findExtraSQLTypeClass() (#35173) * Refactor resource-config.json * Add DialectDatabaseMetaData.findExtraSQLTypeClass() * Add DialectDatabaseMetaData.findExtraSQLTypeClass() * Add DialectDatabaseMetaData.findExtraSQLTypeClass() --- .../metadata/database/DialectDatabaseMetaData.java | 11 +++++++ .../metadata/database/MySQLDatabaseMetaData.java | 16 +++++++++ .../database/PostgreSQLDatabaseMetaData.java | 8 +++++ .../metadata/util/SQLFederationDataTypeUtils.java | 38 ++-------------------- 4 files changed, 38 insertions(+), 35 deletions(-) diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java index 4157a607c00..e32dd221d26 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/DialectDatabaseMetaData.java @@ -50,6 +50,17 @@ public interface DialectDatabaseMetaData extends DatabaseTypedSPI { return Collections.emptyMap(); } + /** + * Find extra SQL type class. + * + * @param dataType data type + * @param unsigned whether unsigned + * @return extra SQL type class + */ + default Optional<Class<?>> findExtraSQLTypeClass(final int dataType, final boolean unsigned) { + return Optional.empty(); + } + /** * Get default nulls order type. * diff --git a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java index b0eb71727d8..da29bd69c19 100644 --- a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java +++ b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java @@ -21,11 +21,13 @@ import org.apache.shardingsphere.infra.database.core.metadata.database.DialectDa import org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType; import org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter; +import java.math.BigInteger; import java.sql.Types; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; /** @@ -73,6 +75,20 @@ public final class MySQLDatabaseMetaData implements DialectDatabaseMetaData { return result; } + @Override + public Optional<Class<?>> findExtraSQLTypeClass(final int dataType, final boolean unsigned) { + if (Types.TINYINT == dataType || Types.SMALLINT == dataType) { + return Optional.of(Integer.class); + } + if (Types.INTEGER == dataType) { + return unsigned ? Optional.of(Long.class) : Optional.of(Integer.class); + } + if (Types.BIGINT == dataType) { + return unsigned ? Optional.of(BigInteger.class) : Optional.of(Long.class); + } + return Optional.empty(); + } + @Override public NullsOrderType getDefaultNullsOrderType() { return NullsOrderType.LOW; diff --git a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java index f49552d7768..85c9c7f5d2f 100644 --- a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java +++ b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java @@ -65,6 +65,14 @@ public final class PostgreSQLDatabaseMetaData implements DialectDatabaseMetaData return result; } + @Override + public Optional<Class<?>> findExtraSQLTypeClass(final int dataType, final boolean unsigned) { + if (Types.SMALLINT == dataType) { + return Optional.of(Integer.class); + } + return Optional.empty(); + } + @Override public NullsOrderType getDefaultNullsOrderType() { return NullsOrderType.HIGH; diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/util/SQLFederationDataTypeUtils.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/util/SQLFederationDataTypeUtils.java index cbf200d12c2..626ac7ce853 100644 --- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/util/SQLFederationDataTypeUtils.java +++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/util/SQLFederationDataTypeUtils.java @@ -24,16 +24,10 @@ import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeFactory.Builder; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; -import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType; -import org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType; +import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable; -import java.math.BigInteger; -import java.sql.Types; -import java.util.Optional; - /** * SQL federation data type utility class. */ @@ -70,33 +64,7 @@ public final class SQLFederationDataTypeUtils { * @return SQL type class */ public static Class<?> getSqlTypeClass(final DatabaseType protocolType, final ShardingSphereColumn column) { - Optional<Class<?>> typeClazz = Optional.empty(); - if (protocolType instanceof MySQLDatabaseType) { - typeClazz = findMySQLTypeClass(column); - } - if (protocolType instanceof PostgreSQLDatabaseType || protocolType instanceof OpenGaussDatabaseType) { - typeClazz = findPostgreSQLTypeClass(column); - } - return typeClazz.orElseGet(() -> SqlType.valueOf(column.getDataType()).clazz); - } - - private static Optional<Class<?>> findPostgreSQLTypeClass(final ShardingSphereColumn column) { - if (Types.SMALLINT == column.getDataType()) { - return Optional.of(Integer.class); - } - return Optional.empty(); - } - - private static Optional<Class<?>> findMySQLTypeClass(final ShardingSphereColumn column) { - if (Types.TINYINT == column.getDataType() || Types.SMALLINT == column.getDataType()) { - return Optional.of(Integer.class); - } - if (Types.INTEGER == column.getDataType()) { - return column.isUnsigned() ? Optional.of(Long.class) : Optional.of(Integer.class); - } - if (Types.BIGINT == column.getDataType()) { - return column.isUnsigned() ? Optional.of(BigInteger.class) : Optional.of(Long.class); - } - return Optional.empty(); + return new DatabaseTypeRegistry(protocolType).getDialectDatabaseMetaData().findExtraSQLTypeClass(column.getDataType(), column.isUnsigned()) + .orElseGet(() -> SqlType.valueOf(column.getDataType()).clazz); } }