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

[shardingsphere] branch master updated: Add DistSQL & configuration for load single table (#26046)

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

panjuan 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 4ad053c677b Add DistSQL & configuration for load single table (#26046)
4ad053c677b is described below

commit 4ad053c677b2ead63c93d754431ef2685c648d78
Author: Raigor <ra...@gmail.com>
AuthorDate: Mon Jun 5 09:41:23 2023 +0800

    Add DistSQL & configuration for load single table (#26046)
---
 .../single/api/config/SingleRuleConfiguration.java |  6 +++
 .../config/pojo/YamlSingleRuleConfiguration.java   |  5 ++
 .../YamlSingleRuleConfigurationSwapper.java        |  2 +
 .../engine/SingleStandardRouteEngineTest.java      |  2 +-
 .../single/rule/builder/SingleRuleBuilderTest.java |  2 +-
 .../YamlSingleRuleConfigurationSwapperTest.java    |  4 +-
 ...wDefaultSingleTableStorageUnitExecutorTest.java |  2 +-
 .../single/{RDLStatement.g4 => BaseRule.g4}        | 16 ++++--
 .../src/main/antlr4/imports/single/Keyword.g4      | 20 ++++++++
 .../src/main/antlr4/imports/single/RDLStatement.g4 | 21 ++++++--
 .../src/main/antlr4/imports/single/RQLStatement.g4 | 15 +++---
 .../parser/autogen/SingleDistSQLStatement.g4       |  3 ++
 .../parser/core/SingleDistSQLStatementVisitor.java | 52 +++++++++++++++++++
 .../distsql/segment/SingleTableSegment.java}       | 26 ++++++----
 .../statement/rdl/LoadSingleTableStatement.java}   | 23 ++++-----
 .../statement/rdl/UnloadSingleTableStatement.java} | 23 ++++-----
 .../rql/ShowUnloadedSingleTableStatement.java      | 58 ++++++++++++++++++++++
 17 files changed, 227 insertions(+), 53 deletions(-)

diff --git a/kernel/single/api/src/main/java/org/apache/shardingsphere/single/api/config/SingleRuleConfiguration.java b/kernel/single/api/src/main/java/org/apache/shardingsphere/single/api/config/SingleRuleConfiguration.java
index 8b98a6db138..92ad53d2c4a 100644
--- a/kernel/single/api/src/main/java/org/apache/shardingsphere/single/api/config/SingleRuleConfiguration.java
+++ b/kernel/single/api/src/main/java/org/apache/shardingsphere/single/api/config/SingleRuleConfiguration.java
@@ -18,11 +18,14 @@
 package org.apache.shardingsphere.single.api.config;
 
 import lombok.AllArgsConstructor;
+import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.infra.config.rule.function.EnhancedRuleConfiguration;
 import org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
 
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Optional;
 
 /**
@@ -33,6 +36,9 @@ import java.util.Optional;
 @Setter
 public final class SingleRuleConfiguration implements DatabaseRuleConfiguration, EnhancedRuleConfiguration {
     
+    @Getter
+    private Collection<String> tables = new LinkedList<>();
+    
     private String defaultDataSource;
     
     /**
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
index 3e3ff212bad..c3521955393 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
@@ -22,6 +22,9 @@ import lombok.Setter;
 import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 
+import java.util.Collection;
+import java.util.LinkedList;
+
 /**
  * Single rule configuration for YAML.
  */
@@ -29,6 +32,8 @@ import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 @Setter
 public final class YamlSingleRuleConfiguration implements YamlRuleConfiguration {
     
+    private Collection<String> tables = new LinkedList<>();
+    
     private String defaultDataSource;
     
     @Override
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/YamlSingleRuleConfigurationSwapper.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/YamlSingleRuleConfigurationSwapper.java
index 42e52b2c291..bb1e254d441 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/YamlSingleRuleConfigurationSwapper.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/swapper/YamlSingleRuleConfigurationSwapper.java
@@ -30,6 +30,7 @@ public final class YamlSingleRuleConfigurationSwapper implements YamlRuleConfigu
     @Override
     public YamlSingleRuleConfiguration swapToYamlConfiguration(final SingleRuleConfiguration data) {
         YamlSingleRuleConfiguration result = new YamlSingleRuleConfiguration();
+        result.getTables().addAll(data.getTables());
         data.getDefaultDataSource().ifPresent(result::setDefaultDataSource);
         return result;
     }
@@ -37,6 +38,7 @@ public final class YamlSingleRuleConfigurationSwapper implements YamlRuleConfigu
     @Override
     public SingleRuleConfiguration swapToObject(final YamlSingleRuleConfiguration yamlConfig) {
         SingleRuleConfiguration result = new SingleRuleConfiguration();
+        result.getTables().addAll(yamlConfig.getTables());
         result.setDefaultDataSource(yamlConfig.getDefaultDataSource());
         return result;
     }
diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
index e319f338879..b4856a0056c 100644
--- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
+++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
@@ -106,7 +106,7 @@ class SingleStandardRouteEngineTest {
     @Test
     void assertRouteWithDefaultSingleRule() throws SQLException {
         SingleStandardRouteEngine engine = new SingleStandardRouteEngine(mockQualifiedTables(), new MySQLCreateTableStatement(false));
-        SingleRule singleRule = new SingleRule(new SingleRuleConfiguration("ds_0"), DefaultDatabase.LOGIC_NAME, createDataSourceMap(), Collections.emptyList());
+        SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(Collections.emptyList(), "ds_0"), DefaultDatabase.LOGIC_NAME, createDataSourceMap(), Collections.emptyList());
         RouteContext routeContext = new RouteContext();
         engine.route(routeContext, singleRule);
         List<RouteUnit> routeUnits = new ArrayList<>(routeContext.getRouteUnits());
diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
index 4e46805ad98..129c6b01545 100644
--- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
+++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/builder/SingleRuleBuilderTest.java
@@ -47,7 +47,7 @@ class SingleRuleBuilderTest {
     void assertBuildWithDefaultDataSource() {
         DatabaseRuleBuilder builder = OrderedSPILoader.getServices(DatabaseRuleBuilder.class).iterator().next();
         DatabaseRule actual = builder.build(
-                new SingleRuleConfiguration("foo_ds"), "", Collections.emptyMap(), Collections.singleton(mock(ShardingSphereRule.class)), mock(InstanceContext.class));
+                new SingleRuleConfiguration(Collections.emptyList(), "foo_ds"), "", Collections.emptyMap(), Collections.singleton(mock(ShardingSphereRule.class)), mock(InstanceContext.class));
         assertThat(actual, instanceOf(SingleRule.class));
     }
 }
diff --git a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/swapper/YamlSingleRuleConfigurationSwapperTest.java b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/swapper/YamlSingleRuleConfigurationSwapperTest.java
index e7820a812b2..a2fd8855c7c 100644
--- a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/swapper/YamlSingleRuleConfigurationSwapperTest.java
+++ b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/swapper/YamlSingleRuleConfigurationSwapperTest.java
@@ -22,6 +22,8 @@ import org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfigura
 import org.apache.shardingsphere.single.yaml.config.swapper.YamlSingleRuleConfigurationSwapper;
 import org.junit.jupiter.api.Test;
 
+import java.util.Collections;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -46,7 +48,7 @@ class YamlSingleRuleConfigurationSwapperTest {
     
     @Test
     void assertSwapToYaml() {
-        assertThat(new YamlSingleRuleConfigurationSwapper().swapToYamlConfiguration(new SingleRuleConfiguration("ds_0")).getDefaultDataSource(), is("ds_0"));
+        assertThat(new YamlSingleRuleConfigurationSwapper().swapToYamlConfiguration(new SingleRuleConfiguration(Collections.emptyList(), "ds_0")).getDefaultDataSource(), is("ds_0"));
     }
     
     @Test
diff --git a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/ShowDefaultSingleTableStorageUnitExecutorTest.java b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/ShowDefaultSingleTableStorageUnitExecutorTest.java
index 01c057e7a15..25e02025bee 100644
--- a/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/ShowDefaultSingleTableStorageUnitExecutorTest.java
+++ b/kernel/single/distsql/handler/src/test/java/org/apache/shardingsphere/single/distsql/handler/query/ShowDefaultSingleTableStorageUnitExecutorTest.java
@@ -59,7 +59,7 @@ class ShowDefaultSingleTableStorageUnitExecutorTest {
     private ShardingSphereDatabase mockDatabase() {
         ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
         SingleRule singleRule = mock(SingleRule.class);
-        when(singleRule.getConfiguration()).thenReturn(new SingleRuleConfiguration("foo_ds"));
+        when(singleRule.getConfiguration()).thenReturn(new SingleRuleConfiguration(Collections.emptyList(), "foo_ds"));
         when(result.getRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.singleton(singleRule)));
         return result;
     }
diff --git a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4 b/kernel/single/distsql/parser/src/main/antlr4/imports/single/BaseRule.g4
similarity index 87%
copy from kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4
copy to kernel/single/distsql/parser/src/main/antlr4/imports/single/BaseRule.g4
index 9d79c7eb2bf..79ab5c501c2 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4
+++ b/kernel/single/distsql/parser/src/main/antlr4/imports/single/BaseRule.g4
@@ -15,14 +15,22 @@
  * limitations under the License.
  */
 
-grammar RDLStatement;
+grammar BaseRule;
 
 import Symbol, Keyword, Literals;
 
-setDefaultSingleTableStorageUnit
-    : SET DEFAULT SINGLE TABLE STORAGE UNIT EQ_ (storageUnitName | RANDOM)
+storageUnitName
+    : IDENTIFIER_
     ;
 
-storageUnitName
+databaseName
+    : IDENTIFIER_
+    ;
+
+schemaName
+    : IDENTIFIER_
+    ;
+
+tableName
     : IDENTIFIER_
     ;
diff --git a/kernel/single/distsql/parser/src/main/antlr4/imports/single/Keyword.g4 b/kernel/single/distsql/parser/src/main/antlr4/imports/single/Keyword.g4
index 38b2ff61786..4f8a8f634df 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/imports/single/Keyword.g4
+++ b/kernel/single/distsql/parser/src/main/antlr4/imports/single/Keyword.g4
@@ -70,3 +70,23 @@ COUNT
 LIKE
     : L I K E
     ;
+
+SCHEMA
+    : S C H E M A
+    ;
+
+INTO
+    : I N T O
+    ;
+
+LOAD
+    : L O A D
+    ;
+
+UNLOAD
+    : U N L O A D
+    ;
+
+UNLOADED
+    : U N L O A D E D
+    ;
diff --git a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4 b/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4
index 9d79c7eb2bf..2ce38d74069 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4
+++ b/kernel/single/distsql/parser/src/main/antlr4/imports/single/RDLStatement.g4
@@ -17,12 +17,27 @@
 
 grammar RDLStatement;
 
-import Symbol, Keyword, Literals;
+import BaseRule;
 
 setDefaultSingleTableStorageUnit
     : SET DEFAULT SINGLE TABLE STORAGE UNIT EQ_ (storageUnitName | RANDOM)
     ;
 
-storageUnitName
-    : IDENTIFIER_
+loadSingleTable
+    : LOAD SINGLE TABLE tableDefinition
+    ;
+
+unloadSingleTable
+    : UNLOAD SINGLE TABLE tableDefinition
+    ;
+
+tableDefinition
+    : tableIdentifier (COMMA_ tableIdentifier)*
+    ;
+
+tableIdentifier
+    : ASTERISK_ DOTASTERISK_ # allTables
+    | storageUnitName DOTASTERISK_ # allTablesFromStorageUnit
+    | storageUnitName DOT_ tableName # tableFromStorageUnit
+    | storageUnitName DOT_ schemaName DOT_ tableName # tableFromSchema
     ;
diff --git a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RQLStatement.g4 b/kernel/single/distsql/parser/src/main/antlr4/imports/single/RQLStatement.g4
index fb2ca92cca4..ebc14ff51a4 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/imports/single/RQLStatement.g4
+++ b/kernel/single/distsql/parser/src/main/antlr4/imports/single/RQLStatement.g4
@@ -17,7 +17,7 @@
 
 grammar RQLStatement;
 
-import Symbol, Keyword, Literals;
+import BaseRule;
 
 showDefaultSingleTableStorageUnit
     : SHOW DEFAULT SINGLE TABLE STORAGE UNIT (FROM databaseName)?
@@ -27,16 +27,17 @@ showSingleTable
     : SHOW SINGLE (TABLES showLike? | TABLE tableName) (FROM databaseName)?
     ;
 
-countSingleTable
-    : COUNT SINGLE TABLE (FROM databaseName)?
+showUnloadedSingleTables
+    : SHOW UNLOADED SINGLE TABLES (FROM fromClause)?
     ;
 
-databaseName
-    : IDENTIFIER_
+fromClause
+    : databaseName (STORAGE UNIT storageUnitName (SCHEMA schemaName)?)?
+    | STORAGE UNIT storageUnitName (SCHEMA schemaName)?
     ;
 
-tableName
-    : IDENTIFIER_
+countSingleTable
+    : COUNT SINGLE TABLE (FROM databaseName)?
     ;
 
 showLike
diff --git a/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4 b/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4
index 4e6f7df90dd..345618d4c3e 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4
+++ b/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4
@@ -24,5 +24,8 @@ execute
     | showDefaultSingleTableStorageUnit
     | showSingleTable
     | countSingleTable
+    | loadSingleTable
+    | unloadSingleTable
+    | showUnloadedSingleTables
     ) SEMI_? EOF
     ;
diff --git a/kernel/single/distsql/parser/src/main/java/org/apache/shardingsphere/single/distsql/parser/core/SingleDistSQLStatementVisitor.java b/kernel/single/distsql/parser/src/main/java/org/apache/shardingsphere/single/distsql/parser/core/SingleDistSQLStatementVisitor.java
index 397c60d7b39..12f1b1c9ec0 100644
--- a/kernel/single/distsql/parser/src/main/java/org/apache/shardingsphere/single/distsql/parser/core/SingleDistSQLStatementVisitor.java
+++ b/kernel/single/distsql/parser/src/main/java/org/apache/shardingsphere/single/distsql/parser/core/SingleDistSQLStatementVisitor.java
@@ -19,20 +19,35 @@ package org.apache.shardingsphere.single.distsql.parser.core;
 
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementBaseVisitor;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.AllTablesFromStorageUnitContext;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.CountSingleTableContext;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.DatabaseNameContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.FromClauseContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.LoadSingleTableContext;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.SetDefaultSingleTableStorageUnitContext;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.ShowDefaultSingleTableStorageUnitContext;
 import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.ShowSingleTableContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.ShowUnloadedSingleTablesContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.TableFromSchemaContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.TableFromStorageUnitContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.TableIdentifierContext;
+import org.apache.shardingsphere.distsql.parser.autogen.SingleDistSQLStatementParser.UnloadSingleTableContext;
+import org.apache.shardingsphere.single.distsql.segment.SingleTableSegment;
+import org.apache.shardingsphere.single.distsql.statement.rdl.LoadSingleTableStatement;
 import org.apache.shardingsphere.single.distsql.statement.rdl.SetDefaultSingleTableStorageUnitStatement;
+import org.apache.shardingsphere.single.distsql.statement.rdl.UnloadSingleTableStatement;
 import org.apache.shardingsphere.single.distsql.statement.rql.CountSingleTableStatement;
 import org.apache.shardingsphere.single.distsql.statement.rql.ShowDefaultSingleTableStorageUnitStatement;
 import org.apache.shardingsphere.single.distsql.statement.rql.ShowSingleTableStatement;
+import org.apache.shardingsphere.single.distsql.statement.rql.ShowUnloadedSingleTableStatement;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.visitor.SQLVisitor;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 
+import java.util.Collection;
+import java.util.stream.Collectors;
+
 /**
  * SQL statement visitor for single DistSQL.
  */
@@ -59,6 +74,43 @@ public final class SingleDistSQLStatementVisitor extends SingleDistSQLStatementB
                 null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
     }
     
+    @Override
+    public ASTNode visitLoadSingleTable(final LoadSingleTableContext ctx) {
+        Collection<SingleTableSegment> tables = ctx.tableDefinition().tableIdentifier().stream().map(this::getSingleTableSegment).collect(Collectors.toList());
+        return new LoadSingleTableStatement(tables);
+    }
+    
+    @Override
+    public ASTNode visitUnloadSingleTable(final UnloadSingleTableContext ctx) {
+        Collection<SingleTableSegment> tables = ctx.tableDefinition().tableIdentifier().stream().map(this::getSingleTableSegment).collect(Collectors.toList());
+        return new UnloadSingleTableStatement(tables);
+    }
+    
+    private SingleTableSegment getSingleTableSegment(final TableIdentifierContext ctx) {
+        if (ctx instanceof AllTablesFromStorageUnitContext) {
+            return new SingleTableSegment(getIdentifierValue(((AllTablesFromStorageUnitContext) ctx).storageUnitName()), "*", "*");
+        }
+        if (ctx instanceof TableFromStorageUnitContext) {
+            TableFromStorageUnitContext tableContext = (TableFromStorageUnitContext) ctx;
+            return new SingleTableSegment(getIdentifierValue(tableContext.storageUnitName()), "*", getIdentifierValue(tableContext.tableName()));
+        }
+        if (ctx instanceof TableFromSchemaContext) {
+            TableFromSchemaContext tableContext = (TableFromSchemaContext) ctx;
+            return new SingleTableSegment(getIdentifierValue(tableContext.storageUnitName()), getIdentifierValue(tableContext.schemaName()), getIdentifierValue(tableContext.tableName()));
+        }
+        return new SingleTableSegment("*", "*", "*");
+    }
+    
+    @Override
+    public ASTNode visitShowUnloadedSingleTables(final ShowUnloadedSingleTablesContext ctx) {
+        return null == ctx.fromClause() ? new ShowUnloadedSingleTableStatement(null, null, null) : visitShowUnloadedSingleTablesWithFromClause(ctx.fromClause());
+    }
+    
+    private ASTNode visitShowUnloadedSingleTablesWithFromClause(final FromClauseContext ctx) {
+        return new ShowUnloadedSingleTableStatement(null == ctx.storageUnitName() ? null : getIdentifierValue(ctx.storageUnitName()),
+                null == ctx.schemaName() ? null : getIdentifierValue(ctx.schemaName()), null == ctx.databaseName() ? null : (DatabaseSegment) visit(ctx.databaseName()));
+    }
+    
     @Override
     public ASTNode visitDatabaseName(final DatabaseNameContext ctx) {
         return new DatabaseSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), new IdentifierValue(ctx.getText()));
diff --git a/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4 b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
similarity index 65%
copy from kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4
copy to kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
index 4e6f7df90dd..286fca0aef2 100644
--- a/kernel/single/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/SingleDistSQLStatement.g4
+++ b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
@@ -15,14 +15,22 @@
  * limitations under the License.
  */
 
-grammar SingleDistSQLStatement;
+package org.apache.shardingsphere.single.distsql.segment;
 
-import Symbol, RDLStatement, RQLStatement;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.api.ASTNode;
 
-execute
-    : (setDefaultSingleTableStorageUnit
-    | showDefaultSingleTableStorageUnit
-    | showSingleTable
-    | countSingleTable
-    ) SEMI_? EOF
-    ;
+/**
+ * Single table segment.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class SingleTableSegment implements ASTNode {
+    
+    private final String storageUnitName;
+    
+    private final String schemaName;
+    
+    private final String tableName;
+}
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/LoadSingleTableStatement.java
similarity index 60%
copy from kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
copy to kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/LoadSingleTableStatement.java
index 3e3ff212bad..2b7c75f7915 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
+++ b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/LoadSingleTableStatement.java
@@ -15,24 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.yaml.config.pojo;
+package org.apache.shardingsphere.single.distsql.statement.rdl;
 
 import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
-import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRuleStatement;
+import org.apache.shardingsphere.single.distsql.segment.SingleTableSegment;
+
+import java.util.Collection;
 
 /**
- * Single rule configuration for YAML.
+ * Load single table statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public final class YamlSingleRuleConfiguration implements YamlRuleConfiguration {
-    
-    private String defaultDataSource;
+public final class LoadSingleTableStatement extends CreateRuleStatement {
     
-    @Override
-    public Class<SingleRuleConfiguration> getRuleConfigurationType() {
-        return SingleRuleConfiguration.class;
-    }
+    private final Collection<SingleTableSegment> tables;
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/UnloadSingleTableStatement.java
similarity index 60%
copy from kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
copy to kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/UnloadSingleTableStatement.java
index 3e3ff212bad..c50303a928e 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/yaml/config/pojo/YamlSingleRuleConfiguration.java
+++ b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rdl/UnloadSingleTableStatement.java
@@ -15,24 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.yaml.config.pojo;
+package org.apache.shardingsphere.single.distsql.statement.rdl;
 
 import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
-import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.DropRuleStatement;
+import org.apache.shardingsphere.single.distsql.segment.SingleTableSegment;
+
+import java.util.Collection;
 
 /**
- * Single rule configuration for YAML.
+ * Unload single table statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public final class YamlSingleRuleConfiguration implements YamlRuleConfiguration {
-    
-    private String defaultDataSource;
+public final class UnloadSingleTableStatement extends DropRuleStatement {
     
-    @Override
-    public Class<SingleRuleConfiguration> getRuleConfigurationType() {
-        return SingleRuleConfiguration.class;
-    }
+    private final Collection<SingleTableSegment> tables;
 }
diff --git a/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rql/ShowUnloadedSingleTableStatement.java b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rql/ShowUnloadedSingleTableStatement.java
new file mode 100644
index 00000000000..4703f8e69fc
--- /dev/null
+++ b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/statement/rql/ShowUnloadedSingleTableStatement.java
@@ -0,0 +1,58 @@
+/*
+ * 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.single.distsql.statement.rql;
+
+import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowTablesStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DatabaseSegment;
+
+import java.util.Optional;
+
+/**
+ * Show unloaded single table statement.
+ */
+public final class ShowUnloadedSingleTableStatement extends ShowTablesStatement {
+    
+    private final String storageUnitName;
+    
+    private final String schemaName;
+    
+    public ShowUnloadedSingleTableStatement(final String storageUnitName, final String schemaName, final DatabaseSegment database) {
+        // TODO support like later
+        super(null, database);
+        this.storageUnitName = storageUnitName;
+        this.schemaName = schemaName;
+    }
+    
+    /**
+     * Get storage unit name.
+     *
+     * @return storage unit name
+     */
+    public Optional<String> getStorageUnitName() {
+        return Optional.ofNullable(storageUnitName);
+    }
+    
+    /**
+     * Get schema name.
+     *
+     * @return schema name
+     */
+    public Optional<String> getSchemaName() {
+        return Optional.ofNullable(schemaName);
+    }
+}