You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2021/05/20 03:17:15 UTC
[shardingsphere] branch master updated: parse create & alter & drop
encrypt rule rdl (#10392)
This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 a03742e1 parse create & alter & drop encrypt rule rdl (#10392)
a03742e1 is described below
commit a03742e184643df96a9b90f16c2538bd3d3aa7c9
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Thu May 20 11:16:29 2021 +0800
parse create & alter & drop encrypt rule rdl (#10392)
* parse create & alter & drop encrypt rule rdl
* parse create & alter & drop encrypt rule rdl
Co-authored-by: menghaoranss <me...@apache.org>
---
.../src/main/antlr4/imports/Keyword.g4 | 12 ++++
.../src/main/antlr4/imports/RDLStatement.g4 | 28 +++++++++
.../distsql/parser/autogen/DistSQLStatement.g4 | 3 +
.../distsql/parser/core/DistSQLVisitor.java | 43 +++++++++++++-
.../api/DistSQLStatementParserEngineTest.java | 68 ++++++++++++++++++++++
.../parser/segment/rdl/EncryptColumnSegment.java | 39 +++++++++++++
.../parser/segment/rdl/EncryptRuleSegment.java | 36 ++++++++++++
.../rdl/alter/AlterEncryptRuleStatement.java | 35 +++++++++++
.../create/impl/CreateEncryptRuleStatement.java | 35 +++++++++++
.../rdl/drop/impl/DropEncryptRuleStatement.java | 34 +++++++++++
10 files changed, 332 insertions(+), 1 deletion(-)
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4 b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
index cae0395..c776696 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/Keyword.g4
@@ -210,3 +210,15 @@ BROADCAST
DB_DISCOVERY
: D B UL_ D I S C O V E R Y
;
+
+COLUMNS
+ : C O L U M N S
+ ;
+
+CIPHER
+ : C I P H E R
+ ;
+
+PLAIN
+ : P L A I N
+ ;
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4 b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
index e5515b6..a62c895 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/imports/RDLStatement.g4
@@ -202,3 +202,31 @@ alterDatabaseDiscoveryRule
dropDatabaseDiscoveryRule
: DROP DB_DISCOVERY RULE IDENTIFIER (COMMA IDENTIFIER)*
;
+
+createEncryptRule
+ : CREATE ENCRYPT RULE encryptRuleDefinition (COMMA encryptRuleDefinition)*
+ ;
+
+encryptRuleDefinition
+ : tableName LP RESOURCE EQ resourceName COMMA COLUMNS LP columnDefinition (COMMA columnDefinition)* RP RP
+ ;
+
+columnDefinition
+ : LP NAME EQ columnName (COMMA PLAIN EQ plainColumnName)? COMMA CIPHER EQ cipherColumnName COMMA functionDefinition RP
+ ;
+
+alterEncryptRule
+ : ALTER ENCRYPT RULE encryptRuleDefinition (COMMA encryptRuleDefinition)*
+ ;
+
+dropEncryptRule
+ : DROP ENCRYPT RULE IDENTIFIER (COMMA IDENTIFIER)*
+ ;
+
+plainColumnName
+ : IDENTIFIER
+ ;
+
+cipherColumnName
+ : IDENTIFIER
+ ;
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4 b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
index 0a176e1..35bc920 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/DistSQLStatement.g4
@@ -37,6 +37,9 @@ execute
| createDatabaseDiscoveryRule
| alterDatabaseDiscoveryRule
| dropDatabaseDiscoveryRule
+ | createEncryptRule
+ | alterEncryptRule
+ | dropEncryptRule
| showResources
| showRule
| showScalingJobList
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
index fccdbb9..522abfb 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
@@ -48,6 +48,8 @@ import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
import org.apache.shardingsphere.distsql.parser.segment.FunctionSegment;
import org.apache.shardingsphere.distsql.parser.segment.TableRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.DatabaseDiscoveryRuleSegment;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptColumnSegment;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.ReadwriteSplittingRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.ShardingBindingTableRuleSegment;
import org.apache.shardingsphere.distsql.parser.statement.ral.impl.CheckScalingJobStatement;
@@ -58,17 +60,20 @@ import org.apache.shardingsphere.distsql.parser.statement.ral.impl.ShowScalingJo
import org.apache.shardingsphere.distsql.parser.statement.ral.impl.StartScalingJobStatement;
import org.apache.shardingsphere.distsql.parser.statement.ral.impl.StopScalingJobStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingBroadcastTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBroadcastTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropResourceStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropShardingBindingTableRulesStatement;
@@ -83,6 +88,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.Identifi
import java.util.Collection;
import java.util.LinkedList;
+import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
@@ -90,7 +96,7 @@ import java.util.stream.Collectors;
* Dist SQL visitor.
*/
public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
-
+
@Override
public ASTNode visitAddResource(final AddResourceContext ctx) {
Collection<DataSourceSegment> connectionInfos = new LinkedList<>();
@@ -303,6 +309,41 @@ public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
}
@Override
+ public ASTNode visitCreateEncryptRule(final DistSQLStatementParser.CreateEncryptRuleContext ctx) {
+ return new CreateEncryptRuleStatement(ctx.encryptRuleDefinition()
+ .stream().map(each -> (EncryptRuleSegment) visit(each)).collect(Collectors.toList()));
+ }
+
+ @Override
+ public ASTNode visitEncryptRuleDefinition(final DistSQLStatementParser.EncryptRuleDefinitionContext ctx) {
+ return new EncryptRuleSegment(ctx.tableName().getText(), ctx.columnDefinition()
+ .stream().map(each -> (EncryptColumnSegment) visit(each)).collect(Collectors.toList()));
+ }
+
+ @Override
+ public ASTNode visitColumnDefinition(final DistSQLStatementParser.ColumnDefinitionContext ctx) {
+ EncryptColumnSegment result = new EncryptColumnSegment();
+ result.setName(ctx.columnName().getText());
+ result.setCipherColumn(ctx.cipherColumnName().getText());
+ if (Objects.nonNull(ctx.plainColumnName())) {
+ result.setPlainColumn(ctx.plainColumnName().getText());
+ }
+ result.setEncryptor((FunctionSegment) visit(ctx.functionDefinition()));
+ return result;
+ }
+
+ @Override
+ public ASTNode visitAlterEncryptRule(final DistSQLStatementParser.AlterEncryptRuleContext ctx) {
+ return new AlterEncryptRuleStatement(ctx.encryptRuleDefinition()
+ .stream().map(each -> (EncryptRuleSegment) visit(each)).collect(Collectors.toList()));
+ }
+
+ @Override
+ public ASTNode visitDropEncryptRule(final DistSQLStatementParser.DropEncryptRuleContext ctx) {
+ return new DropEncryptRuleStatement(ctx.IDENTIFIER().stream().map(TerminalNode::getText).collect(Collectors.toList()));
+ }
+
+ @Override
public ASTNode visitTableName(final TableNameContext ctx) {
return new TableNameSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), new IdentifierValue(ctx.getText()));
}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
index 4772490..5f50043 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/test/java/org/apache/shardingsphere/distsql/parser/api/DistSQLStatementParserEngineTest.java
@@ -20,19 +20,24 @@ package org.apache.shardingsphere.distsql.parser.api;
import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
import org.apache.shardingsphere.distsql.parser.segment.TableRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.DatabaseDiscoveryRuleSegment;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptColumnSegment;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptRuleSegment;
import org.apache.shardingsphere.distsql.parser.segment.rdl.ShardingBindingTableRuleSegment;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingBroadcastTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterShardingTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBindingTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingBroadcastTableRulesStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingTableRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropDatabaseDiscoveryRuleStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropEncryptRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropReadwriteSplittingRuleStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropResourceStatement;
import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropShardingBindingTableRulesStatement;
@@ -129,6 +134,22 @@ public final class DistSQLStatementParserEngineTest {
private static final String RDL_DROP_DATABASE_DISCOVERY_RULE = "DROP DB_DISCOVERY RULE ha_group_0,ha_group_1";
+ private static final String RDL_CREATE_ENCRYPT_RULE = "CREATE ENCRYPT RULE t_encrypt ("
+ + "RESOURCE=ds_1,"
+ + "COLUMNS("
+ + "(NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),"
+ + "(NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))"
+ + "))";
+
+ private static final String RDL_ALTER_ENCRYPT_RULE = "ALTER ENCRYPT RULE t_encrypt ("
+ + "RESOURCE=ds_1,"
+ + "COLUMNS("
+ + "(NAME=user_id,PLAIN=user_plain,CIPHER=user_cipher,TYPE(NAME=AES,PROPERTIES('aes-key-value'='123456abc'))),"
+ + "(NAME=order_id, CIPHER =order_cipher,TYPE(NAME=MD5))"
+ + "))";
+
+ private static final String RDL_DROP_ENCRYPT_RULE = "DROP ENCRYPT RULE t_encrypt,t_encrypt_order";
+
private final DistSQLStatementParserEngine engine = new DistSQLStatementParserEngine();
@Test
@@ -345,4 +366,51 @@ public final class DistSQLStatementParserEngineTest {
assertTrue(sqlStatement instanceof DropDatabaseDiscoveryRuleStatement);
assertThat(((DropDatabaseDiscoveryRuleStatement) sqlStatement).getRuleNames(), is(Arrays.asList("ha_group_0", "ha_group_1")));
}
+
+ @Test
+ public void assertParseCreateEncryptRule() {
+ SQLStatement sqlStatement = engine.parse(RDL_CREATE_ENCRYPT_RULE);
+ assertTrue(sqlStatement instanceof CreateEncryptRuleStatement);
+ CreateEncryptRuleStatement createEncryptRuleStatement = (CreateEncryptRuleStatement) sqlStatement;
+ assertThat(createEncryptRuleStatement.getEncryptRules().size(), is(1));
+ EncryptRuleSegment encryptRuleSegment = createEncryptRuleStatement.getEncryptRules().iterator().next();
+ assertThat(encryptRuleSegment.getTableName(), is("t_encrypt"));
+ assertThat(encryptRuleSegment.getColumns().size(), is(2));
+ List<EncryptColumnSegment> encryptColumnSegments = new ArrayList<>(encryptRuleSegment.getColumns());
+ assertThat(encryptColumnSegments.get(0).getName(), is("user_id"));
+ assertThat(encryptColumnSegments.get(0).getCipherColumn(), is("user_cipher"));
+ assertThat(encryptColumnSegments.get(0).getPlainColumn(), is("user_plain"));
+ assertThat(encryptColumnSegments.get(0).getEncryptor().getAlgorithmName(), is("AES"));
+ assertThat(encryptColumnSegments.get(0).getEncryptor().getAlgorithmProps().get("aes-key-value"), is("123456abc"));
+ assertThat(encryptColumnSegments.get(1).getName(), is("order_id"));
+ assertThat(encryptColumnSegments.get(1).getCipherColumn(), is("order_cipher"));
+ assertThat(encryptColumnSegments.get(1).getEncryptor().getAlgorithmName(), is("MD5"));
+ }
+
+ @Test
+ public void assertParseAlterEncryptRule() {
+ SQLStatement sqlStatement = engine.parse(RDL_ALTER_ENCRYPT_RULE);
+ assertTrue(sqlStatement instanceof AlterEncryptRuleStatement);
+ AlterEncryptRuleStatement alterEncryptRuleStatement = (AlterEncryptRuleStatement) sqlStatement;
+ assertThat(alterEncryptRuleStatement.getEncryptRules().size(), is(1));
+ EncryptRuleSegment encryptRuleSegment = alterEncryptRuleStatement.getEncryptRules().iterator().next();
+ assertThat(encryptRuleSegment.getTableName(), is("t_encrypt"));
+ assertThat(encryptRuleSegment.getColumns().size(), is(2));
+ List<EncryptColumnSegment> encryptColumnSegments = new ArrayList<>(encryptRuleSegment.getColumns());
+ assertThat(encryptColumnSegments.get(0).getName(), is("user_id"));
+ assertThat(encryptColumnSegments.get(0).getCipherColumn(), is("user_cipher"));
+ assertThat(encryptColumnSegments.get(0).getPlainColumn(), is("user_plain"));
+ assertThat(encryptColumnSegments.get(0).getEncryptor().getAlgorithmName(), is("AES"));
+ assertThat(encryptColumnSegments.get(0).getEncryptor().getAlgorithmProps().get("aes-key-value"), is("123456abc"));
+ assertThat(encryptColumnSegments.get(1).getName(), is("order_id"));
+ assertThat(encryptColumnSegments.get(1).getCipherColumn(), is("order_cipher"));
+ assertThat(encryptColumnSegments.get(1).getEncryptor().getAlgorithmName(), is("MD5"));
+ }
+
+ @Test
+ public void assertParseDropEncryptRule() {
+ SQLStatement sqlStatement = engine.parse(RDL_DROP_ENCRYPT_RULE);
+ assertTrue(sqlStatement instanceof DropEncryptRuleStatement);
+ assertThat(((DropEncryptRuleStatement) sqlStatement).getTableNames(), is(Arrays.asList("t_encrypt", "t_encrypt_order")));
+ }
}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptColumnSegment.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptColumnSegment.java
new file mode 100644
index 0000000..df7e7f2
--- /dev/null
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptColumnSegment.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.parser.segment.rdl;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.distsql.parser.segment.FunctionSegment;
+import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+
+/**
+ * Encrypt column segment.
+ */
+@Getter
+@Setter
+public final class EncryptColumnSegment implements ASTNode {
+
+ private String name;
+
+ private String plainColumn;
+
+ private String cipherColumn;
+
+ private FunctionSegment encryptor;
+}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptRuleSegment.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptRuleSegment.java
new file mode 100644
index 0000000..105be1c
--- /dev/null
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/rdl/EncryptRuleSegment.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.parser.segment.rdl;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+
+import java.util.Collection;
+
+/**
+ * Encrypt rule segment.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class EncryptRuleSegment implements ASTNode {
+
+ private final String tableName;
+
+ private final Collection<EncryptColumnSegment> columns;
+}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterEncryptRuleStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterEncryptRuleStatement.java
new file mode 100644
index 0000000..75d9253
--- /dev/null
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/alter/AlterEncryptRuleStatement.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.parser.statement.rdl.alter;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptRuleSegment;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.RDLStatement;
+
+import java.util.Collection;
+
+/**
+ * Alter encrypt rule statement.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class AlterEncryptRuleStatement extends RDLStatement {
+
+ private final Collection<EncryptRuleSegment> encryptRules;
+}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/CreateEncryptRuleStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/CreateEncryptRuleStatement.java
new file mode 100644
index 0000000..6b9c06f
--- /dev/null
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/CreateEncryptRuleStatement.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.segment.rdl.EncryptRuleSegment;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.CreateRDLStatement;
+
+import java.util.Collection;
+
+/**
+ * Create encrypt rule statement.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class CreateEncryptRuleStatement extends CreateRDLStatement {
+
+ private final Collection<EncryptRuleSegment> encryptRules;
+}
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/impl/DropEncryptRuleStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/impl/DropEncryptRuleStatement.java
new file mode 100644
index 0000000..2cfa03c
--- /dev/null
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/drop/impl/DropEncryptRuleStatement.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.DropRDLStatement;
+
+import java.util.Collection;
+
+/**
+ * Drop encrypt rule statement.
+ */
+@RequiredArgsConstructor
+@Getter
+public final class DropEncryptRuleStatement extends DropRDLStatement {
+
+ private final Collection<String> tableNames;
+}