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

zhaojinchao 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 216ca48  Adjust proxy mysql admin executor to support system table 
query (#16373)
216ca48 is described below

commit 216ca485877579a39c26c7e3837e94716595649b
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat Mar 26 11:09:59 2022 +0800

    Adjust proxy mysql admin executor to support system table query (#16373)
    
    * Adjust proxy mysql admin executor to support system table query
    
    * Fix build error
    
    * Fix unit test
    
    * Fix integration test for show databases
---
 .../dal/impl/fixture/TestStatementContext.java     |  7 +++++++
 ...ableAvailableAndSqlStatementContextFixture.java |  7 +++++++
 .../binder/statement/SQLStatementContext.java      |  8 ++++++++
 .../sql/context/ExecutionContextBuilder.java       |  7 +++++--
 .../table/FilterableTableScanExecutor.java         |  2 +-
 .../mode/metadata/MetaDataContextsBuilder.java     | 14 ++++++++-----
 .../jdbc/JDBCDatabaseCommunicationEngine.java      | 10 ++++++----
 .../text/TextProtocolBackendHandlerFactory.java    |  8 ++++----
 .../admin/DatabaseAdminBackendHandlerFactory.java  | 23 +++++++++++-----------
 .../executor/DatabaseAdminExecutorFactory.java     | 10 +++++-----
 .../admin/mysql/MySQLAdminExecutorFactory.java     | 13 +++++++-----
 .../admin/mysql/executor/ShowTablesExecutor.java   |  5 ++++-
 .../postgresql/PostgreSQLAdminExecutorFactory.java |  6 ++++--
 .../impl/SchemaAssignedDatabaseBackendHandler.java |  5 +++--
 ...QLStatementContextInstanceOfTableAvailable.java |  9 ++++++++-
 .../admin/mysql/MySQLAdminExecutorFactoryTest.java | 22 +++++++++++++++++----
 .../mysql/executor/ShowTablesExecutorTest.java     | 13 ++++++------
 .../PostgreSQLAdminExecutorFactoryTest.java        | 19 ++++++++++++------
 .../SchemaAssignedDatabaseBackendHandlerTest.java  |  5 ++++-
 .../cases/dal/dataset/db/mysql/show_databases.xml  |  4 ++++
 .../mysql/show_databases.xml                       |  4 ++++
 .../mysql/show_databases.xml                       |  4 ++++
 .../dal/dataset/encrypt/mysql/show_databases.xml   |  4 ++++
 .../readwrite_splitting/mysql/show_databases.xml   |  4 ++++
 .../sharding_governance/mysql/show_databases.xml   |  4 ++++
 .../cases/dal/dataset/tbl/mysql/show_databases.xml |  4 ++++
 26 files changed, 161 insertions(+), 60 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
index 11dfba7..143469a 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/impl/fixture/TestStatementContext.java
@@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -49,4 +51,9 @@ public final class TestStatementContext implements 
SQLStatementContext<SQLStatem
     public TablesContext getTablesContext() {
         return tablesContext;
     }
+    
+    @Override
+    public DatabaseType getDatabaseType() {
+        return DatabaseTypeRegistry.getDefaultDatabaseType();
+    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
index cf088a8..b6b318c 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.encrypt.merge.dql.fixture;
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -41,4 +43,9 @@ public final class 
TableAvailableAndSqlStatementContextFixture implements TableA
     public TablesContext getTablesContext() {
         return null;
     }
+    
+    @Override
+    public DatabaseType getDatabaseType() {
+        return DatabaseTypeRegistry.getDefaultDatabaseType();
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
index dbe536a..da0ca9e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/SQLStatementContext.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.binder.statement;
 
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
@@ -40,4 +41,11 @@ public interface SQLStatementContext<T extends SQLStatement> 
{
      * @return tables context
      */
     TablesContext getTablesContext();
+    
+    /**
+     * Get database type.
+     * 
+     * @return database type
+     */
+    DatabaseType getDatabaseType();
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
index 227acc5..980cd6e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/context/ExecutionContextBuilder.java
@@ -57,8 +57,11 @@ public final class ExecutionContextBuilder {
     }
     
     private static Collection<ExecutionUnit> build(final 
ShardingSphereMetaData metaData, final GenericSQLRewriteResult 
sqlRewriteResult, final SQLStatementContext<?> sqlStatementContext) {
-        String dataSourceName = 
metaData.getResource().getDataSourcesMetaData().getAllInstanceDataSourceNames().iterator().next();
-        return Collections.singletonList(new ExecutionUnit(dataSourceName,
+        Collection<String> instanceDataSourceNames = 
metaData.getResource().getDataSourcesMetaData().getAllInstanceDataSourceNames();
+        if (instanceDataSourceNames.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return Collections.singletonList(new 
ExecutionUnit(instanceDataSourceNames.iterator().next(), 
                 new SQLUnit(sqlRewriteResult.getSqlRewriteUnit().getSql(), 
sqlRewriteResult.getSqlRewriteUnit().getParameters(), 
getGenericTableRouteMappers(sqlStatementContext))));
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
index 7d0ce4c..5a4aedf 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
@@ -139,7 +139,7 @@ public final class FilterableTableScanExecutor {
         LogicSQL logicSQL = createLogicSQL(federationContext.getMetaDataMap(), 
sqlString, databaseType);
         ShardingSphereMetaData metaData = 
federationContext.getMetaDataMap().get(schemaName);
         ExecutionContext context = new 
KernelProcessor().generateExecutionContext(logicSQL, metaData, 
executorContext.getProps());
-        if (federationContext.isPreview()) {
+        if (federationContext.isPreview() || 
databaseType.containsSystemSchema(schemaName)) {
             
federationContext.getExecutionUnits().addAll(context.getExecutionUnits());
             return createEmptyEnumerable();
         }
diff --git 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
index c9c7887..c91ff37 100644
--- 
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
+++ 
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsBuilder.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.config.schema.SchemaConfiguration;
+import 
org.apache.shardingsphere.infra.config.schema.impl.DataSourceProvidedSchemaConfiguration;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory;
@@ -37,6 +38,7 @@ import 
org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -118,11 +120,13 @@ public final class MetaDataContextsBuilder {
     }
     
     private Map<String, ShardingSphereMetaData> getMetaDataMap() throws 
SQLException {
-        Map<String, ShardingSphereMetaData> result = new 
HashMap<>(schemaConfigMap.size(), 1);
-        for (Entry<String, ? extends SchemaConfiguration> entry : 
schemaConfigMap.entrySet()) {
-            String schemaName = entry.getKey();
-            // TODO support database configuration
-            result.put(schemaName, ShardingSphereMetaData.create(schemaName, 
databaseMap.get(schemaName).getSchemas(), entry.getValue(), 
schemaRulesMap.get(schemaName)));
+        Map<String, ShardingSphereMetaData> result = new 
HashMap<>(databaseMap.size(), 1);
+        for (Entry<String, ShardingSphereDatabase> entry : 
databaseMap.entrySet()) {
+            String databaseName = entry.getKey();
+            // TODO support database and schema configuration separately
+            SchemaConfiguration schemaConfig = 
schemaConfigMap.getOrDefault(databaseName, new 
DataSourceProvidedSchemaConfiguration(Collections.emptyMap(), 
Collections.emptyList()));
+            Collection<ShardingSphereRule> rules = 
schemaRulesMap.getOrDefault(databaseName, Collections.emptyList());
+            result.put(databaseName, 
ShardingSphereMetaData.create(databaseName, entry.getValue().getSchemas(), 
schemaConfig, rules));
         }
         return result;
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
index cfad42f..a3e3657 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/jdbc/JDBCDatabaseCommunicationEngine.java
@@ -115,12 +115,14 @@ public final class JDBCDatabaseCommunicationEngine 
extends DatabaseCommunication
     @SuppressWarnings({"unchecked", "rawtypes"})
     @SneakyThrows(SQLException.class)
     public ResponseHeader execute() {
-        ExecutionContext executionContext = getKernelProcessor()
-                .generateExecutionContext(getLogicSQL(), getMetaData(), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getProps());
+        LogicSQL logicSQL = getLogicSQL();
+        ExecutionContext executionContext = 
getKernelProcessor().generateExecutionContext(
+                logicSQL, getMetaData(), 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getProps());
         // TODO move federation route logic to binder
-        if (executionContext.getRouteContext().isFederated()) {
+        if (executionContext.getRouteContext().isFederated() 
+                || 
logicSQL.getSqlStatementContext().getDatabaseType().containsSystemSchema(backendConnection.getConnectionSession().getSchemaName()))
 {
             MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-            ResultSet resultSet = doExecuteFederation(getLogicSQL(), 
metaDataContexts);
+            ResultSet resultSet = doExecuteFederation(logicSQL, 
metaDataContexts);
             return processExecuteFederation(resultSet, metaDataContexts);
         }
         if (executionContext.getExecutionUnits().isEmpty()) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index ad3eb0d..4b425ff 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -94,12 +94,12 @@ public final class TextProtocolBackendHandlerFactory {
         if (sqlStatement instanceof DistSQLStatement) {
             return DistSQLBackendHandlerFactory.newInstance(databaseType, 
(DistSQLStatement) sqlStatement, connectionSession);
         }
-        Optional<TextProtocolBackendHandler> backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement, 
connectionSession, sql);
+        SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap(),
+                sqlStatement, connectionSession.getDefaultSchemaName());
+        Optional<TextProtocolBackendHandler> backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, 
sqlStatementContext, connectionSession, sql);
         if (backendHandler.isPresent()) {
             return backendHandler.get();
         }
-        SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataMap(),
 
-                sqlStatement, connectionSession.getDefaultSchemaName());
         // TODO optimize SQLStatementSchemaHolder
         if (sqlStatementContext instanceof TableAvailable) {
             ((TableAvailable) 
sqlStatementContext).getTablesContext().getDatabaseName().ifPresent(SQLStatementSchemaHolder::set);
@@ -119,7 +119,7 @@ public final class TextProtocolBackendHandlerFactory {
         if (sqlStatement instanceof TCLStatement) {
             return 
TransactionBackendHandlerFactory.newInstance((SQLStatementContext<TCLStatement>)
 sqlStatementContext, sql, connectionSession);
         }
-        backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement, 
connectionSession);
+        backendHandler = 
DatabaseAdminBackendHandlerFactory.newInstance(databaseType, 
sqlStatementContext, connectionSession);
         return backendHandler.orElseGet(() -> 
DatabaseBackendHandlerFactory.newInstance(sqlStatementContext, sql, 
connectionSession));
     }
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
index 76f7d3d..85d24c0 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.proxy.backend.text.admin;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
@@ -29,7 +30,6 @@ import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseSetCh
 import 
org.apache.shardingsphere.proxy.backend.text.encoding.DatabaseSetCharsetBackendHandler;
 import org.apache.shardingsphere.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.spi.typed.TypedSPIRegistry;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Optional;
 import java.util.Properties;
@@ -49,45 +49,46 @@ public final class DatabaseAdminBackendHandlerFactory {
      * and this handler requires a connection containing a schema to be used.
      *
      * @param databaseType database type
-     * @param sqlStatement SQL statement
+     * @param sqlStatementContext SQL statement context
      * @param connectionSession connection session
      * @return new instance of database admin backend handler
      */
-    public static Optional<TextProtocolBackendHandler> newInstance(final 
DatabaseType databaseType, final SQLStatement sqlStatement, final 
ConnectionSession connectionSession) {
+    public static Optional<TextProtocolBackendHandler> newInstance(final 
DatabaseType databaseType, final SQLStatementContext<?> sqlStatementContext, 
final ConnectionSession connectionSession) {
         Optional<DatabaseAdminExecutorFactory> executorFactory = 
TypedSPIRegistry.findRegisteredService(DatabaseAdminExecutorFactory.class, 
databaseType.getName(), new Properties());
         if (!executorFactory.isPresent()) {
             return Optional.empty();
         }
-        Optional<DatabaseAdminExecutor> executor = 
executorFactory.get().newInstance(sqlStatement);
-        return executor.map(optional -> 
createTextProtocolBackendHandler(sqlStatement, connectionSession, optional));
+        Optional<DatabaseAdminExecutor> executor = 
executorFactory.get().newInstance(sqlStatementContext);
+        return executor.map(optional -> 
createTextProtocolBackendHandler(sqlStatementContext, connectionSession, 
optional));
     }
     
     /**
      * Create new instance of database admin backend handler.
      *
      * @param databaseType database type
-     * @param sqlStatement SQL statement
+     * @param sqlStatementContext SQL statement context
      * @param connectionSession connection session
      * @param sql SQL being executed
      * @return new instance of database admin backend handler
      */
-    public static Optional<TextProtocolBackendHandler> newInstance(final 
DatabaseType databaseType, final SQLStatement sqlStatement,
+    public static Optional<TextProtocolBackendHandler> newInstance(final 
DatabaseType databaseType, final SQLStatementContext<?> sqlStatementContext,
                                                                    final 
ConnectionSession connectionSession, final String sql) {
         Optional<DatabaseAdminExecutorFactory> executorFactory = 
TypedSPIRegistry.findRegisteredService(DatabaseAdminExecutorFactory.class, 
databaseType.getName(), new Properties());
         if (!executorFactory.isPresent()) {
             return Optional.empty();
         }
-        Optional<DatabaseAdminExecutor> executor = 
executorFactory.get().newInstance(sqlStatement, sql, 
Optional.ofNullable(connectionSession.getSchemaName()));
-        return executor.map(optional -> 
createTextProtocolBackendHandler(sqlStatement, connectionSession, optional));
+        Optional<DatabaseAdminExecutor> executor = 
executorFactory.get().newInstance(sqlStatementContext, sql, 
connectionSession.getSchemaName());
+        return executor.map(optional -> 
createTextProtocolBackendHandler(sqlStatementContext, connectionSession, 
optional));
     }
     
-    private static TextProtocolBackendHandler 
createTextProtocolBackendHandler(final SQLStatement sqlStatement, final 
ConnectionSession connectionSession, final DatabaseAdminExecutor executor) {
+    private static TextProtocolBackendHandler 
createTextProtocolBackendHandler(final SQLStatementContext<?> 
sqlStatementContext, 
+                                                                               
final ConnectionSession connectionSession, final DatabaseAdminExecutor 
executor) {
         if (executor instanceof DatabaseAdminQueryExecutor) {
             return new DatabaseAdminQueryBackendHandler(connectionSession, 
(DatabaseAdminQueryExecutor) executor);
         }
         if (executor instanceof DatabaseSetCharsetExecutor) {
             return new DatabaseSetCharsetBackendHandler(connectionSession, 
(DatabaseSetCharsetExecutor) executor);
         }
-        return new DatabaseAdminUpdateBackendHandler(connectionSession, 
sqlStatement, executor);
+        return new DatabaseAdminUpdateBackendHandler(connectionSession, 
sqlStatementContext.getSqlStatement(), executor);
     }
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
index 99106d7..76ed8af 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.executor;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.spi.typed.TypedSPI;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Optional;
 
@@ -31,18 +31,18 @@ public interface DatabaseAdminExecutorFactory extends 
TypedSPI {
      * Create an instance of database admin executor,
      * and this executor requires a connection containing a schema to be used.
      *
-     * @param sqlStatement SQL statement
+     * @param sqlStatementContext SQL statement context
      * @return instance of database admin executor
      */
-    Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement);
+    Optional<DatabaseAdminExecutor> newInstance(SQLStatementContext<?> 
sqlStatementContext);
     
     /**
      * Create an executor of database admin executor.
      *
-     * @param sqlStatement SQL statement
+     * @param sqlStatementContext SQL statement context
      * @param sql SQL
      * @param schemaName schema name
      * @return instance of database admin executor
      */
-    Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement, 
String sql, Optional<String> schemaName);
+    Optional<DatabaseAdminExecutor> newInstance(SQLStatementContext<?> 
sqlStatementContext, String sql, String schemaName);
 }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
index ffeb95f..dcb9d80 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
@@ -68,7 +69,8 @@ public final class MySQLAdminExecutorFactory implements 
DatabaseAdminExecutorFac
     private static final String PERFORMANCE_SCHEMA = "performance_schema";
     
     @Override
-    public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement 
sqlStatement) {
+    public Optional<DatabaseAdminExecutor> newInstance(final 
SQLStatementContext<?> sqlStatementContext) {
+        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         if (sqlStatement instanceof MySQLShowFunctionStatusStatement) {
             return Optional.of(new 
ShowFunctionStatusExecutor((MySQLShowFunctionStatusStatement) sqlStatement));
         }
@@ -76,7 +78,7 @@ public final class MySQLAdminExecutorFactory implements 
DatabaseAdminExecutorFac
             return Optional.of(new 
ShowProcedureStatusExecutor((MySQLShowProcedureStatusStatement) sqlStatement));
         }
         if (sqlStatement instanceof MySQLShowTablesStatement) {
-            return Optional.of(new 
ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement));
+            return Optional.of(new 
ShowTablesExecutor((MySQLShowTablesStatement) sqlStatement, 
sqlStatementContext.getDatabaseType()));
         }
         if (sqlStatement instanceof MySQLShowTableStatusStatement) {
             return Optional.of(new 
ShowTablesStatusExecutor((MySQLShowTableStatusStatement) sqlStatement));
@@ -85,7 +87,8 @@ public final class MySQLAdminExecutorFactory implements 
DatabaseAdminExecutorFac
     }
     
     @Override
-    public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement 
sqlStatement, final String sql, final Optional<String> schemaName) {
+    public Optional<DatabaseAdminExecutor> newInstance(final 
SQLStatementContext<?> sqlStatementContext, final String sql, final String 
schemaName) {
+        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         if (sqlStatement instanceof UseStatement) {
             return Optional.of(new UseDatabaseExecutor((UseStatement) 
sqlStatement));
         }
@@ -159,8 +162,8 @@ public final class MySQLAdminExecutorFactory implements 
DatabaseAdminExecutorFac
         return ((SimpleTableSegment) tableSegment).getOwner().isPresent() && 
specialSchemaName.equalsIgnoreCase(((SimpleTableSegment) 
tableSegment).getOwner().get().getIdentifier().getValue());
     }
     
-    private DatabaseAdminExecutor mockExecutor(final Optional<String> 
schemaName, final SelectStatement sqlStatement, final String sql) {
-        boolean isNotUseSchema = !schemaName.isPresent() && 
sqlStatement.getFrom() == null;
+    private DatabaseAdminExecutor mockExecutor(final String schemaName, final 
SelectStatement sqlStatement, final String sql) {
+        boolean isNotUseSchema = !Optional.ofNullable(schemaName).isPresent() 
&& sqlStatement.getFrom() == null;
         if (isNotUseSchema) {
             if (!hasSchemas() || !hasResources()) {
                 return new NoResourceShowExecutor(sqlStatement);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
index 9167303..d037dab 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultColumnMetaData;
@@ -53,6 +54,8 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     
     private final MySQLShowTablesStatement showTablesStatement;
     
+    private final DatabaseType databaseType;
+    
     private QueryResultMetaData queryResultMetaData;
     
     private MergedResult mergedResult;
@@ -64,7 +67,7 @@ public final class ShowTablesExecutor implements 
DatabaseAdminQueryExecutor {
     }
     
     private QueryResult getQueryResult(final String schemaName) {
-        if (!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
+        if (!databaseType.containsSystemSchema(schemaName) && 
!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
             return new RawMemoryQueryResult(queryResultMetaData, 
Collections.emptyList());
         }
         List<MemoryQueryResultDataRow> rows = 
getAllTableNames(schemaName).stream().map(each -> {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
index 6337f33..f401f5b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactory.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.postgresql;
 
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.AbstractDatabaseMetadataExecutor.DefaultDatabaseMetadataExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
@@ -57,12 +58,13 @@ public final class PostgreSQLAdminExecutorFactory 
implements DatabaseAdminExecut
     private static final String PG_PREFIX = "pg_";
     
     @Override
-    public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement 
sqlStatement) {
+    public Optional<DatabaseAdminExecutor> newInstance(final 
SQLStatementContext<?> sqlStatementContext) {
         return Optional.empty();
     }
     
     @Override
-    public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement 
sqlStatement, final String sql, final Optional<String> schemaName) {
+    public Optional<DatabaseAdminExecutor> newInstance(final 
SQLStatementContext<?> sqlStatementContext, final String sql, final String 
schemaName) {
+        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         if (sqlStatement instanceof SelectStatement) {
             Collection<String> selectedTableNames = 
getSelectedTableNames((SelectStatement) sqlStatement);
             if (selectedTableNames.contains(PG_DATABASE)) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
index 71da564..94d74fc 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandler.java
@@ -68,10 +68,11 @@ public final class SchemaAssignedDatabaseBackendHandler 
implements DatabaseBacke
     }
     
     private void prepareDatabaseCommunicationEngine() throws 
RequiredResourceMissedException {
-        if 
(!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).hasDataSource())
 {
+        boolean isSystemSchema = 
sqlStatementContext.getDatabaseType().containsSystemSchema(connectionSession.getSchemaName());
+        if (!isSystemSchema && 
!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).hasDataSource())
 {
             throw new 
RequiredResourceMissedException(connectionSession.getSchemaName());
         }
-        if 
(!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).isComplete())
 {
+        if (!isSystemSchema && 
!ProxyContext.getInstance().getMetaData(connectionSession.getSchemaName()).isComplete())
 {
             throw new RuleNotExistedException();
         }
         databaseCommunicationEngine = 
databaseCommunicationEngineFactory.newTextProtocolInstance(sqlStatementContext, 
sql, connectionSession.getBackendConnection());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
index 5ca6df6..f229773 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/exception/fixture/TestSQLStatementContextInstanceOfTableAvailable.java
@@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -44,7 +46,12 @@ public final class 
TestSQLStatementContextInstanceOfTableAvailable implements SQ
     public TablesContext getTablesContext() {
         return tablesContext;
     }
-
+    
+    @Override
+    public DatabaseType getDatabaseType() {
+        return DatabaseTypeRegistry.getDefaultDatabaseType();
+    }
+    
     @Override
     public Collection<SimpleTableSegment> getAllTables() {
         return allTables;
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
index e8a9321..dc7997e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactoryTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
 
+import 
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowFunctionStatusExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowProcedureStatusExecutor;
@@ -34,6 +35,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public final class MySQLAdminExecutorFactoryTest {
     
@@ -41,28 +43,40 @@ public final class MySQLAdminExecutorFactoryTest {
     
     @Test
     public void assertNewInstanceWithMySQLShowFunctionStatusStatement() {
-        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowFunctionStatusStatement.class));
+        MySQLShowFunctionStatusStatement statement = 
mock(MySQLShowFunctionStatusStatement.class);
+        CommonSQLStatementContext statementContext = 
mock(CommonSQLStatementContext.class);
+        when(statementContext.getSqlStatement()).thenReturn(statement);
+        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(statementContext);
         assertTrue(executorOptional.isPresent());
         assertThat(executorOptional.get(), 
instanceOf(ShowFunctionStatusExecutor.class));
     }
     
     @Test
     public void assertNewInstanceWithMySQLShowProcedureStatusStatement() {
-        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowProcedureStatusStatement.class));
+        MySQLShowProcedureStatusStatement statement = 
mock(MySQLShowProcedureStatusStatement.class);
+        CommonSQLStatementContext statementContext = 
mock(CommonSQLStatementContext.class);
+        when(statementContext.getSqlStatement()).thenReturn(statement);
+        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(statementContext);
         assertTrue(executorOptional.isPresent());
         assertThat(executorOptional.get(), 
instanceOf(ShowProcedureStatusExecutor.class));
     }
     
     @Test
     public void assertNewInstanceWithMySQLShowTablesStatement() {
-        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowTablesStatement.class));
+        MySQLShowTablesStatement statement = 
mock(MySQLShowTablesStatement.class);
+        CommonSQLStatementContext statementContext = 
mock(CommonSQLStatementContext.class);
+        when(statementContext.getSqlStatement()).thenReturn(statement);
+        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(statementContext);
         assertTrue(executorOptional.isPresent());
         assertThat(executorOptional.get(), 
instanceOf(ShowTablesExecutor.class));
     }
     
     @Test
     public void assertNewInstanceWithMySQLShowTableStatusStatement() {
-        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(mock(MySQLShowTableStatusStatement.class));
+        MySQLShowTableStatusStatement statement = 
mock(MySQLShowTableStatusStatement.class);
+        CommonSQLStatementContext statementContext = 
mock(CommonSQLStatementContext.class);
+        when(statementContext.getSqlStatement()).thenReturn(statement);
+        Optional<DatabaseAdminExecutor> executorOptional = 
mySQLAdminExecutorFactory.newInstance(statementContext);
         assertTrue(executorOptional.isPresent());
         assertThat(executorOptional.get(), 
instanceOf(ShowTablesStatusExecutor.class));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
index be22501..0f33eb2 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
@@ -84,7 +85,7 @@ public final class ShowTablesExecutorTest {
     
     @Test
     public void assertShowTablesExecutorWithoutFilter() throws SQLException {
-        ShowTablesExecutor showTablesExecutor = new ShowTablesExecutor(new 
MySQLShowTablesStatement());
+        ShowTablesExecutor showTablesExecutor = new ShowTablesExecutor(new 
MySQLShowTablesStatement(), DatabaseTypeRegistry.getDefaultDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         showTablesExecutor.getMergedResult().next();
@@ -104,7 +105,7 @@ public final class ShowTablesExecutorTest {
         ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
         when(showFilterSegment.getLike()).thenReturn(Optional.of(new 
ShowLikeSegment(0, 10, "t_account%")));
         showTablesStatement.setFilter(showFilterSegment);
-        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement);
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         showTablesExecutor.getMergedResult().next();
@@ -122,7 +123,7 @@ public final class ShowTablesExecutorTest {
         ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
         when(showFilterSegment.getLike()).thenReturn(Optional.of(new 
ShowLikeSegment(0, 10, "t_account")));
         showTablesStatement.setFilter(showFilterSegment);
-        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement);
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         showTablesExecutor.getMergedResult().next();
@@ -136,7 +137,7 @@ public final class ShowTablesExecutorTest {
         ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
         when(showFilterSegment.getLike()).thenReturn(Optional.of(new 
ShowLikeSegment(0, 10, "T_TEST")));
         showTablesStatement.setFilter(showFilterSegment);
-        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement);
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         showTablesExecutor.getMergedResult().next();
@@ -150,7 +151,7 @@ public final class ShowTablesExecutorTest {
         ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
         when(showFilterSegment.getLike()).thenReturn(Optional.of(new 
ShowLikeSegment(0, 10, "t_test")));
         showTablesStatement.setFilter(showFilterSegment);
-        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement);
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         assertFalse(showTablesExecutor.getMergedResult().next());
@@ -162,7 +163,7 @@ public final class ShowTablesExecutorTest {
         ShowFilterSegment showFilterSegment = mock(ShowFilterSegment.class);
         when(showFilterSegment.getLike()).thenReturn(Optional.of(new 
ShowLikeSegment(0, 10, "T_ACCOUNT")));
         showTablesStatement.setFilter(showFilterSegment);
-        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement);
+        ShowTablesExecutor showTablesExecutor = new 
ShowTablesExecutor(showTablesStatement, new MySQLDatabaseType());
         showTablesExecutor.execute(mockConnectionSession());
         
assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(2));
         assertFalse(showTablesExecutor.getMergedResult().next());
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
index 2baa5a9..979df9c 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/PostgreSQLAdminExecutorFactoryTest.java
@@ -17,6 +17,9 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.postgresql;
 
+import 
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
 import 
org.apache.shardingsphere.proxy.backend.text.admin.postgresql.executor.PostgreSQLSetCharsetExecutor;
@@ -25,7 +28,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableAssig
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dal.VariableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.SetStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
@@ -54,7 +56,9 @@ public final class PostgreSQLAdminExecutorFactoryTest {
         SimpleTableSegment tableSegment = mock(SimpleTableSegment.class);
         when(tableSegment.getTableName()).thenReturn(new TableNameSegment(0, 
0, new IdentifierValue("pg_database")));
         when(statement.getFrom()).thenReturn(tableSegment);
-        Optional<DatabaseAdminExecutor> executorOptional = 
postgreSQLAdminExecutorFactory.newInstance(statement, "", Optional.empty());
+        SelectStatementContext statementContext = 
mock(SelectStatementContext.class);
+        when(statementContext.getSqlStatement()).thenReturn(statement);
+        Optional<DatabaseAdminExecutor> executorOptional = 
postgreSQLAdminExecutorFactory.newInstance(statementContext, "", null);
         assertTrue(executorOptional.isPresent());
         assertThat(executorOptional.get(), 
instanceOf(SelectDatabaseExecutor.class));
     }
@@ -66,7 +70,7 @@ public final class PostgreSQLAdminExecutorFactoryTest {
     
     @Test
     public void assertNewInstanceWithUnknownStatement() {
-        
assertFalse(postgreSQLAdminExecutorFactory.newInstance(mock(SQLStatement.class),
 null, Optional.empty()).isPresent());
+        
assertFalse(postgreSQLAdminExecutorFactory.newInstance(mock(SQLStatementContext.class),
 null, null).isPresent());
     }
     
     @Test
@@ -77,7 +81,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
     @Test
     public void assertNewInstanceWithSetClientEncoding() {
         SetStatement setStatement = createSetStatement("client_encoding");
-        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(setStatement, null, 
Optional.empty());
+        CommonSQLStatementContext<SetStatement> statementContext = new 
CommonSQLStatementContext<>(setStatement);
+        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
         assertTrue(actual.isPresent());
         assertTrue(actual.get() instanceof PostgreSQLSetCharsetExecutor);
     }
@@ -85,7 +90,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
     @Test
     public void assertNewInstanceWithSetExtraFloatDigits() throws SQLException 
{
         SetStatement setStatement = createSetStatement("extra_float_digits");
-        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(setStatement, null, 
Optional.empty());
+        CommonSQLStatementContext<SetStatement> statementContext = new 
CommonSQLStatementContext<>(setStatement);
+        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
         assertTrue(actual.isPresent());
         ConnectionSession connectionSession = mock(ConnectionSession.class);
         actual.get().execute(connectionSession);
@@ -95,7 +101,8 @@ public final class PostgreSQLAdminExecutorFactoryTest {
     @Test
     public void assertNewInstanceWithSetApplicationName() throws SQLException {
         SetStatement setStatement = createSetStatement("application_name");
-        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(setStatement, null, 
Optional.empty());
+        CommonSQLStatementContext<SetStatement> statementContext = new 
CommonSQLStatementContext<>(setStatement);
+        Optional<DatabaseAdminExecutor> actual = 
postgreSQLAdminExecutorFactory.newInstance(statementContext, null, null);
         assertTrue(actual.isPresent());
         ConnectionSession connectionSession = mock(ConnectionSession.class);
         actual.get().execute(connectionSession);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
index 0f0d41b..8d27c93 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
@@ -21,6 +21,7 @@ import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -86,7 +87,9 @@ public final class SchemaAssignedDatabaseBackendHandlerTest {
         contextManagerField.set(ProxyContext.getInstance(), contextManager);
         
when(connectionSession.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN,
 0));
         mockDatabaseCommunicationEngine(new 
UpdateResponseHeader(mock(SQLStatement.class)));
-        schemaAssignedDatabaseBackendHandler = new 
SchemaAssignedDatabaseBackendHandler(mock(SQLStatementContext.class), 
EXECUTE_SQL, connectionSession);
+        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class);
+        when(sqlStatementContext.getDatabaseType()).thenReturn(new 
MySQLDatabaseType());
+        schemaAssignedDatabaseBackendHandler = new 
SchemaAssignedDatabaseBackendHandler(sqlStatementContext, EXECUTE_SQL, 
connectionSession);
         setBackendHandlerFactory(schemaAssignedDatabaseBackendHandler);
     }
     
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
index 8010153..43751a0 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/db/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="db" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
index 3072f58..7c09a1a 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="dbtbl_with_readwrite_splitting" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
index 7b09185..8f71dab 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/dbtbl_with_readwrite_splitting_and_encrypt/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="dbtbl_with_readwrite_splitting_and_encrypt" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
index 84ccc33..a1b882c 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/encrypt/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="encrypt" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
index 54bcc1c..948283a 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/readwrite_splitting/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="readwrite_splitting" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
index e9dc0f8..314e6df 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/sharding_governance/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="sharding_governance" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>
diff --git 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
index e294b78..b7eb1af 100644
--- 
a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
+++ 
b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/resources/cases/dal/dataset/tbl/mysql/show_databases.xml
@@ -20,4 +20,8 @@
         <column name="schema_name" />
     </metadata>
     <row values="tbl" />
+    <row values="mysql" />
+    <row values="information_schema" />
+    <row values="performance_schema" />
+    <row values="sys" />
 </dataset>

Reply via email to