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

duanzhengqiang 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 55a2123ed5f Refactor data type load (#19642)
55a2123ed5f is described below

commit 55a2123ed5ff9516ea29b204514e675a170ecc9c
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Jul 28 16:50:31 2022 +0800

    Refactor data type load (#19642)
    
    * refactor data type load
    
    * Update DataTypeLoaderFixture.java
---
 ...TypeLoader.java => AbstractDataTypeLoader.java} | 12 +++----
 ...aTypeLoader.java => DefaultDataTypeLoader.java} | 32 +++++++++----------
 .../loader/dialect/H2SchemaMetaDataLoader.java     |  5 +--
 .../loader/dialect/MySQLSchemaMetaDataLoader.java  | 18 ++---------
 .../dialect/OpenGaussSchemaMetaDataLoader.java     |  4 +--
 .../loader/dialect/OracleSchemaMetaDataLoader.java | 11 ++-----
 .../dialect/PostgreSQLSchemaMetaDataLoader.java    |  4 +--
 .../dialect/SQLServerSchemaMetaDataLoader.java     |  5 +--
 .../datatypeloader/MySQLDataTypeLoader.java}       | 37 ++++++++++++----------
 .../datatypeloader/OracleDataTypeLoader.java}      | 30 ++++++++----------
 .../loader/{common => spi}/DataTypeLoader.java     | 25 +++++----------
 .../DataTypeLoaderFactory.java}                    | 37 ++++++++++------------
 ...adata.database.schema.loader.spi.DataTypeLoader | 20 ++++++++++++
 .../schema/loader/common/DataTypeLoaderTest.java   |  4 ++-
 .../loader/dialect/DataTypeLoaderFixture.java}     | 29 +++++++----------
 ...adata.database.schema.loader.spi.DataTypeLoader | 18 +++++++++++
 16 files changed, 148 insertions(+), 143 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
similarity index 83%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
index 323996c8825..cc70ac04ff5 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/AbstractDataTypeLoader.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader;
 
 import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
@@ -27,19 +26,18 @@ import java.util.Map;
 import java.util.TreeMap;
 
 /**
- * Data type loader.
+ * Abstract data type loader.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public abstract class AbstractDataTypeLoader implements DataTypeLoader {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
+    public Map<String, Integer> load(final DatabaseMetaData database) throws 
SQLException {
         Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
         try (ResultSet resultSet = database.getTypeInfo()) {
             while (resultSet.next()) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
similarity index 63%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
index 323996c8825..cb19ea2027f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DefaultDataTypeLoader.java
@@ -17,35 +17,33 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-
 import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
- * Data type loader.
+ * Default data type loader.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DefaultDataTypeLoader extends AbstractDataTypeLoader {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
-        return result;
+    public Map<String, Integer> load(final DatabaseMetaData database) throws 
SQLException {
+        return super.load(database);
+    }
+    
+    @Override
+    public String getType() {
+        return "Default";
+    }
+    
+    @Override
+    public boolean isDefault() {
+        return true;
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
index 60eb35221ce..205806fa5db 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/H2SchemaMetaDataLoader.java
@@ -17,11 +17,12 @@
 
 package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -80,7 +81,7 @@ public final class H2SchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader
     private Map<String, Collection<ColumnMetaData>> 
loadColumnMetaDataMap(final Connection connection, final Collection<String> 
tables) throws SQLException {
         Map<String, Collection<ColumnMetaData>> result = new HashMap<>();
         try (PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("H2")).load(connection.getMetaData());
             Map<String, Collection<String>> tablePrimaryKeys = 
loadTablePrimaryKeys(connection, tables);
             Map<String, Map<String, Boolean>> tableGenerated = 
loadTableGenerated(connection, tables);
             preparedStatement.setString(1, connection.getCatalog());
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
index fda6f27e3d2..6a65a2a2a02 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/MySQLSchemaMetaDataLoader.java
@@ -17,13 +17,14 @@
 
 package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import 
org.apache.shardingsphere.infra.datasource.registry.GlobalDataSourceRegistry;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -31,7 +32,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -103,8 +103,7 @@ public final class MySQLSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoa
         try (
                 Connection connection = dataSource.getConnection();
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
-            appendDataTypes(dataTypes);
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("MySQL")).load(connection.getMetaData());
             String databaseName = "".equals(connection.getCatalog()) ? 
GlobalDataSourceRegistry.getInstance().getCachedDatabaseTables().get(tables.iterator().next())
 : connection.getCatalog();
             preparedStatement.setString(1, databaseName);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
@@ -121,17 +120,6 @@ public final class MySQLSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoa
         return result;
     }
     
-    private void appendDataTypes(final Map<String, Integer> dataTypes) {
-        dataTypes.putIfAbsent("JSON", Types.LONGVARCHAR);
-        dataTypes.putIfAbsent("GEOMETRY", Types.BINARY);
-        dataTypes.putIfAbsent("YEAR", Types.DATE);
-        dataTypes.putIfAbsent("POINT", Types.BINARY);
-        dataTypes.putIfAbsent("MULTIPOINT", Types.BINARY);
-        dataTypes.putIfAbsent("POLYGON", Types.BINARY);
-        dataTypes.putIfAbsent("MULTIPOLYGON", Types.BINARY);
-        dataTypes.putIfAbsent("MULTILINESTRING", Types.BINARY);
-    }
-    
     private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet) throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = resultSet.getString("DATA_TYPE");
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
index cfaa119f74a..fb00aabb9cc 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OpenGaussSchemaMetaDataLoader.java
@@ -20,11 +20,11 @@ package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -87,7 +87,7 @@ public final class OpenGaussSchemaMetaDataLoader implements 
DialectSchemaMetaDat
                                                                                
 final Collection<String> schemaNames) throws SQLException {
         Map<String, Multimap<String, ColumnMetaData>> result = new 
LinkedHashMap<>();
         try (Connection connection = dataSource.getConnection(); 
PreparedStatement preparedStatement = 
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("openGauss")).load(connection.getMetaData());
             Set<String> primaryKeys = loadPrimaryKeys(connection, schemaNames);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
index 920825bfe80..17a6bc399f1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/OracleSchemaMetaDataLoader.java
@@ -18,11 +18,12 @@
 package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 
 import com.google.common.collect.Lists;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -31,7 +32,6 @@ import java.sql.DatabaseMetaData;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Types;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -90,8 +90,7 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
     private Map<String, Collection<ColumnMetaData>> 
loadColumnMetaDataMap(final Connection connection, final Collection<String> 
tables) throws SQLException {
         Map<String, Collection<ColumnMetaData>> result = new 
HashMap<>(tables.size(), 1);
         try (PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables, 
connection.getMetaData()))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
-            appendNumberDataType(dataTypes);
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("Oracle")).load(connection.getMetaData());
             Map<String, Collection<String>> tablePrimaryKeys = 
loadTablePrimaryKeys(connection, tables);
             preparedStatement.setString(1, connection.getSchema());
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
@@ -108,10 +107,6 @@ public final class OracleSchemaMetaDataLoader implements 
DialectSchemaMetaDataLo
         return result;
     }
     
-    private void appendNumberDataType(final Map<String, Integer> dataTypes) {
-        dataTypes.put("NUMBER", Types.NUMERIC);
-    }
-    
     private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet, final Collection<String> primaryKeys,
                                               final DatabaseMetaData 
databaseMetaData) throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
index 210b753c01d..1b9150deb81 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java
@@ -20,11 +20,11 @@ package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 import com.google.common.collect.LinkedHashMultimap;
 import com.google.common.collect.Multimap;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -92,7 +92,7 @@ public final class PostgreSQLSchemaMetaDataLoader implements 
DialectSchemaMetaDa
         Map<String, Multimap<String, ColumnMetaData>> result = new 
LinkedHashMap<>();
         Collection<String> roleTableGrants = loadRoleTableGrants(dataSource, 
tables);
         try (Connection connection = dataSource.getConnection(); 
PreparedStatement preparedStatement = 
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("PostgreSQL")).load(connection.getMetaData());
             Set<String> primaryKeys = loadPrimaryKeys(connection, schemaNames);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
index 8203c9dccdc..e6d1e86a342 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/SQLServerSchemaMetaDataLoader.java
@@ -17,11 +17,12 @@
 
 package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 
-import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DataTypeLoader;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DialectSchemaMetaDataLoader;
 
 import javax.sql.DataSource;
@@ -76,7 +77,7 @@ public final class SQLServerSchemaMetaDataLoader implements 
DialectSchemaMetaDat
         try (
                 Connection connection = dataSource.getConnection();
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables))) {
-            Map<String, Integer> dataTypes = 
DataTypeLoader.load(connection.getMetaData());
+            Map<String, Integer> dataTypes = 
DataTypeLoaderFactory.getInstance(DatabaseTypeFactory.getInstance("SQLServer")).load(connection.getMetaData());
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
similarity index 55%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
index 323996c8825..43cfc9562de 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/MySQLDataTypeLoader.java
@@ -15,37 +15,42 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
 
 import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
- * Data type loader.
+ * MySQL data type loader.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class MySQLDataTypeLoader extends AbstractDataTypeLoader {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
+    public Map<String, Integer> load(final DatabaseMetaData database) throws 
SQLException {
+        Map<String, Integer> result = super.load(database);
+        result.putIfAbsent("JSON", Types.LONGVARCHAR);
+        result.putIfAbsent("GEOMETRY", Types.BINARY);
+        result.putIfAbsent("YEAR", Types.DATE);
+        result.putIfAbsent("POINT", Types.BINARY);
+        result.putIfAbsent("MULTIPOINT", Types.BINARY);
+        result.putIfAbsent("POLYGON", Types.BINARY);
+        result.putIfAbsent("MULTIPOLYGON", Types.BINARY);
+        result.putIfAbsent("MULTILINESTRING", Types.BINARY);
         return result;
     }
+    
+    @Override
+    public String getType() {
+        return "MySQL";
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
similarity index 63%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
index 323996c8825..0c071ad6919 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/datatypeloader/OracleDataTypeLoader.java
@@ -15,37 +15,35 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
 
 import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
- * Data type loader.
+ * Oracle data type loader.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class OracleDataTypeLoader extends AbstractDataTypeLoader {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
+    public Map<String, Integer> load(final DatabaseMetaData database) throws 
SQLException {
+        Map<String, Integer> result = super.load(database);
+        result.putIfAbsent("NUMBER", Types.NUMERIC);
         return result;
     }
+    
+    @Override
+    public String getType() {
+        return "Oracle";
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
similarity index 63%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
index 323996c8825..b562f261e91 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoader.java
@@ -15,37 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package org.apache.shardingsphere.infra.metadata.database.schema.loader.spi;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.spi.type.required.RequiredSPI;
+import org.apache.shardingsphere.spi.type.typed.TypedSPI;
 
 import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
  * Data type loader.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+@SingletonSPI
+public interface DataTypeLoader extends TypedSPI, RequiredSPI {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
-        return result;
-    }
+    Map<String, Integer> load(DatabaseMetaData database) throws SQLException;
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
similarity index 56%
copy from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
copy to 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
index 323996c8825..3e9597e82b8 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/spi/DataTypeLoaderFactory.java
@@ -15,37 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package org.apache.shardingsphere.infra.metadata.database.schema.loader.spi;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-
-import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Map;
-import java.util.TreeMap;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.spi.type.required.RequiredSPIRegistry;
+import org.apache.shardingsphere.spi.type.typed.TypedSPIRegistry;
 
 /**
  * Data type loader.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DataTypeLoaderFactory {
+    
+    static {
+        ShardingSphereServiceLoader.register(DataTypeLoader.class);
+    }
     
     /**
-     * Load data type.
-     * 
-     * @param database database
-     * @return data type map
-     * @throws SQLException SQL exception
+     * Get instance of dialect data type loader.
+     *
+     * @param databaseType database type
+     * @return found instance
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
-        return result;
+    public static DataTypeLoader getInstance(final DatabaseType databaseType) {
+        return TypedSPIRegistry.findRegisteredService(DataTypeLoader.class, 
databaseType.getType()).orElseGet(() -> 
RequiredSPIRegistry.getRegisteredService(DataTypeLoader.class));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
new file mode 100644
index 00000000000..7ef2b905ebd
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader.MySQLDataTypeLoader
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.datatypeloader.OracleDataTypeLoader
+org.apache.shardingsphere.infra.metadata.database.schema.loader.common.DefaultDataTypeLoader
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
index fa559540d6d..2658f46180f 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoaderTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
 
+import org.apache.shardingsphere.infra.fixture.InfraDatabaseTypeFixture;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoaderFactory;
 import org.junit.Test;
 
 import java.sql.DatabaseMetaData;
@@ -39,7 +41,7 @@ public final class DataTypeLoaderTest {
         when(resultSet.getInt("DATA_TYPE")).thenReturn(4, 12);
         DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
         when(databaseMetaData.getTypeInfo()).thenReturn(resultSet);
-        Map<String, Integer> actual = DataTypeLoader.load(databaseMetaData);
+        Map<String, Integer> actual = DataTypeLoaderFactory.getInstance(new 
InfraDatabaseTypeFixture()).load(databaseMetaData);
         assertThat(actual.size(), is(2));
         assertThat(actual.get("INT"), is(4));
         assertThat(actual.get("VARCHAR"), is(12));
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
similarity index 62%
rename from 
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
rename to 
shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
index 323996c8825..797a5027190 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/common/DataTypeLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/DataTypeLoaderFixture.java
@@ -15,37 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.metadata.database.schema.loader.common;
+package 
org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect;
 
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.common.AbstractDataTypeLoader;
 
 import java.sql.DatabaseMetaData;
-import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Map;
-import java.util.TreeMap;
 
 /**
- * Data type loader.
+ * Data type loader fixture.
  */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DataTypeLoader {
+public final class DataTypeLoaderFixture extends AbstractDataTypeLoader {
     
     /**
      * Load data type.
-     * 
+     *
      * @param database database
      * @return data type map
      * @throws SQLException SQL exception
      */
-    public static Map<String, Integer> load(final DatabaseMetaData database) 
throws SQLException {
-        Map<String, Integer> result = new 
TreeMap<>(String.CASE_INSENSITIVE_ORDER);
-        try (ResultSet resultSet = database.getTypeInfo()) {
-            while (resultSet.next()) {
-                result.put(resultSet.getString("TYPE_NAME"), 
resultSet.getInt("DATA_TYPE"));
-            }
-        }
-        return result;
+    public Map<String, Integer> load(final DatabaseMetaData database) throws 
SQLException {
+        return super.load(database);
+    }
+    
+    @Override
+    public String getType() {
+        return "INFRA.FIXTURE";
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
new file mode 100644
index 00000000000..780f7a27979
--- /dev/null
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/test/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.loader.spi.DataTypeLoader
@@ -0,0 +1,18 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+org.apache.shardingsphere.infra.metadata.database.schema.loader.dialect.DataTypeLoaderFixture

Reply via email to