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);
     }
 }

Reply via email to