You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/11/20 11:08:53 UTC

[shardingsphere] branch master updated: Add rules wrapper of parser test case xml (#22292)

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

duanzhengqiang 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 e1931ccef47 Add rules wrapper of parser test case xml (#22292)
e1931ccef47 is described below

commit e1931ccef475ff0ec439f8c0efe69fd51ad33839
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Sun Nov 20 19:08:46 2022 +0800

    Add rules wrapper of parser test case xml (#22292)
---
 .../drop/impl/DropShadowRuleStatementAssert.java   |   2 +-
 .../ExpectedCommonTableExpressColumnsClause.java   |  38 --
 .../ral/AlterTrafficRuleStatementTestCase.java     |   2 +
 .../ral/CreateTrafficRuleStatementTestCase.java    |   2 +
 ...seDiscoveryDefinitionRuleStatementTestCase.java |   2 +
 ...seDiscoveryDefinitionRuleStatementTestCase.java |   2 +
 ...DropDatabaseDiscoveryRuleStatementTestCase.java |   2 +
 .../encrypt/AlterEncryptRuleStatementTestCase.java |   2 +
 .../CreateEncryptRuleStatementTestCase.java        |   2 +
 ...terReadwriteSplittingRuleStatementTestCase.java |   2 +
 ...ateReadwriteSplittingRuleStatementTestCase.java |   4 +-
 ...ropReadwriteSplittingRuleStatementTestCase.java |   2 +
 .../shadow/AlterShadowRuleStatementTestCase.java   |   2 +
 .../shadow/CreateShadowRuleStatementTestCase.java  |   2 +
 .../DropShadowAlgorithmStatementTestCase.java      |   2 +
 .../shadow/DropShadowRuleStatementTestCase.java    |   4 +-
 ...lterShardingAutoTableRuleStatementTestCase.java |   2 +
 ...ardingTableReferenceRulesStatementTestCase.java |   2 +
 .../AlterShardingTableRuleStatementTestCase.java   |   2 +
 ...eateShardingAutoTableRuleStatementTestCase.java |   2 +
 ...hardingTableReferenceRuleStatementTestCase.java |   2 +
 .../CreateShardingTableRuleStatementTestCase.java  |   2 +
 ...hardingTableReferenceRuleStatementTestCase.java |   4 +-
 .../src/main/resources/case/ral/updatable.xml      |  58 +-
 test/parser/src/main/resources/case/rdl/alter.xml  | 338 ++++++-----
 test/parser/src/main/resources/case/rdl/create.xml | 662 +++++++++++----------
 test/parser/src/main/resources/case/rdl/drop.xml   |  56 +-
 27 files changed, 648 insertions(+), 554 deletions(-)

diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/rdl/drop/impl/DropShadowRuleStatementAssert.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/rdl/drop/impl/DropShadowRuleStatementAssert.java
index a1e8d2afe24..c448ca6b8b0 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/rdl/drop/impl/DropShadowRuleStatementAssert.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/asserts/statement/rdl/drop/impl/DropShadowRuleStatementAssert.java
@@ -46,7 +46,7 @@ public final class DropShadowRuleStatementAssert {
             assertNull(assertContext.getText("Actual statement should not exist."), actual);
         } else {
             assertNotNull(assertContext.getText("Actual statement should exist."), actual);
-            assertThat(assertContext.getText("Shadow rule assertion error: "), actual.getRuleNames(), is(expected.getRuleName()));
+            assertThat(assertContext.getText("Shadow rule assertion error: "), actual.getRuleNames(), is(expected.getRules()));
             assertThat(assertContext.getText("Shadow rule assertion error: "), actual.isIfExists(), is(expected.isIfExists()));
         }
     }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/segment/impl/with/ExpectedCommonTableExpressColumnsClause.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/segment/impl/with/ExpectedCommonTableExpressColumnsClause.java
deleted file mode 100644
index 31f747895c1..00000000000
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/segment/impl/with/ExpectedCommonTableExpressColumnsClause.java
+++ /dev/null
@@ -1,38 +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.test.sql.parser.internal.cases.parser.domain.segment.impl.with;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.segment.AbstractExpectedSQLSegment;
-import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.segment.impl.column.ExpectedColumn;
-
-import javax.xml.bind.annotation.XmlElement;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Expected common table expression columns clause.
- */
-@Getter
-@Setter
-public final class ExpectedCommonTableExpressColumnsClause extends AbstractExpectedSQLSegment {
-    
-    @XmlElement(name = "column")
-    private List<ExpectedColumn> columns = new LinkedList<>();
-}
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/AlterTrafficRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/AlterTrafficRuleStatementTestCase.java
index 7751a1381ec..6cf41792d0d 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/AlterTrafficRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/AlterTrafficRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterTrafficRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedTrafficRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/CreateTrafficRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/CreateTrafficRuleStatementTestCase.java
index 5ba0d2cce0c..13b1b283a31 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/CreateTrafficRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/ral/CreateTrafficRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateTrafficRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedTrafficRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/AlterDatabaseDiscoveryDefinitionRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/AlterDatabaseDiscoveryDefinitionRuleStatementTestCase.java
index aca64845303..c2315e7da6d 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/AlterDatabaseDiscoveryDefinitionRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/AlterDatabaseDiscoveryDefinitionRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterDatabaseDiscoveryDefinitionRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedDatabaseDiscoveryDefinitionRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/CreateDatabaseDiscoveryDefinitionRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/CreateDatabaseDiscoveryDefinitionRuleStatementTestCase.java
index e1819a912e6..2750aa50c9e 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/CreateDatabaseDiscoveryDefinitionRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/CreateDatabaseDiscoveryDefinitionRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateDatabaseDiscoveryDefinitionRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedDatabaseDiscoveryDefinitionRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/DropDatabaseDiscoveryRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/DropDatabaseDiscoveryRuleStatementTestCase.java
index 10ad139a5c7..f9ae96d4150 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/DropDatabaseDiscoveryRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/dbdiscovery/DropDatabaseDiscoveryRuleStatementTestCase.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.st
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -33,6 +34,7 @@ import java.util.List;
 @Setter
 public final class DropDatabaseDiscoveryRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<String> rules = new LinkedList<>();
     
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/AlterEncryptRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/AlterEncryptRuleStatementTestCase.java
index a1d81b502a9..3ca333ee75b 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/AlterEncryptRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/AlterEncryptRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterEncryptRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedEncryptRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/CreateEncryptRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/CreateEncryptRuleStatementTestCase.java
index c54112ccf99..668cdbaf5c7 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/CreateEncryptRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/encrypt/CreateEncryptRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateEncryptRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedEncryptRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/AlterReadwriteSplittingRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/AlterReadwriteSplittingRuleStatementTestCase.java
index 91c50d6f874..d0bddd142c3 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/AlterReadwriteSplittingRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/AlterReadwriteSplittingRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterReadwriteSplittingRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExceptedReadwriteSplittingRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/CreateReadwriteSplittingRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/CreateReadwriteSplittingRuleStatementTestCase.java
index 01c85b643fa..29ddd1b0f59 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/CreateReadwriteSplittingRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/CreateReadwriteSplittingRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateReadwriteSplittingRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
-    private List<ExceptedReadwriteSplittingRule> rules = new LinkedList<>();
+    private final List<ExceptedReadwriteSplittingRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/DropReadwriteSplittingRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/DropReadwriteSplittingRuleStatementTestCase.java
index 209c551249a..f63381f7f4d 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/DropReadwriteSplittingRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/readwritesplitting/DropReadwriteSplittingRuleStatementTestCase.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.DropRuleStatementTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -30,6 +31,7 @@ import java.util.List;
 @Getter
 public final class DropReadwriteSplittingRuleStatementTestCase extends DropRuleStatementTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<String> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/AlterShadowRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/AlterShadowRuleStatementTestCase.java
index de04c6bd958..be5f96f0576 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/AlterShadowRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/AlterShadowRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterShadowRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedShadowRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/CreateShadowRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/CreateShadowRuleStatementTestCase.java
index b6b5d33315e..b15069b730d 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/CreateShadowRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/CreateShadowRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateShadowRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedShadowRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowAlgorithmStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowAlgorithmStatementTestCase.java
index 3a5f9f8be49..94a4ee4eee3 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowAlgorithmStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowAlgorithmStatementTestCase.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.st
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -36,6 +37,7 @@ public final class DropShadowAlgorithmStatementTestCase extends SQLParserTestCas
     @XmlAttribute(name = "if-exists")
     private boolean ifExists;
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<String> ruleName = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowRuleStatementTestCase.java
index be51a1f997f..d1f400f4f55 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/shadow/DropShadowRuleStatementTestCase.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.st
 
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -36,6 +37,7 @@ public final class DropShadowRuleStatementTestCase extends SQLParserTestCase {
     @XmlAttribute(name = "if-exists")
     private boolean ifExists;
     
+    @XmlElementWrapper(name = "rules")
     @XmlElement(name = "rule")
-    private final List<String> ruleName = new LinkedList<>();
+    private final List<String> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingAutoTableRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingAutoTableRuleStatementTestCase.java
index 99f56db0d9c..2dd69b4e4de 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingAutoTableRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingAutoTableRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterShardingAutoTableRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedAutoTableRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableReferenceRulesStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableReferenceRulesStatementTestCase.java
index ba49a94b9f8..b989169c82a 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableReferenceRulesStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableReferenceRulesStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterShardingTableReferenceRulesStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedShardingTableReferenceRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableRuleStatementTestCase.java
index 19115b2eb6a..c6ac5c0a054 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/AlterShardingTableRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class AlterShardingTableRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedTableRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingAutoTableRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingAutoTableRuleStatementTestCase.java
index 689f262209a..bc9b206b7d8 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingAutoTableRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingAutoTableRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateShardingAutoTableRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedAutoTableRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableReferenceRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableReferenceRuleStatementTestCase.java
index a59d51e3edd..c182a671015 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableReferenceRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableReferenceRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateShardingTableReferenceRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedShardingTableReferenceRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableRuleStatementTestCase.java
index 5e7e282e2fd..3b9043c7e8b 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/CreateShardingTableRuleStatementTestCase.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.se
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.SQLParserTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -31,6 +32,7 @@ import java.util.List;
 @Getter
 public final class CreateShardingTableRuleStatementTestCase extends SQLParserTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<ExpectedTableRule> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/DropShardingTableReferenceRuleStatementTestCase.java b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/DropShardingTableReferenceRuleStatementTestCase.java
index 847a3daadc2..040cbb49c0a 100644
--- a/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/DropShardingTableReferenceRuleStatementTestCase.java
+++ b/test/parser/src/main/java/org/apache/shardingsphere/test/sql/parser/internal/cases/parser/domain/statement/rdl/rule/sharding/DropShardingTableReferenceRuleStatementTestCase.java
@@ -18,20 +18,20 @@
 package org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.rdl.rule.sharding;
 
 import lombok.Getter;
-import lombok.Setter;
 import org.apache.shardingsphere.test.sql.parser.internal.cases.parser.domain.statement.DropRuleStatementTestCase;
 
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
 import java.util.LinkedList;
 import java.util.List;
 
 /**
  * Drop sharding table reference rule statement test case.
  */
-@Setter
 @Getter
 public final class DropShardingTableReferenceRuleStatementTestCase extends DropRuleStatementTestCase {
     
+    @XmlElementWrapper
     @XmlElement(name = "rule")
     private final List<String> rules = new LinkedList<>();
 }
diff --git a/test/parser/src/main/resources/case/ral/updatable.xml b/test/parser/src/main/resources/case/ral/updatable.xml
index e6fd8667663..ae4618567f4 100644
--- a/test/parser/src/main/resources/case/ral/updatable.xml
+++ b/test/parser/src/main/resources/case/ral/updatable.xml
@@ -35,35 +35,41 @@
     <alter-xa-transaction-rule sql-case-id="alter-xa-transaction-rule" />
    
     <create-traffic-rule sql-case-id="create-traffic-rule">
-        <rule name="sql_match_traffic">
-            <label>OLTP</label>
-            <traffic-algorithm algorithm-name="SQL_MATCH">
-                <properties>
-                    <property key="sql" value="SELECT * FROM t_order WHERE order_id = ?; UPDATE t_order SET order_id = ?;" />
-                </properties>
-            </traffic-algorithm>
-            <load-balancer algorithm-name="RANDOM">
-                <properties>
-                    <property key="key" value="value" />
-                </properties>
-            </load-balancer>
-        </rule>
+        <rules>
+            <rule name="sql_match_traffic">
+                <label>OLTP</label>
+                <traffic-algorithm algorithm-name="SQL_MATCH">
+                    <properties>
+                        <property key="sql" value="SELECT * FROM t_order WHERE order_id = ?; UPDATE t_order SET order_id = ?;" />
+                    </properties>
+                </traffic-algorithm>
+                <load-balancer algorithm-name="RANDOM">
+                    <properties>
+                        <property key="key" value="value" />
+                    </properties>
+                </load-balancer>
+            </rule>
+        </rules>
     </create-traffic-rule>
+    
     <alter-traffic-rule sql-case-id="alter-traffic-rule">
-        <rule name="sql_match_traffic">
-            <label>OLTP</label>
-            <traffic-algorithm algorithm-name="SQL_MATCH">
-                <properties>
-                    <property key="sql" value="SELECT * FROM t_order WHERE order_id = ?; UPDATE t_order SET order_id = ?;" />
-                </properties>
-            </traffic-algorithm>
-            <load-balancer algorithm-name="RANDOM">
-                <properties>
-                    <property key="key" value="value" />
-                </properties>
-            </load-balancer>
-        </rule>
+        <rules>
+            <rule name="sql_match_traffic">
+                <label>OLTP</label>
+                <traffic-algorithm algorithm-name="SQL_MATCH">
+                    <properties>
+                        <property key="sql" value="SELECT * FROM t_order WHERE order_id = ?; UPDATE t_order SET order_id = ?;" />
+                    </properties>
+                </traffic-algorithm>
+                <load-balancer algorithm-name="RANDOM">
+                    <properties>
+                        <property key="key" value="value" />
+                    </properties>
+                </load-balancer>
+            </rule>
+        </rules>
     </alter-traffic-rule>
+    
     <drop-traffic-rule sql-case-id="drop-traffic-rule">
         <rule-name>rule_name</rule-name>
     </drop-traffic-rule>
diff --git a/test/parser/src/main/resources/case/rdl/alter.xml b/test/parser/src/main/resources/case/rdl/alter.xml
index fcf999f4873..9c63af83f9b 100644
--- a/test/parser/src/main/resources/case/rdl/alter.xml
+++ b/test/parser/src/main/resources/case/rdl/alter.xml
@@ -64,200 +64,224 @@
     </alter-storage-unit>
     
     <alter-sharding-auto-table-rule sql-case-id="alter-sharding-auto-table-rule">
-        <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
-            <data-source>ms_group_0</data-source>
-            <data-source>ms_group_1</data-source>
-            <table-strategy algorithm-name="hash_mod">
-                <properties>
-                    <property key="sharding-count" value="4" />
-                </properties>
-            </table-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
+                <data-source>ms_group_0</data-source>
+                <data-source>ms_group_1</data-source>
+                <table-strategy algorithm-name="hash_mod">
+                    <properties>
+                        <property key="sharding-count" value="4" />
+                    </properties>
+                </table-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </alter-sharding-auto-table-rule>
 
     <alter-sharding-auto-table-rule sql-case-id="alter-sharding-auto-table-rule-with-inline-expression">
-        <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
-            <data-source>ms_group_${0..1}</data-source>
-            <table-strategy algorithm-name="hash_mod">
-                <properties>
-                    <property key="sharding-count" value="4" />
-                </properties>
-            </table-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
+                <data-source>ms_group_${0..1}</data-source>
+                <table-strategy algorithm-name="hash_mod">
+                    <properties>
+                        <property key="sharding-count" value="4" />
+                    </properties>
+                </table-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </alter-sharding-auto-table-rule>
 
     <alter-sharding-table-rule sql-case-id="alter-sharding-table-rule">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </alter-sharding-table-rule>
 
     <alter-sharding-table-rule sql-case-id="alter-sharding-table-rule-complex">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}_${0..1}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="complex" sharding-column="order_id,user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}_${0..1}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="complex" sharding-column="order_id,user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </alter-sharding-table-rule>
     
     <alter-sharding-table-reference-rule sql-case-id="alter-sharding-table-reference-rule">
-        <rule table-groups="t_order,t_order_item" />
-        <rule table-groups="t_1,t_2" />
+        <rules>
+            <rule table-groups="t_order,t_order_item" />
+            <rule table-groups="t_1,t_2" />
+        </rules>
     </alter-sharding-table-reference-rule>
     
     <alter-readwrite-splitting-rule sql-case-id="alter-readwrite-splitting-rule">
-        <rule name="ms_group_0" auto-aware-resource="group_0" load-balancer="random">
-            <properties>
-                <property key="read_weight" value="2:1" />
-            </properties>
-        </rule>
-        <rule name="ms_group_1" write-data-source="primary_ds" load-balancer="random">
-            <read-data-source>replica_ds_0</read-data-source>
-            <read-data-source>replica_ds_1</read-data-source>
-        </rule>
+        <rules>
+            <rule name="ms_group_0" auto-aware-resource="group_0" load-balancer="random">
+                <properties>
+                    <property key="read_weight" value="2:1" />
+                </properties>
+            </rule>
+            <rule name="ms_group_1" write-data-source="primary_ds" load-balancer="random">
+                <read-data-source>replica_ds_0</read-data-source>
+                <read-data-source>replica_ds_1</read-data-source>
+            </rule>
+        </rules>
     </alter-readwrite-splitting-rule>
 
     <alter-database-discovery-definition-rule sql-case-id="alter-database-discovery-definition-rule">
-        <rule rule-name="ha_group_0" type="mgr">
-            <data-source>ds_0</data-source>
-            <data-source>ds_1</data-source>
-            <discovery-type algorithm-name="mgr">
+        <rules>
+            <rule rule-name="ha_group_0" type="mgr">
+                <data-source>ds_0</data-source>
+                <data-source>ds_1</data-source>
+                <discovery-type algorithm-name="mgr">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec" />
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec" />
+                    <property key="keepAliveCron" value="0/5 * * * * ?" />
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/5 * * * * ?" />
-            </properties>
-        </rule>
-        <rule rule-name="ha_group_1" type="mgr2">
-            <data-source>ds_2</data-source>
-            <data-source>ds_3</data-source>
-            <discovery-type algorithm-name="mgr2">
+            </rule>
+            <rule rule-name="ha_group_1" type="mgr2">
+                <data-source>ds_2</data-source>
+                <data-source>ds_3</data-source>
+                <discovery-type algorithm-name="mgr2">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec-2" />
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec-2" />
+                    <property key="keepAliveCron" value="0/6 * * * * ?" />
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/6 * * * * ?" />
-            </properties>
-        </rule>
+            </rule>
+        </rules>
     </alter-database-discovery-definition-rule>
     
     <alter-encrypt-rule sql-case-id="alter-encrypt-rule">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc" />
-                    </properties>
-                </encryptor>
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5" />
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc" />
+                        </properties>
+                    </encryptor>
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5" />
+                </column>
+            </rule>
+        </rules>
     </alter-encrypt-rule>
 
     <alter-encrypt-rule sql-case-id="alter-encrypt-rule-with-assisted-query-column">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" assisted-query-column="assisted_column">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc" />
-                    </properties>
-                </encryptor>
-                <assisted-query-encryptor algorithm-name="MD5" />
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5" />
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" assisted-query-column="assisted_column">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc" />
+                        </properties>
+                    </encryptor>
+                    <assisted-query-encryptor algorithm-name="MD5" />
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5" />
+                </column>
+            </rule>
+        </rules>
     </alter-encrypt-rule>
     
     <alter-encrypt-rule sql-case-id="alter-encrypt-rule-with-like-query-column">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" like-query-column="like_column">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc"/>
-                    </properties>
-                </encryptor>
-                <like-query-encryptor algorithm-name="CHAR_DIGEST_LIKE"/>
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5"/>
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" like-query-column="like_column">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc"/>
+                        </properties>
+                    </encryptor>
+                    <like-query-encryptor algorithm-name="CHAR_DIGEST_LIKE"/>
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5"/>
+                </column>
+            </rule>
+        </rules>
     </alter-encrypt-rule>
     
     <alter-encrypt-rule sql-case-id="alter-encrypt-rule-with-query-with-cipher-column">
-        <rule name="t_encrypt" query-with-cipher-column="false">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc" />
-                    </properties>
-                </encryptor>
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5" />
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt" query-with-cipher-column="false">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc" />
+                        </properties>
+                    </encryptor>
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5" />
+                </column>
+            </rule>
+        </rules>
     </alter-encrypt-rule>
     
     <alter-shadow-rule sql-case-id="alter-shadow-rule">
-        <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
-            <table-rule table-name="t_order">
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
-                    <algorithm algorithm-name="REGEX_MATCH">
-                        <properties>
-                            <property key="operation" value="insert" />
-                            <property key="column" value="user_id" />
-                            <property key="regex" value="[1]" />
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
-                    <algorithm algorithm-name="SIMPLE_HINT">
-                        <properties>
-                            <property key="shadow" value="true" />
-                            <property key="foo" value="bar" />
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-            </table-rule>
-        </rule>
+        <rules>
+            <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
+                <table-rule table-name="t_order">
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
+                        <algorithm algorithm-name="REGEX_MATCH">
+                            <properties>
+                                <property key="operation" value="insert" />
+                                <property key="column" value="user_id" />
+                                <property key="regex" value="[1]" />
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
+                        <algorithm algorithm-name="SIMPLE_HINT">
+                            <properties>
+                                <property key="shadow" value="true" />
+                                <property key="foo" value="bar" />
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                </table-rule>
+            </rule>
+        </rules>
     </alter-shadow-rule>
     
     <alter-default-shadow-algorithm sql-case-id="alter-default-shadow-algorithm">
diff --git a/test/parser/src/main/resources/case/rdl/create.xml b/test/parser/src/main/resources/case/rdl/create.xml
index 19ac01f032b..825e7c35917 100644
--- a/test/parser/src/main/resources/case/rdl/create.xml
+++ b/test/parser/src/main/resources/case/rdl/create.xml
@@ -73,186 +73,204 @@
     </register-storage-unit>
     
     <create-sharding-auto-table-rule sql-case-id="create-sharding-auto-table-rule">
-        <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
-            <data-source>ms_group_0</data-source>
-            <data-source>ms_group_1</data-source>
-            <table-strategy algorithm-name="hash_mod">
-                <properties>
-                    <property key="sharding-count" value="4"/>
-                </properties>
-            </table-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
+                <data-source>ms_group_0</data-source>
+                <data-source>ms_group_1</data-source>
+                <table-strategy algorithm-name="hash_mod">
+                    <properties>
+                        <property key="sharding-count" value="4"/>
+                    </properties>
+                </table-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </create-sharding-auto-table-rule>
 
     <create-sharding-auto-table-rule sql-case-id="create-sharding-auto-table-rule-with-quota">
-        <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
-            <data-source>ms_group_0</data-source>
-            <data-source>ms_group_1</data-source>
-            <table-strategy algorithm-name="hash_mod">
-                <properties>
-                    <property key="sharding-count" value="4"/>
-                </properties>
-            </table-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
+                <data-source>ms_group_0</data-source>
+                <data-source>ms_group_1</data-source>
+                <table-strategy algorithm-name="hash_mod">
+                    <properties>
+                        <property key="sharding-count" value="4"/>
+                    </properties>
+                </table-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </create-sharding-auto-table-rule>
     
     <create-sharding-auto-table-rule sql-case-id="create-sharding-auto-table-rule-with-inline-expression">
-        <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
-            <data-source>ms_group_${0..1}</data-source>
-            <table-strategy algorithm-name="hash_mod">
-                <properties>
-                    <property key="sharding-count" value="4" />
-                </properties>
-            </table-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" table-strategy-column="order_id" key-generate-strategy-column="another_id">
+                <data-source>ms_group_${0..1}</data-source>
+                <table-strategy algorithm-name="hash_mod">
+                    <properties>
+                        <property key="sharding-count" value="4" />
+                    </properties>
+                </table-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </create-sharding-auto-table-rule>
 
     <create-sharding-table-rule sql-case-id="create-sharding-table-rule">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
-        <rule name="t_order_item" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+            <rule name="t_order_item" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+            </rule>
+        </rules>
     </create-sharding-table-rule>
 
     <create-sharding-table-rule sql-case-id="create-sharding-table-rule-with-enum-inline-expression">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${['abc','ac']}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_name">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_name}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
-        <rule name="t_order_item" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${['abc','ac']}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_name">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_name}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+            <rule name="t_order_item" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+            </rule>
+        </rules>
     </create-sharding-table-rule>
 
     <create-sharding-table-rule sql-case-id="create-sharding-table-rule-complex">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}_${0..1}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="complex" sharding-column="order_id,user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
-        <rule name="t_order_item" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}_${0..1}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="complex" sharding-column="order_id,user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+            <rule name="t_order_item" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_item_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_item_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+            </rule>
+        </rules>
     </create-sharding-table-rule>
     
     <create-sharding-table-rule sql-case-id="create-sharding-table-rule-with-auto-create-algorithm">
-        <rule name="t_order" key-generate-strategy-column="another_id">
-            <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
-            <table-strategy type="standard" sharding-column="user_id">
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="t_order_${user_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </table-strategy>
-            <database-strategy type="standard" sharding-column="order_id" >
-                <algorithm-segment algorithm-name="INLINE">
-                    <properties>
-                        <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
-                    </properties>
-                </algorithm-segment>
-            </database-strategy>
-            <key-generate-strategy algorithm-name="snowflake" />
-        </rule>
+        <rules>
+            <rule name="t_order" key-generate-strategy-column="another_id">
+                <data-node>ms_group_${0..1}.t_order_${0..1}</data-node>
+                <table-strategy type="standard" sharding-column="user_id">
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="t_order_${user_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </table-strategy>
+                <database-strategy type="standard" sharding-column="order_id" >
+                    <algorithm-segment algorithm-name="INLINE">
+                        <properties>
+                            <property key="algorithm-expression" value="ms_group_${order_id % 2}" />
+                        </properties>
+                    </algorithm-segment>
+                </database-strategy>
+                <key-generate-strategy algorithm-name="snowflake" />
+            </rule>
+        </rules>
     </create-sharding-table-rule>
     
     <create-sharding-table-reference-rule sql-case-id="create-sharding-table-reference-rule">
-        <rule table-groups="t_order,t_order_item" />
-        <rule table-groups="t_1,t_2" />
+        <rules>
+            <rule table-groups="t_order,t_order_item" />
+            <rule table-groups="t_1,t_2" />
+        </rules>
     </create-sharding-table-reference-rule>
 
     <create-sharding-table-reference-rule sql-case-id="create-sharding-table-reference-rule-with-quota">
-        <rule table-groups="t_order,t_order_item" />
-        <rule table-groups="t_1,t_2"/>
+        <rules>
+            <rule table-groups="t_order,t_order_item" />
+            <rule table-groups="t_1,t_2"/>
+        </rules>
     </create-sharding-table-reference-rule>
     
     <create-broadcast-table-rule sql-case-id="create-broadcast-table-rule">
@@ -266,201 +284,225 @@
     </create-broadcast-table-rule>
     
     <create-readwrite-splitting-rule sql-case-id="create-static-readwrite-splitting-rule">
-        <rule name="ms_group_0" write-data-source="primary_ds" load-balancer="random">
-            <read-data-source>replica_ds_0</read-data-source>
-            <read-data-source>replica_ds_1</read-data-source>
-        </rule>
+        <rules>
+            <rule name="ms_group_0" write-data-source="primary_ds" load-balancer="random">
+                <read-data-source>replica_ds_0</read-data-source>
+                <read-data-source>replica_ds_1</read-data-source>
+            </rule>
+        </rules>
     </create-readwrite-splitting-rule>
 
     <create-readwrite-splitting-rule sql-case-id="create-readwrite-splitting-rule-with-quota">
-        <rule name="ms_group_0" write-data-source="primary_ds" load-balancer="random">
-            <read-data-source>replica_ds_0</read-data-source>
-            <read-data-source>replica_ds_1</read-data-source>
-        </rule>
+        <rules>
+            <rule name="ms_group_0" write-data-source="primary_ds" load-balancer="random">
+                <read-data-source>replica_ds_0</read-data-source>
+                <read-data-source>replica_ds_1</read-data-source>
+            </rule>
+        </rules>
     </create-readwrite-splitting-rule>
     
     <create-readwrite-splitting-rule sql-case-id="create-dynamic-readwrite-splitting-rule">
-        <rule name="ms_group_1" auto-aware-resource="group_0" load-balancer="random">
-            <properties>
-                <property key="read_weight" value="2:1" />
-            </properties>
-        </rule>
+        <rules>
+            <rule name="ms_group_1" auto-aware-resource="group_0" load-balancer="random">
+                <properties>
+                    <property key="read_weight" value="2:1" />
+                </properties>
+            </rule>
+        </rules>
     </create-readwrite-splitting-rule>
     
     <create-database-discovery-definition-rule sql-case-id="create-database-discovery-definition-rule">
-        <rule rule-name="ha_group_0" type="mgr">
-            <data-source>ds_0</data-source>
-            <data-source>ds_1</data-source>
-            <discovery-type algorithm-name="mgr">
+        <rules>
+            <rule rule-name="ha_group_0" type="mgr">
+                <data-source>ds_0</data-source>
+                <data-source>ds_1</data-source>
+                <discovery-type algorithm-name="mgr">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec" />
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec" />
+                    <property key="keepAliveCron" value="0/5 * * * * ?" />
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/5 * * * * ?" />
-            </properties>
-        </rule>
-        <rule rule-name="ha_group_1" type="mgr2">
-            <data-source>ds_2</data-source>
-            <data-source>ds_3</data-source>
-            <discovery-type algorithm-name="mgr2">
+            </rule>
+            <rule rule-name="ha_group_1" type="mgr2">
+                <data-source>ds_2</data-source>
+                <data-source>ds_3</data-source>
+                <discovery-type algorithm-name="mgr2">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec-2" />
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec-2" />
+                    <property key="keepAliveCron" value="0/6 * * * * ?" />
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/6 * * * * ?" />
-            </properties>
-        </rule>
+            </rule>
+        </rules>
     </create-database-discovery-definition-rule>
 
     <create-database-discovery-definition-rule sql-case-id="create-database-discovery-rule-with-quota">
-        <rule rule-name="ha_group_0" type="mgr">
-            <data-source>ds_0</data-source>
-            <data-source>ds_1</data-source>
-            <discovery-type algorithm-name="mgr">
+        <rules>
+            <rule rule-name="ha_group_0" type="mgr">
+                <data-source>ds_0</data-source>
+                <data-source>ds_1</data-source>
+                <discovery-type algorithm-name="mgr">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec"/>
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec"/>
+                    <property key="keepAliveCron" value="0/5 * * * * ?"/>
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/5 * * * * ?"/>
-            </properties>
-        </rule>
-        <rule rule-name="ha_group_1" type="mgr2">
-            <data-source>ds_2</data-source>
-            <data-source>ds_3</data-source>
-            <discovery-type algorithm-name="mgr2">
+            </rule>
+            <rule rule-name="ha_group_1" type="mgr2">
+                <data-source>ds_2</data-source>
+                <data-source>ds_3</data-source>
+                <discovery-type algorithm-name="mgr2">
+                    <properties>
+                        <property key="groupName" value="92504d5b-6dec-2"/>
+                    </properties>
+                </discovery-type>
                 <properties>
-                    <property key="groupName" value="92504d5b-6dec-2"/>
+                    <property key="keepAliveCron" value="0/6 * * * * ?"/>
                 </properties>
-            </discovery-type>
-            <properties>
-                <property key="keepAliveCron" value="0/6 * * * * ?"/>
-            </properties>
-        </rule>
+            </rule>
+        </rules>
     </create-database-discovery-definition-rule>
     
     <create-encrypt-rule sql-case-id="create-encrypt-rule">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc"/>
-                    </properties>
-                </encryptor>
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5"/>
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc"/>
+                        </properties>
+                    </encryptor>
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5"/>
+                </column>
+            </rule>
+        </rules>
     </create-encrypt-rule>
 
     <create-encrypt-rule sql-case-id="create-encrypt-rule-with-quota">
-        <rule name="encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc"/>
-                    </properties>
-                </encryptor>
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5"/>
-            </column>
-        </rule>
+        <rules>
+            <rule name="encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc"/>
+                        </properties>
+                    </encryptor>
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5"/>
+                </column>
+            </rule>
+        </rules>
     </create-encrypt-rule>
     
     <create-encrypt-rule sql-case-id="create-encrypt-rule-with-assisted-query-column">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" assisted-query-column="assisted_column">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc"/>
-                    </properties>
-                </encryptor>
-                <assisted-query-encryptor algorithm-name="MD5" />
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5"/>
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" assisted-query-column="assisted_column">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc"/>
+                        </properties>
+                    </encryptor>
+                    <assisted-query-encryptor algorithm-name="MD5" />
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5"/>
+                </column>
+            </rule>
+        </rules>
     </create-encrypt-rule>
     
     <create-encrypt-rule sql-case-id="create-encrypt-rule-with-like-query-column">
-        <rule name="t_encrypt">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" like-query-column="like_column">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc"/>
-                    </properties>
-                </encryptor>
-                <like-query-encryptor algorithm-name="CHAR_DIGEST_LIKE" />
-            </column>
-            <column name="order_id" cipher-column="order_cipher">
-                <encryptor algorithm-name="MD5"/>
-            </column>
-        </rule>
+        <rules>
+            <rule name="t_encrypt">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher" like-query-column="like_column">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc"/>
+                        </properties>
+                    </encryptor>
+                    <like-query-encryptor algorithm-name="CHAR_DIGEST_LIKE" />
+                </column>
+                <column name="order_id" cipher-column="order_cipher">
+                    <encryptor algorithm-name="MD5"/>
+                </column>
+            </rule>
+        </rules>
     </create-encrypt-rule>
     
     <create-encrypt-rule sql-case-id="create-encrypt-rule-with-query-with-cipher-column">
-        <rule name="encrypt" query-with-cipher-column="false">
-            <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
-                <encryptor algorithm-name="AES">
-                    <properties>
-                        <property key="aes-key-value" value="123456abc" />
-                    </properties>
-                </encryptor>
-            </column>
-        </rule>
+        <rules>
+            <rule name="encrypt" query-with-cipher-column="false">
+                <column name="user_id" plain-column="user_plain" cipher-column="user_cipher">
+                    <encryptor algorithm-name="AES">
+                        <properties>
+                            <property key="aes-key-value" value="123456abc" />
+                        </properties>
+                    </encryptor>
+                </column>
+            </rule>
+        </rules>
     </create-encrypt-rule>
     
     <create-shadow-rule sql-case-id="create-shadow-rule">
-        <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
-            <table-rule table-name="t_order">
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
-                    <algorithm algorithm-name="REGEX_MATCH">
-                        <properties>
-                            <property key="operation" value="insert"/>
-                            <property key="column" value="user_id"/>
-                            <property key="regex" value="[1]"/>
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
-                    <algorithm algorithm-name="SIMPLE_HINT">
-                        <properties>
-                            <property key="shadow" value="true"/>
-                            <property key="foo" value="bar"/>
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-            </table-rule>
-        </rule>
+        <rules>
+            <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
+                <table-rule table-name="t_order">
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
+                        <algorithm algorithm-name="REGEX_MATCH">
+                            <properties>
+                                <property key="operation" value="insert"/>
+                                <property key="column" value="user_id"/>
+                                <property key="regex" value="[1]"/>
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
+                        <algorithm algorithm-name="SIMPLE_HINT">
+                            <properties>
+                                <property key="shadow" value="true"/>
+                                <property key="foo" value="bar"/>
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                </table-rule>
+            </rule>
+        </rules>
     </create-shadow-rule>
     
     <create-shadow-rule sql-case-id="create-shadow-rule-with-quota">
-        <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
-            <table-rule table-name="t_order">
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
-                    <algorithm algorithm-name="REGEX_MATCH">
-                        <properties>
-                            <property key="operation" value="insert"/>
-                            <property key="column" value="user_id"/>
-                            <property key="regex" value="[1]"/>
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-                <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
-                    <algorithm algorithm-name="SIMPLE_HINT">
-                        <properties>
-                            <property key="shadow" value="true"/>
-                            <property key="foo" value="bar"/>
-                        </properties>
-                    </algorithm>
-                </shadow-algorithm>
-            </table-rule>
-        </rule>
+        <rules>
+            <rule name="rule" rule-name="shadow_rule" source="demo_ds" shadow="demo_ds_shadow">
+                <table-rule table-name="t_order">
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_regex_match_0">
+                        <algorithm algorithm-name="REGEX_MATCH">
+                            <properties>
+                                <property key="operation" value="insert"/>
+                                <property key="column" value="user_id"/>
+                                <property key="regex" value="[1]"/>
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                    <shadow-algorithm algorithm-id="shadow_rule_t_order_simple_hint_1">
+                        <algorithm algorithm-name="SIMPLE_HINT">
+                            <properties>
+                                <property key="shadow" value="true"/>
+                                <property key="foo" value="bar"/>
+                            </properties>
+                        </algorithm>
+                    </shadow-algorithm>
+                </table-rule>
+            </rule>
+        </rules>
     </create-shadow-rule>
     
     <create-default-sharding-strategy sql-case-id="create-default-sharding-table-strategy-with-lower-case">
diff --git a/test/parser/src/main/resources/case/rdl/drop.xml b/test/parser/src/main/resources/case/rdl/drop.xml
index eafb79896f8..1fe227daeb1 100644
--- a/test/parser/src/main/resources/case/rdl/drop.xml
+++ b/test/parser/src/main/resources/case/rdl/drop.xml
@@ -46,11 +46,15 @@
     </drop-sharding-table-rule>
     
     <drop-sharding-table-reference-rule sql-case-id="drop-sharding-table-reference-rule">
-        <rule>t_1,t_2</rule>
+        <rules>
+            <rule>t_1,t_2</rule>
+        </rules>
     </drop-sharding-table-reference-rule>
 
     <drop-sharding-table-reference-rule sql-case-id="drop-sharding-table-reference-rule-if-exists" if-exists="true">
-        <rule>t_1,t_2</rule>
+        <rules>
+            <rule>t_1,t_2</rule>
+        </rules>
     </drop-sharding-table-reference-rule>
     
     <drop-broadcast-table-rule sql-case-id="drop-broadcast-table-rule" >
@@ -67,23 +71,31 @@
     </drop-broadcast-table-rule>
 
     <drop-readwrite-splitting-rule sql-case-id="drop-readwrite-splitting-rule">
-        <rule>ms_group_0</rule>
-        <rule>ms_group_1</rule>
+        <rules>
+            <rule>ms_group_0</rule>
+            <rule>ms_group_1</rule>
+        </rules>
     </drop-readwrite-splitting-rule>
 
     <drop-readwrite-splitting-rule sql-case-id="drop-readwrite-splitting-rule-if-exists" if-exists="true">
-        <rule>ms_group_0</rule>
-        <rule>ms_group_1</rule>
+        <rules>
+            <rule>ms_group_0</rule>
+            <rule>ms_group_1</rule>
+        </rules>
     </drop-readwrite-splitting-rule>
     
     <drop-database-discovery-rule sql-case-id="drop-database-discovery-rule">
-        <rule>ha_group_0</rule>
-        <rule>ha_group_1</rule>
+        <rules>
+            <rule>ha_group_0</rule>
+            <rule>ha_group_1</rule>
+        </rules>
     </drop-database-discovery-rule>
     
     <drop-database-discovery-rule sql-case-id="drop-database-discovery-rule-if-exists" if-exists="true">
-        <rule>ha_group_0</rule>
-        <rule>ha_group_1</rule>
+        <rules>
+            <rule>ha_group_0</rule>
+            <rule>ha_group_1</rule>
+        </rules>
     </drop-database-discovery-rule>
 
     <drop-database-discovery-type sql-case-id="drop-database-discovery-type">
@@ -117,23 +129,31 @@
     </drop-encrypt-rule>
     
     <drop-shadow-rule sql-case-id="drop-shadow-rule">
-        <rule>shadow_rule_1</rule>
-        <rule>shadow_rule_2</rule>
+        <rules>
+            <rule>shadow_rule_1</rule>
+            <rule>shadow_rule_2</rule>
+        </rules>
     </drop-shadow-rule>
     
     <drop-shadow-rule sql-case-id="drop-shadow-rule-if-exists" if-exists="true">
-        <rule>shadow_rule_1</rule>
-        <rule>shadow_rule_2</rule>
+        <rules>
+            <rule>shadow_rule_1</rule>
+            <rule>shadow_rule_2</rule>
+        </rules>
     </drop-shadow-rule>
 
     <drop-shadow-algorithm sql-case-id="drop-shadow-algorithm">
-        <rule>shadow_algorithm_1</rule>
-        <rule>shadow_algorithm_2</rule>
+        <rules>
+            <rule>shadow_algorithm_1</rule>
+            <rule>shadow_algorithm_2</rule>
+        </rules>
     </drop-shadow-algorithm>
 
     <drop-shadow-algorithm sql-case-id="drop-shadow-algorithm-if-exists" if-exists="true">
-        <rule>shadow_algorithm_1</rule>
-        <rule>shadow_algorithm_2</rule>
+        <rules>
+            <rule>shadow_algorithm_1</rule>
+            <rule>shadow_algorithm_2</rule>
+        </rules>
     </drop-shadow-algorithm>
 
     <drop-shadow-algorithm sql-case-id="drop-default-shadow-algorithm-if-exists" if-exists="true"/>