You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/01/05 14:46:02 UTC

[shardingsphere] branch master updated: Fixes #23350, add a DistSQL to show logical tables. (#23362)

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

zhonghongsheng 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 26999bd02c3 Fixes #23350, add a DistSQL to show logical tables. (#23362)
26999bd02c3 is described below

commit 26999bd02c3b1613c3508373963334d698c37361
Author: Raigor <ra...@gmail.com>
AuthorDate: Thu Jan 5 22:45:56 2023 +0800

    Fixes #23350, add a DistSQL to show logical tables. (#23362)
---
 distsql/parser/src/main/antlr4/imports/Keyword.g4  |  4 ++
 .../parser/src/main/antlr4/imports/RQLStatement.g4 | 20 +++++--
 .../parser/autogen/KernelDistSQLStatement.g4       |  1 +
 .../core/kernel/KernelDistSQLStatementVisitor.java | 10 +++-
 ...tement.java => ShowLogicalTablesStatement.java} | 16 ++----
 .../rql/show/ShowSingleTableStatement.java         | 22 ++++---
 ...ableStatement.java => ShowTablesStatement.java} | 37 ++++++++----
 ...leResultSet.java => LogicalTableResultSet.java} | 41 ++++++-------
 .../distsql/rql/rule/SingleTableResultSet.java     | 14 ++---
 ...here.distsql.handler.resultset.DistSQLResultSet |  1 +
 .../distsql/rql/LogicalTableResultSetTest.java     | 67 ++++++++++++++++++++++
 11 files changed, 166 insertions(+), 67 deletions(-)

diff --git a/distsql/parser/src/main/antlr4/imports/Keyword.g4 b/distsql/parser/src/main/antlr4/imports/Keyword.g4
index b9e2e7a9da3..dd3484f4abf 100644
--- a/distsql/parser/src/main/antlr4/imports/Keyword.g4
+++ b/distsql/parser/src/main/antlr4/imports/Keyword.g4
@@ -135,6 +135,10 @@ DATABASE
     : D A T A B A S E
     ;
 
+LOGICAL
+    : L O G I C A L
+    ;
+
 SINGLE
     : S I N G L E
     ;
diff --git a/distsql/parser/src/main/antlr4/imports/RQLStatement.g4 b/distsql/parser/src/main/antlr4/imports/RQLStatement.g4
index 04d5d9c7c03..cda3cf195c8 100644
--- a/distsql/parser/src/main/antlr4/imports/RQLStatement.g4
+++ b/distsql/parser/src/main/antlr4/imports/RQLStatement.g4
@@ -23,16 +23,20 @@ showStorageUnits
     : SHOW STORAGE UNITS (FROM databaseName)? (WHERE USAGE_COUNT EQ_ usageCount)?
     ;
 
+showRulesUsedStorageUnit
+    : SHOW RULES USED STORAGE UNIT storageUnitName (FROM databaseName)?
+    ;
+
+showLogicalTables
+    : SHOW LOGICAL TABLES showLike? (FROM databaseName)?
+    ;
+
 showDefaultSingleTableStorageUnit
     : SHOW DEFAULT SINGLE TABLE STORAGE UNIT (FROM databaseName)?
     ;
 
 showSingleTable
-    : SHOW SINGLE (TABLES (LIKE likeLiteral)? | TABLE tableName) (FROM databaseName)?
-    ;
-
-showRulesUsedStorageUnit
-    : SHOW RULES USED STORAGE UNIT storageUnitName (FROM databaseName)?
+    : SHOW SINGLE (TABLES showLike? | TABLE tableName) (FROM databaseName)?
     ;
 
 countSingleTableRule
@@ -43,6 +47,10 @@ usageCount
     : INT_
     ;
 
-likeLiteral
+showLike
+    : LIKE likePattern
+    ;
+
+likePattern
     : STRING_
     ;
diff --git a/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4 b/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
index 7089795e9dd..6a975b2302e 100644
--- a/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
+++ b/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
@@ -41,6 +41,7 @@ execute
     | prepareDistSQL
     | applyDistSQL
     | discardDistSQL
+    | showLogicalTables
     | showSingleTable
     | showDefaultSingleTableStorageUnit
     | setDefaultSingleTableStorageUnit
diff --git a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index e1ab03a2086..79e33274ba1 100644
--- a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -56,6 +56,7 @@ import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementPa
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowDefaultSingleTableStorageUnitContext;
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowDistVariableContext;
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowDistVariablesContext;
+import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowLogicalTablesContext;
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowMigrationRuleContext;
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowRulesUsedStorageUnitContext;
 import org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ShowSingleTableContext;
@@ -101,6 +102,7 @@ import org.apache.shardingsphere.distsql.parser.statement.rdl.create.SetDefaultS
 import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.UnregisterStorageUnitStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.CountSingleTableRuleStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowDefaultSingleTableStorageUnitStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowLogicalTablesStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowRulesUsedStorageUnitStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowSingleTableStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowStorageUnitsStatement;
@@ -239,6 +241,12 @@ public final class KernelDistSQLStatementVisitor extends KernelDistSQLStatementB
         return new SetDistVariableStatement(getIdentifierValue(ctx.variableName()), getIdentifierValue(ctx.variableValue()));
     }
     
+    @Override
+    public ASTNode visitShowLogicalTables(final ShowLogicalTablesContext ctx) {
+        return new ShowLogicalTablesStatement(null == ctx.showLike() ? null : getIdentifierValue(ctx.showLike().likePattern()),
+                null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
+    }
+    
     @Override
     public ASTNode visitShowDefaultSingleTableStorageUnit(final ShowDefaultSingleTableStorageUnitContext ctx) {
         return new ShowDefaultSingleTableStorageUnitStatement(null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
@@ -246,7 +254,7 @@ public final class KernelDistSQLStatementVisitor extends KernelDistSQLStatementB
     
     @Override
     public ASTNode visitShowSingleTable(final ShowSingleTableContext ctx) {
-        return new ShowSingleTableStatement(null == ctx.TABLE() ? null : getIdentifierValue(ctx.tableName()), null == ctx.likeLiteral() ? null : getIdentifierValue(ctx.likeLiteral()),
+        return new ShowSingleTableStatement(null == ctx.TABLE() ? null : getIdentifierValue(ctx.tableName()), null == ctx.showLike() ? null : getIdentifierValue(ctx.showLike().likePattern()),
                 null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
     }
     
diff --git a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowLogicalTablesStatement.java
similarity index 69%
copy from distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
copy to distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowLogicalTablesStatement.java
index 1139d77405f..6ec4dd8f3d7 100644
--- a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
+++ b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowLogicalTablesStatement.java
@@ -17,22 +17,14 @@
 
 package org.apache.shardingsphere.distsql.parser.statement.rql.show;
 
-import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
 
 /**
- * Show single table statement.
+ * Show logical tables statement.
  */
-@Getter
-public final class ShowSingleTableStatement extends ShowRulesStatement {
+public final class ShowLogicalTablesStatement extends ShowTablesStatement {
     
-    private final String tableName;
-    
-    private final String likeLiteral;
-    
-    public ShowSingleTableStatement(final String tableName, final String likeLiteral, final DatabaseSegment database) {
-        super(database);
-        this.tableName = tableName;
-        this.likeLiteral = likeLiteral;
+    public ShowLogicalTablesStatement(final String likePattern, final DatabaseSegment database) {
+        super(likePattern, database);
     }
 }
diff --git a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
index 1139d77405f..d39372b2a60 100644
--- a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
+++ b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
@@ -17,22 +17,28 @@
 
 package org.apache.shardingsphere.distsql.parser.statement.rql.show;
 
-import lombok.Getter;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
 
+import java.util.Optional;
+
 /**
  * Show single table statement.
  */
-@Getter
-public final class ShowSingleTableStatement extends ShowRulesStatement {
+public final class ShowSingleTableStatement extends ShowTablesStatement {
     
     private final String tableName;
     
-    private final String likeLiteral;
-    
-    public ShowSingleTableStatement(final String tableName, final String likeLiteral, final DatabaseSegment database) {
-        super(database);
+    public ShowSingleTableStatement(final String tableName, final String likePattern, final DatabaseSegment database) {
+        super(likePattern, database);
         this.tableName = tableName;
-        this.likeLiteral = likeLiteral;
+    }
+    
+    /**
+     * Get table name.
+     *
+     * @return table name
+     */
+    public Optional<String> getTableName() {
+        return Optional.ofNullable(tableName);
     }
 }
diff --git a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowTablesStatement.java
similarity index 54%
copy from distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
copy to distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowTablesStatement.java
index 1139d77405f..b38e834d985 100644
--- a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowSingleTableStatement.java
+++ b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rql/show/ShowTablesStatement.java
@@ -17,22 +17,39 @@
 
 package org.apache.shardingsphere.distsql.parser.statement.rql.show;
 
-import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.rql.RQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.available.FromDatabaseAvailable;
+
+import java.util.Optional;
 
 /**
- * Show single table statement.
+ * Show tables statement.
  */
-@Getter
-public final class ShowSingleTableStatement extends ShowRulesStatement {
+@RequiredArgsConstructor
+public abstract class ShowTablesStatement extends RQLStatement implements FromDatabaseAvailable {
+    
+    private final String likePattern;
     
-    private final String tableName;
+    private final DatabaseSegment database;
     
-    private final String likeLiteral;
+    /**
+     * Get like pattern.
+     *
+     * @return like pattern
+     */
+    public Optional<String> getLikePattern() {
+        return Optional.ofNullable(likePattern);
+    }
     
-    public ShowSingleTableStatement(final String tableName, final String likeLiteral, final DatabaseSegment database) {
-        super(database);
-        this.tableName = tableName;
-        this.likeLiteral = likeLiteral;
+    /**
+     * Get database.
+     *
+     * @return database
+     */
+    @Override
+    public final Optional<DatabaseSegment> getDatabase() {
+        return Optional.ofNullable(database);
     }
 }
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/LogicalTableResultSet.java
similarity index 53%
copy from proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/SingleTableResultSet.java
copy to proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/rule/LogicalTableResultSet.java
index 90bd55a3fbc..df24818a2cd 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/LogicalTableResultSet.java
@@ -17,49 +17,44 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule;
 
-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.distsql.parser.statement.rql.show.ShowLogicalTablesStatement;
+import org.apache.shardingsphere.infra.database.type.SchemaSupportedDatabaseType;
 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.Objects;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
- * Result set for show single table.
+ * Result set for show logical table.
  */
-public final class SingleTableResultSet implements DatabaseDistSQLResultSet {
+public final class LogicalTableResultSet implements DatabaseDistSQLResultSet {
     
-    private Iterator<DataNode> data = Collections.emptyIterator();
+    private Iterator<String> data = Collections.emptyIterator();
     
     @Override
     public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
-        ShowSingleTableStatement showSingleTableStatement = (ShowSingleTableStatement) sqlStatement;
-        Stream<DataNode> singleTableRules = 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 (null != showSingleTableStatement.getTableName()) {
-            singleTableRules = singleTableRules.filter(each -> showSingleTableStatement.getTableName().equals(each.getTableName()));
+        String schemaName = database.getName();
+        if (database.getProtocolType() instanceof SchemaSupportedDatabaseType) {
+            schemaName = ((SchemaSupportedDatabaseType) database.getProtocolType()).getDefaultSchema();
         }
-        if (null != showSingleTableStatement.getLikeLiteral()) {
-            String pattern = SQLUtil.convertLikePatternToRegex(showSingleTableStatement.getLikeLiteral());
-            singleTableRules = singleTableRules.filter(each -> RegularUtil.matchesCaseInsensitive(pattern, each.getTableName())).collect(Collectors.toList()).stream();
+        Collection<String> tables = database.getSchema(schemaName).getAllTableNames();
+        ShowLogicalTablesStatement showLogicalTablesStatement = (ShowLogicalTablesStatement) sqlStatement;
+        if (showLogicalTablesStatement.getLikePattern().isPresent()) {
+            String pattern = SQLUtil.convertLikePatternToRegex(showLogicalTablesStatement.getLikePattern().get());
+            tables = tables.stream().filter(each -> RegularUtil.matchesCaseInsensitive(pattern, each)).collect(Collectors.toList());
         }
-        data = singleTableRules.sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList()).iterator();
+        data = tables.iterator();
     }
     
     @Override
     public Collection<String> getColumnNames() {
-        return Arrays.asList("table_name", "storage_unit_name");
+        return Collections.singletonList("table_name");
     }
     
     @Override
@@ -69,12 +64,12 @@ public final class SingleTableResultSet implements DatabaseDistSQLResultSet {
     
     @Override
     public Collection<Object> getRowData() {
-        DataNode next = data.next();
-        return Arrays.asList(next.getTableName(), next.getDataSourceName());
+        String next = data.next();
+        return Collections.singletonList(next);
     }
     
     @Override
     public String getType() {
-        return ShowSingleTableStatement.class.getName();
+        return ShowLogicalTablesStatement.class.getName();
     }
 }
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/SingleTableResultSet.java
index 90bd55a3fbc..224495eaadc 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/SingleTableResultSet.java
@@ -45,16 +45,16 @@ public final class SingleTableResultSet implements DatabaseDistSQLResultSet {
     @Override
     public void init(final ShardingSphereDatabase database, final SQLStatement sqlStatement) {
         ShowSingleTableStatement showSingleTableStatement = (ShowSingleTableStatement) sqlStatement;
-        Stream<DataNode> singleTableRules = database.getRuleMetaData().getRules().stream().filter(each -> each instanceof SingleRule)
+        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 (null != showSingleTableStatement.getTableName()) {
-            singleTableRules = singleTableRules.filter(each -> showSingleTableStatement.getTableName().equals(each.getTableName()));
+        if (showSingleTableStatement.getTableName().isPresent()) {
+            singleTableNodes = singleTableNodes.filter(each -> showSingleTableStatement.getTableName().get().equals(each.getTableName()));
         }
-        if (null != showSingleTableStatement.getLikeLiteral()) {
-            String pattern = SQLUtil.convertLikePatternToRegex(showSingleTableStatement.getLikeLiteral());
-            singleTableRules = singleTableRules.filter(each -> RegularUtil.matchesCaseInsensitive(pattern, each.getTableName())).collect(Collectors.toList()).stream();
+        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 = singleTableRules.sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList()).iterator();
+        data = singleTableNodes.sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList()).iterator();
     }
     
     @Override
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 4fd687d961d..04bb9335500 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
@@ -16,6 +16,7 @@
 #
 
 org.apache.shardingsphere.proxy.backend.handler.distsql.rql.resource.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
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/LogicalTableResultSetTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/LogicalTableResultSetTest.java
new file mode 100644
index 00000000000..79a7985b437
--- /dev/null
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rql/LogicalTableResultSetTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.ShowLogicalTablesStatement;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import org.apache.shardingsphere.proxy.backend.handler.distsql.rql.rule.LogicalTableResultSet;
+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 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 LogicalTableResultSetTest {
+    
+    @Mock
+    private ShardingSphereDatabase database;
+    
+    @Before
+    public void before() {
+        when(database.getName()).thenReturn("sharding_db");
+        when(database.getProtocolType()).thenReturn(mock(DatabaseType.class));
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+        when(database.getSchema("sharding_db")).thenReturn(schema);
+        when(schema.getAllTableNames()).thenReturn(Arrays.asList("t_order", "t_order_item"));
+    }
+    
+    @Test
+    public void assertGetRowData() {
+        LogicalTableResultSet resultSet = new LogicalTableResultSet();
+        resultSet.init(database, mock(ShowLogicalTablesStatement.class));
+        assertThat(resultSet.getRowData().iterator().next(), is("t_order"));
+        assertThat(resultSet.getRowData().iterator().next(), is("t_order_item"));
+    }
+    
+    @Test
+    public void assertRowDataWithLike() {
+        LogicalTableResultSet resultSet = new LogicalTableResultSet();
+        resultSet.init(database, new ShowLogicalTablesStatement("t_order_%", null));
+        assertThat(resultSet.getRowData().iterator().next(), is("t_order_item"));
+    }
+}