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

Reply via email to