You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2023/01/27 03:23:00 UTC

[shardingsphere] branch master updated: Refactor RQLBackendHandler, replace DistSQLResultSet with MergedResult (#23735)

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

sunnianjun 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 22212239a85 Refactor RQLBackendHandler, replace DistSQLResultSet with MergedResult  (#23735)
22212239a85 is described below

commit 22212239a850e7e87df84ecd14c407ecacff72bc
Author: Raigor <ra...@gmail.com>
AuthorDate: Fri Jan 27 11:22:53 2023 +0800

    Refactor RQLBackendHandler, replace DistSQLResultSet with MergedResult  (#23735)
    
    * Refactor RQLBackendHandler
    
    * format java doc.
---
 distsql/handler/pom.xml                            |   5 +
 .../distsql/handler/query/RQLExecutor.java         |  49 +++++++
 .../handler/distsql/rql/RQLBackendHandler.java     |  78 ++++++++---
 .../distsql/rql/RQLBackendHandlerFactory.java      |  12 +-
 ...andler.java => RQLResultSetBackendHandler.java} |   9 +-
 ...ResultSet.java => ShowSingleTableExecutor.java} |  50 +++----
 ...ResultSet.java => ShowStorageUnitExecutor.java} |  84 +++++------
 ...ardingsphere.distsql.handler.query.RQLExecutor} |   9 +-
 ...here.distsql.handler.resultset.DistSQLResultSet |   2 -
 .../handler/ProxyBackendHandlerFactoryTest.java    |   4 +-
 ...st.java => RQLResultSetBackendHandlerTest.java} |  10 +-
 .../distsql/rql/SingleTableResultSetTest.java      | 151 --------------------
 .../distsql/rql/StorageUnitResultSetTest.java      | 154 ---------------------
 13 files changed, 190 insertions(+), 427 deletions(-)

diff --git a/distsql/handler/pom.xml b/distsql/handler/pom.xml
index 61fe2a556e4..87fbe22223f 100644
--- a/distsql/handler/pom.xml
+++ b/distsql/handler/pom.xml
@@ -33,5 +33,10 @@
             <artifactId>shardingsphere-infra-common</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-infra-merge</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/distsql/handler/src/main/java/org/apache/shardingsphere/distsql/handler/query/RQLExecutor.java b/distsql/handler/src/main/java/org/apache/shardingsphere/distsql/handler/query/RQLExecutor.java
new file mode 100644
index 00000000000..7e29b882873
--- /dev/null
+++ b/distsql/handler/src/main/java/org/apache/shardingsphere/distsql/handler/query/RQLExecutor.java
@@ -0,0 +1,49 @@
+/*
+ * 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.distsql.handler.query;
+
+import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
+
+import java.util.Collection;
+
+/**
+ * RQL executor.
+ */
+@SingletonSPI
+public interface RQLExecutor<T extends RQLStatement> extends TypedSPI {
+    
+    /**
+     * Get column names.
+     * 
+     * @return column names
+     */
+    Collection<String> getColumnNames();
+    
+    /**
+     * Get query result rows.
+     * 
+     * @param shardingSphereDatabase ShardingSphere database
+     * @param sqlStatement SQL statement
+     * @return query result rows
+     */
+    Collection<LocalDataQueryResultRow> getRows(ShardingSphereDatabase shardingSphereDatabase, T sqlStatement);
+}
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java
index bba5242ef85..1756a050d69 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java
@@ -17,55 +17,93 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.rql;
 
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.dialect.exception.syntax.database.NoDatabaseSelectedException;
+import org.apache.shardingsphere.dialect.exception.syntax.database.UnknownDatabaseException;
+import org.apache.shardingsphere.distsql.handler.query.RQLExecutor;
 import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
-import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
+import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataMergedResult;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPIRegistry;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.handler.DatabaseRequiredBackendHandler;
+import org.apache.shardingsphere.proxy.backend.handler.distsql.DistSQLBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseRow;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.available.FromDatabaseAvailable;
 
+import java.sql.SQLException;
 import java.sql.Types;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
  * RQL backend handler.
+ *
+ * @param <T> type of RQL statement
  */
-public final class RQLBackendHandler extends DatabaseRequiredBackendHandler<RQLStatement> {
+@RequiredArgsConstructor
+@Getter
+public final class RQLBackendHandler<T extends RQLStatement> implements DistSQLBackendHandler {
     
-    private final DatabaseDistSQLResultSet resultSet;
+    private final T sqlStatement;
     
-    public RQLBackendHandler(final RQLStatement sqlStatement, final ConnectionSession connectionSession, final DatabaseDistSQLResultSet resultSet) {
-        super(sqlStatement, connectionSession);
-        this.resultSet = resultSet;
-    }
+    private final ConnectionSession connectionSession;
+    
+    private List<QueryHeader> queryHeaders;
     
+    private MergedResult mergedResult;
+    
+    @SuppressWarnings({"rawtypes", "unchecked"})
     @Override
-    protected ResponseHeader execute(final String databaseName, final RQLStatement sqlStatement) {
-        resultSet.init(ProxyContext.getInstance().getDatabase(databaseName), sqlStatement);
-        List<QueryHeader> queryHeaders = resultSet.getColumnNames().stream()
-                .map(each -> new QueryHeader(databaseName, "", each, each, Types.CHAR, "CHAR", 255, 0, false, false, false, false)).collect(Collectors.toList());
+    public ResponseHeader execute() throws SQLException {
+        String databaseName = getDatabaseName(connectionSession, sqlStatement);
+        checkDatabaseName(databaseName);
+        RQLExecutor executor = TypedSPIRegistry.getService(RQLExecutor.class, sqlStatement.getClass().getName());
+        queryHeaders = createQueryHeader(executor.getColumnNames());
+        mergedResult = createMergedResult(executor.getRows(ProxyContext.getInstance().getDatabase(databaseName), sqlStatement));
         return new QueryResponseHeader(queryHeaders);
     }
     
+    private String getDatabaseName(final ConnectionSession connectionSession, final T sqlStatement) {
+        Optional<DatabaseSegment> databaseSegment = sqlStatement instanceof FromDatabaseAvailable ? ((FromDatabaseAvailable) sqlStatement).getDatabase() : Optional.empty();
+        return databaseSegment.isPresent() ? databaseSegment.get().getIdentifier().getValue() : connectionSession.getDatabaseName();
+    }
+    
+    private void checkDatabaseName(final String databaseName) {
+        ShardingSpherePreconditions.checkNotNull(databaseName, NoDatabaseSelectedException::new);
+        ShardingSpherePreconditions.checkState(ProxyContext.getInstance().databaseExists(databaseName), () -> new UnknownDatabaseException(databaseName));
+    }
+    
+    private List<QueryHeader> createQueryHeader(final Collection<String> columnNames) {
+        return columnNames.stream().map(each -> new QueryHeader("", "", each, each, Types.CHAR, "CHAR", 255, 0, false, false, false, false)).collect(Collectors.toList());
+    }
+    
+    private MergedResult createMergedResult(final Collection<LocalDataQueryResultRow> rows) {
+        return new LocalDataMergedResult(rows);
+    }
+    
     @Override
-    public boolean next() {
-        return resultSet.next();
+    public boolean next() throws SQLException {
+        return null != mergedResult && mergedResult.next();
     }
     
     @Override
-    public QueryResponseRow getRowData() {
-        Collection<Object> rowData = resultSet.getRowData();
-        List<QueryResponseCell> result = new ArrayList<>(rowData.size());
-        for (Object each : rowData) {
-            result.add(new QueryResponseCell(Types.CHAR, each));
+    public QueryResponseRow getRowData() throws SQLException {
+        List<QueryResponseCell> cells = new ArrayList<>(queryHeaders.size());
+        for (int i = 0; i < queryHeaders.size(); i++) {
+            cells.add(new QueryResponseCell(queryHeaders.get(i).getColumnType(), mergedResult.getValue(i + 1, Object.class)));
         }
-        return new QueryResponseRow(result);
+        return new QueryResponseRow(cells);
     }
 }
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerFactory.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerFactory.java
index 68fed34ebc6..5025c13a24d 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerFactory.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerFactory.java
@@ -35,14 +35,22 @@ import java.util.Properties;
 public final class RQLBackendHandlerFactory {
     
     /**
-     * Create new instance of RDL backend handler.
+     * Create new instance of RQL backend handler.
      * 
      * @param sqlStatement RQL statement
      * @param connectionSession connection session
      * @return RDL backend handler
      */
     public static ProxyBackendHandler newInstance(final RQLStatement sqlStatement, final ConnectionSession connectionSession) {
+        // TODO remove this judgment after the refactoring of DistSQLResultSet is completed
+        if (TypedSPIRegistry.contains(DistSQLResultSet.class, sqlStatement.getClass().getCanonicalName())) {
+            return newInstanceByDistSQLResultSet(sqlStatement, connectionSession);
+        }
+        return new RQLBackendHandler<>(sqlStatement, connectionSession);
+    }
+    
+    private static ProxyBackendHandler newInstanceByDistSQLResultSet(final RQLStatement sqlStatement, final ConnectionSession connectionSession) {
         DistSQLResultSet resultSet = TypedSPIRegistry.getService(DistSQLResultSet.class, sqlStatement.getClass().getCanonicalName(), new Properties());
-        return new RQLBackendHandler(sqlStatement, connectionSession, (DatabaseDistSQLResultSet) resultSet);
+        return new RQLResultSetBackendHandler(sqlStatement, connectionSession, (DatabaseDistSQLResultSet) resultSet);
     }
 }
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandler.java
similarity index 89%
copy from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java
copy to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandler.java
index bba5242ef85..bdb7e7d82ad 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandler.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.rql;
 
-import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
 import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
+import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.handler.DatabaseRequiredBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.data.QueryResponseCell;
@@ -35,13 +35,14 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 /**
- * RQL backend handler.
+ * RQL result set backend handler.
+ * TODO remove after RQLBackendHandler is done
  */
-public final class RQLBackendHandler extends DatabaseRequiredBackendHandler<RQLStatement> {
+public final class RQLResultSetBackendHandler extends DatabaseRequiredBackendHandler<RQLStatement> {
     
     private final DatabaseDistSQLResultSet resultSet;
     
-    public RQLBackendHandler(final RQLStatement sqlStatement, final ConnectionSession connectionSession, final DatabaseDistSQLResultSet resultSet) {
+    public RQLResultSetBackendHandler(final RQLStatement sqlStatement, final ConnectionSession connectionSession, final DatabaseDistSQLResultSet resultSet) {
         super(sqlStatement, connectionSession);
         this.resultSet = resultSet;
     }
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/SingleTableResultSet.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowSingleTableExecutor.java
similarity index 65%
rename from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/SingleTableResultSet.java
rename to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowSingleTableExecutor.java
index 224495eaadc..dbe69333927 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/SingleTableResultSet.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/ShowSingleTableExecutor.java
@@ -17,45 +17,27 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule;
 
+import org.apache.shardingsphere.distsql.handler.query.RQLExecutor;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowSingleTableStatement;
 import org.apache.shardingsphere.infra.datanode.DataNode;
-import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.proxy.backend.util.RegularUtil;
 import org.apache.shardingsphere.single.rule.SingleRule;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
 
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
- * Result set for show single table.
+ * Show single table executor.
  */
-public final class SingleTableResultSet implements DatabaseDistSQLResultSet {
-    
-    private Iterator<DataNode> data = Collections.emptyIterator();
-    
-    @Override
-    public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
-        ShowSingleTableStatement showSingleTableStatement = (ShowSingleTableStatement) sqlStatement;
-        Stream<DataNode> singleTableNodes = database.getRuleMetaData().getRules().stream().filter(each -> each instanceof SingleRule)
-                .map(each -> (SingleRule) each).map(each -> each.getSingleTableDataNodes().values()).flatMap(Collection::stream).filter(Objects::nonNull).map(each -> each.iterator().next());
-        if (showSingleTableStatement.getTableName().isPresent()) {
-            singleTableNodes = singleTableNodes.filter(each -> showSingleTableStatement.getTableName().get().equals(each.getTableName()));
-        }
-        if (showSingleTableStatement.getLikePattern().isPresent()) {
-            String pattern = SQLUtil.convertLikePatternToRegex(showSingleTableStatement.getLikePattern().get());
-            singleTableNodes = singleTableNodes.filter(each -> RegularUtil.matchesCaseInsensitive(pattern, each.getTableName())).collect(Collectors.toList()).stream();
-        }
-        data = singleTableNodes.sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList()).iterator();
-    }
+public final class ShowSingleTableExecutor implements RQLExecutor<ShowSingleTableStatement> {
     
     @Override
     public Collection<String> getColumnNames() {
@@ -63,14 +45,24 @@ public final class SingleTableResultSet implements DatabaseDistSQLResultSet {
     }
     
     @Override
-    public boolean next() {
-        return data.hasNext();
+    public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowSingleTableStatement sqlStatement) {
+        Collection<LocalDataQueryResultRow> result = new LinkedList<>();
+        Collection<DataNode> dataNodes = getDataNodes(database, sqlStatement);
+        dataNodes.forEach(each -> result.add(new LocalDataQueryResultRow(each.getTableName(), each.getDataSourceName())));
+        return result;
     }
     
-    @Override
-    public Collection<Object> getRowData() {
-        DataNode next = data.next();
-        return Arrays.asList(next.getTableName(), next.getDataSourceName());
+    private Collection<DataNode> getDataNodes(final ShardingSphereDatabase database, final ShowSingleTableStatement sqlStatement) {
+        Stream<DataNode> singleTableNodes = database.getRuleMetaData().getRules().stream().filter(each -> each instanceof SingleRule)
+                .map(each -> (SingleRule) each).map(each -> each.getSingleTableDataNodes().values()).flatMap(Collection::stream).filter(Objects::nonNull).map(each -> each.iterator().next());
+        if (sqlStatement.getTableName().isPresent()) {
+            singleTableNodes = singleTableNodes.filter(each -> sqlStatement.getTableName().get().equals(each.getTableName()));
+        }
+        if (sqlStatement.getLikePattern().isPresent()) {
+            String pattern = SQLUtil.convertLikePatternToRegex(sqlStatement.getLikePattern().get());
+            singleTableNodes = singleTableNodes.filter(each -> RegularUtil.matchesCaseInsensitive(pattern, each.getTableName())).collect(Collectors.toList()).stream();
+        }
+        return singleTableNodes.sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList());
     }
     
     @Override
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/StorageUnitResultSet.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
similarity index 68%
rename from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/StorageUnitResultSet.java
rename to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
index 3e23a517018..cac6a22bb01 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/StorageUnitResultSet.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/storage/unit/ShowStorageUnitExecutor.java
@@ -20,25 +20,24 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.rql.storage.unit
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
 import com.google.gson.Gson;
-import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
+import org.apache.shardingsphere.distsql.handler.query.RQLExecutor;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowStorageUnitsStatement;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import javax.sql.DataSource;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
@@ -48,9 +47,9 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
- * Result set for show storage units.
+ * Show storage unit executor.
  */
-public final class StorageUnitResultSet implements DatabaseDistSQLResultSet {
+public final class ShowStorageUnitExecutor implements RQLExecutor<ShowStorageUnitsStatement> {
     
     private static final String CONNECTION_TIMEOUT_MILLISECONDS = "connectionTimeoutMilliseconds";
     
@@ -64,31 +63,48 @@ public final class StorageUnitResultSet implements DatabaseDistSQLResultSet {
     
     private static final String READ_ONLY = "readOnly";
     
-    private ShardingSphereResourceMetaData resourceMetaData;
-    
-    private Map<String, DataSourceProperties> dataSourcePropsMap;
-    
-    private Iterator<String> dataSourceNames;
+    @Override
+    public Collection<String> getColumnNames() {
+        return Arrays.asList("name", "type", "host", "port", "db", "connection_timeout_milliseconds", "idle_timeout_milliseconds",
+                "max_lifetime_milliseconds", "max_pool_size", "min_pool_size", "read_only", "other_attributes");
+    }
     
     @Override
-    public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
-        resourceMetaData = database.getResourceMetaData();
-        dataSourcePropsMap = new LinkedHashMap<>(database.getResourceMetaData().getDataSources().size(), 1);
-        Optional<Integer> usageCountOptional = ((ShowStorageUnitsStatement) sqlStatement).getUsageCount();
+    public Collection<LocalDataQueryResultRow> getRows(final ShardingSphereDatabase database, final ShowStorageUnitsStatement sqlStatement) {
+        ShardingSphereResourceMetaData resourceMetaData = database.getResourceMetaData();
+        Map<String, DataSourceProperties> dataSourcePropsMap = getDataSourcePropsMap(database, sqlStatement);
+        Collection<LocalDataQueryResultRow> result = new LinkedList<>();
+        dataSourcePropsMap.forEach((key, value) -> {
+            DataSourceMetaData metaData = resourceMetaData.getDataSourceMetaData(key);
+            DataSourceProperties dataSourceProps = dataSourcePropsMap.get(key);
+            Map<String, Object> standardProps = dataSourceProps.getPoolPropertySynonyms().getStandardProperties();
+            Map<String, Object> otherProps = dataSourceProps.getCustomDataSourceProperties().getProperties();
+            result.add(new LocalDataQueryResultRow(key, resourceMetaData.getStorageType(key).getType(), metaData.getHostname(), metaData.getPort(), metaData.getCatalog(),
+                    getStandardProperty(standardProps, CONNECTION_TIMEOUT_MILLISECONDS), getStandardProperty(standardProps, IDLE_TIMEOUT_MILLISECONDS),
+                    getStandardProperty(standardProps, MAX_LIFETIME_MILLISECONDS), getStandardProperty(standardProps, MAX_POOL_SIZE),
+                    getStandardProperty(standardProps, MIN_POOL_SIZE), getStandardProperty(standardProps, READ_ONLY),
+                    otherProps.isEmpty() ? "" : new Gson().toJson(otherProps)));
+        });
+        return result;
+    }
+    
+    private Map<String, DataSourceProperties> getDataSourcePropsMap(final ShardingSphereDatabase database, final ShowStorageUnitsStatement sqlStatement) {
+        Map<String, DataSourceProperties> result = new LinkedHashMap<>(database.getResourceMetaData().getDataSources().size(), 1);
+        Optional<Integer> usageCountOptional = sqlStatement.getUsageCount();
         if (usageCountOptional.isPresent()) {
             Multimap<String, String> inUsedMultiMap = getInUsedResources(database.getRuleMetaData());
             for (Entry<String, DataSource> entry : database.getResourceMetaData().getDataSources().entrySet()) {
                 Integer currentUsageCount = inUsedMultiMap.containsKey(entry.getKey()) ? inUsedMultiMap.get(entry.getKey()).size() : 0;
                 if (usageCountOptional.get().equals(currentUsageCount)) {
-                    dataSourcePropsMap.put(entry.getKey(), DataSourcePropertiesCreator.create(entry.getValue()));
+                    result.put(entry.getKey(), DataSourcePropertiesCreator.create(entry.getValue()));
                 }
             }
         } else {
             for (Entry<String, DataSource> entry : database.getResourceMetaData().getDataSources().entrySet()) {
-                dataSourcePropsMap.put(entry.getKey(), DataSourcePropertiesCreator.create(entry.getValue()));
+                result.put(entry.getKey(), DataSourcePropertiesCreator.create(entry.getValue()));
             }
         }
-        dataSourceNames = dataSourcePropsMap.keySet().iterator();
+        return result;
     }
     
     private Multimap<String, String> getInUsedResources(final ShardingSphereRuleMetaData ruleMetaData) {
@@ -122,40 +138,6 @@ public final class StorageUnitResultSet implements DatabaseDistSQLResultSet {
         return result;
     }
     
-    @Override
-    public Collection<String> getColumnNames() {
-        return Arrays.asList("name", "type", "host", "port", "db", "connection_timeout_milliseconds", "idle_timeout_milliseconds",
-                "max_lifetime_milliseconds", "max_pool_size", "min_pool_size", "read_only", "other_attributes");
-    }
-    
-    @Override
-    public boolean next() {
-        return dataSourceNames.hasNext();
-    }
-    
-    @Override
-    public Collection<Object> getRowData() {
-        String dataSourceName = dataSourceNames.next();
-        DataSourceMetaData metaData = resourceMetaData.getDataSourceMetaData(dataSourceName);
-        Collection<Object> result = new LinkedList<>();
-        result.add(dataSourceName);
-        result.add(resourceMetaData.getStorageType(dataSourceName).getType());
-        result.add(metaData.getHostname());
-        result.add(metaData.getPort());
-        result.add(metaData.getCatalog());
-        DataSourceProperties dataSourceProps = dataSourcePropsMap.get(dataSourceName);
-        Map<String, Object> standardProps = dataSourceProps.getPoolPropertySynonyms().getStandardProperties();
-        result.add(getStandardProperty(standardProps, CONNECTION_TIMEOUT_MILLISECONDS));
-        result.add(getStandardProperty(standardProps, IDLE_TIMEOUT_MILLISECONDS));
-        result.add(getStandardProperty(standardProps, MAX_LIFETIME_MILLISECONDS));
-        result.add(getStandardProperty(standardProps, MAX_POOL_SIZE));
-        result.add(getStandardProperty(standardProps, MIN_POOL_SIZE));
-        result.add(getStandardProperty(standardProps, READ_ONLY));
-        Map<String, Object> otherProps = dataSourceProps.getCustomDataSourceProperties().getProperties();
-        result.add(otherProps.isEmpty() ? "" : new Gson().toJson(otherProps));
-        return result;
-    }
-    
     private String getStandardProperty(final Map<String, Object> standardProps, final String key) {
         if (standardProps.containsKey(key) && null != standardProps.get(key)) {
             return standardProps.get(key).toString();
diff --git a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.query.RQLExecutor
similarity index 64%
copy from proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet
copy to proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.query.RQLExecutor
index 8c4f9d71f0a..2a529fa8a28 100644
--- a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet
+++ b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.query.RQLExecutor
@@ -15,10 +15,5 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.storage.unit.StorageUnitResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.LogicalTableResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.SingleTableResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.SingleTableRuleResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.RulesUsedStorageUnitResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.CountSingleTableResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowMigrationRuleResultSet
+org.apache.shardingsphere.proxy.backend.handler.distsql.rql.storage.unit.ShowStorageUnitExecutor
+org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.ShowSingleTableExecutor
diff --git a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet
index 8c4f9d71f0a..7169937d933 100644
--- a/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet
+++ b/proxy/backend/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.resultset.DistSQLResultSet
@@ -15,9 +15,7 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.storage.unit.StorageUnitResultSet
 org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.LogicalTableResultSet
-org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.SingleTableResultSet
 org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.SingleTableRuleResultSet
 org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.RulesUsedStorageUnitResultSet
 org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.CountSingleTableResultSet
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
index 7e03548cc8c..5458ec9567a 100644
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
@@ -38,7 +38,7 @@ import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.QueryableGlob
 import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.QueryableRALBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.hint.HintRALBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.SetDistVariableHandler;
-import org.apache.shardingsphere.proxy.backend.handler.distsql.rql.RQLBackendHandler;
+import org.apache.shardingsphere.proxy.backend.handler.distsql.rql.RQLResultSetBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.distsql.rul.SQLRULBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.skip.SkipBackendHandler;
 import org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandler;
@@ -261,7 +261,7 @@ public final class ProxyBackendHandlerFactoryTest extends ProxyContextRestorer {
         when(connectionSession.getTransactionStatus().isInTransaction()).thenReturn(true);
         String sql = "SHOW DEFAULT SINGLE TABLE STORAGE UNIT";
         ProxyBackendHandler actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession);
-        assertThat(actual, instanceOf(RQLBackendHandler.class));
+        assertThat(actual, instanceOf(RQLResultSetBackendHandler.class));
     }
     
     @Test
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandlerTest.java
similarity index 93%
rename from proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerTest.java
rename to proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandlerTest.java
index 0becded7118..f73535b72ae 100644
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLBackendHandlerTest.java
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/RQLResultSetBackendHandlerTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.rql;
 
-import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
 import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
+import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -38,14 +38,14 @@ import java.util.Collection;
 import java.util.Collections;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
 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 RQLBackendHandlerTest extends ProxyContextRestorer {
+public final class RQLResultSetBackendHandlerTest extends ProxyContextRestorer {
     
     @Before
     public void setUp() {
@@ -64,7 +64,7 @@ public final class RQLBackendHandlerTest extends ProxyContextRestorer {
     public void assertExecute() {
         DatabaseDistSQLResultSet resultSet = mock(DatabaseDistSQLResultSet.class);
         when(resultSet.getColumnNames()).thenReturn(Arrays.asList("foo", "bar"));
-        RQLBackendHandler handler = new RQLBackendHandler(mock(RQLStatement.class), mock(ConnectionSession.class), resultSet);
+        RQLResultSetBackendHandler handler = new RQLResultSetBackendHandler(mock(RQLStatement.class), mock(ConnectionSession.class), resultSet);
         ResponseHeader responseHeader = handler.execute("test", mock(RQLStatement.class));
         assertThat(((QueryResponseHeader) responseHeader).getQueryHeaders().size(), is(2));
         assertQueryHeader(((QueryResponseHeader) responseHeader).getQueryHeaders().get(0), "foo");
@@ -90,7 +90,7 @@ public final class RQLBackendHandlerTest extends ProxyContextRestorer {
     public void assertGetRowData() {
         DatabaseDistSQLResultSet resultSet = mock(DatabaseDistSQLResultSet.class);
         when(resultSet.getRowData()).thenReturn(Arrays.asList("foo_value", "bar_value"));
-        RQLBackendHandler handler = new RQLBackendHandler(mock(RQLStatement.class), mock(ConnectionSession.class), resultSet);
+        RQLResultSetBackendHandler handler = new RQLResultSetBackendHandler(mock(RQLStatement.class), mock(ConnectionSession.class), resultSet);
         handler.execute("test", mock(RQLStatement.class));
         Collection<Object> rowData = handler.getRowData().getData();
         assertThat(rowData.size(), is(2));
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/SingleTableResultSetTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/SingleTableResultSetTest.java
deleted file mode 100644
index 06963feffc1..00000000000
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/SingleTableResultSetTest.java
+++ /dev/null
@@ -1,151 +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.handler.distsql.rql;
-
-import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowSingleTableStatement;
-import org.apache.shardingsphere.infra.datanode.DataNode;
-import org.apache.shardingsphere.distsql.handler.resultset.DatabaseDistSQLResultSet;
-import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.SingleTableResultSet;
-import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
-import org.apache.shardingsphere.shadow.rule.ShadowRule;
-import org.apache.shardingsphere.single.rule.SingleRule;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public final class SingleTableResultSetTest {
-    
-    @Mock
-    private ShardingSphereDatabase database;
-    
-    @Before
-    public void before() {
-        Map<String, Collection<DataNode>> singleTableDataNodeMap = new HashMap<>();
-        singleTableDataNodeMap.put("t_order", Collections.singletonList(new DataNode("ds_1", "t_order")));
-        singleTableDataNodeMap.put("t_order_item", Collections.singletonList(new DataNode("ds_2", "t_order_item")));
-        Collection<ShardingSphereRule> rules = new LinkedList<>();
-        rules.add(mockSingleTableRule(singleTableDataNodeMap));
-        ShardingSphereRuleMetaData ruleMetaData = mock(ShardingSphereRuleMetaData.class);
-        when(ruleMetaData.getRules()).thenReturn(rules);
-        when(database.getRuleMetaData()).thenReturn(ruleMetaData);
-    }
-    
-    @Test
-    public void assertGetRowData() {
-        DatabaseDistSQLResultSet resultSet = new SingleTableResultSet();
-        resultSet.init(database, mock(ShowSingleTableStatement.class));
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order"));
-        assertThat(rowData.next(), is("ds_1"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order_item"));
-        assertThat(rowData.next(), is("ds_2"));
-    }
-    
-    @Test
-    public void assertGetRowDataMultipleRules() {
-        Map<String, Collection<DataNode>> singleTableDataNodeMap = new HashMap<>();
-        singleTableDataNodeMap.put("t_order_multiple", Collections.singletonList(new DataNode("ds_1_multiple", "t_order_multiple")));
-        singleTableDataNodeMap.put("t_order_item_multiple", Collections.singletonList(new DataNode("ds_2_multiple", "t_order_item_multiple")));
-        addShardingSphereRule(mockSingleTableRule(singleTableDataNodeMap));
-        DatabaseDistSQLResultSet resultSet = new SingleTableResultSet();
-        resultSet.init(database, mock(ShowSingleTableStatement.class));
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order"));
-        assertThat(rowData.next(), is("ds_1"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order_item"));
-        assertThat(rowData.next(), is("ds_2"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order_item_multiple"));
-        assertThat(rowData.next(), is("ds_2_multiple"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order_multiple"));
-        assertThat(rowData.next(), is("ds_1_multiple"));
-    }
-    
-    @Test
-    public void assertGetRowDataWithOtherRules() {
-        addShardingSphereRule(new ShadowRule(mock(ShadowRuleConfiguration.class)));
-        DatabaseDistSQLResultSet resultSet = new SingleTableResultSet();
-        resultSet.init(database, mock(ShowSingleTableStatement.class));
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order"));
-        assertThat(rowData.next(), is("ds_1"));
-        resultSet.next();
-        actual = resultSet.getRowData();
-        rowData = actual.iterator();
-        assertThat(rowData.next(), is("t_order_item"));
-        assertThat(rowData.next(), is("ds_2"));
-    }
-    
-    @Test
-    public void assertGetSingleTableWithLikeLiteral() {
-        DatabaseDistSQLResultSet resultSet = new SingleTableResultSet();
-        ShowSingleTableStatement statement = new ShowSingleTableStatement(null, "%item", null);
-        resultSet.init(database, statement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(2));
-        Iterator<Object> iterator = actual.iterator();
-        assertThat(iterator.next(), is("t_order_item"));
-        assertThat(iterator.next(), is("ds_2"));
-    }
-    
-    private SingleRule mockSingleTableRule(final Map<String, Collection<DataNode>> singleTableDataNodeMap) {
-        SingleRule result = mock(SingleRule.class);
-        when(result.getSingleTableDataNodes()).thenReturn(singleTableDataNodeMap);
-        return result;
-    }
-    
-    private void addShardingSphereRule(final ShardingSphereRule... rules) {
-        database.getRuleMetaData().getRules().addAll(Arrays.asList(rules));
-    }
-}
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/StorageUnitResultSetTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/StorageUnitResultSetTest.java
deleted file mode 100644
index 2ccb365ddfe..00000000000
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/StorageUnitResultSetTest.java
+++ /dev/null
@@ -1,154 +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.handler.distsql.rql;
-
-import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowStorageUnitsStatement;
-import org.apache.shardingsphere.infra.instance.InstanceContext;
-import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData;
-import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.proxy.backend.handler.distsql.rql.storage.unit.StorageUnitResultSet;
-import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
-import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
-import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
-import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
-import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
-import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import javax.sql.DataSource;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-public final class StorageUnitResultSetTest {
-    
-    @Mock
-    private ShardingSphereDatabase database;
-    
-    @Before
-    public void before() {
-        ShardingSphereResourceMetaData resourceMetaData = new ShardingSphereResourceMetaData("sharding_db", createDataSources());
-        ShardingSphereRuleMetaData metaData = new ShardingSphereRuleMetaData(Collections.singleton(createShardingRule()));
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        when(database.getRuleMetaData()).thenReturn(metaData);
-    }
-    
-    private ShardingRule createShardingRule() {
-        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
-        ShardingTableRuleConfiguration shardingTableRuleConfig = createTableRuleConfiguration("order", "ds_${0..1}.order_${0..1}");
-        shardingTableRuleConfig.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("id", "increment"));
-        shardingRuleConfig.getTables().add(shardingTableRuleConfig);
-        return new ShardingRule(shardingRuleConfig, createDataSourceNames(), mock(InstanceContext.class));
-    }
-    
-    private ShardingTableRuleConfiguration createTableRuleConfiguration(final String logicTableName, final String actualDataNodes) {
-        ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration(logicTableName, actualDataNodes);
-        result.setDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "database_inline"));
-        result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "table_inline"));
-        return result;
-    }
-    
-    private Collection<String> createDataSourceNames() {
-        return Arrays.asList("ds_0", "ds_1", "ds_2");
-    }
-    
-    private Map<String, DataSource> createDataSources() {
-        Map<String, DataSource> result = new HashMap<>();
-        for (String each : createDataSourceNames()) {
-            result.put(each, createDataSource(each));
-        }
-        return result;
-    }
-    
-    private MockedDataSource createDataSource(final String dataSourceName) {
-        MockedDataSource result = new MockedDataSource();
-        result.setUrl("jdbc:mysql://localhost:3307/" + dataSourceName);
-        result.setUsername("root");
-        result.setPassword("root");
-        result.setMaxPoolSize(100);
-        result.setMinPoolSize(10);
-        return result;
-    }
-    
-    @Test
-    public void assertAllStorageUnit() {
-        StorageUnitResultSet resultSet = new StorageUnitResultSet();
-        ShowStorageUnitsStatement showStorageUnitsStatement = new ShowStorageUnitsStatement(mock(DatabaseSegment.class), null);
-        resultSet.init(database, showStorageUnitsStatement);
-        Map<Integer, String> nameMap = new HashMap<>(3, 1);
-        nameMap.put(0, "ds_2");
-        nameMap.put(1, "ds_1");
-        nameMap.put(2, "ds_0");
-        int index = 0;
-        while (resultSet.next()) {
-            Collection<Object> actual = resultSet.getRowData();
-            assertThat(actual.size(), is(12));
-            Iterator<Object> rowData = actual.iterator();
-            assertThat(rowData.next(), is(nameMap.get(index)));
-            assertThat(rowData.next(), is("MySQL"));
-            assertThat(rowData.next(), is("localhost"));
-            assertThat(rowData.next(), is(3307));
-            assertThat(rowData.next(), is(nameMap.get(index)));
-            assertThat(rowData.next(), is(""));
-            assertThat(rowData.next(), is(""));
-            assertThat(rowData.next(), is(""));
-            assertThat(rowData.next(), is("100"));
-            assertThat(rowData.next(), is("10"));
-            assertThat(rowData.next(), is(""));
-            assertThat(rowData.next(), is(""));
-            index++;
-        }
-    }
-    
-    @Test
-    public void assertUnusedStorageUnit() {
-        StorageUnitResultSet resultSet = new StorageUnitResultSet();
-        ShowStorageUnitsStatement showStorageUnitsStatement = new ShowStorageUnitsStatement(mock(DatabaseSegment.class), 0);
-        resultSet.init(database, showStorageUnitsStatement);
-        Collection<Object> actual = resultSet.getRowData();
-        assertThat(actual.size(), is(12));
-        Iterator<Object> rowData = actual.iterator();
-        assertThat(rowData.next(), is("ds_2"));
-        assertThat(rowData.next(), is("MySQL"));
-        assertThat(rowData.next(), is("localhost"));
-        assertThat(rowData.next(), is(3307));
-        assertThat(rowData.next(), is("ds_2"));
-        assertThat(rowData.next(), is(""));
-        assertThat(rowData.next(), is(""));
-        assertThat(rowData.next(), is(""));
-        assertThat(rowData.next(), is("100"));
-        assertThat(rowData.next(), is("10"));
-        assertThat(rowData.next(), is(""));
-        assertThat(rowData.next(), is(""));
-    }
-}