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

chengzhang 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 74ea91498f0 Use DataTypeRegistry to cache date type load and reuse in 
different scenario (#33918)
74ea91498f0 is described below

commit 74ea91498f02426a08a02b7575ee2bfd9c4e521d
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Thu Dec 5 10:04:54 2024 +0800

    Use DataTypeRegistry to cache date type load and reuse in different 
scenario (#33918)
    
    * Use DataTypeRegistry to cache date type load and reuse in different 
scenario
    
    * fix unit test
---
 .../core/metadata/data/loader/MetaDataLoader.java  |  2 +
 .../database/datatype/DataTypeRegistry.java        | 80 ++++++++++++++++++++++
 .../h2/metadata/data/loader/H2MetaDataLoader.java  | 13 ++--
 .../metadata/data/loader/H2MetaDataLoaderTest.java |  3 +
 .../metadata/data/loader/HiveMetaDataLoader.java   | 20 ++----
 .../metadata/data/loader/MySQLMetaDataLoader.java  | 10 +--
 .../data/loader/MySQLMetaDataLoaderTest.java       |  3 +
 .../data/loader/OpenGaussMetaDataLoader.java       | 10 +--
 .../database/OpenGaussDatabaseMetaData.java        | 17 +++++
 .../data/loader/OpenGaussMetaDataLoaderTest.java   |  3 +
 .../metadata/data/loader/OracleMetaDataLoader.java | 12 ++--
 .../metadata/database/OracleDatabaseMetaData.java  |  5 +-
 .../data/loader/OracleMetaDataLoaderTest.java      |  8 +++
 .../data/loader/PostgreSQLMetaDataLoader.java      | 13 ++--
 .../database/PostgreSQLDatabaseMetaData.java       | 17 +++++
 .../data/loader/PostgreSQLMetaDataLoaderTest.java  |  3 +
 .../data/loader/SQLServerMetaDataLoader.java       | 10 +--
 .../data/loader/SQLServerMetaDataLoaderTest.java   |  5 ++
 18 files changed, 178 insertions(+), 56 deletions(-)

diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
index 10b8bb73bd8..3ef4f71848a 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/loader/MetaDataLoader.java
@@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.loader.type.TableMetaDataLoader;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 
 import java.sql.SQLException;
@@ -61,6 +62,7 @@ public final class MetaDataLoader {
         Map<String, SchemaMetaData> result = new 
LinkedHashMap<>(materials.size(), 1F);
         Collection<Future<Collection<SchemaMetaData>>> futures = new 
LinkedList<>();
         for (MetaDataLoaderMaterial each : materials) {
+            DataTypeRegistry.load(each.getDataSource(), 
each.getStorageType().getType());
             futures.add(EXECUTOR_SERVICE.submit(() -> load(each)));
         }
         try {
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/datatype/DataTypeRegistry.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/datatype/DataTypeRegistry.java
new file mode 100644
index 00000000000..ea538c1ff9d
--- /dev/null
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/datatype/DataTypeRegistry.java
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+package 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype;
+
+import com.cedarsoftware.util.CaseInsensitiveMap;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.wrapper.SQLWrapperException;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLException;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Data type registry.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+@Slf4j
+public final class DataTypeRegistry {
+    
+    private static final Map<String, Map<String, Integer>> DATA_TYPES = new 
ConcurrentHashMap<>();
+    
+    /**
+     * Load data types.
+     *
+     * @param dataSource data source to be loaded
+     * @param databaseType database type
+     * @throws SQLWrapperException SQL wrapper exception
+     */
+    public static void load(final DataSource dataSource, final String 
databaseType) {
+        try (Connection connection = dataSource.getConnection()) {
+            DatabaseMetaData databaseMetaData = connection.getMetaData();
+            if (!DATA_TYPES.containsKey(databaseType)) {
+                DATA_TYPES.put(databaseType, new CaseInsensitiveMap<>(new 
DataTypeLoader().load(databaseMetaData, 
TypedSPILoader.getService(DatabaseType.class, databaseType))));
+            }
+        } catch (final SQLException ex) {
+            throw new SQLWrapperException(ex);
+        }
+    }
+    
+    /**
+     * Get data type.
+     *
+     * @param databaseType database type 
+     * @param dataTypeName data type name
+     * @return data type
+     */
+    public static Optional<Integer> getDataType(final String databaseType, 
final String dataTypeName) {
+        if (!DATA_TYPES.containsKey(databaseType)) {
+            return Optional.empty();
+        }
+        if (!DATA_TYPES.get(databaseType).containsKey(dataTypeName)) {
+            log.warn("Cannot find data type: {}.", dataTypeName);
+            return Optional.empty();
+        }
+        return Optional.of(DATA_TYPES.get(databaseType).get(dataTypeName));
+    }
+}
diff --git 
a/infra/database/type/h2/src/main/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoader.java
 
b/infra/database/type/h2/src/main/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoader.java
index fc64bfd8078..dfa1f52328d 100644
--- 
a/infra/database/type/h2/src/main/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoader.java
+++ 
b/infra/database/type/h2/src/main/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoader.java
@@ -23,12 +23,13 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 
 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;
@@ -81,7 +82,6 @@ public final class H2MetaDataLoader implements 
DialectMetaDataLoader {
     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 = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             Map<String, Collection<String>> tablePrimaryKeys = 
loadTablePrimaryKeys(connection, tables);
             Map<String, Map<String, Boolean>> tableGenerated = 
loadTableGenerated(connection, tables);
             preparedStatement.setString(1, connection.getCatalog());
@@ -89,8 +89,8 @@ public final class H2MetaDataLoader implements 
DialectMetaDataLoader {
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
-                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet, 
tablePrimaryKeys.getOrDefault(tableName, Collections.emptyList()),
-                            tableGenerated.getOrDefault(tableName, new 
HashMap<>()));
+                    ColumnMetaData columnMetaData =
+                            loadColumnMetaData(resultSet, 
tablePrimaryKeys.getOrDefault(tableName, Collections.emptyList()), 
tableGenerated.getOrDefault(tableName, new HashMap<>()));
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
@@ -101,15 +101,14 @@ public final class H2MetaDataLoader implements 
DialectMetaDataLoader {
         return result;
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet, final Collection<String> primaryKeys,
-                                              final Map<String, Boolean> 
tableGenerated) throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final ResultSet resultSet, final 
Collection<String> primaryKeys, final Map<String, Boolean> tableGenerated) 
throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = resultSet.getString("DATA_TYPE");
         boolean primaryKey = primaryKeys.contains(columnName);
         boolean generated = tableGenerated.getOrDefault(columnName, 
Boolean.FALSE);
         boolean isVisible = resultSet.getBoolean("IS_VISIBLE");
         boolean isNullable = "YES".equals(resultSet.getString("IS_NULLABLE"));
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, false, isVisible, false, isNullable);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
primaryKey, generated, false, isVisible, false, isNullable);
     }
     
     private String getTableMetaDataSQL(final Collection<String> tables) {
diff --git 
a/infra/database/type/h2/src/test/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoaderTest.java
 
b/infra/database/type/h2/src/test/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoaderTest.java
index 7be7308819d..d670edec93e 100644
--- 
a/infra/database/type/h2/src/test/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoaderTest.java
+++ 
b/infra/database/type/h2/src/test/java/org/apache/shardingsphere/infra/database/h2/metadata/data/loader/H2MetaDataLoaderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.h2.type.H2DatabaseType;
@@ -67,6 +68,7 @@ class H2MetaDataLoaderTest {
                 "SELECT C.TABLE_NAME TABLE_NAME, C.COLUMN_NAME COLUMN_NAME, 
COALESCE(I.IS_GENERATED, FALSE) IS_GENERATED FROM INFORMATION_SCHEMA.COLUMNS C 
RIGHT JOIN"
                         + " INFORMATION_SCHEMA.INDEXES I ON 
C.TABLE_NAME=I.TABLE_NAME WHERE C.TABLE_CATALOG=? AND C.TABLE_SCHEMA=?")
                 .executeQuery()).thenReturn(generatedInfo);
+        DataTypeRegistry.load(dataSource, "H2");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", dataSource, new 
H2DatabaseType(), "sharding_db")));
     }
     
@@ -91,6 +93,7 @@ class H2MetaDataLoaderTest {
                 "SELECT C.TABLE_NAME TABLE_NAME, C.COLUMN_NAME COLUMN_NAME, 
COALESCE(I.IS_GENERATED, FALSE) IS_GENERATED FROM INFORMATION_SCHEMA.COLUMNS C"
                         + " RIGHT JOIN INFORMATION_SCHEMA.INDEXES I ON 
C.TABLE_NAME=I.TABLE_NAME WHERE C.TABLE_CATALOG=? AND C.TABLE_SCHEMA=? AND 
C.TABLE_NAME IN ('tbl')")
                 .executeQuery()).thenReturn(generatedInfo);
+        DataTypeRegistry.load(dataSource, "H2");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.singletonList("tbl"), "foo_ds", dataSource, 
new H2DatabaseType(), "sharding_db")));
     }
     
diff --git 
a/infra/database/type/hive/src/main/java/org/apache/shardingsphere/infra/database/hive/metadata/data/loader/HiveMetaDataLoader.java
 
b/infra/database/type/hive/src/main/java/org/apache/shardingsphere/infra/database/hive/metadata/data/loader/HiveMetaDataLoader.java
index 594049dc346..e7a2e542b2c 100644
--- 
a/infra/database/type/hive/src/main/java/org/apache/shardingsphere/infra/database/hive/metadata/data/loader/HiveMetaDataLoader.java
+++ 
b/infra/database/type/hive/src/main/java/org/apache/shardingsphere/infra/database/hive/metadata/data/loader/HiveMetaDataLoader.java
@@ -28,11 +28,9 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.loader.type.T
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import org.apache.thrift.TException;
 
-import javax.sql.DataSource;
-import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -40,7 +38,6 @@ import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
-import java.util.Map;
 
 /**
  * Hive meta data loader.
@@ -83,27 +80,18 @@ public final class HiveMetaDataLoader implements 
DialectMetaDataLoader {
     }
     
     private Collection<TableMetaData> getTableMetaData(final 
Collection<String> tables, final HiveMetaStoreClient storeClient, final 
MetaDataLoaderMaterial material) throws TException, SQLException {
-        Map<String, Integer> dataTypes = getDataType(material.getDataSource());
         Collection<TableMetaData> result = new LinkedList<>();
         for (String each : tables) {
             GetTableRequest req = new 
GetTableRequest(material.getDefaultSchemaName(), each);
-            result.add(new TableMetaData(each, 
getColumnMetaData(storeClient.getTable(req), dataTypes), 
Collections.emptyList(), Collections.emptyList()));
+            result.add(new TableMetaData(each, 
getColumnMetaData(storeClient.getTable(req)), Collections.emptyList(), 
Collections.emptyList()));
         }
         return result;
     }
     
-    private Map<String, Integer> getDataType(final DataSource dataSource) 
throws SQLException {
-        try (
-                Connection connection = dataSource.getConnection()) {
-            return new DataTypeLoader().load(connection.getMetaData(), 
getType());
-        }
-    }
-    
-    private Collection<ColumnMetaData> getColumnMetaData(final Table table, 
final Map<String, Integer> dataTypes) {
+    private Collection<ColumnMetaData> getColumnMetaData(final Table table) {
         Collection<ColumnMetaData> result = new LinkedList<>();
         for (FieldSchema each : table.getSd().getCols()) {
-            result.add(new ColumnMetaData(each.getName(), null == 
dataTypes.get(each.getType()) ? Types.VARCHAR : dataTypes.get(each.getType()),
-                    false, false, false, false, false, false));
+            result.add(new ColumnMetaData(each.getName(), 
DataTypeRegistry.getDataType(getDatabaseType(), 
each.getType()).orElse(Types.VARCHAR), false, false, false, false, false, 
false));
         }
         return result;
     }
diff --git 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java
 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java
index dc8a5571de4..492ccfed159 100644
--- 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java
+++ 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoader.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.Constra
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType;
 
 import javax.sql.DataSource;
@@ -33,6 +33,7 @@ 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;
@@ -131,13 +132,12 @@ public final class MySQLMetaDataLoader implements 
DialectMetaDataLoader {
         try (
                 Connection connection = dataSource.getConnection();
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables))) {
-            Map<String, Integer> dataTypes = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             String databaseName = "".equals(connection.getCatalog()) ? 
GlobalDataSourceRegistry.getInstance().getCachedDatabaseTables().get(tables.iterator().next())
 : connection.getCatalog();
             preparedStatement.setString(1, databaseName);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
-                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet);
+                    ColumnMetaData columnMetaData = 
loadColumnMetaData(resultSet);
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
@@ -148,7 +148,7 @@ public final class MySQLMetaDataLoader implements 
DialectMetaDataLoader {
         return result;
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet) throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final ResultSet resultSet) 
throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = resultSet.getString("DATA_TYPE");
         boolean primaryKey = 
"PRI".equalsIgnoreCase(resultSet.getString("COLUMN_KEY"));
@@ -159,7 +159,7 @@ public final class MySQLMetaDataLoader implements 
DialectMetaDataLoader {
         boolean visible = !"INVISIBLE".equalsIgnoreCase(extra);
         boolean unsigned = 
resultSet.getString("COLUMN_TYPE").toUpperCase().contains("UNSIGNED");
         boolean nullable = "YES".equals(resultSet.getString("IS_NULLABLE"));
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, visible, unsigned, nullable);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
primaryKey, generated, caseSensitive, visible, unsigned, nullable);
     }
     
     private String getTableMetaDataSQL(final Collection<String> tables) {
diff --git 
a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
 
b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
index a415f99d500..562e8675721 100644
--- 
a/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
+++ 
b/infra/database/type/mysql/src/test/java/org/apache/shardingsphere/infra/database/mysql/metadata/data/loader/MySQLMetaDataLoaderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
@@ -57,6 +58,7 @@ class MySQLMetaDataLoaderTest {
         ResultSet indexResultSet = mockIndexMetaDataResultSet();
         when(dataSource.getConnection().prepareStatement("SELECT TABLE_NAME, 
INDEX_NAME, NON_UNIQUE, COLUMN_NAME FROM information_schema.statistics "
                 + "WHERE TABLE_SCHEMA=? and TABLE_NAME IN ('tbl') ORDER BY 
NON_UNIQUE, INDEX_NAME, 
SEQ_IN_INDEX").executeQuery()).thenReturn(indexResultSet);
+        DataTypeRegistry.load(dataSource, "MySQL");
         assertTableMetaDataMap(dialectMetaDataLoader.load(new 
MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", dataSource, new 
MySQLDatabaseType(), "sharding_db")));
     }
     
@@ -71,6 +73,7 @@ class MySQLMetaDataLoaderTest {
         when(dataSource.getConnection().prepareStatement("SELECT TABLE_NAME, 
INDEX_NAME, NON_UNIQUE, COLUMN_NAME FROM information_schema.statistics WHERE 
TABLE_SCHEMA=? and TABLE_NAME IN ('tbl') "
                 + "ORDER BY NON_UNIQUE, INDEX_NAME, SEQ_IN_INDEX")
                 .executeQuery()).thenReturn(indexResultSet);
+        DataTypeRegistry.load(dataSource, "MySQL");
         assertTableMetaDataMap(dialectMetaDataLoader.load(new 
MetaDataLoaderMaterial(Collections.singletonList("tbl"), "foo_ds", dataSource, 
new MySQLDatabaseType(), "sharding_db")));
     }
     
diff --git 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java
 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java
index baa86be01fa..855e01b92ba 100644
--- 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java
+++ 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoader.java
@@ -26,7 +26,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 
@@ -34,6 +34,7 @@ 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.HashSet;
@@ -132,13 +133,12 @@ public final class OpenGaussMetaDataLoader implements 
DialectMetaDataLoader {
         try (
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables));
                 ResultSet resultSet = preparedStatement.executeQuery()) {
-            Map<String, Integer> dataTypes = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             Collection<String> primaryKeys = loadPrimaryKeys(connection, 
schemaNames);
             while (resultSet.next()) {
                 String tableName = resultSet.getString("table_name");
                 String schemaName = resultSet.getString("table_schema");
                 Multimap<String, ColumnMetaData> columnMetaDataMap = 
result.computeIfAbsent(schemaName, key -> LinkedHashMultimap.create());
-                columnMetaDataMap.put(tableName, loadColumnMetaData(dataTypes, 
primaryKeys, resultSet));
+                columnMetaDataMap.put(tableName, 
loadColumnMetaData(primaryKeys, resultSet));
             }
         }
         return result;
@@ -169,7 +169,7 @@ public final class OpenGaussMetaDataLoader implements 
DialectMetaDataLoader {
         return String.format(PRIMARY_KEY_META_DATA_SQL, 
schemaNames.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final Collection<String> primaryKeys, final ResultSet resultSet) 
throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final Collection<String> 
primaryKeys, final ResultSet resultSet) throws SQLException {
         String schemaName = resultSet.getString("table_schema");
         String tableName = resultSet.getString("table_name");
         String columnName = resultSet.getString("column_name");
@@ -180,7 +180,7 @@ public final class OpenGaussMetaDataLoader implements 
DialectMetaDataLoader {
         // TODO user defined collation which deterministic is false
         boolean caseSensitive = true;
         boolean isNullable = "YES".equals(resultSet.getString("is_nullable"));
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
isPrimaryKey, generated, caseSensitive, true, false, isNullable);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
isPrimaryKey, generated, caseSensitive, true, false, isNullable);
     }
     
     private Collection<TableMetaData> createTableMetaDataList(final 
Multimap<String, IndexMetaData> tableIndexMetaDataMap, final Multimap<String, 
ColumnMetaData> tableColumnMetaDataMap) {
diff --git 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
index 22076dac3f9..46bc5ce6cf2 100644
--- 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
+++ 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
@@ -17,12 +17,15 @@
 
 package org.apache.shardingsphere.infra.database.opengauss.metadata.database;
 
+import com.cedarsoftware.util.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 
+import java.sql.Types;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
@@ -50,6 +53,20 @@ public final class OpenGaussDatabaseMetaData implements 
DialectDatabaseMetaData
         return QuoteCharacter.QUOTE;
     }
     
+    @Override
+    public Map<String, Integer> getExtraDataTypes() {
+        Map<String, Integer> result = new CaseInsensitiveMap<>();
+        result.put("SMALLINT", Types.SMALLINT);
+        result.put("INT", Types.INTEGER);
+        result.put("INTEGER", Types.INTEGER);
+        result.put("BIGINT", Types.BIGINT);
+        result.put("DECIMAL", Types.DECIMAL);
+        result.put("NUMERIC", Types.NUMERIC);
+        result.put("REAL", Types.REAL);
+        result.put("BOOL", Types.BOOLEAN);
+        return result;
+    }
+    
     @Override
     public NullsOrderType getDefaultNullsOrderType() {
         return NullsOrderType.HIGH;
diff --git 
a/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoaderTest.java
 
b/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoaderTest.java
index 60da4cb9a87..a5f07aef4cb 100644
--- 
a/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoaderTest.java
+++ 
b/infra/database/type/opengauss/src/test/java/org/apache/shardingsphere/infra/database/opengauss/metadata/data/loader/OpenGaussMetaDataLoaderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.opengauss.type.OpenGaussDatabaseType;
@@ -78,6 +79,7 @@ class OpenGaussMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(BASIC_INDEX_META_DATA_SQL).executeQuery()).thenReturn(indexResultSet);
         ResultSet advanceIndexResultSet = mockAdvanceIndexMetaDataResultSet();
         
when(dataSource.getConnection().prepareStatement(ADVANCE_INDEX_META_DATA_SQL).executeQuery()).thenReturn(advanceIndexResultSet);
+        DataTypeRegistry.load(dataSource, "openGauss");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", dataSource, new 
OpenGaussDatabaseType(), "sharding_db")));
     }
     
@@ -101,6 +103,7 @@ class OpenGaussMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(BASIC_INDEX_META_DATA_SQL).executeQuery()).thenReturn(indexResultSet);
         ResultSet advanceIndexResultSet = mockAdvanceIndexMetaDataResultSet();
         
when(dataSource.getConnection().prepareStatement(ADVANCE_INDEX_META_DATA_SQL).executeQuery()).thenReturn(advanceIndexResultSet);
+        DataTypeRegistry.load(dataSource, "openGauss");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.singletonList("tbl"), "foo_ds", dataSource, 
new OpenGaussDatabaseType(), "sharding_db")));
     }
     
diff --git 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
index afe23facaf1..84001e34fc6 100644
--- 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
+++ 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
@@ -25,7 +25,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -44,7 +44,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -126,13 +125,12 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
     private Map<String, Collection<ColumnMetaData>> 
loadColumnMetaDataMap(final Connection connection, final Collection<String> 
tables, final String schema) throws SQLException {
         Map<String, Collection<ColumnMetaData>> result = new 
HashMap<>(tables.size(), 1F);
         try (PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables, 
connection.getMetaData()))) {
-            Map<String, Integer> dataTypes = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             Map<String, Collection<String>> tablePrimaryKeys = 
loadTablePrimaryKeys(connection, tables);
             preparedStatement.setString(1, schema);
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
-                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet, 
tablePrimaryKeys.getOrDefault(tableName, Collections.emptyList()), 
connection.getMetaData());
+                    ColumnMetaData columnMetaData = 
loadColumnMetaData(resultSet, tablePrimaryKeys.getOrDefault(tableName, 
Collections.emptyList()), connection.getMetaData());
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
@@ -143,8 +141,7 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
         return result;
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet, final Collection<String> primaryKeys,
-                                              final DatabaseMetaData 
databaseMetaData) throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final ResultSet resultSet, final 
Collection<String> primaryKeys, final DatabaseMetaData databaseMetaData) throws 
SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = 
getOriginalDataType(resultSet.getString("DATA_TYPE"));
         boolean primaryKey = primaryKeys.contains(columnName);
@@ -154,8 +151,7 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
         boolean caseSensitive = null != collation && collation.endsWith("_CS");
         boolean isVisible = "NO".equals(resultSet.getString("HIDDEN_COLUMN"));
         boolean nullable = "Y".equals(resultSet.getString("NULLABLE"));
-        Integer dataTypeCode = 
Optional.ofNullable(dataTypeMap.get(dataType)).orElse(Types.OTHER);
-        return new ColumnMetaData(columnName, dataTypeCode, primaryKey, 
generated, caseSensitive, isVisible, false, nullable);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
primaryKey, generated, caseSensitive, isVisible, false, nullable);
     }
     
     private String getOriginalDataType(final String dataType) {
diff --git 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
index fefae719d2c..99feb7191c3 100644
--- 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
+++ 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/database/OracleDatabaseMetaData.java
@@ -26,10 +26,10 @@ import java.sql.SQLException;
 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;
-import java.util.HashSet;
 
 /**
  * Database meta data of Oracle.
@@ -91,6 +91,9 @@ public final class OracleDatabaseMetaData implements 
DialectDatabaseMetaData {
     @Override
     public Map<String, Integer> getExtraDataTypes() {
         Map<String, Integer> result = new HashMap<>(8);
+        result.put("SMALLINT", Types.SMALLINT);
+        result.put("TINYINT", Types.TINYINT);
+        result.put("INT", Types.INTEGER);
         result.put("TEXT", Types.LONGVARCHAR);
         result.put("CHARACTER", Types.CHAR);
         result.put("VARCHAR2", Types.VARCHAR);
diff --git 
a/infra/database/type/oracle/src/test/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
 
b/infra/database/type/oracle/src/test/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
index c7d4f94ff2d..3a2304eb097 100644
--- 
a/infra/database/type/oracle/src/test/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
+++ 
b/infra/database/type/oracle/src/test/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoaderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.oracle.type.OracleDatabaseType;
@@ -88,6 +89,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -108,6 +110,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -128,6 +131,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITHOUT_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -149,6 +153,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -170,6 +175,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(1);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -191,6 +197,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(11);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -212,6 +219,7 @@ class OracleMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(ALL_CONSTRAINTS_SQL_WITH_TABLES).executeQuery()).thenReturn(primaryKeys);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(12);
         
when(dataSource.getConnection().getMetaData().getDatabaseMinorVersion()).thenReturn(2);
+        DataTypeRegistry.load(dataSource, "Oracle");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singleton("tbl"), 
"foo_ds", dataSource, new OracleDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
diff --git 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
index d2e329dd349..ec151ec8c99 100644
--- 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
+++ 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoader.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.Constra
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -152,7 +152,6 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
         try (
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getColumnMetaDataSQL(schemaNames, tables));
                 ResultSet resultSet = preparedStatement.executeQuery()) {
-            Map<String, Integer> dataTypes = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             Collection<String> primaryKeys = loadPrimaryKeys(connection, 
schemaNames);
             while (resultSet.next()) {
                 String tableName = resultSet.getString("table_name");
@@ -161,7 +160,7 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
                 }
                 String schemaName = resultSet.getString("table_schema");
                 Multimap<String, ColumnMetaData> columnMetaDataMap = 
result.computeIfAbsent(schemaName, key -> LinkedHashMultimap.create());
-                columnMetaDataMap.put(tableName, loadColumnMetaData(dataTypes, 
primaryKeys, resultSet));
+                columnMetaDataMap.put(tableName, 
loadColumnMetaData(primaryKeys, resultSet));
             }
         }
         return result;
@@ -209,7 +208,7 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
         return String.format(PRIMARY_KEY_META_DATA_SQL, 
schemaNames.stream().map(each -> String.format("'%s'", 
each)).collect(Collectors.joining(",")));
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final Collection<String> primaryKeys, final ResultSet resultSet) 
throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final Collection<String> 
primaryKeys, final ResultSet resultSet) throws SQLException {
         String schemaName = resultSet.getString("table_schema");
         String tableName = resultSet.getString("table_name");
         String columnName = resultSet.getString("column_name");
@@ -220,11 +219,7 @@ public final class PostgreSQLMetaDataLoader implements 
DialectMetaDataLoader {
         // TODO user defined collation which deterministic is false
         boolean caseSensitive = true;
         boolean isNullable = "YES".equals(resultSet.getString("is_nullable"));
-        return new ColumnMetaData(columnName, getDataType(dataTypeMap, 
dataType), isPrimaryKey, generated, caseSensitive, true, false, isNullable);
-    }
-    
-    private Integer getDataType(final Map<String, Integer> dataTypeMap, final 
String dataTypeName) {
-        return "bool".equals(dataTypeName) ? Types.BOOLEAN : 
dataTypeMap.get(dataTypeName);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
isPrimaryKey, generated, caseSensitive, true, false, isNullable);
     }
     
     private Map<String, Multimap<String, ConstraintMetaData>> 
loadConstraintMetaDataMap(final Connection connection, final Collection<String> 
schemaNames) throws SQLException {
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 d50a1a026bb..e9fd6a531af 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
@@ -17,12 +17,15 @@
 
 package org.apache.shardingsphere.infra.database.postgresql.metadata.database;
 
+import com.cedarsoftware.util.CaseInsensitiveMap;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 
+import java.sql.Types;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 
@@ -47,6 +50,20 @@ public final class PostgreSQLDatabaseMetaData implements 
DialectDatabaseMetaData
         return QuoteCharacter.QUOTE;
     }
     
+    @Override
+    public Map<String, Integer> getExtraDataTypes() {
+        Map<String, Integer> result = new CaseInsensitiveMap<>();
+        result.put("SMALLINT", Types.SMALLINT);
+        result.put("INT", Types.INTEGER);
+        result.put("INTEGER", Types.INTEGER);
+        result.put("BIGINT", Types.BIGINT);
+        result.put("DECIMAL", Types.DECIMAL);
+        result.put("NUMERIC", Types.NUMERIC);
+        result.put("REAL", Types.REAL);
+        result.put("BOOL", Types.BOOLEAN);
+        return result;
+    }
+    
     @Override
     public NullsOrderType getDefaultNullsOrderType() {
         return NullsOrderType.HIGH;
diff --git 
a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
 
b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
index 1c14dc6700c..d758126e141 100644
--- 
a/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
+++ 
b/infra/database/type/postgresql/src/test/java/org/apache/shardingsphere/infra/database/postgresql/metadata/data/loader/PostgreSQLMetaDataLoaderTest.java
@@ -24,6 +24,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.Constra
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.postgresql.type.PostgreSQLDatabaseType;
@@ -91,6 +92,7 @@ class PostgreSQLMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(BASIC_CONSTRAINT_META_DATA_SQL).executeQuery()).thenReturn(constraintResultSet);
         ResultSet roleTableGrantsResultSet = mockRoleTableGrantsResultSet();
         
when(dataSource.getConnection().prepareStatement(startsWith(LOAD_ALL_ROLE_TABLE_GRANTS_SQL)).executeQuery()).thenReturn(roleTableGrantsResultSet);
+        DataTypeRegistry.load(dataSource, "PostgreSQL");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", dataSource, new 
PostgreSQLDatabaseType(), "sharding_db")));
     }
     
@@ -118,6 +120,7 @@ class PostgreSQLMetaDataLoaderTest {
         
when(dataSource.getConnection().prepareStatement(BASIC_CONSTRAINT_META_DATA_SQL).executeQuery()).thenReturn(constraintResultSet);
         ResultSet roleTableGrantsResultSet = mockRoleTableGrantsResultSet();
         
when(dataSource.getConnection().prepareStatement(startsWith(LOAD_ALL_ROLE_TABLE_GRANTS_SQL)).executeQuery()).thenReturn(roleTableGrantsResultSet);
+        DataTypeRegistry.load(dataSource, "PostgreSQL");
         assertTableMetaDataMap(getDialectTableMetaDataLoader().load(new 
MetaDataLoaderMaterial(Collections.singletonList("tbl"), "foo_ds", dataSource, 
new PostgreSQLDatabaseType(), "sharding_db")));
     }
     
diff --git 
a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
 
b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
index 327a44522cf..26282dc9530 100644
--- 
a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
+++ 
b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoader.java
@@ -23,7 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
-import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeLoader;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -31,6 +31,7 @@ import java.sql.DatabaseMetaData;
 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;
@@ -83,11 +84,10 @@ public final class SQLServerMetaDataLoader implements 
DialectMetaDataLoader {
         try (
                 Connection connection = dataSource.getConnection();
                 PreparedStatement preparedStatement = 
connection.prepareStatement(getTableMetaDataSQL(tables, 
connection.getMetaData()))) {
-            Map<String, Integer> dataTypes = new 
DataTypeLoader().load(connection.getMetaData(), getType());
             try (ResultSet resultSet = preparedStatement.executeQuery()) {
                 while (resultSet.next()) {
                     String tableName = resultSet.getString("TABLE_NAME");
-                    ColumnMetaData columnMetaData = 
loadColumnMetaData(dataTypes, resultSet, connection.getMetaData());
+                    ColumnMetaData columnMetaData = 
loadColumnMetaData(resultSet, connection.getMetaData());
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
@@ -98,7 +98,7 @@ public final class SQLServerMetaDataLoader implements 
DialectMetaDataLoader {
         return result;
     }
     
-    private ColumnMetaData loadColumnMetaData(final Map<String, Integer> 
dataTypeMap, final ResultSet resultSet, final DatabaseMetaData 
databaseMetaData) throws SQLException {
+    private ColumnMetaData loadColumnMetaData(final ResultSet resultSet, final 
DatabaseMetaData databaseMetaData) throws SQLException {
         String columnName = resultSet.getString("COLUMN_NAME");
         String dataType = resultSet.getString("DATA_TYPE");
         String collationName = resultSet.getString("COLLATION_NAME");
@@ -107,7 +107,7 @@ public final class SQLServerMetaDataLoader implements 
DialectMetaDataLoader {
         boolean caseSensitive = null != collationName && 
collationName.contains("_CS");
         boolean isVisible = !(versionContainsHiddenColumn(databaseMetaData) && 
"1".equals(resultSet.getString("IS_HIDDEN")));
         boolean isNullable = "1".equals(resultSet.getString("IS_NULLABLE"));
-        return new ColumnMetaData(columnName, dataTypeMap.get(dataType), 
primaryKey, generated, caseSensitive, isVisible, false, isNullable);
+        return new ColumnMetaData(columnName, 
DataTypeRegistry.getDataType(getDatabaseType(), dataType).orElse(Types.OTHER), 
primaryKey, generated, caseSensitive, isVisible, false, isNullable);
     }
     
     private String getTableMetaDataSQL(final Collection<String> tables, final 
DatabaseMetaData databaseMetaData) throws SQLException {
diff --git 
a/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
 
b/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
index a77b8671225..2804120e1aa 100644
--- 
a/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
+++ 
b/infra/database/type/sqlserver/src/test/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/data/loader/SQLServerMetaDataLoaderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.ColumnM
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
 import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.database.sqlserver.type.SQLServerDatabaseType;
@@ -89,6 +90,7 @@ class SQLServerMetaDataLoaderTest {
         when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(15);
+        DataTypeRegistry.load(dataSource, "SQLServer");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", 
dataSource, new SQLServerDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -108,6 +110,7 @@ class SQLServerMetaDataLoaderTest {
         when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(14);
+        DataTypeRegistry.load(dataSource, "SQLServer");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.emptyList(), "foo_ds", 
dataSource, new SQLServerDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -126,6 +129,7 @@ class SQLServerMetaDataLoaderTest {
         when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(15);
+        DataTypeRegistry.load(dataSource, "SQLServer");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singletonList("tbl"), 
"foo_ds", dataSource, new SQLServerDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);
@@ -144,6 +148,7 @@ class SQLServerMetaDataLoaderTest {
         when(dataSource.getConnection().prepareStatement(LOAD_INDEX_META_DATA)
                 .executeQuery()).thenReturn(indexResultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(14);
+        DataTypeRegistry.load(dataSource, "SQLServer");
         Collection<SchemaMetaData> actual = 
getDialectTableMetaDataLoader().load(
                 new MetaDataLoaderMaterial(Collections.singletonList("tbl"), 
"foo_ds", dataSource, new SQLServerDatabaseType(), "sharding_db"));
         assertTableMetaDataMap(actual);

Reply via email to