You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2020/12/22 16:59:39 UTC

[shardingsphere] branch master updated: Add DatabaseAdminExecutor (#8723)

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

menghaoran 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 3b51532  Add DatabaseAdminExecutor (#8723)
3b51532 is described below

commit 3b5153296307e4fb7ab095ed4b51eeafbca1da3d
Author: Liang Zhang <te...@163.com>
AuthorDate: Wed Dec 23 00:59:04 2020 +0800

    Add DatabaseAdminExecutor (#8723)
    
    * Refactor KernelProcessor
    
    * Refactor ShowTablesBackendHandler
    
    * Refactor QueryHeaderBuilder
    
    * Refactor ShowDatabasesBackendHandler
    
    * Refactor ShowCurrentDatabaseBackendHandler
    
    * Add DatabaseAdminExecutor
    
    * Fix test case
    
    * Fix test case
    
    * Move to executor package
    
    * Impl process multiple columns when gen QueryHeader
    
    * Add DatabaseAdminExecutorFactory
    
    * Rename mysql.executor
    
    * Refactor ShowTablesExecutor
---
 .../raw/metadata/RawQueryResultColumnMetaData.java | 13 ++++
 .../query/impl/raw/type/RawMemoryQueryResult.java  |  6 +-
 .../communication/DatabaseCommunicationEngine.java |  4 +-
 .../header/query/impl/QueryHeaderBuilder.java      | 43 +++++------
 .../text/TextProtocolBackendHandlerFactory.java    | 18 +----
 .../admin/DatabaseAdminBackendHandlerFactory.java  | 33 ++++++++-
 ....java => DatabaseAdminQueryBackendHandler.java} | 47 +++++++-----
 ...java => DatabaseAdminUpdateBackendHandler.java} | 32 ++++----
 .../DatabaseAdminExecutor.java}                    | 15 +++-
 .../DatabaseAdminExecutorFactory.java}             | 14 ++--
 .../DatabaseAdminQueryExecutor.java}               | 23 +++++-
 ...Factory.java => MySQLAdminExecutorFactory.java} | 29 ++++----
 .../ShowCurrentDatabaseExecutor.java}              | 35 +++------
 .../ShowDatabasesExecutor.java}                    | 45 +++++-------
 .../admin/mysql/executor/ShowTablesExecutor.java   | 68 +++++++++++++++++
 .../UseDatabaseExecutor.java}                      | 23 +++---
 .../mysql/handler/ShowTablesBackendHandler.java    | 84 ---------------------
 ...xt.admin.executor.DatabaseAdminExecutorFactory} |  2 +-
 .../TextProtocolBackendHandlerFactoryTest.java     |  8 +-
 .../header/query/impl/QueryHeaderBuilderTest.java  | 52 ++++++-------
 .../ShowDatabasesExecutorTest.java}                | 34 ++++-----
 .../ShowTablesExecutorTest.java}                   | 34 ++++-----
 .../UseDatabaseExecutorTest.java}                  | 23 +-----
 .../MySQLAdminBackendHandlerFactoryTest.java       | 85 ----------------------
 24 files changed, 342 insertions(+), 428 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
index 4a7da68..a6e4834 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/metadata/RawQueryResultColumnMetaData.java
@@ -46,4 +46,17 @@ public final class RawQueryResultColumnMetaData {
     private final boolean notNull;
     
     private final boolean autoIncrement;
+    
+    public RawQueryResultColumnMetaData(final String tableName, final String name, final String label, final int type, final String typeName, final int length, final int decimals) {
+        this.tableName = tableName;
+        this.name = name;
+        this.label = label;
+        this.type = type;
+        this.typeName = typeName;
+        this.length = length;
+        this.decimals = decimals;
+        signed = false;
+        notNull = false;
+        autoIncrement = false;
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
index 0c2cb35..67d542d 100644
--- a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
+++ b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/execute/result/query/impl/raw/type/RawMemoryQueryResult.java
@@ -17,9 +17,9 @@
 
 package org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type;
 
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.AbstractMemoryQueryResult;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
 
 import java.util.List;
 
@@ -28,7 +28,7 @@ import java.util.List;
  */
 public final class RawMemoryQueryResult extends AbstractMemoryQueryResult {
     
-    public RawMemoryQueryResult(final RawQueryResultMetaData metaData, final List<MemoryQueryResultDataRow> rows) {
+    public RawMemoryQueryResult(final QueryResultMetaData metaData, final List<MemoryQueryResultDataRow> rows) {
         super(metaData, rows.iterator());
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
index 236f86a..a8ea366 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java
@@ -155,8 +155,8 @@ public final class DatabaseCommunicationEngine {
     private QueryHeader createQueryHeader(final ExecutionContext executionContext,
                                           final QueryResult queryResultSample, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
         return hasSelectExpandProjections(executionContext.getSqlStatementContext())
-                ? QueryHeaderBuilder.build(((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample, metaData, columnIndex)
-                : QueryHeaderBuilder.build(queryResultSample, metaData, columnIndex);
+                ? QueryHeaderBuilder.build(((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), metaData, columnIndex)
+                : QueryHeaderBuilder.build(queryResultSample.getMetaData(), metaData, columnIndex);
     }
     
     private boolean hasSelectExpandProjections(final SQLStatementContext<?> sqlStatementContext) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
index 7553047..1b6dab4 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilder.java
@@ -22,7 +22,7 @@ import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
-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.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.apache.shardingsphere.infra.rule.type.DataNodeContainedRule;
@@ -39,33 +39,34 @@ public final class QueryHeaderBuilder {
     /**
      * Build query header builder.
      *
-     * @param queryResult query result
-     * @param metaData meta data name
+     * @param queryResultMetaData query result meta data
+     * @param metaData ShardingSphere meta data
      * @param columnIndex column index 
      * @return query header
      * @throws SQLException SQL exception
      */
-    public static QueryHeader build(final QueryResult queryResult, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
-        return build(queryResult, metaData, queryResult.getMetaData().getColumnName(columnIndex), columnIndex);
+    public static QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
+        return build(queryResultMetaData, metaData, queryResultMetaData.getColumnName(columnIndex), columnIndex);
     }
     
     /**
      * Build query header builder.
      *
      * @param projectionsContext projections context
-     * @param queryResult query result
-     * @param metaData meta data name
+     * @param queryResultMetaData query result meta data
+     * @param metaData ShardingSphere meta data
      * @param columnIndex column index
      * @return query header
      * @throws SQLException SQL exception
      */
-    public static QueryHeader build(final ProjectionsContext projectionsContext, final QueryResult queryResult, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
-        return build(queryResult, metaData, getColumnName(projectionsContext, queryResult, columnIndex), columnIndex);
+    public static QueryHeader build(final ProjectionsContext projectionsContext, 
+                                    final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final int columnIndex) throws SQLException {
+        return build(queryResultMetaData, metaData, getColumnName(projectionsContext, queryResultMetaData, columnIndex), columnIndex);
     }
     
-    private static QueryHeader build(final QueryResult queryResult, final ShardingSphereMetaData metaData, final String columnName, final int columnIndex) throws SQLException {
+    private static QueryHeader build(final QueryResultMetaData queryResultMetaData, final ShardingSphereMetaData metaData, final String columnName, final int columnIndex) throws SQLException {
         String schemaName = metaData.getName();
-        String actualTableName = queryResult.getMetaData().getTableName(columnIndex);
+        String actualTableName = queryResultMetaData.getTableName(columnIndex);
         Optional<DataNodeContainedRule> dataNodeContainedRule =
                 metaData.getRuleMetaData().getRules().stream().filter(each -> each instanceof DataNodeContainedRule).findFirst().map(rule -> (DataNodeContainedRule) rule);
         String tableName;
@@ -78,19 +79,19 @@ public final class QueryHeaderBuilder {
             tableName = actualTableName;
             primaryKey = false;
         }
-        String columnLabel = queryResult.getMetaData().getColumnLabel(columnIndex);
-        int columnType = queryResult.getMetaData().getColumnType(columnIndex);
-        String columnTypeName = queryResult.getMetaData().getColumnTypeName(columnIndex);
-        int columnLength = queryResult.getMetaData().getColumnLength(columnIndex);
-        int decimals = queryResult.getMetaData().getDecimals(columnIndex);
-        boolean signed = queryResult.getMetaData().isSigned(columnIndex);
-        boolean notNull = queryResult.getMetaData().isNotNull(columnIndex);
-        boolean autoIncrement = queryResult.getMetaData().isAutoIncrement(columnIndex);
+        String columnLabel = queryResultMetaData.getColumnLabel(columnIndex);
+        int columnType = queryResultMetaData.getColumnType(columnIndex);
+        String columnTypeName = queryResultMetaData.getColumnTypeName(columnIndex);
+        int columnLength = queryResultMetaData.getColumnLength(columnIndex);
+        int decimals = queryResultMetaData.getDecimals(columnIndex);
+        boolean signed = queryResultMetaData.isSigned(columnIndex);
+        boolean notNull = queryResultMetaData.isNotNull(columnIndex);
+        boolean autoIncrement = queryResultMetaData.isAutoIncrement(columnIndex);
         return new QueryHeader(schemaName, tableName, columnLabel, columnName, columnType, columnTypeName, columnLength, decimals, signed, primaryKey, notNull, autoIncrement);
     }
     
-    private static String getColumnName(final ProjectionsContext projectionsContext, final QueryResult queryResult, final int columnIndex) throws SQLException {
+    private static String getColumnName(final ProjectionsContext projectionsContext, final QueryResultMetaData queryResultMetaData, final int columnIndex) throws SQLException {
         Projection projection = projectionsContext.getExpandProjections().get(columnIndex - 1);
-        return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResult.getMetaData().getColumnName(columnIndex);
+        return projection instanceof ColumnProjection ? ((ColumnProjection) projection).getName() : queryResultMetaData.getColumnName(columnIndex);
     }
 }
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 70cc246..ee200d3 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
@@ -22,10 +22,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.text.data.DatabaseBackendHandlerFactory;
 import org.apache.shardingsphere.proxy.backend.text.distsql.DistSQLBackendHandlerFactory;
@@ -38,7 +35,6 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatemen
 
 import java.sql.SQLException;
 import java.util.Optional;
-import java.util.Properties;
 
 /**
  * Text protocol backend handler factory.
@@ -46,10 +42,6 @@ import java.util.Properties;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class TextProtocolBackendHandlerFactory {
     
-    static {
-        ShardingSphereServiceLoader.register(DatabaseAdminBackendHandlerFactory.class);
-    }
-    
     /**
      * Create new instance of text protocol backend handler.
      *
@@ -76,13 +68,9 @@ public final class TextProtocolBackendHandlerFactory {
         if (distSQLBackendHandler.isPresent()) {
             return distSQLBackendHandler.get();
         }
-        Optional<DatabaseAdminBackendHandlerFactory> adminBackendHandlerEngine = TypedSPIRegistry.findRegisteredService(
-                DatabaseAdminBackendHandlerFactory.class, databaseType.getName(), new Properties());
-        if (adminBackendHandlerEngine.isPresent()) {
-            Optional<DatabaseAdminBackendHandler> databaseAdminBackendHandler = adminBackendHandlerEngine.get().newInstance(sqlStatement, backendConnection);
-            if (databaseAdminBackendHandler.isPresent()) {
-                return databaseAdminBackendHandler.get();
-            }
+        Optional<TextProtocolBackendHandler> databaseAdminBackendHandler = DatabaseAdminBackendHandlerFactory.newInstance(databaseType, sqlStatement, backendConnection);
+        if (databaseAdminBackendHandler.isPresent()) {
+            return databaseAdminBackendHandler.get();
         }
         return DatabaseBackendHandlerFactory.newInstance(sqlStatement, sql, backendConnection);
     }
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 b65baf3..028b5489f 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
@@ -17,23 +17,50 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin;
 
-import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
+import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Optional;
+import java.util.Properties;
 
 /**
  * Database admin backend handler factory.
  */
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DatabaseAdminBackendHandlerFactory {
+    
+    static {
+        ShardingSphereServiceLoader.register(DatabaseAdminExecutorFactory.class);
+    }
     
     /**
      * Create new instance of database admin backend handler. 
      * 
+     * @param databaseType database type
      * @param sqlStatement SQL statement
      * @param backendConnection backend connection
      * @return new instance of database admin backend handler
      */
-    Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+    public static Optional<TextProtocolBackendHandler> newInstance(final DatabaseType databaseType, final SQLStatement sqlStatement, final BackendConnection backendConnection) {
+        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, backendConnection, optional));
+    }
+    
+    private static TextProtocolBackendHandler createTextProtocolBackendHandler(final SQLStatement sqlStatement, final BackendConnection backendConnection, final DatabaseAdminExecutor executor) {
+        return executor instanceof DatabaseAdminQueryExecutor
+                ? new DatabaseAdminQueryBackendHandler(backendConnection, (DatabaseAdminQueryExecutor) executor) : new DatabaseAdminUpdateBackendHandler(backendConnection, sqlStatement, executor);
+    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
similarity index 51%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
index 2121777..ec37956 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminQueryBackendHandler.java
@@ -15,49 +15,52 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
+import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeaderBuilder;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
 
 import java.sql.SQLException;
-import java.sql.Types;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedList;
-import java.util.Optional;
+import java.util.List;
 
 /**
- * Show databases backend handler.
+ * Database admin query backend handler.
  */
 @RequiredArgsConstructor
-public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHandler {
+public final class DatabaseAdminQueryBackendHandler implements TextProtocolBackendHandler {
     
     private final BackendConnection backendConnection;
     
+    private final DatabaseAdminQueryExecutor executor;
+    
+    private QueryResultMetaData queryResultMetaData;
+    
     private MergedResult mergedResult;
     
     @Override
-    public ResponseHeader execute() {
-        mergedResult = new SingleLocalDataMergedResult(getSchemaNames());
-        return new QueryResponseHeader(Collections.singletonList(
-                new QueryHeader("information_schema", "SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
+    public ResponseHeader execute() throws SQLException {
+        executor.execute(backendConnection);
+        queryResultMetaData = executor.getQueryResultMetaData();
+        mergedResult = executor.getMergedResult();
+        return new QueryResponseHeader(createResponseHeader());
     }
     
-    private Collection<Object> getSchemaNames() {
-        Collection<Object> result = new LinkedList<>(ProxyContext.getInstance().getAllSchemaNames());
-        Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
-        Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
-        if (!authorizedSchemas.isEmpty()) {
-            result.retainAll(authorizedSchemas);
+    private List<QueryHeader> createResponseHeader() throws SQLException {
+        List<QueryHeader> result = new ArrayList<>(queryResultMetaData.getColumnCount());
+        for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
+            result.add(QueryHeaderBuilder.build(queryResultMetaData, ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()), columnIndex));
         }
         return result;
     }
@@ -69,6 +72,10 @@ public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHa
     
     @Override
     public Collection<Object> getRowData() throws SQLException {
-        return Collections.singletonList(mergedResult.getValue(1, Object.class));
+        Collection<Object> result = new LinkedList<>();
+        for (int columnIndex = 1; columnIndex <= queryResultMetaData.getColumnCount(); columnIndex++) {
+            result.add(mergedResult.getValue(columnIndex, Object.class));
+        }
+        return result;
     }
 }
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/DatabaseAdminUpdateBackendHandler.java
similarity index 55%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminUpdateBackendHandler.java
index b65baf3..efc6b4a 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/DatabaseAdminUpdateBackendHandler.java
@@ -17,23 +17,29 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin;
 
-import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
-import java.util.Optional;
-
 /**
- * Database admin backend handler factory.
+ * Database admin update backend handler.
  */
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+@RequiredArgsConstructor
+public final class DatabaseAdminUpdateBackendHandler implements TextProtocolBackendHandler {
+    
+    private final BackendConnection backendConnection;
+    
+    private final SQLStatement sqlStatement;
+    
+    private final DatabaseAdminExecutor executor;
     
-    /**
-     * Create new instance of database admin backend handler. 
-     * 
-     * @param sqlStatement SQL statement
-     * @param backendConnection backend connection
-     * @return new instance of database admin backend handler
-     */
-    Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+    @Override
+    public ResponseHeader execute() {
+        executor.execute(backendConnection);
+        return new UpdateResponseHeader(sqlStatement);
+    }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
similarity index 67%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
index d7f905a..7ad5481 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutor.java
@@ -15,12 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
 
-import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 
 /**
- * Database admin backend handler.
+ * Database admin executor.
  */
-public interface DatabaseAdminBackendHandler extends TextProtocolBackendHandler {
+public interface DatabaseAdminExecutor {
+    
+    /**
+     * Execute.
+     * 
+     * @param backendConnection backend connection
+     */
+    void execute(BackendConnection backendConnection);
 }
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/executor/DatabaseAdminExecutorFactory.java
similarity index 65%
copy from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandlerFactory.java
copy to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminExecutorFactory.java
index b65baf3..cbeab09 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/executor/DatabaseAdminExecutorFactory.java
@@ -15,25 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
 
 import org.apache.shardingsphere.infra.spi.typed.TypedSPI;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.Optional;
 
 /**
- * Database admin backend handler factory.
+ * Database admin executor factory.
  */
-public interface DatabaseAdminBackendHandlerFactory extends TypedSPI {
+public interface DatabaseAdminExecutorFactory extends TypedSPI {
     
     /**
-     * Create new instance of database admin backend handler. 
+     * New instance of database admin executor.
      * 
      * @param sqlStatement SQL statement
-     * @param backendConnection backend connection
-     * @return new instance of database admin backend handler
+     * @return instance of database admin executor
      */
-    Optional<DatabaseAdminBackendHandler> newInstance(SQLStatement sqlStatement, BackendConnection backendConnection);
+    Optional<DatabaseAdminExecutor> newInstance(SQLStatement sqlStatement);
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
similarity index 57%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
index d7f905a..7254dfd 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/DatabaseAdminBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/executor/DatabaseAdminQueryExecutor.java
@@ -15,12 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin;
+package org.apache.shardingsphere.proxy.backend.text.admin.executor;
 
-import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResultMetaData;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
 
 /**
- * Database admin backend handler.
+ * Database admin query executor.
  */
-public interface DatabaseAdminBackendHandler extends TextProtocolBackendHandler {
+public interface DatabaseAdminQueryExecutor extends DatabaseAdminExecutor {
+    
+    /**
+     * Get query result meta data.
+     * 
+     * @return query result meta data
+     */
+    QueryResultMetaData getQueryResultMetaData();
+    
+    /**
+     * Get merged result.
+     * 
+     * @return merged result
+     */
+    MergedResult getMergedResult();
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
similarity index 66%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
index 7c37c41..0a2bbcd 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminBackendHandlerFactory.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/MySQLAdminExecutorFactory.java
@@ -17,13 +17,12 @@
 
 package org.apache.shardingsphere.proxy.backend.text.admin.mysql;
 
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowCurrentDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowTablesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowCurrentDatabaseExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowDatabasesExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.ShowTablesExecutor;
+import org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor.UseDatabaseExecutor;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -35,26 +34,26 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
 import java.util.Optional;
 
 /**
- * MySQL admin backend handler factory.
+ * Admin executor factory for MySQL.
  */
-public final class MySQLAdminBackendHandlerFactory implements DatabaseAdminBackendHandlerFactory {
+public final class MySQLAdminExecutorFactory implements DatabaseAdminExecutorFactory {
     
     @Override
-    public Optional<DatabaseAdminBackendHandler> newInstance(final SQLStatement sqlStatement, final BackendConnection backendConnection) {
+    public Optional<DatabaseAdminExecutor> newInstance(final SQLStatement sqlStatement) {
         if (sqlStatement instanceof MySQLUseStatement) {
-            return Optional.of(new UseDatabaseBackendHandler((MySQLUseStatement) sqlStatement, backendConnection));
+            return Optional.of(new UseDatabaseExecutor((MySQLUseStatement) sqlStatement));
         }
         if (sqlStatement instanceof MySQLShowDatabasesStatement) {
-            return Optional.of(new ShowDatabasesBackendHandler(backendConnection));
+            return Optional.of(new ShowDatabasesExecutor());
         }
         if (sqlStatement instanceof MySQLShowTablesStatement) {
-            return Optional.of(new ShowTablesBackendHandler(backendConnection));
+            return Optional.of(new ShowTablesExecutor());
         }
         if (sqlStatement instanceof SelectStatement) {
             ProjectionSegment firstProjection = ((SelectStatement) sqlStatement).getProjections().getProjections().iterator().next();
             if (firstProjection instanceof ExpressionProjectionSegment
-                    && ShowCurrentDatabaseBackendHandler.FUNCTION_NAME.equalsIgnoreCase(((ExpressionProjectionSegment) firstProjection).getText())) {
-                return Optional.of(new ShowCurrentDatabaseBackendHandler(backendConnection));
+                    && ShowCurrentDatabaseExecutor.FUNCTION_NAME.equalsIgnoreCase(((ExpressionProjectionSegment) firstProjection).getText())) {
+                return Optional.of(new ShowCurrentDatabaseExecutor());
             }
         }
         return Optional.empty();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
similarity index 54%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
index 0bd01ac..ec1b80c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowCurrentDatabaseBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowCurrentDatabaseExecutor.java
@@ -15,48 +15,37 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
-import lombok.RequiredArgsConstructor;
+import lombok.Getter;
+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;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
 import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
 
-import java.sql.SQLException;
 import java.sql.Types;
-import java.util.Collection;
 import java.util.Collections;
 
 /**
- * Show current database backend handler.
+ * Show current database executor.
  */
-@RequiredArgsConstructor
-public final class ShowCurrentDatabaseBackendHandler implements DatabaseAdminBackendHandler {
+@Getter
+public final class ShowCurrentDatabaseExecutor implements DatabaseAdminQueryExecutor {
     
     public static final String FUNCTION_NAME = "DATABASE()";
     
-    private final BackendConnection backendConnection;
-    
     private MergedResult mergedResult;
     
     @Override
-    public ResponseHeader execute() {
+    public void execute(final BackendConnection backendConnection) {
         mergedResult = new SingleLocalDataMergedResult(Collections.singleton(backendConnection.getSchemaName()));
-        return new QueryResponseHeader(Collections.singletonList(new QueryHeader(
-                "information_schema", "SCHEMATA", FUNCTION_NAME, FUNCTION_NAME, Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
-    }
-    
-    @Override
-    public boolean next() throws SQLException {
-        return mergedResult.next();
     }
     
     @Override
-    public Collection<Object> getRowData() throws SQLException {
-        return Collections.singletonList(mergedResult.getValue(1, Object.class));
+    public QueryResultMetaData getQueryResultMetaData() {
+        return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("SCHEMATA", FUNCTION_NAME, FUNCTION_NAME, Types.VARCHAR, "VARCHAR", 100, 0)));
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
similarity index 63%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
index 2121777..a68f6b9 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutor.java
@@ -15,20 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
-import lombok.RequiredArgsConstructor;
+import lombok.Getter;
 import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
+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;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
 import org.apache.shardingsphere.sharding.merge.dal.common.SingleLocalDataMergedResult;
 
-import java.sql.SQLException;
 import java.sql.Types;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,23 +35,25 @@ import java.util.LinkedList;
 import java.util.Optional;
 
 /**
- * Show databases backend handler.
+ * Show databases executor.
  */
-@RequiredArgsConstructor
-public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHandler {
-    
-    private final BackendConnection backendConnection;
+@Getter
+public final class ShowDatabasesExecutor implements DatabaseAdminQueryExecutor {
     
     private MergedResult mergedResult;
     
     @Override
-    public ResponseHeader execute() {
-        mergedResult = new SingleLocalDataMergedResult(getSchemaNames());
-        return new QueryResponseHeader(Collections.singletonList(
-                new QueryHeader("information_schema", "SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 100, 0, false, false, false, false)));
+    public void execute(final BackendConnection backendConnection) {
+        mergedResult = new SingleLocalDataMergedResult(getSchemaNames(backendConnection));
     }
     
-    private Collection<Object> getSchemaNames() {
+    @Override
+    public QueryResultMetaData getQueryResultMetaData() {
+        return new RawQueryResultMetaData(
+                Collections.singletonList(new RawQueryResultColumnMetaData("SCHEMATA", "Database", "SCHEMA_NAME", Types.VARCHAR, "VARCHAR", 255, 0)));
+    }
+    
+    private Collection<Object> getSchemaNames(final BackendConnection backendConnection) {
         Collection<Object> result = new LinkedList<>(ProxyContext.getInstance().getAllSchemaNames());
         Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
         Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
@@ -61,14 +62,4 @@ public final class ShowDatabasesBackendHandler implements DatabaseAdminBackendHa
         }
         return result;
     }
-    
-    @Override
-    public boolean next() throws SQLException {
-        return mergedResult.next();
-    }
-    
-    @Override
-    public Collection<Object> getRowData() throws SQLException {
-        return Collections.singletonList(mergedResult.getValue(1, Object.class));
-    }
 }
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
new file mode 100644
index 0000000..7c4d48e
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutor.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
+
+import lombok.Getter;
+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;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
+import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminQueryExecutor;
+
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Show tables executor.
+ */
+@Getter
+public final class ShowTablesExecutor implements DatabaseAdminQueryExecutor {
+    
+    private QueryResultMetaData queryResultMetaData;
+    
+    private MergedResult mergedResult;
+    
+    @Override
+    public void execute(final BackendConnection backendConnection) {
+        queryResultMetaData = createQueryResultMetaData(backendConnection.getSchemaName());
+        mergedResult = new TransparentMergedResult(getQueryResult(backendConnection.getSchemaName()));
+    }
+    
+    private QueryResult getQueryResult(final String schemaName) {
+        if (!ProxyContext.getInstance().getMetaData(schemaName).isComplete()) {
+            return new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
+        }
+        Collection<String> allTableNames = ProxyContext.getInstance().getMetaData(schemaName).getSchema().getAllTableNames();
+        List<MemoryQueryResultDataRow> rows = allTableNames.stream().map(each -> new MemoryQueryResultDataRow(Collections.singletonList(each))).collect(Collectors.toList());
+        return new RawMemoryQueryResult(queryResultMetaData, rows);
+    }
+    
+    private QueryResultMetaData createQueryResultMetaData(final String schemaName) {
+        String columnName = String.format("Tables_in_%s", schemaName);
+        return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("", columnName, columnName, Types.VARCHAR, "VARCHAR", 255, 0)));
+    }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
similarity index 71%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
index 470a5a8..5e771ac 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutor.java
@@ -15,16 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutor;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
 
@@ -33,26 +31,23 @@ import java.util.Collections;
 import java.util.Optional;
 
 /**
- * Use database backend handler.
+ * Use database executor.
  */
 @RequiredArgsConstructor
-public final class UseDatabaseBackendHandler implements DatabaseAdminBackendHandler {
+public final class UseDatabaseExecutor implements DatabaseAdminExecutor {
     
     private final MySQLUseStatement useStatement;
     
-    private final BackendConnection backendConnection;
-    
     @Override
-    public ResponseHeader execute() {
+    public void execute(final BackendConnection backendConnection) {
         String schema = SQLUtil.getExactlyValue(useStatement.getSchema());
-        if (ProxyContext.getInstance().schemaExists(schema) && isAuthorizedSchema(schema)) {
-            backendConnection.setCurrentSchema(schema);
-            return new UpdateResponseHeader(useStatement);
+        if (!ProxyContext.getInstance().schemaExists(schema) && isAuthorizedSchema(backendConnection, schema)) {
+            throw new UnknownDatabaseException(schema);
         }
-        throw new UnknownDatabaseException(schema);
+        backendConnection.setCurrentSchema(schema);
     }
     
-    private boolean isAuthorizedSchema(final String schema) {
+    private boolean isAuthorizedSchema(final BackendConnection backendConnection, final String schema) {
         Optional<ShardingSphereUser> user = ProxyContext.getInstance().getMetaDataContexts().getAuthentication().findUser(backendConnection.getUsername());
         Collection<String> authorizedSchemas = user.isPresent() ? user.get().getAuthorizedSchemas() : Collections.emptyList();
         return authorizedSchemas.isEmpty() || authorizedSchemas.contains(schema);
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java
deleted file mode 100644
index 447beed..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandler.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultColumnMetaData;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.metadata.RawQueryResultMetaData;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.raw.type.RawMemoryQueryResult;
-import org.apache.shardingsphere.infra.executor.sql.execute.result.query.type.memory.row.MemoryQueryResultDataRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.query.impl.QueryHeaderBuilder;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * Backend handler for show tables.
- */
-@RequiredArgsConstructor
-public final class ShowTablesBackendHandler implements DatabaseAdminBackendHandler {
-    
-    private final BackendConnection backendConnection;
-    
-    private QueryResult queryResult;
-    
-    @Override
-    public ResponseHeader execute() throws SQLException {
-        RawQueryResultMetaData queryResultMetaData = createQueryResultMetaData();
-        ShardingSphereMetaData metaData = ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName());
-        if (ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()).isComplete()) {
-            Collection<String> allTableNames = ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()).getSchema().getAllTableNames();
-            List<MemoryQueryResultDataRow> rows = allTableNames.stream().map(each -> new MemoryQueryResultDataRow(Collections.singletonList(each))).collect(Collectors.toList());
-            queryResult = new RawMemoryQueryResult(queryResultMetaData, rows);
-        } else {
-            queryResult = new RawMemoryQueryResult(queryResultMetaData, Collections.emptyList());
-        }
-        return new QueryResponseHeader(Collections.singletonList(QueryHeaderBuilder.build(queryResult, metaData, 1)));
-    }
-    
-    private RawQueryResultMetaData createQueryResultMetaData() {
-        String column = String.format("Tables_in_%s", backendConnection.getSchemaName());
-        return new RawQueryResultMetaData(Collections.singletonList(new RawQueryResultColumnMetaData("", column, column, Types.VARCHAR, "VARCHAR", 255, 0, false, false, false)));
-    }
-    
-    @Override
-    public boolean next() throws SQLException {
-        return queryResult.next();
-    }
-    
-    @Override
-    public Collection<Object> getRowData() throws SQLException {
-        Collection<Object> result = new LinkedList<>();
-        for (int columnIndex = 1; columnIndex <= queryResult.getMetaData().getColumnCount(); columnIndex++) {
-            result.add(queryResult.getValue(columnIndex, Object.class));
-        }
-        return result;
-    }
-}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
similarity index 97%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
index 4ef4a04..3913edc 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/resources/META-INF/services/org.apache.shardingsphere.proxy.backend.text.admin.executor.DatabaseAdminExecutorFactory
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.proxy.backend.text.admin.mysql.MySQLAdminBackendHandlerFactory
+org.apache.shardingsphere.proxy.backend.text.admin.mysql.MySQLAdminExecutorFactory
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
index d424d1c..8a00254 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/TextProtocolBackendHandlerFactoryTest.java
@@ -24,11 +24,11 @@ import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.Bac
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminQueryBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminUpdateBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.data.impl.BroadcastDatabaseBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.data.impl.SchemaAssignedDatabaseBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.data.impl.UnicastDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.sctl.set.ShardingCTLSetBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.sctl.show.ShardingCTLShowBackendHandler;
 import org.apache.shardingsphere.proxy.backend.text.skip.SkipBackendHandler;
@@ -150,14 +150,14 @@ public final class TextProtocolBackendHandlerFactoryTest {
     public void assertNewInstanceWithUse() throws SQLException {
         String sql = "use sharding_db";
         TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection);
-        assertThat(actual, instanceOf(UseDatabaseBackendHandler.class));
+        assertThat(actual, instanceOf(DatabaseAdminUpdateBackendHandler.class));
     }
     
     @Test
     public void assertNewInstanceWithShowDatabase() throws SQLException {
         String sql = "show databases";
         TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(databaseType, sql, backendConnection);
-        assertThat(actual, instanceOf(ShowDatabasesBackendHandler.class));
+        assertThat(actual, instanceOf(DatabaseAdminQueryBackendHandler.class));
     }
     
     @Test
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
index 68eb354..8cc5339 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/response/header/query/impl/QueryHeaderBuilderTest.java
@@ -21,7 +21,7 @@ import org.apache.shardingsphere.infra.binder.segment.select.projection.Projecti
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ExpressionProjection;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-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.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
@@ -48,79 +48,79 @@ public final class QueryHeaderBuilderTest {
     
     @Test
     public void assertQueryHeaderSchema() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getSchema(), is("sharding_schema"));
     }
     
     @Test
     public void assertQueryHeaderTable() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getTable(), is("t_logic_order"));
     }
     
     @Test
     public void assertQueryHeaderColumnLabel() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getColumnLabel(), is("order_id"));
     }
     
     @Test
     public void assertQueryHeaderColumnNameWithoutProjectionsContext() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getColumnName(), is("order_id"));
     }
     
     @Test
     public void assertQueryHeaderColumnNameFromProjectionsContext() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getColumnName(), is("order_id"));
     }
     
     @Test
     public void assertQueryHeaderColumnNameFromMetaData() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResult(), createMetaData(), 2);
+        QueryHeader header = QueryHeaderBuilder.build(createProjectionsContext(), createQueryResultMetaData(), createMetaData(), 2);
         assertThat(header.getColumnName(), is("expr"));
     }
     
     @Test
     public void assertQueryHeaderColumnLength() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getColumnLength(), is(1));
     }
     
     @Test
     public void assertQueryHeaderColumnType() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getColumnType(), is(Types.INTEGER));
     }
     
     @Test
     public void assertQueryHeaderDecimals() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertThat(header.getDecimals(), is(1));
     }
     
     @Test
     public void assertQueryHeaderSigned() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertTrue(header.isSigned());
     }
     
     @Test
     public void assertQueryHeaderPrimaryKey() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertTrue(header.isPrimaryKey());
     }
     
     @Test
     public void assertQueryHeaderNotNull() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertTrue(header.isNotNull());
     }
     
     @Test
     public void assertQueryHeaderAutoIncrement() throws SQLException {
-        QueryHeader header = QueryHeaderBuilder.build(createQueryResult(), createMetaData(), 1);
+        QueryHeader header = QueryHeaderBuilder.build(createQueryResultMetaData(), createMetaData(), 1);
         assertTrue(header.isAutoIncrement());
     }
     
@@ -144,18 +144,18 @@ public final class QueryHeaderBuilderTest {
         return new ProjectionsContext(0, 0, false, Arrays.asList(new ColumnProjection("o", "order_id", "id"), new ExpressionProjection("o.order_id + 1", "expr")));
     }
     
-    private QueryResult createQueryResult() throws SQLException {
-        QueryResult result = mock(QueryResult.class, RETURNS_DEEP_STUBS);
-        when(result.getMetaData().getTableName(1)).thenReturn("t_order");
-        when(result.getMetaData().getColumnLabel(1)).thenReturn("order_id");
-        when(result.getMetaData().getColumnName(1)).thenReturn("order_id");
-        when(result.getMetaData().getColumnName(2)).thenReturn("expr");
-        when(result.getMetaData().getColumnType(1)).thenReturn(Types.INTEGER);
-        when(result.getMetaData().isSigned(1)).thenReturn(true);
-        when(result.getMetaData().isAutoIncrement(1)).thenReturn(true);
-        when(result.getMetaData().getColumnLength(1)).thenReturn(1);
-        when(result.getMetaData().getDecimals(1)).thenReturn(1);
-        when(result.getMetaData().isNotNull(1)).thenReturn(true);
+    private QueryResultMetaData createQueryResultMetaData() throws SQLException {
+        QueryResultMetaData result = mock(QueryResultMetaData.class);
+        when(result.getTableName(1)).thenReturn("t_order");
+        when(result.getColumnLabel(1)).thenReturn("order_id");
+        when(result.getColumnName(1)).thenReturn("order_id");
+        when(result.getColumnName(2)).thenReturn("expr");
+        when(result.getColumnType(1)).thenReturn(Types.INTEGER);
+        when(result.isSigned(1)).thenReturn(true);
+        when(result.isAutoIncrement(1)).thenReturn(true);
+        when(result.getColumnLength(1)).thenReturn(1);
+        when(result.getDecimals(1)).thenReturn(1);
+        when(result.isNotNull(1)).thenReturn(true);
         return result;
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
similarity index 78%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
index 2c1a7be..450a1b1 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowDatabasesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowDatabasesExecutorTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
 import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -28,7 +28,6 @@ import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -42,24 +41,21 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
-public final class ShowDatabasesBackendHandlerTest {
+public final class ShowDatabasesExecutorTest {
     
     private static final String SCHEMA_PATTERN = "schema_%s";
     
-    private ShowDatabasesBackendHandler showDatabasesBackendHandler;
+    private ShowDatabasesExecutor showDatabasesExecutor;
     
     @Before
     public void setUp() throws IllegalAccessException, NoSuchFieldException {
-        BackendConnection backendConnection = mock(BackendConnection.class);
-        when(backendConnection.getUsername()).thenReturn("root");
-        showDatabasesBackendHandler = new ShowDatabasesBackendHandler(backendConnection);
+        showDatabasesExecutor = new ShowDatabasesExecutor();
         Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
         metaDataContexts.setAccessible(true);
         metaDataContexts.set(ProxyContext.getInstance(), 
@@ -85,17 +81,19 @@ public final class ShowDatabasesBackendHandlerTest {
     }
     
     @Test
-    public void assertExecuteShowDatabaseBackendHandler() {
-        QueryResponseHeader actual = (QueryResponseHeader) showDatabasesBackendHandler.execute();
-        assertThat(actual, instanceOf(QueryResponseHeader.class));
-        assertThat(actual.getQueryHeaders().size(), is(1));
+    public void assertExecute() throws SQLException {
+        showDatabasesExecutor.execute(mockBackendConnection());
+        assertThat(showDatabasesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
+        int count = 0;
+        while (showDatabasesExecutor.getMergedResult().next()) {
+            assertThat(showDatabasesExecutor.getMergedResult().getValue(1, Object.class), is(String.format(SCHEMA_PATTERN, count)));
+            count++;
+        }
     }
     
-    @Test
-    public void assertShowDatabaseUsingStream() throws SQLException {
-        showDatabasesBackendHandler.execute();
-        while (showDatabasesBackendHandler.next()) {
-            assertThat(showDatabasesBackendHandler.getRowData().size(), is(1));
-        }
+    private BackendConnection mockBackendConnection() {
+        BackendConnection result = mock(BackendConnection.class);
+        when(result.getUsername()).thenReturn("root");
+        return result;
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
similarity index 75%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
index c95007e..c57006f 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/ShowTablesBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/ShowTablesExecutorTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
 import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -25,7 +25,6 @@ import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -36,26 +35,22 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-public final class ShowTablesBackendHandlerTest {
+public final class ShowTablesExecutorTest {
     
     private static final String SCHEMA_PATTERN = "schema_%s";
     
-    private ShowTablesBackendHandler tablesBackendHandler;
+    private ShowTablesExecutor showTablesExecutor;
     
     @Before
     public void setUp() throws NoSuchFieldException, IllegalAccessException {
-        BackendConnection backendConnection = mock(BackendConnection.class);
-        when(backendConnection.getUsername()).thenReturn("root");
-        tablesBackendHandler = new ShowTablesBackendHandler(backendConnection);
+        showTablesExecutor = new ShowTablesExecutor();
         Map<String, ShardingSphereMetaData> metaDataMap = getMetaDataMap();
-        when(backendConnection.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN, 0));
         Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
         metaDataContexts.setAccessible(true);
         metaDataContexts.set(ProxyContext.getInstance(), new StandardMetaDataContexts(metaDataMap, mock(ExecutorEngine.class), getAuthentication(), new ConfigurationProperties(new Properties())));
@@ -79,17 +74,18 @@ public final class ShowTablesBackendHandlerTest {
     }
     
     @Test
-    public void assertExecuteShowTablesBackendHandler() throws SQLException {
-        QueryResponseHeader actual = (QueryResponseHeader) tablesBackendHandler.execute();
-        assertThat(actual, instanceOf(QueryResponseHeader.class));
-        assertThat(actual.getQueryHeaders().size(), is(1));
+    public void assertExecute() throws SQLException {
+        showTablesExecutor.execute(mockBackendConnection());
+        assertThat(showTablesExecutor.getQueryResultMetaData().getColumnCount(), is(1));
+        while (showTablesExecutor.getMergedResult().next()) {
+            assertThat(showTablesExecutor.getMergedResult().getValue(1, Object.class), is(1));
+        }
     }
     
-    @Test
-    public void assertShowTablesUsingStream() throws SQLException {
-        tablesBackendHandler.execute();
-        while (tablesBackendHandler.next()) {
-            assertThat(tablesBackendHandler.getRowData().size(), is(1));
-        }
+    private BackendConnection mockBackendConnection() {
+        BackendConnection result = mock(BackendConnection.class);
+        when(result.getUsername()).thenReturn("root");
+        when(result.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN, 0));
+        return result;
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
similarity index 78%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
index e400b44..09e2f7c 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/handler/UseDatabaseBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/UseDatabaseExecutorTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler;
+package org.apache.shardingsphere.proxy.backend.text.admin.mysql.executor;
 
 import org.apache.shardingsphere.infra.auth.ShardingSphereUser;
 import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
@@ -28,9 +28,6 @@ import org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
-import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,15 +41,13 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
-public final class UseDatabaseBackendHandlerTest {
+public final class UseDatabaseExecutorTest {
     
     private static final String SCHEMA_PATTERN = "schema_%s";
     
@@ -61,7 +56,6 @@ public final class UseDatabaseBackendHandlerTest {
     @Before
     public void setUp() throws NoSuchFieldException, IllegalAccessException {
         backendConnection = mock(BackendConnection.class);
-        when(backendConnection.getUsername()).thenReturn("root");
         Field metaDataContexts = ProxyContext.getInstance().getClass().getDeclaredField("metaDataContexts");
         metaDataContexts.setAccessible(true);
         metaDataContexts.set(ProxyContext.getInstance(), 
@@ -90,17 +84,8 @@ public final class UseDatabaseBackendHandlerTest {
     public void assertExecuteUseStatementBackendHandler() {
         MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
         when(useStatement.getSchema()).thenReturn(String.format(SCHEMA_PATTERN, 0));
-        UseDatabaseBackendHandler useSchemaBackendHandler = new UseDatabaseBackendHandler(useStatement, backendConnection);
-        ResponseHeader actual = useSchemaBackendHandler.execute();
+        UseDatabaseExecutor useSchemaBackendHandler = new UseDatabaseExecutor(useStatement);
+        useSchemaBackendHandler.execute(backendConnection);
         verify(backendConnection).setCurrentSchema(anyString());
-        assertThat(actual, instanceOf(UpdateResponseHeader.class));
-    }
-    
-    @Test(expected = UnknownDatabaseException.class)
-    public void assertExecuteUseStatementNotExist() {
-        MySQLUseStatement useStatement = mock(MySQLUseStatement.class);
-        when(useStatement.getSchema()).thenReturn("not_exist");
-        UseDatabaseBackendHandler useSchemaBackendHandler = new UseDatabaseBackendHandler(useStatement, backendConnection);
-        useSchemaBackendHandler.execute();
     }
 }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java
deleted file mode 100644
index e8a5710..0000000
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/schema/MySQLAdminBackendHandlerFactoryTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.proxy.backend.text.admin.mysql.schema;
-
-import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
-import org.apache.shardingsphere.infra.spi.typed.TypedSPIRegistry;
-import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.DatabaseAdminBackendHandlerFactory;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowCurrentDatabaseBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowDatabasesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.ShowTablesBackendHandler;
-import org.apache.shardingsphere.proxy.backend.text.admin.mysql.handler.UseDatabaseBackendHandler;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ExpressionProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowTablesStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import java.util.Optional;
-import java.util.Properties;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public final class MySQLAdminBackendHandlerFactoryTest {
-    
-    private final DatabaseAdminBackendHandlerFactory databaseAdminBackendHandlerFactory = TypedSPIRegistry.getRegisteredService(DatabaseAdminBackendHandlerFactory.class, "MySQL", new Properties());
-    
-    @BeforeClass
-    public static void setUp() {
-        ShardingSphereServiceLoader.register(DatabaseAdminBackendHandlerFactory.class);
-    }
-    
-    @Test
-    public void assertUseDatabase() {
-        Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLUseStatement.class), mock(BackendConnection.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), instanceOf(UseDatabaseBackendHandler.class));
-    }
-    
-    @Test
-    public void assertShowDatabases() {
-        Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLShowDatabasesStatement.class), mock(BackendConnection.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), instanceOf(ShowDatabasesBackendHandler.class));
-    }
-    
-    @Test
-    public void assertShowCurrentDatabase() {
-        SelectStatement sqlStatement = mock(SelectStatement.class, RETURNS_DEEP_STUBS);
-        when(sqlStatement.getProjections().getProjections().iterator().next()).thenReturn(new ExpressionProjectionSegment(0, 0, ShowCurrentDatabaseBackendHandler.FUNCTION_NAME));
-        Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(sqlStatement, mock(BackendConnection.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), instanceOf(ShowCurrentDatabaseBackendHandler.class));
-    }
-    
-    @Test
-    public void assertShowTables() {
-        Optional<DatabaseAdminBackendHandler> actual = databaseAdminBackendHandlerFactory.newInstance(mock(MySQLShowTablesStatement.class), mock(BackendConnection.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), instanceOf(ShowTablesBackendHandler.class));
-    }
-}