This is an automated email from the ASF dual-hosted git repository.
menghaoranss 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 aa1702afee8 Handle MySQL lower_case_table_names=0 in identifier rules
(#38676)
aa1702afee8 is described below
commit aa1702afee84ddd11b3b5ce0658736ce59f4b2a1
Author: Haoran Meng <[email protected]>
AuthorDate: Fri May 8 13:48:18 2026 +0800
Handle MySQL lower_case_table_names=0 in identifier rules (#38676)
* Handle MySQL lower_case_table_names=0 in identifier rules
* Refine MySQL lctn=0 identifier rules and stabilize metadata tests
* Close JDBC connection in MySQL identifier rule provider
---
.../MySQLIdentifierCaseRuleProvider.java | 30 ++++++++--
.../MySQLIdentifierCaseRuleProviderTest.java | 66 +++++++++++++++++++++-
.../DatabaseIdentifierContextFactory.java | 6 +-
.../DatabaseIdentifierContextFactoryTest.java | 36 +++++++++++-
.../admin/MySQLAdminExecutorCreatorTest.java | 7 ++-
.../SelectInformationSchemataExecutorTest.java | 17 +++++-
6 files changed, 146 insertions(+), 16 deletions(-)
diff --git
a/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProvider.java
b/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProvider.java
index af60487140b..77d7224fcb7 100644
---
a/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProvider.java
+++
b/database/connector/dialect/mysql/src/main/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProvider.java
@@ -19,13 +19,17 @@ package
org.apache.shardingsphere.database.connector.mysql.metadata.identifier;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProvider;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProviderContext;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRule;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleSet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleSets;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.EnumMap;
+import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -42,18 +46,32 @@ public final class MySQLIdentifierCaseRuleProvider
implements IdentifierCaseRule
if (null == context.getDataSource()) {
return Optional.empty();
}
- try (
- Connection connection =
context.getDataSource().getConnection();
- PreparedStatement preparedStatement =
connection.prepareStatement(QUERY_LOWER_CASE_TABLE_NAMES);
- ResultSet resultSet = preparedStatement.executeQuery()) {
- return resultSet.next() ? createRuleSet(resultSet.getInt(1)) :
Optional.empty();
+ try (Connection connection = context.getDataSource().getConnection()) {
+ if (null == connection) {
+ return Optional.empty();
+ }
+ try (
+ PreparedStatement preparedStatement =
connection.prepareStatement(QUERY_LOWER_CASE_TABLE_NAMES);
+ ResultSet resultSet = preparedStatement.executeQuery()) {
+ return resultSet.next() ? createRuleSet(resultSet.getInt(1)) :
Optional.empty();
+ }
} catch (final SQLException ignored) {
return Optional.empty();
}
}
private Optional<IdentifierCaseRuleSet> createRuleSet(final int
lowerCaseTableNames) {
- return 1 == lowerCaseTableNames || 2 == lowerCaseTableNames ?
Optional.of(IdentifierCaseRuleSets.newMySQLInsensitiveRuleSet()) :
Optional.empty();
+ if (1 == lowerCaseTableNames || 2 == lowerCaseTableNames) {
+ return
Optional.of(IdentifierCaseRuleSets.newMySQLInsensitiveRuleSet());
+ }
+ if (0 == lowerCaseTableNames) {
+ Map<IdentifierScope, IdentifierCaseRule> scopedRules = new
EnumMap<>(IdentifierScope.class);
+ scopedRules.put(IdentifierScope.SCHEMA,
IdentifierCaseRuleSets.newSensitiveRuleSet().getRule(IdentifierScope.SCHEMA));
+ scopedRules.put(IdentifierScope.TABLE,
IdentifierCaseRuleSets.newSensitiveRuleSet().getRule(IdentifierScope.TABLE));
+ scopedRules.put(IdentifierScope.VIEW,
IdentifierCaseRuleSets.newSensitiveRuleSet().getRule(IdentifierScope.VIEW));
+ return Optional.of(new
IdentifierCaseRuleSet(IdentifierCaseRuleSets.newInsensitiveRuleSet().getRule(IdentifierScope.TABLE),
scopedRules));
+ }
+ return Optional.empty();
}
@Override
diff --git
a/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProviderTest.java
b/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProviderTest.java
index 0bcb8ea460c..af2d0f9af4a 100644
---
a/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProviderTest.java
+++
b/database/connector/dialect/mysql/src/test/java/org/apache/shardingsphere/database/connector/mysql/metadata/identifier/MySQLIdentifierCaseRuleProviderTest.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.database.enums
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRule;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProvider;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProviderContext;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleSet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -95,7 +96,9 @@ class MySQLIdentifierCaseRuleProviderTest {
private static Stream<Arguments> provideArguments() throws SQLException {
return Stream.of(
Arguments.of("null_data_source", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, null), null, null, null),
- Arguments.of("lower_case_table_names_0", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockDataSource(true, 0)),
null, null, null),
+ Arguments.of("null_connection", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE,
mockNullConnectionDataSource()), null, null, null),
+ Arguments.of("lower_case_table_names_0", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockDataSource(true, 0)),
+ LookupMode.EXACT, LookupMode.EXACT, Boolean.FALSE),
Arguments.of("lower_case_table_names_1", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockDataSource(true, 1)),
LookupMode.NORMALIZED, LookupMode.NORMALIZED,
Boolean.TRUE),
Arguments.of("lower_case_table_names_2", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockDataSource(true, 2)),
@@ -104,6 +107,17 @@ class MySQLIdentifierCaseRuleProviderTest {
Arguments.of("sql_exception", new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockFailingDataSource()),
null, null, null));
}
+ @Test
+ void assertProvideWithLowerCaseTableNamesZeroUsesScopedRules() throws
SQLException {
+ IdentifierCaseRuleProviderContext context = new
IdentifierCaseRuleProviderContext(DATABASE_TYPE, mockDataSource(true, 0));
+ IdentifierCaseRuleSet actual =
provider.provide(context).orElseThrow(AssertionError::new);
+
assertThat(actual.getRule(IdentifierScope.SCHEMA).matches("foo_schema",
"FOO_SCHEMA", QuoteCharacter.NONE), is(Boolean.FALSE));
+ assertThat(actual.getRule(IdentifierScope.TABLE).matches("foo_tbl",
"FOO_TBL", QuoteCharacter.NONE), is(Boolean.FALSE));
+ assertThat(actual.getRule(IdentifierScope.VIEW).matches("foo_view",
"FOO_VIEW", QuoteCharacter.NONE), is(Boolean.FALSE));
+ assertThat(actual.getRule(IdentifierScope.COLUMN).matches("foo_col",
"FOO_COL", QuoteCharacter.NONE), is(Boolean.TRUE));
+ assertThat(actual.getRule(IdentifierScope.INDEX).matches("foo_idx",
"FOO_IDX", QuoteCharacter.NONE), is(Boolean.TRUE));
+ }
+
private static DataSource mockDataSource(final boolean hasResultSetRow,
final int lowerCaseTableNames) throws SQLException {
return new FixtureDataSource(hasResultSetRow, lowerCaseTableNames);
}
@@ -112,6 +126,10 @@ class MySQLIdentifierCaseRuleProviderTest {
return new FailingFixtureDataSource();
}
+ private static DataSource mockNullConnectionDataSource() {
+ return new NullConnectionFixtureDataSource();
+ }
+
private static Object getDefaultValue(final Class<?> returnType) {
if (!returnType.isPrimitive()) {
return null;
@@ -261,4 +279,50 @@ class MySQLIdentifierCaseRuleProviderTest {
return Logger.getGlobal();
}
}
+
+ private static final class NullConnectionFixtureDataSource implements
DataSource {
+
+ @Override
+ public Connection getConnection() {
+ return null;
+ }
+
+ @Override
+ public Connection getConnection(final String username, final String
password) {
+ return null;
+ }
+
+ @Override
+ public <T> T unwrap(final Class<T> iface) {
+ return null;
+ }
+
+ @Override
+ public boolean isWrapperFor(final Class<?> iface) {
+ return false;
+ }
+
+ @Override
+ public PrintWriter getLogWriter() {
+ return null;
+ }
+
+ @Override
+ public void setLogWriter(final PrintWriter out) {
+ }
+
+ @Override
+ public void setLoginTimeout(final int seconds) {
+ }
+
+ @Override
+ public int getLoginTimeout() {
+ return 0;
+ }
+
+ @Override
+ public Logger getParentLogger() {
+ return Logger.getGlobal();
+ }
+ }
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
index 81650674773..22da25f7a47 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
@@ -78,7 +78,7 @@ public final class DatabaseIdentifierContextFactory {
public static DatabaseIdentifierContext create(final DatabaseType
protocolType, final ResourceMetaData resourceMetaData, final
ConfigurationProperties props) {
ConfigurationProperties actualProps = getProps(props);
IdentifierCaseRuleResolver resolver = new IdentifierCaseRuleResolver();
- IdentifierCaseRuleSet protocolRuleSet = resolver.resolve(protocolType,
actualProps, null);
+ IdentifierCaseRuleSet protocolRuleSet = resolver.resolve(protocolType,
actualProps, getFirstDataSource(resourceMetaData));
Optional<DatabaseType> storageDatabaseType =
getIdentifierRuleDatabaseType(resourceMetaData);
IdentifierCaseRuleSet storageRuleSet =
resolver.resolve(storageDatabaseType.orElse(protocolType), actualProps,
getFirstDataSource(resourceMetaData));
IdentifierCaseRuleSet scopeAwareRuleSet =
createScopeAwareRuleSet(protocolRuleSet, storageRuleSet);
@@ -110,7 +110,7 @@ public final class DatabaseIdentifierContextFactory {
public static void refresh(final DatabaseIdentifierContext
identifierContext, final DatabaseType protocolType, final ResourceMetaData
resourceMetaData, final ConfigurationProperties props) {
ConfigurationProperties actualProps = getProps(props);
IdentifierCaseRuleResolver resolver = new IdentifierCaseRuleResolver();
- IdentifierCaseRuleSet protocolRuleSet = resolver.resolve(protocolType,
actualProps, null);
+ IdentifierCaseRuleSet protocolRuleSet = resolver.resolve(protocolType,
actualProps, getFirstDataSource(resourceMetaData));
Optional<DatabaseType> storageDatabaseType =
getIdentifierRuleDatabaseType(resourceMetaData);
IdentifierCaseRuleSet storageRuleSet =
resolver.resolve(storageDatabaseType.orElse(protocolType), actualProps,
getFirstDataSource(resourceMetaData));
identifierContext.refresh(createScopeAwareRuleSet(protocolRuleSet,
storageRuleSet), isHeterogeneous(protocolType,
getStorageDatabaseTypes(resourceMetaData)));
@@ -137,7 +137,7 @@ public final class DatabaseIdentifierContextFactory {
}
scopedRules.put(each, IdentifierScope.SCHEMA == each ?
protocolRuleSet.getRule(each) : storageRuleSet.getRule(each));
}
- scopedRules.put(IdentifierScope.LOGICAL_TABLE,
protocolRuleSet.getRule(IdentifierScope.TABLE));
+ scopedRules.put(IdentifierScope.LOGICAL_TABLE,
protocolRuleSet.getRule(IdentifierScope.LOGICAL_TABLE));
return new
IdentifierCaseRuleSet(storageRuleSet.getRule(IdentifierScope.TABLE),
scopedRules);
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
index 7cc724c5670..124a13aa87d 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
@@ -76,6 +76,8 @@ class DatabaseIdentifierContextFactoryTest {
private static final ResourceMetaData
MYSQL_QUOTED_INSENSITIVE_RESOURCE_META_DATA =
createResourceMetaDataWithMySQLLowerCaseTableNames(2);
+ private static final ResourceMetaData
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA =
createResourceMetaDataWithMySQLLowerCaseTableNames(0);
+
private static final ResourceMetaData POSTGRESQL_RESOURCE_META_DATA =
createResourceMetaDataWithStorageUrls("jdbc:postgresql://localhost:5432/foo_db");
private static final ResourceMetaData OPEN_GAUSS_RESOURCE_META_DATA =
createResourceMetaDataWithStorageUrls("jdbc:opengauss://localhost:5432/foo_db");
@@ -180,6 +182,36 @@ class DatabaseIdentifierContextFactoryTest {
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
}
+ @Test
+ void
assertCreateUsesInsensitiveRuleForLogicalTableWhenMySQLLowerCaseTableNamesIsZero()
{
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
+ IdentifierCaseRule actualLogicalTableRule =
actual.getRule(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCaseRule actualTableRule =
actual.getRule(IdentifierScope.TABLE);
+ assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ assertFalse(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ }
+
+ @Test
+ void
assertRefreshUsesInsensitiveRuleForLogicalTableWhenMySQLLowerCaseTableNamesIsZero()
{
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
+ DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
+ IdentifierCaseRule actualLogicalTableRule =
actual.getRule(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCaseRule actualTableRule =
actual.getRule(IdentifierScope.TABLE);
+ assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ assertFalse(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ }
+
+ @Test
+ void assertCreateKeepsPostgreSQLLogicalTableRuleWithResourceMetadata() {
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(POSTGRESQL_DATABASE_TYPE,
POSTGRESQL_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
+ IdentifierCaseRule actualLogicalTableRule =
actual.getRule(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCaseRule actualTableRule =
actual.getRule(IdentifierScope.TABLE);
+ assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ assertTrue(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
+ assertFalse(actualLogicalTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
+ assertFalse(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
+ }
+
@Test
void
assertCreateDisablesHeterogeneousLookupWhenProtocolAndStorageAreHomogeneous() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
MYSQL_INSENSITIVE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
@@ -384,7 +416,7 @@ class DatabaseIdentifierContextFactoryTest {
private static Stream<Arguments>
createWithSupportedDatabaseSchemaLookupArguments() {
return Stream.of(
- createInsensitiveQuotedExactLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
+ createNormalizedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
createLowerCaseLookupArguments("postgresql schema",
POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema", "\""),
createLowerCaseLookupArguments("openGauss schema",
OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_RESOURCE_META_DATA, "foo_schema", "\""),
createUpperCaseLookupArguments("oracle schema",
ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
@@ -441,7 +473,7 @@ class DatabaseIdentifierContextFactoryTest {
private static Stream<Arguments>
createWithMixedStoredCaseSchemaLookupArguments() {
return Stream.of(
- createInsensitiveQuotedExactMixedLookupArguments("mysql
schema", MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA,
"foo_schema", "`"),
+ createNormalizedMixedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
createLowerCaseMixedLookupArguments("postgresql schema",
POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema", "\""),
createLowerCaseMixedLookupArguments("openGauss schema",
OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_RESOURCE_META_DATA, "foo_schema", "\""),
createUpperCaseMixedLookupArguments("oracle schema",
ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
diff --git
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
index 20003a974c3..e2461b9becf 100644
---
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
+++
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/MySQLAdminExecutorCreatorTest.java
@@ -73,6 +73,7 @@ import
org.apache.shardingsphere.test.infra.framework.extension.mock.StaticMockS
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import java.sql.Connection;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
@@ -287,7 +288,7 @@ class MySQLAdminExecutorCreatorTest {
@Test
void assertCreateWithOtherSelectStatementForDatabaseName() {
- ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds", new MockedDataSource()));
+ ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds", new
MockedDataSource(mock(Connection.class, RETURNS_DEEP_STUBS))));
ShardingSphereDatabase database =
new ShardingSphereDatabase("db_0", databaseType,
resourceMetaData, mock(RuleMetaData.class), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
initProxyContext(Collections.singleton(database));
@@ -306,7 +307,7 @@ class MySQLAdminExecutorCreatorTest {
@Test
void assertCreateWithOtherSelectStatementForNullDatabaseName() {
- ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds_0", new MockedDataSource()));
+ ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds_0", new
MockedDataSource(mock(Connection.class, RETURNS_DEEP_STUBS))));
ShardingSphereDatabase database =
new ShardingSphereDatabase("db_0", databaseType,
resourceMetaData, mock(RuleMetaData.class), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
initProxyContext(Collections.singleton(database));
@@ -420,7 +421,7 @@ class MySQLAdminExecutorCreatorTest {
@Test
void assertCreateWithNoFromAndMultiProjectionsSkipsAdmin() {
- ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds_0", new MockedDataSource()));
+ ResourceMetaData resourceMetaData = new
ResourceMetaData(Collections.singletonMap("ds_0", new
MockedDataSource(mock(Connection.class, RETURNS_DEEP_STUBS))));
ShardingSphereDatabase database =
new ShardingSphereDatabase("db_0", databaseType,
resourceMetaData, mock(RuleMetaData.class), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
initProxyContext(Collections.singleton(database));
diff --git
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutorTest.java
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutorTest.java
index ec25e2a6517..28d61bcc9cb 100644
---
a/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutorTest.java
+++
b/proxy/backend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/backend/mysql/handler/admin/executor/select/SelectInformationSchemataExecutorTest.java
@@ -51,6 +51,7 @@ import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.sql.Connection;
+import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
@@ -68,6 +69,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockConstruction;
@@ -185,8 +187,21 @@ class SelectInformationSchemataExecutorTest {
Connection result = mock(Connection.class, RETURNS_DEEP_STUBS);
when(result.getMetaData().getURL()).thenReturn("jdbc:mysql://localhost:3306/foo_ds");
when(result.getCatalog()).thenReturn("foo_ds");
+ PreparedStatement lowerCasePreparedStatement =
mock(PreparedStatement.class, RETURNS_DEEP_STUBS);
+ PreparedStatement queryPreparedStatement =
mock(PreparedStatement.class, RETURNS_DEEP_STUBS);
ResultSet resultSet = mockResultSet(expectedResultSetMap);
-
when(result.prepareStatement(any(String.class)).executeQuery()).thenReturn(resultSet);
+ ResultSet lowerCaseResultSet = mockLowerCaseResultSet();
+
when(lowerCasePreparedStatement.executeQuery()).thenReturn(lowerCaseResultSet);
+ when(queryPreparedStatement.executeQuery()).thenReturn(resultSet);
+
when(result.prepareStatement(any(String.class))).thenReturn(queryPreparedStatement);
+ when(result.prepareStatement(eq("SELECT
@@lower_case_table_names"))).thenReturn(lowerCasePreparedStatement);
+ return result;
+ }
+
+ private ResultSet mockLowerCaseResultSet() throws SQLException {
+ ResultSet result = mock(ResultSet.class, RETURNS_DEEP_STUBS);
+ when(result.next()).thenReturn(true);
+ when(result.getInt(1)).thenReturn(1);
return result;
}