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

[shardingsphere] branch master updated: Remove EncryptTable.findAssistedQueryColumn() and findLikeQueryColumn() (#26505)

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 b52f2163fda Remove EncryptTable.findAssistedQueryColumn() and findLikeQueryColumn() (#26505)
b52f2163fda is described below

commit b52f2163fda175712698fc0ceaf17543b8e53155
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Jun 23 10:52:01 2023 +0800

    Remove EncryptTable.findAssistedQueryColumn() and findLikeQueryColumn() (#26505)
    
    * Remove EncryptTable.getCipherColumn()
    
    * Remove EncryptTable.findAssistedQueryColumn() and findLikeQueryColumn()
---
 .../generator/EncryptAlterTableTokenGenerator.java | 52 +++++++++++-----------
 .../generator/EncryptAssignmentTokenGenerator.java |  7 +--
 .../EncryptCreateTableTokenGenerator.java          | 32 ++++++-------
 ...ptForUseDefaultInsertColumnsTokenGenerator.java | 24 +++++-----
 .../EncryptIndexColumnTokenGenerator.java          | 11 ++---
 .../EncryptOrderByItemTokenGenerator.java          | 19 ++++----
 .../EncryptPredicateColumnTokenGenerator.java      | 16 +++----
 .../generator/EncryptProjectionTokenGenerator.java | 46 ++++++++++---------
 .../EncryptInsertDerivedColumnsTokenGenerator.java | 11 ++++-
 .../EncryptInsertOnUpdateTokenGenerator.java       | 27 ++++++-----
 .../insert/EncryptInsertValuesTokenGenerator.java  |  4 +-
 .../shardingsphere/encrypt/rule/EncryptTable.java  | 30 -------------
 .../EncryptAlterTableTokenGeneratorTest.java       |  6 ++-
 .../EncryptCreateTableTokenGeneratorTest.java      |  7 ++-
 .../EncryptOrderByItemTokenGeneratorTest.java      |  4 ++
 .../EncryptProjectionTokenGeneratorTest.java       |  4 ++
 ...ryptInsertDerivedColumnsTokenGeneratorTest.java |  7 ++-
 .../encrypt/rule/EncryptTableTest.java             | 25 -----------
 18 files changed, 153 insertions(+), 179 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGenerator.java
index b0631a0476b..1e9687cea32 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGenerator.java
@@ -94,23 +94,23 @@ public final class EncryptAlterTableTokenGenerator implements CollectionSQLToken
         for (ColumnDefinitionSegment each : addColumnDefinitionSegment.getColumnDefinitions()) {
             String columnName = each.getColumnName().getIdentifier().getValue();
             if (encryptTable.isEncryptColumn(columnName)) {
-                result.addAll(getAddColumnTokens(encryptTable, columnName, addColumnDefinitionSegment, each));
+                result.addAll(getAddColumnTokens(encryptTable.getEncryptColumn(columnName), addColumnDefinitionSegment, each));
             }
         }
         getAddColumnPositionToken(encryptTable, addColumnDefinitionSegment).ifPresent(result::add);
         return result;
     }
     
-    private Collection<SQLToken> getAddColumnTokens(final EncryptTable encryptTable, final String columnName,
+    private Collection<SQLToken> getAddColumnTokens(final EncryptColumn encryptColumn,
                                                     final AddColumnDefinitionSegment addColumnDefinitionSegment, final ColumnDefinitionSegment columnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
         result.add(new RemoveToken(columnDefinitionSegment.getStartIndex(), columnDefinitionSegment.getColumnName().getStopIndex()));
         result.add(new EncryptAlterTableToken(columnDefinitionSegment.getColumnName().getStopIndex() + 1, columnDefinitionSegment.getColumnName().getStopIndex(),
-                encryptTable.getEncryptColumn(columnName).getCipher().getName(), null));
-        encryptTable.findAssistedQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(
-                addColumnDefinitionSegment.getStopIndex() + 1, columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", ADD COLUMN")).ifPresent(result::add);
-        encryptTable.findLikeQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(
-                addColumnDefinitionSegment.getStopIndex() + 1, columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", ADD COLUMN")).ifPresent(result::add);
+                encryptColumn.getCipher().getName(), null));
+        encryptColumn.getAssistedQuery().map(optional -> new EncryptAlterTableToken(
+                addColumnDefinitionSegment.getStopIndex() + 1, columnDefinitionSegment.getColumnName().getStopIndex(), optional.getName(), ", ADD COLUMN")).ifPresent(result::add);
+        encryptColumn.getLikeQuery().map(optional -> new EncryptAlterTableToken(
+                addColumnDefinitionSegment.getStopIndex() + 1, columnDefinitionSegment.getColumnName().getStopIndex(), optional.getName(), ", ADD COLUMN")).ifPresent(result::add);
         return result;
     }
     
@@ -130,23 +130,23 @@ public final class EncryptAlterTableTokenGenerator implements CollectionSQLToken
         for (ModifyColumnDefinitionSegment each : columnDefinitionSegments) {
             String columnName = each.getColumnDefinition().getColumnName().getIdentifier().getValue();
             if (encryptTable.isEncryptColumn(columnName)) {
-                result.addAll(getModifyColumnTokens(encryptTable, columnName, each));
+                result.addAll(getModifyColumnTokens(encryptTable.getEncryptColumn(columnName), each));
             }
             each.getColumnPosition().flatMap(optional -> getColumnPositionToken(encryptTable, optional)).ifPresent(result::add);
         }
         return result;
     }
     
-    private Collection<SQLToken> getModifyColumnTokens(final EncryptTable encryptTable, final String columnName, final ModifyColumnDefinitionSegment modifyColumnDefinitionSegment) {
+    private Collection<SQLToken> getModifyColumnTokens(final EncryptColumn encryptColumn, final ModifyColumnDefinitionSegment modifyColumnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
         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(),
-                encryptTable.getEncryptColumn(columnName).getCipher().getName(), null));
-        encryptTable.findAssistedQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
-                columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", MODIFY COLUMN")).ifPresent(result::add);
-        encryptTable.findLikeQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
-                columnDefinitionSegment.getColumnName().getStopIndex(), optional, ", MODIFY COLUMN")).ifPresent(result::add);
+                encryptColumn.getCipher().getName(), null));
+        encryptColumn.getAssistedQuery().map(optional -> new EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
+                columnDefinitionSegment.getColumnName().getStopIndex(), optional.getName(), ", MODIFY COLUMN")).ifPresent(result::add);
+        encryptColumn.getLikeQuery().map(optional -> new EncryptAlterTableToken(modifyColumnDefinitionSegment.getStopIndex() + 1,
+                columnDefinitionSegment.getColumnName().getStopIndex(), optional.getName(), ", MODIFY COLUMN")).ifPresent(result::add);
         return result;
     }
     
@@ -210,15 +210,15 @@ public final class EncryptAlterTableTokenGenerator implements CollectionSQLToken
         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(),
                 encryptTable.getEncryptColumn(segment.getColumnDefinition().getColumnName().getIdentifier().getValue()).getCipher().getName(), null));
-        String previousColumnName = segment.getPreviousColumn().getIdentifier().getValue();
+        EncryptColumn previousEncryptColumn = encryptTable.getEncryptColumn(segment.getPreviousColumn().getIdentifier().getValue());
         EncryptColumn encryptColumn = encryptTable.getEncryptColumn(segment.getColumnDefinition().getColumnName().getIdentifier().getValue());
-        encryptTable.findAssistedQueryColumn(previousColumnName)
+        previousEncryptColumn.getAssistedQuery()
                 .map(optional -> new EncryptAlterTableToken(segment.getStopIndex() + 1, segment.getColumnDefinition().getColumnName().getStopIndex(),
-                        encryptColumn.getAssistedQuery().map(AssistedQueryColumnItem::getName).orElse(""), ", CHANGE COLUMN " + optional))
+                        encryptColumn.getAssistedQuery().map(AssistedQueryColumnItem::getName).orElse(""), ", CHANGE COLUMN " + optional.getName()))
                 .ifPresent(result::add);
-        encryptTable.findLikeQueryColumn(previousColumnName)
+        previousEncryptColumn.getLikeQuery()
                 .map(optional -> new EncryptAlterTableToken(segment.getStopIndex() + 1, segment.getColumnDefinition().getColumnName().getStopIndex(),
-                        encryptColumn.getLikeQuery().map(LikeQueryColumnItem::getName).orElse(""), ", CHANGE COLUMN " + optional))
+                        encryptColumn.getLikeQuery().map(LikeQueryColumnItem::getName).orElse(""), ", CHANGE COLUMN " + optional.getName()))
                 .ifPresent(result::add);
         return result;
     }
@@ -244,21 +244,21 @@ public final class EncryptAlterTableTokenGenerator implements CollectionSQLToken
         for (ColumnSegment each : dropColumnDefinitionSegment.getColumns()) {
             String columnName = each.getQualifiedName();
             if (encryptTable.isEncryptColumn(columnName)) {
-                result.addAll(getDropColumnTokens(encryptTable, columnName, each, dropColumnDefinitionSegment));
+                result.addAll(getDropColumnTokens(encryptTable.getEncryptColumn(columnName), each, dropColumnDefinitionSegment));
             }
         }
         return result;
     }
     
-    private Collection<SQLToken> getDropColumnTokens(final EncryptTable encryptTable, final String columnName,
+    private Collection<SQLToken> getDropColumnTokens(final EncryptColumn encryptColumn,
                                                      final ColumnSegment columnSegment, final DropColumnDefinitionSegment dropColumnDefinitionSegment) {
         Collection<SQLToken> result = new LinkedList<>();
         result.add(new RemoveToken(columnSegment.getStartIndex(), columnSegment.getStopIndex()));
-        result.add(new EncryptAlterTableToken(columnSegment.getStopIndex() + 1, columnSegment.getStopIndex(), encryptTable.getEncryptColumn(columnName).getCipher().getName(), null));
-        encryptTable.findAssistedQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
-                dropColumnDefinitionSegment.getStopIndex(), optional, ", DROP COLUMN")).ifPresent(result::add);
-        encryptTable.findLikeQueryColumn(columnName).map(optional -> new EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
-                dropColumnDefinitionSegment.getStopIndex(), optional, ", DROP COLUMN")).ifPresent(result::add);
+        result.add(new EncryptAlterTableToken(columnSegment.getStopIndex() + 1, columnSegment.getStopIndex(), encryptColumn.getCipher().getName(), null));
+        encryptColumn.getAssistedQuery().map(optional -> new EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
+                dropColumnDefinitionSegment.getStopIndex(), optional.getName(), ", DROP COLUMN")).ifPresent(result::add);
+        encryptColumn.getLikeQuery().map(optional -> new EncryptAlterTableToken(dropColumnDefinitionSegment.getStopIndex() + 1,
+                dropColumnDefinitionSegment.getStopIndex(), optional.getName(), ", DROP COLUMN")).ifPresent(result::add);
         return result;
     }
     
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAssignmentTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAssignmentTokenGenerator.java
index 211fa41585f..cb2f408644a 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAssignmentTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAssignmentTokenGenerator.java
@@ -102,9 +102,10 @@ public final class EncryptAssignmentTokenGenerator implements CollectionSQLToken
     private EncryptAssignmentToken generateParameterSQLToken(final EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
         EncryptParameterAssignmentToken result = new EncryptParameterAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(), assignmentSegment.getStopIndex());
         String columnName = assignmentSegment.getColumns().get(0).getIdentifier().getValue();
-        result.addColumnName(encryptTable.getEncryptColumn(columnName).getCipher().getName());
-        encryptTable.findAssistedQueryColumn(columnName).ifPresent(result::addColumnName);
-        encryptTable.findLikeQueryColumn(columnName).ifPresent(result::addColumnName);
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
+        result.addColumnName(encryptColumn.getCipher().getName());
+        encryptColumn.getAssistedQuery().ifPresent(optional -> result.addColumnName(optional.getName()));
+        encryptColumn.getLikeQuery().ifPresent(optional -> result.addColumnName(optional.getName()));
         return result;
     }
     
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
index 841541f55c3..ea68f1e3973 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGenerator.java
@@ -21,6 +21,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -62,41 +63,36 @@ public final class EncryptCreateTableTokenGenerator implements CollectionSQLToke
             ColumnDefinitionSegment each = columns.get(index);
             String columnName = each.getColumnName().getIdentifier().getValue();
             if (encryptTable.isEncryptColumn(columnName)) {
-                result.addAll(getColumnTokens(encryptTable, columnName, each, columns, index));
+                result.addAll(getColumnTokens(encryptTable.getEncryptColumn(columnName), each, columns, index));
             }
         }
         return result;
     }
     
-    private Collection<SQLToken> getColumnTokens(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
-                                                 final List<ColumnDefinitionSegment> columns, final int index) {
+    private Collection<SQLToken> getColumnTokens(final EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final List<ColumnDefinitionSegment> columns, final int index) {
         boolean lastColumn = columns.size() - 1 == index;
         int columnStopIndex = lastColumn ? column.getStopIndex() : columns.get(index + 1).getStartIndex() - 1;
         Collection<SQLToken> result = new LinkedList<>();
         result.add(new RemoveToken(column.getStartIndex(), columnStopIndex));
-        result.add(getCipherColumnToken(encryptTable, columnName, column, columnStopIndex));
-        getAssistedQueryColumnToken(encryptTable, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
-        getLikeQueryColumnToken(encryptTable, columnName, column, columnStopIndex, lastColumn).ifPresent(result::add);
+        result.add(getCipherColumnToken(encryptColumn, column, columnStopIndex));
+        getAssistedQueryColumnToken(encryptColumn, column, columnStopIndex, lastColumn).ifPresent(result::add);
+        getLikeQueryColumnToken(encryptColumn, column, columnStopIndex, lastColumn).ifPresent(result::add);
         return result;
     }
     
-    private SQLToken getCipherColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column, final int stopIndex) {
+    private SQLToken getCipherColumnToken(final EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final int stopIndex) {
         return new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
-                getColumnProjections(new IdentifierValue(encryptTable.getEncryptColumn(columnName).getCipher().getName(), column.getColumnName().getIdentifier().getQuoteCharacter())));
+                getColumnProjections(new IdentifierValue(encryptColumn.getCipher().getName(), column.getColumnName().getIdentifier().getQuoteCharacter())));
     }
     
-    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
-                                                                     final int stopIndex, final boolean lastColumn) {
-        Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(columnName);
-        return assistedQueryColumn.map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
-                getColumnProjections(new IdentifierValue(optional, column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
+    private Optional<? extends SQLToken> getAssistedQueryColumnToken(final EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final int stopIndex, final boolean lastColumn) {
+        return encryptColumn.getAssistedQuery().map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
+                getColumnProjections(new IdentifierValue(optional.getName(), column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
     }
     
-    private Optional<? extends SQLToken> getLikeQueryColumnToken(final EncryptTable encryptTable, final String columnName, final ColumnDefinitionSegment column,
-                                                                 final int stopIndex, final boolean lastColumn) {
-        Optional<String> likeQueryColumn = encryptTable.findLikeQueryColumn(columnName);
-        return likeQueryColumn.map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
-                getColumnProjections(new IdentifierValue(optional, column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
+    private Optional<? extends SQLToken> getLikeQueryColumnToken(final EncryptColumn encryptColumn, final ColumnDefinitionSegment column, final int stopIndex, final boolean lastColumn) {
+        return encryptColumn.getLikeQuery().map(optional -> new SubstitutableColumnNameToken(stopIndex + 1, column.getColumnName().getStopIndex(),
+                getColumnProjections(new IdentifierValue(optional.getName(), column.getColumnName().getIdentifier().getQuoteCharacter())), lastColumn));
     }
     
     private Collection<Projection> getColumnProjections(final IdentifierValue columnIdentifier) {
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptForUseDefaultInsertColumnsTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptForUseDefaultInsertColumnsTokenGenerator.java
index 6ec287fe551..106aba407ba 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptForUseDefaultInsertColumnsTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptForUseDefaultInsertColumnsTokenGenerator.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
@@ -91,28 +92,29 @@ public final class EncryptForUseDefaultInsertColumnsTokenGenerator implements Op
             if (!encryptTable.isEncryptColumn(columnName)) {
                 continue;
             }
+            EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
             int columnIndex = result.indexOf(columnName);
-            setCipherColumn(result, encryptTable, columnName, columnIndex);
-            if (encryptTable.findAssistedQueryColumn(columnName).isPresent()) {
-                addAssistedQueryColumn(result, encryptTable, columnName, columnIndex);
+            setCipherColumn(result, encryptColumn, columnIndex);
+            if (encryptColumn.getAssistedQuery().isPresent()) {
+                addAssistedQueryColumn(result, encryptColumn, columnIndex);
                 columnIndex++;
             }
-            if (encryptTable.findLikeQueryColumn(columnName).isPresent()) {
-                addLikeQueryColumn(result, encryptTable, columnName, columnIndex);
+            if (encryptColumn.getLikeQuery().isPresent()) {
+                addLikeQueryColumn(result, encryptColumn, columnIndex);
             }
         }
         return result;
     }
     
-    private void addAssistedQueryColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
-        encryptTable.findAssistedQueryColumn(columnName).ifPresent(optional -> columnNames.add(columnIndex + 1, optional));
+    private void setCipherColumn(final List<String> columnNames, final EncryptColumn encryptColumn, final int columnIndex) {
+        columnNames.set(columnIndex, encryptColumn.getCipher().getName());
     }
     
-    private void addLikeQueryColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
-        encryptTable.findLikeQueryColumn(columnName).ifPresent(optional -> columnNames.add(columnIndex + 1, optional));
+    private void addAssistedQueryColumn(final List<String> columnNames, final EncryptColumn encryptColumn, final int columnIndex) {
+        encryptColumn.getAssistedQuery().ifPresent(optional -> columnNames.add(columnIndex + 1, optional.getName()));
     }
     
-    private void setCipherColumn(final List<String> columnNames, final EncryptTable encryptTable, final String columnName, final int columnIndex) {
-        columnNames.set(columnIndex, encryptTable.getEncryptColumn(columnName).getCipher().getName());
+    private void addLikeQueryColumn(final List<String> columnNames, final EncryptColumn encryptColumn, final int columnIndex) {
+        encryptColumn.getLikeQuery().ifPresent(optional -> columnNames.add(columnIndex + 1, optional.getName()));
     }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
index 494113fee3c..dae1b62adb9 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptIndexColumnTokenGenerator.java
@@ -22,6 +22,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -69,12 +70,12 @@ public final class EncryptIndexColumnTokenGenerator implements CollectionSQLToke
     }
     
     private Optional<SQLToken> getColumnToken(final EncryptTable encryptTable, final ColumnSegment columnSegment) {
-        String columnName = columnSegment.getIdentifier().getValue();
         QuoteCharacter quoteCharacter = columnSegment.getIdentifier().getQuoteCharacter();
         int startIndex = columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
-        return encryptTable.findAssistedQueryColumn(columnName).map(optional -> getAssistedQueryColumnToken(startIndex, stopIndex, optional, quoteCharacter))
-                .orElseGet(() -> getCipherColumnToken(encryptTable, startIndex, stopIndex, columnName, quoteCharacter));
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnSegment.getIdentifier().getValue());
+        return encryptColumn.getAssistedQuery().map(optional -> getAssistedQueryColumnToken(startIndex, stopIndex, optional.getName(), quoteCharacter))
+                .orElseGet(() -> getCipherColumnToken(encryptColumn, startIndex, stopIndex, quoteCharacter));
     }
     
     private Optional<SQLToken> getAssistedQueryColumnToken(final int startIndex, final int stopIndex, final String columnName, final QuoteCharacter quoteCharacter) {
@@ -82,8 +83,8 @@ public final class EncryptIndexColumnTokenGenerator implements CollectionSQLToke
         return Optional.of(new SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections, quoteCharacter));
     }
     
-    private Optional<SQLToken> getCipherColumnToken(final EncryptTable encryptTable, final int startIndex, final int stopIndex, final String columnName, final QuoteCharacter quoteCharacter) {
-        String cipherColumn = encryptTable.getEncryptColumn(columnName).getCipher().getName();
+    private Optional<SQLToken> getCipherColumnToken(final EncryptColumn encryptColumn, final int startIndex, final int stopIndex, final QuoteCharacter quoteCharacter) {
+        String cipherColumn = encryptColumn.getCipher().getName();
         Collection<Projection> columnProjections = getColumnProjections(cipherColumn, quoteCharacter);
         return Optional.of(new SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections, quoteCharacter));
     }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGenerator.java
index 1e59c6bf6ed..14795cc360b 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGenerator.java
@@ -78,18 +78,19 @@ public final class EncryptOrderByItemTokenGenerator implements CollectionSQLToke
     
     private Collection<SubstitutableColumnNameToken> generateSQLTokensWithColumnSegments(final Collection<ColumnSegment> columnSegments, final Map<String, String> columnTableNames) {
         Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
-        for (ColumnSegment column : columnSegments) {
-            String tableName = columnTableNames.getOrDefault(column.getExpression(), "");
+        for (ColumnSegment each : columnSegments) {
+            String tableName = columnTableNames.getOrDefault(each.getExpression(), "");
             Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
-            if (!encryptTable.isPresent() || !encryptTable.get().isEncryptColumn(column.getIdentifier().getValue())) {
+            if (!encryptTable.isPresent() || !encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) {
                 continue;
             }
-            int startIndex = column.getOwner().isPresent() ? column.getOwner().get().getStopIndex() + 2 : column.getStartIndex();
-            int stopIndex = column.getStopIndex();
-            Optional<String> assistedQueryColumn = encryptTable.get().findAssistedQueryColumn(column.getIdentifier().getValue());
-            SubstitutableColumnNameToken encryptColumnNameToken = assistedQueryColumn.map(optional -> new SubstitutableColumnNameToken(startIndex, stopIndex,
-                    createColumnProjections(optional, column.getIdentifier().getQuoteCharacter()))).orElseGet(() -> new SubstitutableColumnNameToken(startIndex, stopIndex,
-                            createColumnProjections(encryptTable.get().getEncryptColumn(column.getIdentifier().getValue()).getCipher().getName(), column.getIdentifier().getQuoteCharacter())));
+            int startIndex = each.getOwner().isPresent() ? each.getOwner().get().getStopIndex() + 2 : each.getStartIndex();
+            int stopIndex = each.getStopIndex();
+            SubstitutableColumnNameToken encryptColumnNameToken = encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()).getAssistedQuery()
+                    .map(optional -> new SubstitutableColumnNameToken(startIndex, stopIndex,
+                            createColumnProjections(optional.getName(), each.getIdentifier().getQuoteCharacter())))
+                    .orElseGet(() -> new SubstitutableColumnNameToken(startIndex, stopIndex,
+                            createColumnProjections(encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()).getCipher().getName(), each.getIdentifier().getQuoteCharacter())));
             result.add(encryptColumnNameToken);
         }
         return result;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
index 907afa35180..393db5a7a26 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptPredicateColumnTokenGenerator.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptSQLE
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -86,25 +87,22 @@ public final class EncryptPredicateColumnTokenGenerator implements CollectionSQL
             String tableName = Optional.ofNullable(columnExpressionTableNames.get(each.getExpression())).orElse("");
             Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
             if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(each.getIdentifier().getValue())) {
-                result.add(buildSubstitutableColumnNameToken(each, whereSegments, encryptTable.get()));
+                result.add(buildSubstitutableColumnNameToken(encryptTable.get().getEncryptColumn(each.getIdentifier().getValue()), each, whereSegments));
             }
         }
         return result;
     }
     
-    private SubstitutableColumnNameToken buildSubstitutableColumnNameToken(final ColumnSegment columnSegment, final Collection<WhereSegment> whereSegments, final EncryptTable encryptTable) {
+    private SubstitutableColumnNameToken buildSubstitutableColumnNameToken(final EncryptColumn encryptColumn, final ColumnSegment columnSegment, final Collection<WhereSegment> whereSegments) {
         int startIndex = columnSegment.getOwner().isPresent() ? columnSegment.getOwner().get().getStopIndex() + 2 : columnSegment.getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
-        String logicColumn = columnSegment.getIdentifier().getValue();
-        // TODO remove foreach loop to improve performance
         if (includesLike(whereSegments, columnSegment)) {
-            Optional<String> likeQueryColumn = encryptTable.findLikeQueryColumn(logicColumn);
-            ShardingSpherePreconditions.checkState(likeQueryColumn.isPresent(), () -> new UnsupportedEncryptSQLException("LIKE"));
-            return new SubstitutableColumnNameToken(startIndex, stopIndex, createColumnProjections(likeQueryColumn.get(), columnSegment.getIdentifier().getQuoteCharacter()));
+            ShardingSpherePreconditions.checkState(encryptColumn.getLikeQuery().isPresent(), () -> new UnsupportedEncryptSQLException("LIKE"));
+            return new SubstitutableColumnNameToken(startIndex, stopIndex, createColumnProjections(encryptColumn.getLikeQuery().get().getName(), columnSegment.getIdentifier().getQuoteCharacter()));
         }
         Collection<Projection> columnProjections =
-                encryptTable.findAssistedQueryColumn(logicColumn).map(optional -> createColumnProjections(optional, columnSegment.getIdentifier().getQuoteCharacter()))
-                        .orElseGet(() -> createColumnProjections(encryptTable.getEncryptColumn(logicColumn).getCipher().getName(), columnSegment.getIdentifier().getQuoteCharacter()));
+                encryptColumn.getAssistedQuery().map(optional -> createColumnProjections(optional.getName(), columnSegment.getIdentifier().getQuoteCharacter()))
+                        .orElseGet(() -> createColumnProjections(encryptColumn.getCipher().getName(), columnSegment.getIdentifier().getQuoteCharacter()));
         return new SubstitutableColumnNameToken(startIndex, stopIndex, columnProjections);
     }
     
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
index 21e1041d936..f8e98de83f7 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGenerator.java
@@ -22,6 +22,8 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
+import org.apache.shardingsphere.encrypt.rule.column.item.AssistedQueryColumnItem;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.ProjectionsContext;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
@@ -94,7 +96,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
                 }
                 Optional<EncryptTable> encryptTable = encryptRule.findEncryptTable(tableName);
                 if (encryptTable.isPresent() && encryptTable.get().isEncryptColumn(columnProjection.getName())) {
-                    sqlTokens.add(generateSQLToken(encryptTable.get(), columnSegment, columnProjection, subqueryType));
+                    sqlTokens.add(generateSQLToken(encryptTable.get().getEncryptColumn(columnProjection.getName()), columnSegment, columnProjection, subqueryType));
                 }
             }
             if (each instanceof ShorthandProjectionSegment) {
@@ -107,9 +109,9 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
         }
     }
     
-    private SubstitutableColumnNameToken generateSQLToken(final EncryptTable encryptTable, final ColumnProjectionSegment columnSegment,
+    private SubstitutableColumnNameToken generateSQLToken(final EncryptColumn encryptColumn, final ColumnProjectionSegment columnSegment,
                                                           final ColumnProjection columnProjection, final SubqueryType subqueryType) {
-        Collection<Projection> projections = generateProjections(encryptTable, columnProjection, subqueryType, false, null);
+        Collection<Projection> projections = generateProjections(encryptColumn, columnProjection, subqueryType, false, null);
         int startIndex = columnSegment.getColumn().getOwner().isPresent() ? columnSegment.getColumn().getOwner().get().getStopIndex() + 2 : columnSegment.getColumn().getStartIndex();
         int stopIndex = columnSegment.getStopIndex();
         return new SubstitutableColumnNameToken(startIndex, stopIndex, projections);
@@ -124,7 +126,7 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
             if (!encryptTable.isPresent() || !encryptTable.get().isEncryptColumn(each.getColumnLabel())) {
                 projections.add(each.getAlias().map(optional -> (Projection) new ColumnProjection(null, optional, null)).orElse(each));
             } else if (each instanceof ColumnProjection) {
-                projections.addAll(generateProjections(encryptTable.get(), (ColumnProjection) each, subqueryType, true, segment));
+                projections.addAll(generateProjections(encryptTable.get().getEncryptColumn(((ColumnProjection) each).getName()), (ColumnProjection) each, subqueryType, true, segment));
             }
         }
         int startIndex = segment.getOwner().isPresent() ? segment.getOwner().get().getStartIndex() : segment.getStartIndex();
@@ -152,17 +154,17 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
         return selectStatementContext.getTablesContext().findTableNamesByColumnProjection(columns, schema);
     }
     
-    private Collection<Projection> generateProjections(final EncryptTable encryptTable, final ColumnProjection column, final SubqueryType subqueryType, final boolean shorthand,
-                                                       final ShorthandProjectionSegment segment) {
+    private Collection<Projection> generateProjections(final EncryptColumn encryptColumn, final ColumnProjection column,
+                                                       final SubqueryType subqueryType, final boolean shorthand, final ShorthandProjectionSegment segment) {
         Collection<Projection> result = new LinkedList<>();
         if (SubqueryType.PREDICATE_SUBQUERY == subqueryType) {
-            result.add(distinctOwner(generatePredicateSubqueryProjection(encryptTable, column), shorthand));
+            result.add(distinctOwner(generatePredicateSubqueryProjection(encryptColumn, column), shorthand));
         } else if (SubqueryType.TABLE_SUBQUERY == subqueryType) {
-            result.addAll(generateTableSubqueryProjections(encryptTable, column, shorthand));
+            result.addAll(generateTableSubqueryProjections(encryptColumn, column, shorthand));
         } else if (SubqueryType.EXISTS_SUBQUERY == subqueryType) {
-            result.addAll(generateExistsSubqueryProjections(encryptTable, column, shorthand));
+            result.addAll(generateExistsSubqueryProjections(encryptColumn, column, shorthand));
         } else {
-            result.add(distinctOwner(generateCommonProjection(encryptTable, column, segment), shorthand));
+            result.add(distinctOwner(generateCommonProjection(encryptColumn, column, segment), shorthand));
         }
         return result;
     }
@@ -174,33 +176,33 @@ public final class EncryptProjectionTokenGenerator implements CollectionSQLToken
         return new ColumnProjection(null, column.getNameIdentifier(), column.getAlias().isPresent() ? column.getAliasIdentifier() : null);
     }
     
-    private ColumnProjection generatePredicateSubqueryProjection(final EncryptTable encryptTable, final ColumnProjection column) {
-        Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column.getName());
+    private ColumnProjection generatePredicateSubqueryProjection(final EncryptColumn encryptColumn, final ColumnProjection column) {
+        Optional<AssistedQueryColumnItem> assistedQueryColumn = encryptColumn.getAssistedQuery();
         if (assistedQueryColumn.isPresent()) {
-            return new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(assistedQueryColumn.get(), column.getNameIdentifier().getQuoteCharacter()), null);
+            return new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(assistedQueryColumn.get().getName(), column.getNameIdentifier().getQuoteCharacter()), null);
         }
-        String cipherColumn = encryptTable.getEncryptColumn(column.getName()).getCipher().getName();
+        String cipherColumn = encryptColumn.getCipher().getName();
         return new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(cipherColumn, column.getNameIdentifier().getQuoteCharacter()), null);
     }
     
-    private Collection<ColumnProjection> generateTableSubqueryProjections(final EncryptTable encryptTable, final ColumnProjection column, final boolean shorthand) {
+    private Collection<ColumnProjection> generateTableSubqueryProjections(final EncryptColumn encryptColumn, final ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptTable.getEncryptColumn(column.getName()).getCipher().getName(),
+        result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptColumn.getCipher().getName(),
                 column.getNameIdentifier().getQuoteCharacter()), null), shorthand));
-        Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column.getName());
-        assistedQueryColumn.ifPresent(optional -> result.add(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(optional, column.getNameIdentifier().getQuoteCharacter()), null)));
+        encryptColumn.getAssistedQuery().ifPresent(optional -> result.add(
+                new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(optional.getName(), column.getNameIdentifier().getQuoteCharacter()), null)));
         return result;
     }
     
-    private Collection<ColumnProjection> generateExistsSubqueryProjections(final EncryptTable encryptTable, final ColumnProjection column, final boolean shorthand) {
+    private Collection<ColumnProjection> generateExistsSubqueryProjections(final EncryptColumn encryptColumn, final ColumnProjection column, final boolean shorthand) {
         Collection<ColumnProjection> result = new LinkedList<>();
-        result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptTable.getEncryptColumn(column.getName()).getCipher().getName(),
+        result.add(distinctOwner(new ColumnProjection(column.getOwnerIdentifier(), new IdentifierValue(encryptColumn.getCipher().getName(),
                 column.getNameIdentifier().getQuoteCharacter()), null), shorthand));
         return result;
     }
     
-    private ColumnProjection generateCommonProjection(final EncryptTable encryptTable, final ColumnProjection column, final ShorthandProjectionSegment segment) {
-        String encryptColumnName = encryptTable.getEncryptColumn(column.getName()).getCipher().getName();
+    private ColumnProjection generateCommonProjection(final EncryptColumn encryptColumn, final ColumnProjection column, final ShorthandProjectionSegment segment) {
+        String encryptColumnName = encryptColumn.getCipher().getName();
         IdentifierValue owner = (null == segment || !segment.getOwner().isPresent()) ? column.getOwnerIdentifier() : segment.getOwner().get().getIdentifier();
         return new ColumnProjection(owner, new IdentifierValue(encryptColumnName, column.getNameIdentifier().getQuoteCharacter()), column.getAlias().isPresent()
                 ? column.getAliasIdentifier()
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGenerator.java
index 52ff05bab28..aa4a1fef99a 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGenerator.java
@@ -21,6 +21,7 @@ import lombok.Setter;
 import org.apache.shardingsphere.encrypt.rewrite.aware.EncryptRuleAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.generator.CollectionSQLTokenGenerator;
@@ -29,6 +30,7 @@ import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic.InsertColu
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -59,9 +61,14 @@ public final class EncryptInsertDerivedColumnsTokenGenerator implements Collecti
     }
     
     private List<String> getDerivedColumnNames(final EncryptTable encryptTable, final ColumnSegment columnSegment) {
+        String columnName = columnSegment.getIdentifier().getValue();
+        if (!encryptTable.isEncryptColumn(columnName)) {
+            return Collections.emptyList();
+        }
         List<String> result = new LinkedList<>();
-        encryptTable.findAssistedQueryColumn(columnSegment.getIdentifier().getValue()).ifPresent(result::add);
-        encryptTable.findLikeQueryColumn(columnSegment.getIdentifier().getValue()).ifPresent(result::add);
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
+        encryptColumn.getAssistedQuery().ifPresent(optional -> result.add(optional.getName()));
+        encryptColumn.getLikeQuery().ifPresent(optional -> result.add(optional.getName()));
         return result;
     }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
index 73fa050dc66..ad966be309a 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertOnUpdateTokenGenerator.java
@@ -29,6 +29,8 @@ import org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptParameterAssi
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
 import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
+import org.apache.shardingsphere.encrypt.rule.column.item.AssistedQueryColumnItem;
+import org.apache.shardingsphere.encrypt.rule.column.item.LikeQueryColumnItem;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
@@ -111,9 +113,10 @@ public final class EncryptInsertOnUpdateTokenGenerator implements CollectionSQLT
     private EncryptAssignmentToken generateParameterSQLToken(final EncryptTable encryptTable, final AssignmentSegment assignmentSegment) {
         EncryptParameterAssignmentToken result = new EncryptParameterAssignmentToken(assignmentSegment.getColumns().get(0).getStartIndex(), assignmentSegment.getStopIndex());
         String columnName = assignmentSegment.getColumns().get(0).getIdentifier().getValue();
-        result.addColumnName(encryptTable.getEncryptColumn(columnName).getCipher().getName());
-        encryptTable.findAssistedQueryColumn(columnName).ifPresent(result::addColumnName);
-        encryptTable.findLikeQueryColumn(columnName).ifPresent(result::addColumnName);
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(columnName);
+        result.addColumnName(encryptColumn.getCipher().getName());
+        encryptColumn.getAssistedQuery().ifPresent(optional -> result.addColumnName(optional.getName()));
+        encryptColumn.getLikeQuery().ifPresent(optional -> result.addColumnName(optional.getName()));
         return result;
     }
     
@@ -134,24 +137,26 @@ public final class EncryptInsertOnUpdateTokenGenerator implements CollectionSQLT
         EncryptFunctionAssignmentToken result = new EncryptFunctionAssignmentToken(columnSegment.getStartIndex(), assignmentSegment.getStopIndex());
         boolean isEncryptColumn = encryptTable.isEncryptColumn(column);
         boolean isEncryptValueColumn = encryptTable.isEncryptColumn(valueColumn);
+        EncryptColumn encryptColumn = encryptTable.getEncryptColumn(column);
+        EncryptColumn encryptValueColumn = encryptTable.getEncryptColumn(column);
         if (isEncryptColumn && isEncryptValueColumn) {
-            String cipherColumn = encryptTable.getEncryptColumn(column).getCipher().getName();
-            String cipherValueColumn = encryptTable.getEncryptColumn(valueColumn).getCipher().getName();
+            String cipherColumn = encryptColumn.getCipher().getName();
+            String cipherValueColumn = encryptValueColumn.getCipher().getName();
             result.addAssignment(cipherColumn, "VALUES(" + cipherValueColumn + ")");
         } else if (isEncryptColumn != isEncryptValueColumn) {
             throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
         }
-        Optional<String> assistedQueryColumn = encryptTable.findAssistedQueryColumn(column);
-        Optional<String> valueAssistedQueryColumn = encryptTable.findAssistedQueryColumn(valueColumn);
+        Optional<AssistedQueryColumnItem> assistedQueryColumn = encryptColumn.getAssistedQuery();
+        Optional<AssistedQueryColumnItem> valueAssistedQueryColumn = encryptValueColumn.getAssistedQuery();
         if (assistedQueryColumn.isPresent() && valueAssistedQueryColumn.isPresent()) {
-            result.addAssignment(assistedQueryColumn.get(), "VALUES(" + valueAssistedQueryColumn.get() + ")");
+            result.addAssignment(assistedQueryColumn.get().getName(), "VALUES(" + valueAssistedQueryColumn.get().getName() + ")");
         } else if (assistedQueryColumn.isPresent() != valueAssistedQueryColumn.isPresent()) {
             throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
         }
-        Optional<String> likeQueryColumn = encryptTable.findLikeQueryColumn(column);
-        Optional<String> valueLikeQueryColumn = encryptTable.findLikeQueryColumn(valueColumn);
+        Optional<LikeQueryColumnItem> likeQueryColumn = encryptColumn.getLikeQuery();
+        Optional<LikeQueryColumnItem> valueLikeQueryColumn = encryptValueColumn.getLikeQuery();
         if (likeQueryColumn.isPresent() && valueLikeQueryColumn.isPresent()) {
-            result.addAssignment(likeQueryColumn.get(), "VALUES(" + valueLikeQueryColumn.get() + ")");
+            result.addAssignment(likeQueryColumn.get().getName(), "VALUES(" + valueLikeQueryColumn.get().getName() + ")");
         } else if (likeQueryColumn.isPresent() != valueLikeQueryColumn.isPresent()) {
             throw new UnsupportedEncryptSQLException(String.format("%s=VALUES(%s)", column, valueColumn));
         }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
index ccd5ad42ac7..d8b71be3f57 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertValuesTokenGenerator.java
@@ -143,11 +143,11 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
             Object originalValue = insertValueContext.getLiteralValue(columnIndex).orElse(null);
             setCipherColumn(schemaName, tableName, encryptColumn, insertValueToken, insertValueContext.getValueExpressions().get(columnIndex), columnIndex, originalValue);
             int indexDelta = 1;
-            if (encryptTable.findAssistedQueryColumn(columnName).isPresent()) {
+            if (encryptColumn.getAssistedQuery().isPresent()) {
                 addAssistedQueryColumn(schemaName, tableName, encryptColumn, insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
                 indexDelta++;
             }
-            if (encryptTable.findLikeQueryColumn(columnName).isPresent()) {
+            if (encryptColumn.getLikeQuery().isPresent()) {
                 addLikeQueryColumn(schemaName, tableName, encryptColumn, insertValueContext, insertValueToken, columnIndex, indexDelta, originalValue);
             }
         }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
index c2db7735e18..1b54bb96e6b 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
@@ -123,16 +123,6 @@ public final class EncryptTable {
         return columns.values().stream().anyMatch(each -> each.getCipher().getName().equalsIgnoreCase(logicColumnName));
     }
     
-    /**
-     * Get cipher column.
-     *
-     * @param logicColumnName logic column name
-     * @return cipher column
-     */
-    public String getCipherColumn(final String logicColumnName) {
-        return columns.get(logicColumnName).getCipher().getName();
-    }
-    
     /**
      * Get assisted query columns.
      *
@@ -163,26 +153,6 @@ public final class EncryptTable {
         return result;
     }
     
-    /**
-     * Find assisted query column.
-     *
-     * @param logicColumnName logic column name
-     * @return assisted query column
-     */
-    public Optional<String> findAssistedQueryColumn(final String logicColumnName) {
-        return columns.containsKey(logicColumnName) ? columns.get(logicColumnName).getAssistedQuery().map(AssistedQueryColumnItem::getName) : Optional.empty();
-    }
-    
-    /**
-     * Find like query column.
-     *
-     * @param logicColumnName logic column name
-     * @return like query column
-     */
-    public Optional<String> findLikeQueryColumn(final String logicColumnName) {
-        return columns.containsKey(logicColumnName) ? columns.get(logicColumnName).getLikeQuery().map(LikeQueryColumnItem::getName) : Optional.empty();
-    }
-    
     /**
      * Get logic and cipher columns.
      *
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGeneratorTest.java
index df5a963b5b2..e9cb159b336 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptAlterTableTokenGeneratorTest.java
@@ -73,8 +73,10 @@ class EncryptAlterTableTokenGeneratorTest {
         when(result.getTable()).thenReturn("t_encrypt");
         when(result.isEncryptColumn("certificate_number")).thenReturn(true);
         when(result.getEncryptColumn("certificate_number").getCipher().getName()).thenReturn("cipher_certificate_number");
-        when(result.findAssistedQueryColumn("certificate_number")).thenReturn(Optional.of("assisted_certificate_number"));
-        when(result.findLikeQueryColumn("certificate_number")).thenReturn(Optional.of("like_certificate_number"));
+        when(result.getEncryptColumn("certificate_number").getAssistedQuery())
+                .thenReturn(Optional.of(new AssistedQueryColumnItem("assisted_certificate_number", mock(AssistedEncryptAlgorithm.class))));
+        when(result.getEncryptColumn("certificate_number").getLikeQuery())
+                .thenReturn(Optional.of(new LikeQueryColumnItem("like_certificate_number", mock(LikeEncryptAlgorithm.class))));
         when(result.getLogicColumns()).thenReturn(Collections.singleton("t_encrypt"));
         when(result.getEncryptColumn("certificate_number")).thenReturn(mockEncryptColumn());
         when(result.isEncryptColumn("certificate_number_new")).thenReturn(true);
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
index 8b49c9ea50b..4eebd699206 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptCreateTableTokenGeneratorTest.java
@@ -41,6 +41,7 @@ import org.junit.jupiter.api.Test;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
@@ -70,8 +71,10 @@ class EncryptCreateTableTokenGeneratorTest {
         EncryptColumn column = mockEncryptColumn();
         when(result.isEncryptColumn("certificate_number")).thenReturn(true);
         when(result.getEncryptColumn("certificate_number").getCipher().getName()).thenReturn(column.getCipher().getName());
-        when(result.findAssistedQueryColumn("certificate_number")).thenReturn(column.getAssistedQuery().map(AssistedQueryColumnItem::getName));
-        when(result.findLikeQueryColumn("certificate_number")).thenReturn(column.getLikeQuery().map(LikeQueryColumnItem::getName));
+        when(result.getEncryptColumn("certificate_number").getAssistedQuery())
+                .thenReturn(Optional.of(new AssistedQueryColumnItem(column.getAssistedQuery().map(AssistedQueryColumnItem::getName).orElse(null), mock(AssistedEncryptAlgorithm.class))));
+        when(result.getEncryptColumn("certificate_number").getLikeQuery())
+                .thenReturn(Optional.of(new LikeQueryColumnItem(column.getLikeQuery().map(LikeQueryColumnItem::getName).orElse(null), mock(LikeEncryptAlgorithm.class))));
         return result;
     }
     
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGeneratorTest.java
index 4b08bc70fc9..9c402b1787b 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptOrderByItemTokenGeneratorTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.encrypt.rewrite.token.generator;
 
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.orderby.OrderByItem;
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -60,6 +61,9 @@ class EncryptOrderByItemTokenGeneratorTest {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
         when(encryptTable.isEncryptColumn("certificate_number")).thenReturn(true);
+        EncryptColumn encryptColumn = mock(EncryptColumn.class, RETURNS_DEEP_STUBS);
+        when(encryptColumn.getAssistedQuery()).thenReturn(Optional.empty());
+        when(encryptTable.getEncryptColumn("certificate_number")).thenReturn(encryptColumn);
         when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
         return result;
     }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
index 5eba82c04d3..644c13afe61 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptProjectionTokenGeneratorTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.encrypt.rewrite.token.generator;
 
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -67,6 +68,9 @@ class EncryptProjectionTokenGeneratorTest {
         when(result.findEncryptTable("doctor")).thenReturn(Optional.of(encryptTable1));
         when(result.findEncryptTable("doctor1")).thenReturn(Optional.of(encryptTable2));
         when(encryptTable1.isEncryptColumn("mobile")).thenReturn(true);
+        EncryptColumn encryptColumn = mock(EncryptColumn.class, RETURNS_DEEP_STUBS);
+        when(encryptColumn.getAssistedQuery()).thenReturn(Optional.empty());
+        when(encryptTable1.getEncryptColumn("mobile")).thenReturn(encryptColumn);
         return result;
     }
     
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGeneratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGeneratorTest.java
index 5f686052779..ab0156efc08 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGeneratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/insert/EncryptInsertDerivedColumnsTokenGeneratorTest.java
@@ -17,8 +17,10 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator.insert;
 
+import org.apache.shardingsphere.encrypt.api.encrypt.assisted.AssistedEncryptAlgorithm;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.encrypt.rule.column.item.AssistedQueryColumnItem;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
@@ -87,8 +89,9 @@ class EncryptInsertDerivedColumnsTokenGeneratorTest {
     
     private EncryptRule mockEncryptRule() {
         EncryptRule result = mock(EncryptRule.class);
-        EncryptTable encryptTable = mock(EncryptTable.class);
-        when(encryptTable.findAssistedQueryColumn("foo_col")).thenReturn(Optional.of("assisted_query_col"));
+        EncryptTable encryptTable = mock(EncryptTable.class, RETURNS_DEEP_STUBS);
+        when(encryptTable.isEncryptColumn("foo_col")).thenReturn(true);
+        when(encryptTable.getEncryptColumn("foo_col").getAssistedQuery()).thenReturn(Optional.of(new AssistedQueryColumnItem("assisted_query_col", mock(AssistedEncryptAlgorithm.class))));
         when(result.getEncryptTable("foo_tbl")).thenReturn(encryptTable);
         return result;
     }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
index 4305f4a47b4..2ef886e9c67 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
@@ -26,7 +26,6 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
-import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -89,30 +88,6 @@ class EncryptTableTest {
         assertThat(encryptTable.getAssistedQueryColumns(), is(Collections.singletonList("assistedQueryColumn")));
     }
     
-    @Test
-    void assertFindAssistedQueryColumn() {
-        Optional<String> actual = encryptTable.findAssistedQueryColumn("logicColumn");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("assistedQueryColumn"));
-    }
-    
-    @Test
-    void assertFindLikeQueryColumn() {
-        Optional<String> actual = encryptTable.findLikeQueryColumn("logicColumn");
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("likeQueryColumn"));
-    }
-    
-    @Test
-    void assertNotFindAssistedQueryColumn() {
-        assertFalse(encryptTable.findAssistedQueryColumn("notExistLogicColumn").isPresent());
-    }
-    
-    @Test
-    void assertNotFindLikeQueryColumn() {
-        assertFalse(encryptTable.findAssistedQueryColumn("notExistLikeQueryColumn").isPresent());
-    }
-    
     @Test
     void assertGetLogicAndCipherColumns() {
         assertThat(encryptTable.getLogicAndCipherColumns(), is(Collections.singletonMap("logicColumn", "cipherColumn")));