This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push: new c7158fc2 refactor database dialect get delimiter (#7797) c7158fc2 is described below commit c7158fc27a135311f96b6d6177e7791365e89419 Author: xiaoyu <549477...@qq.com> AuthorDate: Thu Oct 15 15:15:08 2020 +0800 refactor database dialect get delimiter (#7797) * refactor database dialect get delimiter * modify java doc * refactor database dialect get delimiter --- .../handler/DatabaseMetaDataDialectHandler.java | 19 +++- ....java => H2DatabaseMetaDataDialectHandler.java} | 27 ++--- ... => MariaDBDatabaseMetaDataDialectHandler.java} | 29 ++--- ...va => MySQLDatabaseMetaDataDialectHandler.java} | 27 ++--- .../impl/OracleDatabaseMetaDataDialectHandler.java | 8 +- ... PostgreSQLDatabaseMetaDataDialectHandler.java} | 27 ++--- ...va => SQL92DatabaseMetaDataDialectHandler.java} | 27 ++--- ...> SQLServerDatabaseMetaDataDialectHandler.java} | 27 ++--- .../model/column/PhysicalColumnMetaDataLoader.java | 23 +--- ...cal.jdbc.handler.DatabaseMetaDataDialectHandler | 6 + .../DatabaseMetaDataDialectHandlerFactoryTest.java | 9 +- .../DatabaseMetaDataDialectHandlerTest.java | 125 +++++++++++++++++++++ 12 files changed, 212 insertions(+), 142 deletions(-) diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandler.java index 8918582..69feae8 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandler.java @@ -18,7 +18,9 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler; import java.sql.Connection; +import java.sql.SQLException; import org.apache.shardingsphere.infra.spi.typed.TypedSPI; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** * Database meta data dialect handler. @@ -31,7 +33,13 @@ public interface DatabaseMetaDataDialectHandler extends TypedSPI { * @param connection connection * @return schema */ - String getSchema(Connection connection); + default String getSchema(Connection connection) { + try { + return connection.getSchema(); + } catch (SQLException e) { + return null; + } + } /** * Decorate table name pattern. @@ -42,4 +50,13 @@ public interface DatabaseMetaDataDialectHandler extends TypedSPI { default String decorate(String tableNamePattern) { return tableNamePattern; } + + /** + * Get delimiter. + * + * @return delimiter + */ + default QuoteCharacter getDelimiter() { + return QuoteCharacter.NONE; + } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/H2DatabaseMetaDataDialectHandler.java similarity index 64% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/H2DatabaseMetaDataDialectHandler.java index cdeeb30..8637d5f 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/H2DatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of H2. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { +public final class H2DatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.QUOTE; } - + @Override public String getType() { - return "Oracle"; + return "H2"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MariaDBDatabaseMetaDataDialectHandler.java similarity index 63% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MariaDBDatabaseMetaDataDialectHandler.java index cdeeb30..4e41ff8 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MariaDBDatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of MariaDB. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { - +public final class MariaDBDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { + private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.BACK_QUOTE; } - + @Override public String getType() { - return "Oracle"; + return "MariaDB"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MySQLDatabaseMetaDataDialectHandler.java similarity index 64% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MySQLDatabaseMetaDataDialectHandler.java index cdeeb30..38ee556 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/MySQLDatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of MySQL. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { +public final class MySQLDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.BACK_QUOTE; } - + @Override public String getType() { - return "Oracle"; + return "MySQL"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java index cdeeb30..04137da 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java @@ -24,6 +24,7 @@ import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** * Database meta data dialect handler of Oracle. @@ -47,7 +48,12 @@ public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaD public String decorate(final String tableNamePattern) { return tableNamePattern.toUpperCase(); } - + + @Override + public QuoteCharacter getDelimiter() { + return QuoteCharacter.QUOTE; + } + @Override public String getType() { return "Oracle"; diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/PostgreSQLDatabaseMetaDataDialectHandler.java similarity index 64% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/PostgreSQLDatabaseMetaDataDialectHandler.java index cdeeb30..7b2e38c 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/PostgreSQLDatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of PostgreSQL. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { +public final class PostgreSQLDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.QUOTE; } - + @Override public String getType() { - return "Oracle"; + return "PostgreSQL"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQL92DatabaseMetaDataDialectHandler.java similarity index 64% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQL92DatabaseMetaDataDialectHandler.java index cdeeb30..08aa9bd 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQL92DatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of SQL92. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { +public final class SQL92DatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.QUOTE; } - + @Override public String getType() { - return "Oracle"; + return "SQL92"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQLServerDatabaseMetaDataDialectHandler.java similarity index 64% copy from shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQLServerDatabaseMetaDataDialectHandler.java index cdeeb30..8dc035b 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/OracleDatabaseMetaDataDialectHandler.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/impl/SQLServerDatabaseMetaDataDialectHandler.java @@ -17,39 +17,28 @@ package org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Optional; import java.util.Properties; import lombok.Getter; import lombok.Setter; import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** - * Database meta data dialect handler of Oracle. + * Database meta data dialect handler of SQLServer. */ @Getter @Setter -public final class OracleDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { +public final class SQLServerDatabaseMetaDataDialectHandler implements DatabaseMetaDataDialectHandler { private Properties props; - - @Override - public String getSchema(final Connection connection) { - try { - return Optional.ofNullable(connection.getMetaData().getUserName()).map(String::toUpperCase).orElse(null); - } catch (final SQLException ignored) { - return null; - } - } - + @Override - public String decorate(final String tableNamePattern) { - return tableNamePattern.toUpperCase(); + public QuoteCharacter getDelimiter() { + return QuoteCharacter.BRACKETS; } - + @Override public String getType() { - return "Oracle"; + return "SQLServer"; } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/model/column/PhysicalColumnMetaDataLoader.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/model/column/PhysicalColumnMetaDataLoader.java index 40d0cb3..baa4e97 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/model/column/PhysicalColumnMetaDataLoader.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/model/physical/model/column/PhysicalColumnMetaDataLoader.java @@ -30,6 +30,9 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Objects; +import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler; +import org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandlerFactory; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; /** * Physical column meta data loader. @@ -87,24 +90,8 @@ public final class PhysicalColumnMetaDataLoader { } private static String generateEmptyResultSQL(final String table, final DatabaseType databaseType) { - // TODO consider add a getDialectDelimeter() interface in parse module - String delimiterLeft; - String delimiterRight; - String databaseTypeName = databaseType.getName(); - if ("MySQL".equals(databaseTypeName) || "MariaDB".equals(databaseTypeName)) { - delimiterLeft = "`"; - delimiterRight = "`"; - } else if ("Oracle".equals(databaseTypeName) || "PostgreSQL".equals(databaseTypeName) || "H2".equals(databaseTypeName) || "SQL92".equals(databaseTypeName)) { - delimiterLeft = "\""; - delimiterRight = "\""; - } else if ("SQLServer".equals(databaseTypeName)) { - delimiterLeft = "["; - delimiterRight = "]"; - } else { - delimiterLeft = ""; - delimiterRight = ""; - } - return "SELECT * FROM " + delimiterLeft + table + delimiterRight + " WHERE 1 != 1"; + QuoteCharacter quoteCharacter = DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(DatabaseMetaDataDialectHandler::getDelimiter).orElse(QuoteCharacter.NONE); + return "SELECT * FROM " + quoteCharacter.getStartDelimiter() + table + quoteCharacter.getEndDelimiter() + " WHERE 1 != 1"; } private static Collection<String> loadPrimaryKeys(final Connection connection, final String table) throws SQLException { diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler index 1bb44fd..9ae84d4 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.DatabaseMetaDataDialectHandler @@ -15,4 +15,10 @@ # limitations under the License. # +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.H2DatabaseMetaDataDialectHandler +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.MariaDBDatabaseMetaDataDialectHandler +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.MySQLDatabaseMetaDataDialectHandler org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.OracleDatabaseMetaDataDialectHandler +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.PostgreSQLDatabaseMetaDataDialectHandler +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.SQL92DatabaseMetaDataDialectHandler +org.apache.shardingsphere.infra.metadata.model.physical.jdbc.handler.impl.SQLServerDatabaseMetaDataDialectHandler diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerFactoryTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerFactoryTest.java index cddfe7f..d21059d 100644 --- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerFactoryTest.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerFactoryTest.java @@ -22,19 +22,14 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @RunWith(MockitoJUnitRunner.class) public final class DatabaseMetaDataDialectHandlerFactoryTest { @Test - public void assertFindHandlerForOracle() { + public void assertFindHandler() { assertTrue(DatabaseMetaDataDialectHandlerFactory.findHandler(DatabaseTypes.getTrunkDatabaseType("Oracle")).isPresent()); - } - - @Test - public void assertFindHandlerMySQL() { - assertFalse(DatabaseMetaDataDialectHandlerFactory.findHandler(DatabaseTypes.getTrunkDatabaseType("MySQL")).isPresent()); + assertTrue(DatabaseMetaDataDialectHandlerFactory.findHandler(DatabaseTypes.getTrunkDatabaseType("MySQL")).isPresent()); } } diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerTest.java new file mode 100644 index 0000000..3367e81 --- /dev/null +++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/metadata/model/physical/jdbc/handler/DatabaseMetaDataDialectHandlerTest.java @@ -0,0 +1,125 @@ +/* + * 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.metadata.model.physical.jdbc.handler; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.SQLException; +import org.apache.shardingsphere.infra.database.type.DatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.MariaDBDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.OracleDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.SQL92DatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.SQLServerDatabaseType; +import org.apache.shardingsphere.sql.parser.sql.common.constant.QuoteCharacter; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public final class DatabaseMetaDataDialectHandlerTest { + + private static final String USER_NAME = "root"; + + private static final String TABLE_NAME_PATTERN = "t_order_0"; + + @Mock + private Connection connection; + + @Mock + private DatabaseMetaData databaseMetaData; + + @Test + public void assertGetSchema() throws SQLException { + when(connection.getMetaData()).thenReturn(databaseMetaData); + when(databaseMetaData.getUserName()).thenReturn(USER_NAME); + String schema = getSchema(new OracleDatabaseType()); + assertThat(schema, is(USER_NAME.toUpperCase())); + when(connection.getSchema()).thenReturn(USER_NAME); + String schemaMySQL = getSchema(new MySQLDatabaseType()); + assertThat(schemaMySQL, is(USER_NAME)); + // TODO H2, MariaDB, PostgreSQL, SQLServer, SQL92 database getSchema + } + + @Test + public void assertGetTableNamePattern() { + String oracleTableNamePattern = getTableNamePattern(new OracleDatabaseType()); + assertThat(oracleTableNamePattern, is(TABLE_NAME_PATTERN.toUpperCase())); + String mysqlTableNamePattern = getTableNamePattern(new MySQLDatabaseType()); + assertThat(mysqlTableNamePattern, is(TABLE_NAME_PATTERN)); + // TODO H2, MariaDB, PostgreSQL, SQLServer, SQL92 decorate table name pattern + } + + @Test + public void assertGetDelimiter() { + QuoteCharacter oracleQuoteCharacter = findQuoteCharacter(new OracleDatabaseType()); + assertThat(oracleQuoteCharacter.getStartDelimiter(), is("\"")); + assertThat(oracleQuoteCharacter.getEndDelimiter(), is("\"")); + + QuoteCharacter h2QuoteCharacter = findQuoteCharacter(new H2DatabaseType()); + assertThat(h2QuoteCharacter.getStartDelimiter(), is("\"")); + assertThat(h2QuoteCharacter.getEndDelimiter(), is("\"")); + + QuoteCharacter postgreSQLQuoteCharacter = findQuoteCharacter(new PostgreSQLDatabaseType()); + assertThat(postgreSQLQuoteCharacter.getStartDelimiter(), is("\"")); + assertThat(postgreSQLQuoteCharacter.getEndDelimiter(), is("\"")); + + QuoteCharacter sql92QuoteCharacter = findQuoteCharacter(new SQL92DatabaseType()); + assertThat(sql92QuoteCharacter.getStartDelimiter(), is("\"")); + assertThat(sql92QuoteCharacter.getEndDelimiter(), is("\"")); + + QuoteCharacter mariaDBQuoteCharacter = findQuoteCharacter(new MariaDBDatabaseType()); + assertThat(mariaDBQuoteCharacter.getStartDelimiter(), is("`")); + assertThat(mariaDBQuoteCharacter.getEndDelimiter(), is("`")); + + QuoteCharacter mysqlQuoteCharacter = findQuoteCharacter(new MySQLDatabaseType()); + assertThat(mysqlQuoteCharacter.getStartDelimiter(), is("`")); + assertThat(mysqlQuoteCharacter.getEndDelimiter(), is("`")); + + QuoteCharacter sqlServerQuoteCharacter = findQuoteCharacter(new SQLServerDatabaseType()); + assertThat(sqlServerQuoteCharacter.getStartDelimiter(), is("[")); + assertThat(sqlServerQuoteCharacter.getEndDelimiter(), is("]")); + } + + private QuoteCharacter findQuoteCharacter(final DatabaseType databaseType) { + return DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(DatabaseMetaDataDialectHandler::getDelimiter).orElse(QuoteCharacter.NONE); + } + + private String getTableNamePattern(final DatabaseType databaseType) { + return DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(handler -> handler.decorate(TABLE_NAME_PATTERN)).orElse(TABLE_NAME_PATTERN); + } + + private String getSchema(final DatabaseType databaseType) { + return DatabaseMetaDataDialectHandlerFactory.findHandler(databaseType).map(handler -> handler.getSchema(connection)).orElse(getSchema(connection)); + } + + private String getSchema(final Connection connection) { + try { + return connection.getSchema(); + } catch (final SQLException ex) { + return null; + } + } +}