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 2e33b07  Refactor encrypt alter column (#14219)
2e33b07 is described below

commit 2e33b07fd41a1e5fd64e83334ae8cfbcc69c9563
Author: tuichenchuxin <[email protected]>
AuthorDate: Wed Dec 22 18:28:26 2021 +0800

    Refactor encrypt alter column (#14219)
    
    * add unsupported sql for pg/og doc
    
    * Refactor encrypt alter.
    
    * Refactor encrypt alter.
---
 .../impl/EncryptAlterTableTokenGenerator.java      | 176 ++++++++++-----------
 .../rewrite/token/pojo/EncryptAlterTableToken.java |   2 +-
 .../impl/MySQLDDLStatementSQLVisitor.java          |   7 +-
 ...ent.java => ChangeColumnDefinitionSegment.java} |   4 +-
 .../alter/ModifyColumnDefinitionSegment.java       |   3 -
 .../common/statement/ddl/AlterTableStatement.java  |   3 +
 .../ddl/impl/AlterTableStatementAssert.java        |  22 +++
 .../definition/ExpectedChangeColumnDefinition.java |  42 +++++
 .../statement/ddl/AlterTableStatementTestCase.java |   4 +
 .../src/main/resources/case/ddl/alter-table.xml    |  15 +-
 .../encrypt/case/alter_for_query_with_cipher.xml   |   6 +
 .../encrypt/case/alter_for_query_with_plain.xml    |  18 +--
 12 files changed, 184 insertions(+), 118 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptAlterTableTokenGenerator.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptAlterTableTokenGenerator.java
index e09572e..25f31c1 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptAlterTableTokenGenerator.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptAlterTableTokenGenerator.java
@@ -28,11 +28,13 @@ import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.Substitutable;
 import 
org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.RemoveToken;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.position.ColumnPositionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -54,6 +56,7 @@ public final class EncryptAlterTableTokenGenerator extends 
BaseEncryptSQLTokenGe
         String tableName = 
alterTableStatementContext.getSqlStatement().getTable().getTableName().getIdentifier().getValue();
         Collection<SQLToken> result = new 
LinkedList<>(getAddColumnTokens(tableName, 
alterTableStatementContext.getSqlStatement().getAddColumnDefinitions()));
         result.addAll(getModifyColumnTokens(tableName, 
alterTableStatementContext.getSqlStatement().getModifyColumnDefinitions()));
+        result.addAll(getChangeColumnTokens(tableName, 
alterTableStatementContext.getSqlStatement().getChangeColumnDefinitions()));
         Collection<SQLToken> dropCollection = getDropColumnTokens(tableName, 
alterTableStatementContext.getSqlStatement().getDropColumnDefinitions());
         String databaseName = 
alterTableStatementContext.getDatabaseType().getName();
         if ("SQLServer".equals(databaseName)) {
@@ -112,13 +115,18 @@ public final class EncryptAlterTableTokenGenerator 
extends BaseEncryptSQLTokenGe
         return result;
     }
     
-    private Collection<SQLToken> getAddColumnTokens(final String tableName, 
final String columnName, 
+    private Collection<SQLToken> getAddColumnTokens(final String tableName, 
final String columnName,
                                                     final 
AddColumnDefinitionSegment addColumnDefinitionSegment, final 
ColumnDefinitionSegment columnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
-        result.add(new RemoveToken(addColumnDefinitionSegment.getStartIndex() 
- 1, columnDefinitionSegment.getStopIndex() + 1));
-        result.add(getCipherColumn(tableName, columnName, 
columnDefinitionSegment));
-        getAssistedQueryColumn(tableName, columnName, 
columnDefinitionSegment).ifPresent(result::add);
-        getPlainColumn(tableName, columnName, 
columnDefinitionSegment).ifPresent(result::add);
+        result.add(new RemoveToken(columnDefinitionSegment.getStartIndex(), 
columnDefinitionSegment.getColumnName().getStopIndex()));
+        result.add(new 
EncryptAlterTableToken(columnDefinitionSegment.getColumnName().getStopIndex() + 
1, columnDefinitionSegment.getColumnName().getStopIndex(),
+                getEncryptRule().getCipherColumn(tableName, columnName), 
null));
+        Optional<String> assistedQueryColumn = 
getEncryptRule().findAssistedQueryColumn(tableName, columnName);
+        assistedQueryColumn.map(optional -> new EncryptAlterTableToken(
+                addColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", ADD 
COLUMN")).ifPresent(result::add);
+        Optional<String> plainColumn = 
getEncryptRule().findPlainColumn(tableName, columnName);
+        plainColumn.map(optional -> new EncryptAlterTableToken(
+                addColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", ADD 
COLUMN")).ifPresent(result::add);
         return result;
     }
     
@@ -142,35 +150,83 @@ public final class EncryptAlterTableTokenGenerator 
extends BaseEncryptSQLTokenGe
             ColumnDefinitionSegment segment = each.getColumnDefinition();
             String columnName = 
segment.getColumnName().getIdentifier().getValue();
             Optional<EncryptAlgorithm> encryptor = 
getEncryptRule().findEncryptor(tableName, columnName);
-            Optional<EncryptAlgorithm> encryptorPrevious = 
getEncryptRule().findEncryptor(tableName,
-                    
Optional.ofNullable(each.getPreviousColumn()).map(columnSegment -> 
columnSegment.getIdentifier().getValue()).orElse(""));
-            if (encryptor.isPresent() || encryptorPrevious.isPresent()) {
-                result.addAll(getModifyColumnTokens(tableName, columnName, 
each, segment));
+            if (encryptor.isPresent()) {
+                result.addAll(getModifyColumnTokens(tableName, columnName, 
each));
             }
-            getModifyColumnPositionToken(tableName, 
each).ifPresent(result::add);
+            each.getColumnPosition().flatMap(columnPositionSegment -> 
getColumnPositionToken(tableName, 
columnPositionSegment)).ifPresent(result::add);
         }
         return result;
     }
     
-    private Collection<SQLToken> getModifyColumnTokens(final String tableName, 
final String columnName, 
-                                                       final 
ModifyColumnDefinitionSegment modifyColumnDefinitionSegment, final 
ColumnDefinitionSegment columnDefinitionSegment) {
+    private Collection<SQLToken> getModifyColumnTokens(final String tableName, 
final String columnName,
+                                                       final 
ModifyColumnDefinitionSegment modifyColumnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
-        result.add(new 
RemoveToken(modifyColumnDefinitionSegment.getStartIndex() - 1, 
modifyColumnDefinitionSegment.getStopIndex()));
-        result.add(getCipherColumn(tableName, columnName, 
modifyColumnDefinitionSegment, columnDefinitionSegment));
-        getAssistedQueryColumn(tableName, columnName, 
modifyColumnDefinitionSegment, columnDefinitionSegment).ifPresent(result::add);
-        getPlainColumn(tableName, columnName, modifyColumnDefinitionSegment, 
columnDefinitionSegment).ifPresent(result::add);
+        ColumnDefinitionSegment columnDefinitionSegment = 
modifyColumnDefinitionSegment.getColumnDefinition();
+        result.add(new 
RemoveToken(columnDefinitionSegment.getColumnName().getStartIndex(), 
columnDefinitionSegment.getColumnName().getStopIndex()));
+        result.add(new 
EncryptAlterTableToken(columnDefinitionSegment.getColumnName().getStopIndex() + 
1, columnDefinitionSegment.getColumnName().getStopIndex(),
+                getEncryptRule().getCipherColumn(tableName, columnName), 
null));
+        getEncryptRule().findAssistedQueryColumn(tableName, 
columnName).map(optional -> new 
EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
+                columnDefinitionSegment.getColumnName().getStopIndex(), 
optional, ", MODIFY COLUMN")).ifPresent(result::add);
+        getEncryptRule().findPlainColumn(tableName, columnName).map(optional 
-> new EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
+                columnDefinitionSegment.getColumnName().getStopIndex(), 
optional, ", MODIFY COLUMN")).ifPresent(result::add);
         return result;
     }
     
-    private Optional<SQLToken> getModifyColumnPositionToken(final String 
tableName, final ModifyColumnDefinitionSegment modifyColumnDefinitionSegment) {
-        Optional<EncryptAlgorithm> encryptor = 
modifyColumnDefinitionSegment.getColumnPosition().filter(positionSegment -> 
null != positionSegment.getColumnName())
+    private Optional<SQLToken> getColumnPositionToken(final String tableName, 
final ColumnPositionSegment columnPositionSegment) {
+        Optional<EncryptAlgorithm> encryptor = 
Optional.of(columnPositionSegment).filter(positionSegment -> null != 
positionSegment.getColumnName())
                 .flatMap(positionSegment -> 
getEncryptRule().findEncryptor(tableName, 
positionSegment.getColumnName().getIdentifier().getValue()));
         if (encryptor.isPresent()) {
-            return 
Optional.of(getPositionColumnToken(modifyColumnDefinitionSegment.getColumnPosition().get(),
 tableName));
+            return Optional.of(getPositionColumnToken(columnPositionSegment, 
tableName));
         }
         return Optional.empty();
     }
     
+    private Collection<SQLToken> getChangeColumnTokens(final String tableName, 
final Collection<ChangeColumnDefinitionSegment> changeColumnDefinitions) {
+        Collection<SQLToken> result = new LinkedList<>();
+        for (ChangeColumnDefinitionSegment each : changeColumnDefinitions) {
+            result.addAll(getPreviousColumnTokens(tableName, each));
+            result.addAll(getColumnTokens(tableName, each));
+            each.getColumnPosition().flatMap(columnPositionSegment -> 
getColumnPositionToken(tableName, 
columnPositionSegment)).ifPresent(result::add);
+            if (null != each.getPreviousColumn()) {
+                String previousColumnName = 
each.getPreviousColumn().getIdentifier().getValue();
+                getEncryptRule().findAssistedQueryColumn(tableName, 
previousColumnName).map(optional ->
+                        new EncryptAlterTableToken(each.getStopIndex() + 1, 
each.getColumnDefinition().getColumnName().getStopIndex(),
+                                
each.getColumnDefinition().getColumnName().getIdentifier().getValue() + 
"_assisted", ", CHANGE COLUMN " + optional)).ifPresent(result::add);
+                getEncryptRule().findPlainColumn(tableName, 
previousColumnName).map(optional ->
+                        new EncryptAlterTableToken(each.getStopIndex() + 1, 
each.getColumnDefinition().getColumnName().getStopIndex(),
+                                
each.getColumnDefinition().getColumnName().getIdentifier().getValue() + 
"_plain", ", CHANGE COLUMN " + optional)).ifPresent(result::add);
+            }
+        }
+        return result;
+    }
+    
+    private Collection<? extends SQLToken> getColumnTokens(final String 
tableName, final ChangeColumnDefinitionSegment segment) {
+        if (null == segment.getPreviousColumn() || null == 
segment.getPreviousColumn().getIdentifier().getValue()
+                || !getEncryptRule().findEncryptor(tableName, 
segment.getPreviousColumn().getIdentifier().getValue()).isPresent()) {
+            return Collections.emptyList();
+        }
+        if (null == segment.getColumnDefinition() || null == 
segment.getColumnDefinition().getColumnName() || null == 
segment.getColumnDefinition().getColumnName().getIdentifier().getValue()) {
+            return Collections.emptyList();
+        }
+        Collection<SQLToken> result = new LinkedList<>();
+        result.add(new 
RemoveToken(segment.getColumnDefinition().getColumnName().getStartIndex(), 
segment.getColumnDefinition().getColumnName().getStopIndex()));
+        result.add(new 
EncryptAlterTableToken(segment.getColumnDefinition().getColumnName().getStopIndex()
 + 1, segment.getColumnDefinition().getColumnName().getStopIndex(),
+                
segment.getColumnDefinition().getColumnName().getIdentifier().getValue() + 
"_cipher", null));
+        return result;
+    }
+    
+    private Collection<? extends SQLToken> getPreviousColumnTokens(final 
String tableName, final ChangeColumnDefinitionSegment segment) {
+        if (null == segment.getPreviousColumn() || null == 
segment.getPreviousColumn().getIdentifier().getValue()
+                || !getEncryptRule().findEncryptor(tableName, 
segment.getPreviousColumn().getIdentifier().getValue()).isPresent()) {
+            return Collections.emptyList();
+        }
+        Collection<SQLToken> result = new LinkedList<>();
+        result.add(new 
RemoveToken(segment.getPreviousColumn().getStartIndex(), 
segment.getPreviousColumn().getStopIndex()));
+        result.add(new 
EncryptAlterTableToken(segment.getPreviousColumn().getStopIndex() + 1, 
segment.getPreviousColumn().getStopIndex(),
+                getEncryptRule().getCipherColumn(tableName, 
segment.getPreviousColumn().getIdentifier().getValue()), null));
+        return result;
+    }
+    
     private Collection<SQLToken> getDropColumnTokens(final String tableName, 
final Collection<DropColumnDefinitionSegment> columnDefinitionSegments) {
         Collection<SQLToken> result = new LinkedList<>();
         for (DropColumnDefinitionSegment each : columnDefinitionSegments) {
@@ -186,9 +242,6 @@ public final class EncryptAlterTableTokenGenerator extends 
BaseEncryptSQLTokenGe
             Optional<EncryptAlgorithm> encryptor = 
getEncryptRule().findEncryptor(tableName, columnName);
             if (encryptor.isPresent()) {
                 result.addAll(getDropColumnTokens(tableName, columnName, each, 
dropColumnDefinitionSegment));
-            } else {
-                result.add(new 
RemoveToken(dropColumnDefinitionSegment.getStartIndex() - 1, 
each.getStopIndex()));
-                result.add(new EncryptAlterTableToken(each.getStopIndex() + 1, 
each.getStopIndex(), columnName, "DROP COLUMN"));
             }
         }
         return result;
@@ -197,79 +250,12 @@ public final class EncryptAlterTableTokenGenerator 
extends BaseEncryptSQLTokenGe
     private Collection<SQLToken> getDropColumnTokens(final String tableName, 
final String columnName, 
                                                      final ColumnSegment 
columnSegment, final DropColumnDefinitionSegment dropColumnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
-        result.add(new RemoveToken(dropColumnDefinitionSegment.getStartIndex() 
- 1, columnSegment.getStopIndex()));
-        result.add(getCipherColumn(tableName, columnName, columnSegment));
-        getAssistedQueryColumn(tableName, columnName, 
columnSegment).ifPresent(result::add);
-        getPlainColumn(tableName, columnName, 
columnSegment).ifPresent(result::add);
+        result.add(new RemoveToken(columnSegment.getStartIndex(), 
columnSegment.getStopIndex()));
+        result.add(new EncryptAlterTableToken(columnSegment.getStopIndex() + 
1, columnSegment.getStopIndex(), getEncryptRule().getCipherColumn(tableName, 
columnName), null));
+        getEncryptRule().findAssistedQueryColumn(tableName, 
columnName).map(optional -> new 
EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
+                dropColumnDefinitionSegment.getStopIndex(), optional, ", DROP 
COLUMN")).ifPresent(result::add);
+        getEncryptRule().findPlainColumn(tableName, columnName).map(optional 
-> new EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
+                dropColumnDefinitionSegment.getStopIndex(), optional, ", DROP 
COLUMN")).ifPresent(result::add);
         return result;
     }
-    
-    private EncryptAlterTableToken getCipherColumn(final String tableName, 
final String columnName, final ColumnDefinitionSegment columnDefinitionSegment) 
{
-        String cipherColumn = getEncryptRule().getCipherColumn(tableName, 
columnName);
-        return new 
EncryptAlterTableToken(columnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getStartIndex() + columnName.length(), cipherColumn, 
"ADD COLUMN");
-    }
-    
-    private EncryptAlterTableToken getCipherColumn(final String tableName, 
final String columnName,
-                                                   final 
ModifyColumnDefinitionSegment modifyColumnDefinitionSegment, final 
ColumnDefinitionSegment columnDefinitionSegment) {
-        String previousColumnName = 
Optional.ofNullable(modifyColumnDefinitionSegment.getPreviousColumn()).map(segment
 -> segment.getIdentifier().getValue()).orElse("");
-        String cipherColumnPrevious = (!previousColumnName.isEmpty())
-                ? getEncryptRule().getCipherColumn(tableName, 
previousColumnName) : "";
-        String encryptColumnName = cipherColumnPrevious.isEmpty()
-                ? getEncryptRule().getCipherColumn(tableName, columnName) : 
columnDefinitionSegment.getColumnName().getQualifiedName() + "_cipher";
-        String encryptCommand = cipherColumnPrevious.isEmpty() ? "MODIFY 
COLUMN" : "CHANGE COLUMN " + cipherColumnPrevious;
-        return new 
EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getDataType().getStartIndex() - 1, encryptColumnName, 
encryptCommand);
-    }
-    
-    private EncryptAlterTableToken getCipherColumn(final String tableName, 
final String columnName, final ColumnSegment columnSegment) {
-        String cipherColumn = getEncryptRule().getCipherColumn(tableName, 
columnName);
-        return new EncryptAlterTableToken(columnSegment.getStopIndex() + 1, 
columnSegment.getStopIndex(), cipherColumn, "DROP COLUMN");
-    }
-    
-    private Optional<EncryptAlterTableToken> getAssistedQueryColumn(final 
String tableName, final String columnName, final ColumnDefinitionSegment 
columnDefinitionSegment) {
-        Optional<String> assistedQueryColumn = 
getEncryptRule().findAssistedQueryColumn(tableName, columnName);
-        return assistedQueryColumn.map(optional -> new EncryptAlterTableToken(
-                columnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getStartIndex() + columnName.length(), optional, ", ADD 
COLUMN"));
-    }
-    
-    private Optional<EncryptAlterTableToken> getAssistedQueryColumn(final 
String tableName, final String columnName,
-                                                                    final 
ModifyColumnDefinitionSegment modifyColumnDefinitionSegment, final 
ColumnDefinitionSegment columnDefinitionSegment) {
-        Optional<String> previousColumn = 
Optional.ofNullable(modifyColumnDefinitionSegment.getPreviousColumn()).map(segment
 -> segment.getIdentifier().getValue());
-        if (!previousColumn.isPresent()) {
-            Optional<String> assistedQueryColumn = 
getEncryptRule().findAssistedQueryColumn(tableName, columnName);
-            return assistedQueryColumn.map(optional -> new 
EncryptAlterTableToken(
-                    modifyColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getDataType().getStartIndex() - 1, optional, ", MODIFY 
COLUMN"));
-        }
-        Optional<String> assistedQueryColumnPrevious = 
previousColumn.flatMap(each -> 
getEncryptRule().findAssistedQueryColumn(tableName, each));
-        return assistedQueryColumnPrevious.map(optional -> new 
EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getDataType().getStartIndex() - 1,
-                columnDefinitionSegment.getColumnName().getQualifiedName() + 
"_assisted", ", CHANGE COLUMN " + optional));
-    }
-    
-    private Optional<EncryptAlterTableToken> getAssistedQueryColumn(final 
String tableName, final String columnName, final ColumnSegment columnSegment) {
-        Optional<String> assistedQueryColumn = 
getEncryptRule().findAssistedQueryColumn(tableName, columnName);
-        return assistedQueryColumn.map(optional -> new 
EncryptAlterTableToken(columnSegment.getStopIndex() + 1, 
columnSegment.getStopIndex(), optional, ", DROP COLUMN"));
-    }
-    
-    private Optional<EncryptAlterTableToken> getPlainColumn(final String 
tableName, final String columnName, final ColumnDefinitionSegment 
columnDefinitionSegment) {
-        Optional<String> plainColumn = 
getEncryptRule().findPlainColumn(tableName, columnName);
-        return plainColumn.map(optional -> new EncryptAlterTableToken(
-                columnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getStartIndex() + columnName.length(), optional, ", ADD 
COLUMN"));
-    }
-    
-    private Optional<EncryptAlterTableToken> getPlainColumn(final String 
tableName, final String columnName,
-                                                            final 
ModifyColumnDefinitionSegment modifyColumnDefinitionSegment, final 
ColumnDefinitionSegment columnDefinitionSegment) {
-        Optional<String> previousColumn = 
Optional.ofNullable(modifyColumnDefinitionSegment.getPreviousColumn()).map(segment
 -> segment.getIdentifier().getValue());
-        if (!previousColumn.isPresent()) {
-            Optional<String> plainColumn = 
getEncryptRule().findPlainColumn(tableName, columnName);
-            return plainColumn.map(optional -> new EncryptAlterTableToken(
-                    modifyColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getDataType().getStartIndex() - 1, optional, ", MODIFY 
COLUMN"));
-        }
-        Optional<String> plainColumnPrevious = previousColumn.flatMap(each -> 
getEncryptRule().findPlainColumn(tableName, each));
-        return plainColumnPrevious.map(optional -> new 
EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1, 
columnDefinitionSegment.getDataType().getStartIndex() - 1,
-                columnDefinitionSegment.getColumnName().getQualifiedName() + 
"_plain", ", CHANGE COLUMN " + optional));
-    }
-    
-    private Optional<EncryptAlterTableToken> getPlainColumn(final String 
tableName, final String columnName, final ColumnSegment columnSegment) {
-        Optional<String> plainColumn = 
getEncryptRule().findPlainColumn(tableName, columnName);
-        return plainColumn.map(optional -> new 
EncryptAlterTableToken(columnSegment.getStopIndex() + 1, 
columnSegment.getStopIndex(), optional, ", DROP COLUMN"));
-    }
 }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/pojo/EncryptAlterTableToken.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/pojo/EncryptAlterTableToken.java
index e665dfe..42e7b04 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/pojo/EncryptAlterTableToken.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/pojo/EncryptAlterTableToken.java
@@ -47,6 +47,6 @@ public final class EncryptAlterTableToken extends SQLToken 
implements Substituta
             return columnName;
         }
         // TODO refactor alter table token
-        return String.format(" %s %s ", operationType, columnName);
+        return String.format("%s %s", operationType, columnName);
     }
 }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
index be70bb3..48bdf77 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
@@ -97,6 +97,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.charset.Chars
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.charset.CollateClauseSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.position.ColumnAfterPositionSegment;
@@ -264,6 +265,8 @@ public final class MySQLDDLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
                     
result.getAddColumnDefinitions().add((AddColumnDefinitionSegment) each);
                 } else if (each instanceof ModifyColumnDefinitionSegment) {
                     
result.getModifyColumnDefinitions().add((ModifyColumnDefinitionSegment) each);
+                } else if (each instanceof ChangeColumnDefinitionSegment) {
+                    
result.getChangeColumnDefinitions().add((ChangeColumnDefinitionSegment) each);
                 } else if (each instanceof DropColumnDefinitionSegment) {
                     
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
                 } else if (each instanceof AddConstraintDefinitionSegment) {
@@ -385,8 +388,8 @@ public final class MySQLDDLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
         return modifyColumnDefinition;
     }
     
-    private ModifyColumnDefinitionSegment 
generateModifyColumnDefinitionSegment(final ChangeColumnContext ctx) {
-        ModifyColumnDefinitionSegment result = new 
ModifyColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (ColumnDefinitionSegment) 
visit(ctx.columnDefinition()));
+    private ChangeColumnDefinitionSegment 
generateModifyColumnDefinitionSegment(final ChangeColumnContext ctx) {
+        ChangeColumnDefinitionSegment result = new 
ChangeColumnDefinitionSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (ColumnDefinitionSegment) 
visit(ctx.columnDefinition()));
         result.setPreviousColumn(new 
ColumnSegment(ctx.columnInternalRef.getStart().getStartIndex(), 
ctx.columnInternalRef.getStop().getStopIndex(),
                 new IdentifierValue(ctx.columnInternalRef.getText())));
         if (null != ctx.place()) {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ChangeColumnDefinitionSegment.java
similarity index 94%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
copy to 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ChangeColumnDefinitionSegment.java
index a8ff939..aa800ce 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ChangeColumnDefinitionSegment.java
@@ -28,12 +28,12 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.Column
 import java.util.Optional;
 
 /**
- * Modify column definition segment.
+ * Change column definition segment.
  */
 @RequiredArgsConstructor
 @Getter
 @Setter
-public final class ModifyColumnDefinitionSegment implements 
AlterDefinitionSegment {
+public final class ChangeColumnDefinitionSegment implements 
AlterDefinitionSegment {
     
     private final int startIndex;
     
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
index a8ff939..57628d6 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/column/alter/ModifyColumnDefinitionSegment.java
@@ -23,7 +23,6 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.AlterDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.position.ColumnPositionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 
 import java.util.Optional;
 
@@ -41,8 +40,6 @@ public final class ModifyColumnDefinitionSegment implements 
AlterDefinitionSegme
     
     private final ColumnDefinitionSegment columnDefinition;
     
-    private ColumnSegment previousColumn;
-    
     private ColumnPositionSegment columnPosition;
     
     /**
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
index fae8c6b..9be9904 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/AlterTableStatement.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
@@ -53,6 +54,8 @@ public abstract class AlterTableStatement extends 
AbstractSQLStatement implement
     
     private final Collection<ModifyColumnDefinitionSegment> 
modifyColumnDefinitions = new LinkedList<>();
     
+    private final Collection<ChangeColumnDefinitionSegment> 
changeColumnDefinitions = new LinkedList<>();
+    
     private final Collection<DropColumnDefinitionSegment> 
dropColumnDefinitions = new LinkedList<>();
     
     private final Collection<AddConstraintDefinitionSegment> 
addConstraintDefinitions = new LinkedList<>();
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
index 3fdebfc..91664c4 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.AddColumnDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ChangeColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.DropColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.alter.AddConstraintDefinitionSegment;
@@ -38,6 +39,7 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.d
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.definition.ConstraintDefinitionAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedAddColumnDefinition;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedChangeColumnDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedColumnDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedModifyColumnDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.ddl.AlterTableStatementTestCase;
@@ -73,6 +75,7 @@ public final class AlterTableStatementAssert {
         assertAddColumnDefinitions(assertContext, actual, expected);
         assertAddConstraintDefinitions(assertContext, actual, expected);
         assertModifyColumnDefinitions(assertContext, actual, expected);
+        assertChangeColumnDefinitions(assertContext, actual, expected);
         assertDropColumns(assertContext, actual, expected);
         assertConvertTable(assertContext, actual, expected);
     }
@@ -151,6 +154,25 @@ public final class AlterTableStatementAssert {
         }
     }
     
+    private static void assertChangeColumnDefinitions(final 
SQLCaseAssertContext assertContext, final AlterTableStatement actual, final 
AlterTableStatementTestCase expected) {
+        assertThat(assertContext.getText("Change column definitions size 
assertion error: "), actual.getChangeColumnDefinitions().size(), 
is(expected.getChangeColumns().size()));
+        int count = 0;
+        for (ChangeColumnDefinitionSegment each : 
actual.getChangeColumnDefinitions()) {
+            ExpectedChangeColumnDefinition expectedChangeColumnDefinition = 
expected.getChangeColumns().get(count);
+            ColumnDefinitionAssert.assertIs(assertContext, 
each.getColumnDefinition(), 
expectedChangeColumnDefinition.getColumnDefinition());
+            if (each.getColumnPosition().isPresent()) {
+                assertNotNull(assertContext.getText("Column position should 
exist."), expectedChangeColumnDefinition.getColumnPosition());
+                ColumnPositionAssert.assertIs(assertContext, 
each.getColumnPosition().get(), 
expectedChangeColumnDefinition.getColumnPosition());
+            } else {
+                assertNull(assertContext.getText("Column position should not 
exist."), expectedChangeColumnDefinition.getColumnPosition());
+            }
+            if (null != each.getPreviousColumn()) {
+                ColumnAssert.assertIs(assertContext, each.getPreviousColumn(), 
expectedChangeColumnDefinition.getPreviousColumn());
+            }
+            count++;
+        }
+    }
+    
     private static void assertDropColumns(final SQLCaseAssertContext 
assertContext, final AlterTableStatement actual, final 
AlterTableStatementTestCase expected) {
         Collection<ColumnSegment> actualDropColumns = getDropColumns(actual);
         assertThat(assertContext.getText("Drop columns size assertion error: 
"), actualDropColumns.size(), is(expected.getDropColumns().size()));
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/definition/ExpectedChangeColumnDefinition.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/definition/ExpectedChangeColumnDefinition.java
new file mode 100644
index 0000000..4eeb5b9
--- /dev/null
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/segment/impl/definition/ExpectedChangeColumnDefinition.java
@@ -0,0 +1,42 @@
+/*
+ * 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.parameterized.jaxb.cases.domain.segment.impl.definition;
+
+import lombok.Getter;
+import lombok.Setter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.AbstractExpectedSQLSegment;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected change column definition.
+ */
+@Getter
+@Setter
+public final class ExpectedChangeColumnDefinition extends 
AbstractExpectedSQLSegment {
+    
+    @XmlElement(name = "column-definition")
+    private ExpectedColumnDefinition columnDefinition;
+    
+    @XmlElement(name = "column-position")
+    private ExpectedColumnPosition columnPosition;
+    
+    @XmlElement(name = "previousColumn")
+    private ExpectedColumn previousColumn;
+}
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
index e5d7c4f..db1d52f 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
@@ -21,6 +21,7 @@ import lombok.Getter;
 import lombok.Setter;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedAddColumnDefinition;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedChangeColumnDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedConstraintDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedConvertTableDefinition;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.definition.ExpectedModifyColumnDefinition;
@@ -56,6 +57,9 @@ public final class AlterTableStatementTestCase extends 
SQLParserTestCase {
     @XmlElement(name = "modify-column")
     private final List<ExpectedModifyColumnDefinition> modifyColumns = new 
LinkedList<>();
     
+    @XmlElement(name = "change-column")
+    private final List<ExpectedChangeColumnDefinition> changeColumns = new 
LinkedList<>();
+    
     @XmlElement(name = "drop-column")
     private final List<ExpectedColumn> dropColumns = new LinkedList<>();
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/alter-table.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/alter-table.xml
index 9947140..7c87afc 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/alter-table.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/ddl/alter-table.xml
@@ -517,11 +517,12 @@
     
     <alter-table sql-case-id="alter_table_change_column">
         <table name="t_order" start-index="12" stop-index="18" />
-        <modify-column>
+        <change-column>
             <column-definition type="VARCHAR" start-index="35" stop-index="53">
                 <column name="column4" start-index="35" stop-index="41" />
             </column-definition>
-        </modify-column>
+            <previousColumn name="user_id" start-index="27" stop-index="33" />
+        </change-column>
     </alter-table>
     
     <alter-table sql-case-id="alter_table_add_primary_key">
@@ -609,11 +610,12 @@
 
     <alter-table sql-case-id="alter_table_change_unsigned_not_null">
         <table name="t1" start-index="12" stop-index="13" />
-        <modify-column>
+        <change-column>
             <column-definition type="real" start-index="25" stop-index="49">
                 <column name="c2" />
             </column-definition>
-        </modify-column>
+            <previousColumn name="c1" start-index="22" stop-index="23" />
+        </change-column>
     </alter-table>
 
     <alter-table sql-case-id="alter_table_modify_unsigned_not_null">
@@ -636,11 +638,12 @@
 
     <alter-table sql-case-id="alter_table_change_unsigned_zerofill_not_null">
         <table name="t1" start-index="12" stop-index="13" />
-        <modify-column>
+        <change-column>
             <column-definition type="real" start-index="25" stop-index="58">
                 <column name="c2" />
             </column-definition>
-        </modify-column>
+            <previousColumn name="c1" start-index="22" stop-index="23" />
+        </change-column>
     </alter-table>
 
     <alter-table sql-case-id="alter_table_add_partition">
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_cipher.xml
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_cipher.xml
index 950247c..b30e9f8 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_cipher.xml
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_cipher.xml
@@ -36,4 +36,10 @@
         <input sql="ALTER TABLE t_account MODIFY COLUMN status text AFTER 
amount"/>
         <output sql="ALTER TABLE t_account MODIFY COLUMN status text AFTER 
cipher_amount"/>
     </rewrite-assertion>
+
+    <rewrite-assertion id="add_column_with_cipher" db-types="MySQL">
+        <input sql="ALTER TABLE t_account ADD COLUMN amount INT"/>
+        <output sql="ALTER TABLE t_account ADD COLUMN cipher_amount INT"/>
+    </rewrite-assertion>
+
 </rewrite-assertions>
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_plain.xml
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_plain.xml
index 2c30a93..f32000b 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_plain.xml
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/resources/scenario/encrypt/case/alter_for_query_with_plain.xml
@@ -18,32 +18,32 @@
 
 <rewrite-assertions yaml-rule="scenario/encrypt/config/query-with-plain.yaml">
     <rewrite-assertion id="add_column_for_plain" db-types="MySQL">
-        <input sql="ALTER TABLE t_account_bak ADD COLUMN id int not null  ,  
ADD COLUMN password varchar(255) not null default ''" />
-        <output sql="ALTER TABLE t_account_bak ADD COLUMN id int not null  ,  
ADD COLUMN cipher_password varchar(255) not null default '' , ADD COLUMN 
assisted_query_password varchar(255) not null default '' , ADD COLUMN 
plain_password varchar(255) not null default ''" />
+        <input sql="ALTER TABLE t_account_bak ADD COLUMN id int not null, ADD 
COLUMN password varchar(255) not null default ''" />
+        <output sql="ALTER TABLE t_account_bak ADD COLUMN id int not null, ADD 
COLUMN cipher_password varchar(255) not null default '', ADD COLUMN 
assisted_query_password varchar(255) not null default '', ADD COLUMN 
plain_password varchar(255) not null default ''" />
     </rewrite-assertion>
     
     <rewrite-assertion id="modify_column_for_plain" db-types="MySQL">
         <input sql="ALTER TABLE t_account_bak MODIFY COLUMN password 
varchar(255) not null default ''" />
-        <output sql="ALTER TABLE t_account_bak MODIFY COLUMN cipher_password 
varchar(255) not null default '' , MODIFY COLUMN assisted_query_password 
varchar(255) not null default '' , MODIFY COLUMN plain_password varchar(255) 
not null default ''" />
+        <output sql="ALTER TABLE t_account_bak MODIFY COLUMN cipher_password 
varchar(255) not null default '', MODIFY COLUMN assisted_query_password 
varchar(255) not null default '', MODIFY COLUMN plain_password varchar(255) not 
null default ''" />
     </rewrite-assertion>
     
     <rewrite-assertion id="change_column_for_plain" db-types="MySQL">
         <input sql="ALTER TABLE t_account_bak CHANGE COLUMN password 
password_new varchar(255) not null default ''" />
-        <output sql="ALTER TABLE t_account_bak CHANGE COLUMN cipher_password 
password_new_cipher varchar(255) not null default '' , CHANGE COLUMN 
assisted_query_password password_new_assisted varchar(255) not null default '' 
, CHANGE COLUMN plain_password password_new_plain varchar(255) not null default 
''" />
+        <output sql="ALTER TABLE t_account_bak CHANGE COLUMN cipher_password 
password_new_cipher varchar(255) not null default '', CHANGE COLUMN 
assisted_query_password password_new_assisted varchar(255) not null default '', 
CHANGE COLUMN plain_password password_new_plain varchar(255) not null default 
''" />
     </rewrite-assertion>
     
     <rewrite-assertion id="drop_column_for_plain" db-types="MySQL">
         <input sql="ALTER TABLE t_account_bak DROP COLUMN password" />
-        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password  , 
DROP COLUMN assisted_query_password  , DROP COLUMN plain_password " />
+        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password, 
DROP COLUMN assisted_query_password, DROP COLUMN plain_password" />
     </rewrite-assertion>
     
     <rewrite-assertion id="drop_columns_for_plain" db-types="MySQL">
-        <input sql="ALTER TABLE t_account_bak DROP COLUMN password , DROP 
COLUMN amount" />
-        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password  , 
DROP COLUMN assisted_query_password  , DROP COLUMN plain_password  , DROP 
COLUMN cipher_amount  , DROP COLUMN plain_amount " />
+        <input sql="ALTER TABLE t_account_bak DROP COLUMN password, DROP 
COLUMN amount" />
+        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password, 
DROP COLUMN assisted_query_password, DROP COLUMN plain_password, DROP COLUMN 
cipher_amount, DROP COLUMN plain_amount" />
     </rewrite-assertion>
     
     <rewrite-assertion id="drop_mix_columns_for_plain" db-types="MySQL">
-        <input sql="ALTER TABLE t_account_bak DROP COLUMN password , DROP 
COLUMN id" />
-        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password  , 
DROP COLUMN assisted_query_password  , DROP COLUMN plain_password  , DROP 
COLUMN id " />
+        <input sql="ALTER TABLE t_account_bak DROP COLUMN password, DROP 
COLUMN id" />
+        <output sql="ALTER TABLE t_account_bak DROP COLUMN cipher_password, 
DROP COLUMN assisted_query_password, DROP COLUMN plain_password, DROP COLUMN 
id" />
     </rewrite-assertion>
 </rewrite-assertions>

Reply via email to