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