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

jianglongtao 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 b3a560295aa support the fuzzyQueryColumn and fuzzyQueryEncryptorName 
for distsql and UT, SIT (#21808)
b3a560295aa is described below

commit b3a560295aa7031ff5e31e457a8fc4aa68fec295
Author: gxxiong <[email protected]>
AuthorDate: Tue Nov 1 09:42:10 2022 +0800

    support the fuzzyQueryColumn and fuzzyQueryEncryptorName for distsql and 
UT, SIT (#21808)
    
    * support the fuzzyQueryColumn and fuzzyQueryEncryptorName for distsql and 
UT, SIT
    
    * Reformat Code EncryptRuleTest
    
    * fix Parameter matching of encrypt disql
---
 .../template/jdbc/java/config/encrypt.ftl          |  2 +-
 .../config/local/LocalEncryptConfiguration.java    |  2 +-
 .../jdbc/config/EncryptDatabasesConfiguration.java |  4 +-
 .../jdbc/config/ShadowEncryptConfiguration.java    |  4 +-
 .../rule/EncryptColumnRuleConfiguration.java       |  6 +-
 ...rovidedEncryptRuleConfigurationCheckerTest.java |  4 +-
 .../EncryptRuleConfigurationCheckerTest.java       |  4 +-
 .../encrypt/rule/EncryptRuleTest.java              | 68 +++++++++++++++-------
 .../encrypt/rule/EncryptTableTest.java             | 18 +++++-
 ...lEncryptColumnRuleConfigurationSwapperTest.java |  4 +-
 ...mlEncryptTableRuleConfigurationSwapperTest.java |  6 +-
 .../converter/EncryptRuleStatementConverter.java   | 14 ++++-
 .../EncryptRuleStatementConverterTest.java         |  6 +-
 .../query/EncryptRuleQueryResultSetTest.java       |  2 +-
 .../AlterEncryptRuleStatementUpdaterTest.java      | 11 ++--
 .../CreateEncryptRuleStatementUpdaterTest.java     | 13 +++--
 .../DropEncryptRuleStatementUpdaterTest.java       |  4 +-
 .../src/main/antlr4/imports/encrypt/Keyword.g4     | 10 +++-
 .../main/antlr4/imports/encrypt/RDLStatement.g4    | 10 +++-
 .../core/EncryptDistSQLStatementVisitor.java       |  9 ++-
 .../parser/segment/EncryptColumnSegment.java       |  9 ++-
 .../spring/boot/EncryptSpringBootStarterTest.java  |  8 ++-
 .../test/resources/application-encrypt.properties  |  4 ++
 .../namespace/EncryptSpringNamespaceTest.java      | 24 +++++++-
 .../spring/encrypt-application-context.xml         |  2 +
 25 files changed, 185 insertions(+), 63 deletions(-)

diff --git 
a/examples/shardingsphere-example-generator/src/main/resources/template/jdbc/java/config/encrypt.ftl
 
b/examples/shardingsphere-example-generator/src/main/resources/template/jdbc/java/config/encrypt.ftl
index 118a981bbff..49d5831c32e 100644
--- 
a/examples/shardingsphere-example-generator/src/main/resources/template/jdbc/java/config/encrypt.ftl
+++ 
b/examples/shardingsphere-example-generator/src/main/resources/template/jdbc/java/config/encrypt.ftl
@@ -18,7 +18,7 @@
     private EncryptRuleConfiguration createEncryptRuleConfiguration() {
         Properties props = new Properties();
         props.setProperty("aes-key-value", "123456");
-        EncryptColumnRuleConfiguration columnConfigAes = new 
EncryptColumnRuleConfiguration("phone", "phone", "", "phone_plain", 
"phone_encryptor", null);
+        EncryptColumnRuleConfiguration columnConfigAes = new 
EncryptColumnRuleConfiguration("phone", "phone", "", "", "phone_plain", 
"phone_encryptor", null);
         EncryptColumnRuleConfiguration columnConfigTest = new 
EncryptColumnRuleConfiguration("status", "status", "assisted_query_status", "", 
"string_encryptor", "string_encryptor", null);
         EncryptTableRuleConfiguration orderItemRule = new 
EncryptTableRuleConfiguration("t_order_item", 
Collections.singleton(columnConfigAes), true);
         EncryptTableRuleConfiguration orderRule = new 
EncryptTableRuleConfiguration("t_order", 
Collections.singleton(columnConfigTest), true);
diff --git 
a/examples/shardingsphere-jdbc-example/single-feature-example/cluster-mode-example/cluster-mode-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/cluster/mode/raw/jdbc/config/local/LocalEncryptConfiguration.java
 
b/examples/shardingsphere-jdbc-example/single-feature-example/cluster-mode-example/cluster-mode-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/cluster/mode/raw/jdbc/config/local/LocalEncryptConfiguration.java
index be68050f8ce..220f85ae415 100644
--- 
a/examples/shardingsphere-jdbc-example/single-feature-example/cluster-mode-example/cluster-mode-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/cluster/mode/raw/jdbc/config/local/LocalEncryptConfiguration.java
+++ 
b/examples/shardingsphere-jdbc-example/single-feature-example/cluster-mode-example/cluster-mode-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/cluster/mode/raw/jdbc/config/local/LocalEncryptConfiguration.java
@@ -49,7 +49,7 @@ public final class LocalEncryptConfiguration implements 
ExampleConfiguration {
     }
     
     private EncryptTableRuleConfiguration 
createEncryptTableRuleConfiguration() {
-        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("status", "status", "", "", "status_encryptor", 
null);
+        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("status", "status", "", "", "", 
"status_encryptor", null);
         return new EncryptTableRuleConfiguration("t_order", 
Collections.singleton(encryptColumnRuleConfig), null);
     }
     
diff --git 
a/examples/shardingsphere-jdbc-example/single-feature-example/encrypt-example/encrypt-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/encrypt/raw/jdbc/config/EncryptDatabasesConfiguration.java
 
b/examples/shardingsphere-jdbc-example/single-feature-example/encrypt-example/encrypt-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/encrypt/raw/jdbc/config/EncryptDatabasesConfiguration.java
index 700d870e75b..78ac314902e 100644
--- 
a/examples/shardingsphere-jdbc-example/single-feature-example/encrypt-example/encrypt-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/encrypt/raw/jdbc/config/EncryptDatabasesConfiguration.java
+++ 
b/examples/shardingsphere-jdbc-example/single-feature-example/encrypt-example/encrypt-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/encrypt/raw/jdbc/config/EncryptDatabasesConfiguration.java
@@ -39,8 +39,8 @@ public final class EncryptDatabasesConfiguration implements 
ExampleConfiguration
     public DataSource getDataSource() {
         Properties props = new Properties();
         props.setProperty("aes-key-value", "123456");
-        EncryptColumnRuleConfiguration columnConfigAes = new 
EncryptColumnRuleConfiguration("username", "username", "", "username_plain", 
"name_encryptor", null);
-        EncryptColumnRuleConfiguration columnConfigTest = new 
EncryptColumnRuleConfiguration("pwd", "pwd", "assisted_query_pwd", "", 
"pwd_encryptor", null);
+        EncryptColumnRuleConfiguration columnConfigAes = new 
EncryptColumnRuleConfiguration("username", "username", "", "", 
"username_plain", "name_encryptor", null);
+        EncryptColumnRuleConfiguration columnConfigTest = new 
EncryptColumnRuleConfiguration("pwd", "pwd", "assisted_query_pwd", "", "", 
"pwd_encryptor", null);
         EncryptTableRuleConfiguration encryptTableRuleConfig = new 
EncryptTableRuleConfiguration("t_user", Arrays.asList(columnConfigAes, 
columnConfigTest), null);
         Map<String, AlgorithmConfiguration> encryptAlgorithmConfigs = new 
LinkedHashMap<>(2, 1);
         encryptAlgorithmConfigs.put("name_encryptor", new 
AlgorithmConfiguration("AES", props));
diff --git 
a/examples/shardingsphere-jdbc-example/single-feature-example/shadow-example/shadow-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/shadow/raw/jdbc/config/ShadowEncryptConfiguration.java
 
b/examples/shardingsphere-jdbc-example/single-feature-example/shadow-example/shadow-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/shadow/raw/jdbc/config/ShadowEncryptConfiguration.java
index 5e0f455731d..5d5b3e82b40 100644
--- 
a/examples/shardingsphere-jdbc-example/single-feature-example/shadow-example/shadow-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/shadow/raw/jdbc/config/ShadowEncryptConfiguration.java
+++ 
b/examples/shardingsphere-jdbc-example/single-feature-example/shadow-example/shadow-raw-jdbc-example/src/main/java/org/apache/shardingsphere/example/shadow/raw/jdbc/config/ShadowEncryptConfiguration.java
@@ -80,8 +80,8 @@ public final class ShadowEncryptConfiguration extends 
BaseShadowConfiguration {
     private Collection<EncryptTableRuleConfiguration> 
getEncryptTableRuleConfigurations() {
         Collection<EncryptTableRuleConfiguration> result = new LinkedList<>();
         Collection<EncryptColumnRuleConfiguration> columns = new 
LinkedList<>();
-        columns.add(new EncryptColumnRuleConfiguration("username", "username", 
"", "username_plain", "name_encryptor", null));
-        columns.add(new EncryptColumnRuleConfiguration("pwd", "pwd", 
"assisted_query_pwd", "", "pwd_encryptor", null));
+        columns.add(new EncryptColumnRuleConfiguration("username", "username", 
"", "", "username_plain", "name_encryptor", null));
+        columns.add(new EncryptColumnRuleConfiguration("pwd", "pwd", 
"assisted_query_pwd", "", "", "pwd_encryptor", null));
         result.add(new EncryptTableRuleConfiguration("t_user", columns, null));
         return result;
     }
diff --git 
a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/rule/EncryptColumnRuleConfiguration.java
 
b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/rule/EncryptColumnRuleConfiguration.java
index 3741f67c015..50bc26729d7 100644
--- 
a/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/rule/EncryptColumnRuleConfiguration.java
+++ 
b/features/encrypt/api/src/main/java/org/apache/shardingsphere/encrypt/api/config/rule/EncryptColumnRuleConfiguration.java
@@ -45,8 +45,8 @@ public final class EncryptColumnRuleConfiguration {
     
     private final Boolean queryWithCipherColumn;
     
-    public EncryptColumnRuleConfiguration(final String logicColumn, final 
String cipherColumn, final String assistedQueryColumn, final String plainColumn,
-                                          final String encryptorName, final 
Boolean queryWithCipherColumn) {
-        this(logicColumn, cipherColumn, assistedQueryColumn, null, 
plainColumn, encryptorName, null, null, queryWithCipherColumn);
+    public EncryptColumnRuleConfiguration(final String logicColumn, final 
String cipherColumn, final String assistedQueryColumn, final String 
fuzzyQueryColumn,
+                                          final String plainColumn, final 
String encryptorName, final Boolean queryWithCipherColumn) {
+        this(logicColumn, cipherColumn, assistedQueryColumn, fuzzyQueryColumn, 
plainColumn, encryptorName, null, null, queryWithCipherColumn);
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
index cc6d8fa7151..96717b7cb14 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/AlgorithmProvidedEncryptRuleConfigurationCheckerTest.java
@@ -51,7 +51,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
     private AlgorithmProvidedEncryptRuleConfiguration 
createValidConfiguration() {
         AlgorithmProvidedEncryptRuleConfiguration result = 
mock(AlgorithmProvidedEncryptRuleConfiguration.class);
         
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 mock(EncryptAlgorithm.class)));
-        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, null, "user_plain", "aes_encryptor", false));
         when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
@@ -69,7 +69,7 @@ public final class 
AlgorithmProvidedEncryptRuleConfigurationCheckerTest {
     private AlgorithmProvidedEncryptRuleConfiguration 
createInvalidCipherColumnConfig() {
         AlgorithmProvidedEncryptRuleConfiguration result = 
mock(AlgorithmProvidedEncryptRuleConfiguration.class);
         when(result.getEncryptors()).thenReturn(Collections.emptyMap());
-        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, null, "user_plain", "aes_encryptor", false));
         when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
index 6af9927ead6..c784dfc7950 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/EncryptRuleConfigurationCheckerTest.java
@@ -50,7 +50,7 @@ public final class EncryptRuleConfigurationCheckerTest {
     private EncryptRuleConfiguration createValidConfiguration() {
         EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
         
when(result.getEncryptors()).thenReturn(Collections.singletonMap("aes_encryptor",
 mock(AlgorithmConfiguration.class)));
-        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, null, "user_plain", "aes_encryptor", false));
         when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
@@ -68,7 +68,7 @@ public final class EncryptRuleConfigurationCheckerTest {
     private EncryptRuleConfiguration createInvalidCipherColumnConfig() {
         EncryptRuleConfiguration result = mock(EncryptRuleConfiguration.class);
         when(result.getEncryptors()).thenReturn(Collections.emptyMap());
-        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, "user_plain", "aes_encryptor", false));
+        Collection<EncryptColumnRuleConfiguration> columns = 
Collections.singletonList(new EncryptColumnRuleConfiguration("user_id", 
"user_cipher", null, null, "user_plain", "aes_encryptor", false));
         when(result.getTables()).thenReturn(Collections.singletonList(new 
EncryptTableRuleConfiguration("t_encrypt", columns, false)));
         return result;
     }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
index 490f2a6b42c..018b16d4382 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptRuleTest.java
@@ -50,7 +50,7 @@ public final class EncryptRuleTest {
     
     @Test
     public void 
assertNewInstanceWithAlgorithmProvidedEncryptRuleConfiguration() {
-        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", null);
+        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", "", 
"test_encryptor", null);
         EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), null);
         AlgorithmProvidedEncryptRuleConfiguration ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(
                 Collections.singleton(tableConfig), 
Collections.singletonMap("test_encryptor", new CoreEncryptAlgorithmFixture()), 
true);
@@ -77,8 +77,8 @@ public final class EncryptRuleTest {
     public void assertGetEncryptValues() {
         List<Object> encryptAssistedQueryValues = new 
EncryptRule(createEncryptRuleConfiguration())
                 .getEncryptValues(DefaultDatabase.LOGIC_NAME, 
DefaultDatabase.LOGIC_NAME, "t_encrypt", "pwd", 
Collections.singletonList(null));
-        for (final Object value : encryptAssistedQueryValues) {
-            assertNull(value);
+        for (Object actual : encryptAssistedQueryValues) {
+            assertNull(actual);
         }
     }
     
@@ -106,8 +106,8 @@ public final class EncryptRuleTest {
     public void assertGetEncryptAssistedQueryValues() {
         List<Object> encryptAssistedQueryValues = new 
EncryptRule(createEncryptRuleConfiguration())
                 .getEncryptAssistedQueryValues(DefaultDatabase.LOGIC_NAME, 
DefaultDatabase.LOGIC_NAME, "t_encrypt", "pwd", 
Collections.singletonList(null));
-        for (final Object value : encryptAssistedQueryValues) {
-            assertNull(value);
+        for (Object actual : encryptAssistedQueryValues) {
+            assertNull(actual);
         }
     }
     
@@ -123,28 +123,44 @@ public final class EncryptRuleTest {
         assertFalse(new 
EncryptRule(createEncryptRuleConfiguration()).findPlainColumn("t_encrypt", 
"notExistLogicColumn").isPresent());
     }
     
+    @Test
+    public void assertFindFuzzyQueryColumn() {
+        assertFalse(new 
EncryptRule(createEncryptRuleConfiguration()).findFuzzyQueryColumn("t_encrypt", 
"pwd_cipher").isPresent());
+    }
+    
+    @Test
+    public void assertGetEncryptFuzzyQueryValues() {
+        List<Object> encryptFuzzyQueryValues = new 
EncryptRule(createEncryptRuleConfiguration())
+                .getEncryptFuzzyQueryValues(DefaultDatabase.LOGIC_NAME, 
DefaultDatabase.LOGIC_NAME, "t_encrypt", "pwd", 
Collections.singletonList(null));
+        for (Object actual : encryptFuzzyQueryValues) {
+            assertNull(actual);
+        }
+    }
+    
+    @Test
+    public void assertGetFuzzyQueryColumns() {
+        assertFalse(new 
EncryptRule(createEncryptRuleConfiguration()).getFuzzyQueryColumns("t_encrypt").isEmpty());
+    }
+    
     @Test
     public void assertIsQueryWithCipherColumn() {
-        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", null);
+        EncryptColumnRuleConfiguration encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", "", 
"test_encryptor", null);
         EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), null);
         AlgorithmProvidedEncryptRuleConfiguration ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(
                 Collections.singleton(tableConfig), 
Collections.singletonMap("test_encryptor", new CoreEncryptAlgorithmFixture()), 
true);
         EncryptRule actual = new EncryptRule(ruleConfig);
         assertTrue(actual.isQueryWithCipherColumn("t_encrypt", 
"encrypt_column"));
-        
-        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", null);
+        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", "", 
"test_encryptor", null);
         tableConfig = new EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), false);
         ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(Collections.singleton(tableConfig), 
Collections.singletonMap("test_encryptor", new CoreEncryptAlgorithmFixture()), 
true);
         actual = new EncryptRule(ruleConfig);
         assertFalse(actual.isQueryWithCipherColumn("t_encrypt", 
"encrypt_column"));
-        
-        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", true);
+        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", "", 
"test_encryptor", true);
         tableConfig = new EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), false);
         ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(Collections.singleton(tableConfig), 
Collections.singletonMap("test_encryptor", new CoreEncryptAlgorithmFixture()), 
true);
         actual = new EncryptRule(ruleConfig);
         assertTrue(actual.isQueryWithCipherColumn("t_encrypt", 
"encrypt_column"));
-        
-        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", 
"test_encryptor", false);
+        encryptColumnConfig = new 
EncryptColumnRuleConfiguration("encrypt_column", "encrypt_cipher", "", "", "", 
"test_encryptor", false);
         tableConfig = new EncryptTableRuleConfiguration("t_encrypt", 
Collections.singletonList(encryptColumnConfig), null);
         ruleConfig = new 
AlgorithmProvidedEncryptRuleConfiguration(Collections.singleton(tableConfig), 
Collections.singletonMap("test_encryptor", new CoreEncryptAlgorithmFixture()), 
true);
         actual = new EncryptRule(ruleConfig);
@@ -184,12 +200,14 @@ public final class EncryptRuleTest {
     
     private EncryptRuleConfiguration createEncryptRuleConfiguration() {
         AlgorithmConfiguration queryAssistedEncryptConfig = new 
AlgorithmConfiguration("CORE.QUERY_ASSISTED.FIXTURE", new Properties());
+        AlgorithmConfiguration queryFuzzyEncryptConfig = new 
AlgorithmConfiguration("CORE.QUERY_FUZZY.FIXTURE", new Properties());
         AlgorithmConfiguration metaDataAwareEncryptConfig = new 
AlgorithmConfiguration("CORE.METADATA_AWARE.FIXTURE", new Properties());
-        EncryptColumnRuleConfiguration pwdColumnConfig = new 
EncryptColumnRuleConfiguration("pwd", "pwd_cipher", "pwd_assist", "", 
"pwd_plain", "test_encryptor", "test_encryptor", null, null);
-        EncryptColumnRuleConfiguration creditCardColumnConfig = new 
EncryptColumnRuleConfiguration("credit_card", "credit_card_cipher", "", 
"credit_card_plain", "test_encryptor", null);
-        EncryptColumnRuleConfiguration nameColumnConfig = new 
EncryptColumnRuleConfiguration("name", "name_cipher", "", "name_plain", 
"customized_encryptor", null);
+        EncryptColumnRuleConfiguration pwdColumnConfig =
+                new EncryptColumnRuleConfiguration("pwd", "pwd_cipher", 
"pwd_assist", "pwd_fuzzy", "pwd_plain", "test_encryptor", "test_encryptor", 
"fuzzy_encryptor", null);
+        EncryptColumnRuleConfiguration creditCardColumnConfig = new 
EncryptColumnRuleConfiguration("credit_card", "credit_card_cipher", "", "", 
"credit_card_plain", "test_encryptor", null);
+        EncryptColumnRuleConfiguration nameColumnConfig = new 
EncryptColumnRuleConfiguration("name", "name_cipher", "", "", "name_plain", 
"customized_encryptor", null);
         EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("t_encrypt", Arrays.asList(pwdColumnConfig, 
creditCardColumnConfig, nameColumnConfig), null);
-        return new 
EncryptRuleConfiguration(Collections.singleton(tableConfig), 
getEncryptors(queryAssistedEncryptConfig, metaDataAwareEncryptConfig));
+        return new 
EncryptRuleConfiguration(Collections.singleton(tableConfig), 
getEncryptors(queryAssistedEncryptConfig, queryFuzzyEncryptConfig, 
metaDataAwareEncryptConfig));
     }
     
     @Test
@@ -199,20 +217,30 @@ public final class EncryptRuleTest {
         assertThat(pwdColumnConfig.getAssistedQueryEncryptorName(), 
is("assisted_query_test_encryptor"));
     }
     
+    @Test
+    public void assertFuzzyQueryEncryptorNameSpecified() {
+        EncryptColumnRuleConfiguration pwdColumnConfig =
+                new EncryptColumnRuleConfiguration("pwd", "pwd_cipher", "", 
"pwd_fuzzy", "pwd_plain", "test_encryptor", "", "fuzzy_query_test_encryptor", 
null);
+        assertThat(pwdColumnConfig.getFuzzyQueryEncryptorName(), 
is("fuzzy_query_test_encryptor"));
+    }
+    
     private EncryptRuleConfiguration 
createEncryptRuleConfigurationWithUpperCaseLogicTable() {
         AlgorithmConfiguration queryAssistedEncryptConfig = new 
AlgorithmConfiguration("CORE.QUERY_ASSISTED.FIXTURE", new Properties());
+        AlgorithmConfiguration queryFuzzyEncryptConfig = new 
AlgorithmConfiguration("CORE.QUERY_FUZZY.FIXTURE", new Properties());
         AlgorithmConfiguration metaDataAwareEncryptConfig = new 
AlgorithmConfiguration("CORE.METADATA_AWARE.FIXTURE", new Properties());
-        EncryptColumnRuleConfiguration pwdColumnConfig = new 
EncryptColumnRuleConfiguration("pwd", "pwd_cipher", "", "pwd_plain", 
"test_encryptor", null);
-        EncryptColumnRuleConfiguration creditCardColumnConfig = new 
EncryptColumnRuleConfiguration("credit_card", "credit_card_cipher", "", 
"credit_card_plain", "test_encryptor", null);
-        EncryptColumnRuleConfiguration nameColumnConfig = new 
EncryptColumnRuleConfiguration("name", "name_cipher", "", "name_plain", 
"customized_encryptor", null);
+        EncryptColumnRuleConfiguration pwdColumnConfig = new 
EncryptColumnRuleConfiguration("pwd", "pwd_cipher", "", "", "pwd_plain", 
"test_encryptor", null);
+        EncryptColumnRuleConfiguration creditCardColumnConfig = new 
EncryptColumnRuleConfiguration("credit_card", "credit_card_cipher", "", "", 
"credit_card_plain", "test_encryptor", null);
+        EncryptColumnRuleConfiguration nameColumnConfig = new 
EncryptColumnRuleConfiguration("name", "name_cipher", "", "", "name_plain", 
"customized_encryptor", null);
         EncryptTableRuleConfiguration tableConfig = new 
EncryptTableRuleConfiguration("T_ENCRYPT", Arrays.asList(pwdColumnConfig, 
creditCardColumnConfig, nameColumnConfig), null);
-        return new 
EncryptRuleConfiguration(Collections.singleton(tableConfig), 
getEncryptors(queryAssistedEncryptConfig, metaDataAwareEncryptConfig));
+        return new 
EncryptRuleConfiguration(Collections.singleton(tableConfig), 
getEncryptors(queryAssistedEncryptConfig, queryFuzzyEncryptConfig, 
metaDataAwareEncryptConfig));
     }
     
     private Map<String, AlgorithmConfiguration> getEncryptors(final 
AlgorithmConfiguration queryAssistedEncryptConfig,
+                                                              final 
AlgorithmConfiguration queryFuzzyEncryptConfig,
                                                               final 
AlgorithmConfiguration metaDataAwareEncryptConfig) {
         Map<String, AlgorithmConfiguration> result = new HashMap<>(2, 1);
         result.put("test_encryptor", queryAssistedEncryptConfig);
+        result.put("fuzzy_encryptor", queryFuzzyEncryptConfig);
         result.put("customized_encryptor", metaDataAwareEncryptConfig);
         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 d5c3610b78e..7d7d789299c 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
@@ -39,7 +39,7 @@ public final class EncryptTableTest {
     @Before
     public void setUp() {
         encryptTable = new EncryptTable(new 
EncryptTableRuleConfiguration("t_encrypt",
-                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "plainColumn", "myEncryptor", null)), null));
+                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "fuzzyQueryColumn", "plainColumn", "myEncryptor", 
null)), null));
     }
     
     @Test
@@ -104,11 +104,23 @@ public final class EncryptTableTest {
         assertThat(actual.get(), is("assistedQueryColumn"));
     }
     
+    @Test
+    public void assertFindFuzzyQueryColumn() {
+        Optional<String> actual = 
encryptTable.findFuzzyQueryColumn("logicColumn");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), is("fuzzyQueryColumn"));
+    }
+    
     @Test
     public void assertNotFindAssistedQueryColumn() {
         
assertFalse(encryptTable.findAssistedQueryColumn("notExistLogicColumn").isPresent());
     }
     
+    @Test
+    public void assertNotFindFuzzyQueryColumn() {
+        
assertFalse(encryptTable.findAssistedQueryColumn("notExistFuzzyQueryColumn").isPresent());
+    }
+    
     @Test
     public void assertGetPlainColumns() {
         assertThat(encryptTable.getPlainColumns(), 
is(Collections.singletonList("plainColumn")));
@@ -137,13 +149,13 @@ public final class EncryptTableTest {
         assertFalse(actual.isPresent());
         
         encryptTable = new EncryptTable(new 
EncryptTableRuleConfiguration("t_encrypt",
-                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "plainColumn", "myEncryptor", null)), true));
+                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "fuzzyQueryColumn", "plainColumn", "myEncryptor", 
null)), true));
         actual = encryptTable.getQueryWithCipherColumn("logicColumn");
         assertTrue(actual.isPresent());
         assertTrue(actual.get());
         
         encryptTable = new EncryptTable(new 
EncryptTableRuleConfiguration("t_encrypt",
-                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "plainColumn", "myEncryptor", false)), true));
+                Collections.singleton(new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "fuzzyQueryColumn", "plainColumn", "myEncryptor", 
false)), true));
         actual = encryptTable.getQueryWithCipherColumn("logicColumn");
         assertTrue(actual.isPresent());
         assertFalse(actual.get());
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptColumnRuleConfigurationSwapperTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptColumnRuleConfigurationSwapperTest.java
index 78fde6ff3a4..d9121b0a166 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptColumnRuleConfigurationSwapperTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptColumnRuleConfigurationSwapperTest.java
@@ -29,11 +29,13 @@ public final class 
YamlEncryptColumnRuleConfigurationSwapperTest {
     @Test
     public void assertSwapToYamlConfiguration() {
         YamlEncryptColumnRuleConfigurationSwapper swapper = new 
YamlEncryptColumnRuleConfigurationSwapper();
-        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("logicColumn", "cipherColumn", 
"assistedQueryColumn", "plainColumn", "encryptorName", true);
+        EncryptColumnRuleConfiguration encryptColumnRuleConfig =
+                new EncryptColumnRuleConfiguration("logicColumn", 
"cipherColumn", "assistedQueryColumn", "fuzzyQueryColumn", "plainColumn", 
"encryptorName", true);
         YamlEncryptColumnRuleConfiguration actual = 
swapper.swapToYamlConfiguration(encryptColumnRuleConfig);
         assertThat(actual.getLogicColumn(), is("logicColumn"));
         assertThat(actual.getCipherColumn(), is("cipherColumn"));
         assertThat(actual.getAssistedQueryColumn(), is("assistedQueryColumn"));
+        assertThat(actual.getFuzzyQueryColumn(), is("fuzzyQueryColumn"));
         assertThat(actual.getPlainColumn(), is("plainColumn"));
         assertThat(actual.getEncryptorName(), is("encryptorName"));
         assertThat(actual.getQueryWithCipherColumn(), is(true));
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptTableRuleConfigurationSwapperTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptTableRuleConfigurationSwapperTest.java
index 0f1bf7eeae8..38d749953be 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptTableRuleConfigurationSwapperTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/yaml/swapper/rule/YamlEncryptTableRuleConfigurationSwapperTest.java
@@ -41,9 +41,9 @@ public final class 
YamlEncryptTableRuleConfigurationSwapperTest {
     @Test
     public void assertSwapToYamlConfiguration() {
         Collection<EncryptColumnRuleConfiguration> encryptColumnRuleConfigs = 
Arrays.asList(
-                new EncryptColumnRuleConfiguration("encrypt_column_1", 
"encrypt_cipher_1", "", "", "test_encryptor_1", null),
-                new EncryptColumnRuleConfiguration("encrypt_column_2", 
"encrypt_cipher_2", "", "", "test_encryptor_2", true),
-                new EncryptColumnRuleConfiguration("encrypt_column_3", 
"encrypt_cipher_3", "", "", "test_encryptor_3", false));
+                new EncryptColumnRuleConfiguration("encrypt_column_1", 
"encrypt_cipher_1", "", "", "", "test_encryptor_1", null),
+                new EncryptColumnRuleConfiguration("encrypt_column_2", 
"encrypt_cipher_2", "", "", "", "test_encryptor_2", true),
+                new EncryptColumnRuleConfiguration("encrypt_column_3", 
"encrypt_cipher_3", "", "", "", "test_encryptor_3", false));
         EncryptTableRuleConfiguration encryptTableRuleConfig = new 
EncryptTableRuleConfiguration("test_table", encryptColumnRuleConfigs, true);
         YamlEncryptTableRuleConfiguration actualYamlEncryptTableRuleConfig = 
swapper.swapToYamlConfiguration(encryptTableRuleConfig);
         assertThat(actualYamlEncryptTableRuleConfig.getName(), 
is("test_table"));
diff --git 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverter.java
 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverter.java
index 7bfe6054c5d..b8c42e6a405 100644
--- 
a/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverter.java
+++ 
b/features/encrypt/distsql/handler/src/main/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverter.java
@@ -60,8 +60,9 @@ public final class EncryptRuleStatementConverter {
     
     private static EncryptColumnRuleConfiguration 
createEncryptColumnRuleConfiguration(final String tableName, final 
EncryptColumnSegment columnSegment) {
         String assistedQueryEncryptorName = null == 
columnSegment.getAssistedQueryEncryptor() ? null : 
getAssistedQueryEncryptorName(tableName, columnSegment.getName());
+        String fuzzyQueryEncryptorName = null == 
columnSegment.getFuzzyQueryEncryptor() ? null : 
getFuzzyQueryEncryptorName(tableName, columnSegment.getName());
         return new EncryptColumnRuleConfiguration(columnSegment.getName(), 
columnSegment.getCipherColumn(), columnSegment.getAssistedQueryColumn(),
-                null, columnSegment.getPlainColumn(), 
getEncryptorName(tableName, columnSegment.getName()), 
assistedQueryEncryptorName, null, null);
+                columnSegment.getFuzzyQueryColumn(), 
columnSegment.getPlainColumn(), getEncryptorName(tableName, 
columnSegment.getName()), assistedQueryEncryptorName, fuzzyQueryEncryptorName, 
null);
     }
     
     private static Map<String, AlgorithmConfiguration> 
createEncryptorConfigurations(final EncryptRuleSegment ruleSegment) {
@@ -71,6 +72,9 @@ public final class EncryptRuleStatementConverter {
             if (null != each.getAssistedQueryEncryptor()) {
                 
result.put(getAssistedQueryEncryptorName(ruleSegment.getTableName(), 
each.getName()), createAssistedQueryEncryptorConfiguration(each));
             }
+            if (null != each.getFuzzyQueryEncryptor()) {
+                
result.put(getFuzzyQueryEncryptorName(ruleSegment.getTableName(), 
each.getName()), createFuzzyQueryEncryptorConfiguration(each));
+            }
         }
         return result;
     }
@@ -83,6 +87,10 @@ public final class EncryptRuleStatementConverter {
         return new 
AlgorithmConfiguration(columnSegment.getAssistedQueryEncryptor().getName(), 
columnSegment.getAssistedQueryEncryptor().getProps());
     }
     
+    private static AlgorithmConfiguration 
createFuzzyQueryEncryptorConfiguration(final EncryptColumnSegment 
columnSegment) {
+        return new 
AlgorithmConfiguration(columnSegment.getFuzzyQueryEncryptor().getName(), 
columnSegment.getFuzzyQueryEncryptor().getProps());
+    }
+    
     private static String getEncryptorName(final String tableName, final 
String columnName) {
         return String.format("%s_%s", tableName, columnName);
     }
@@ -90,4 +98,8 @@ public final class EncryptRuleStatementConverter {
     private static String getAssistedQueryEncryptorName(final String 
tableName, final String columnName) {
         return String.format("assist_%s_%s", tableName, columnName);
     }
+    
+    private static String getFuzzyQueryEncryptorName(final String tableName, 
final String columnName) {
+        return String.format("fuzzy_%s_%s", tableName, columnName);
+    }
 }
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverterTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverterTest.java
index 783d12f5907..6e3599a0497 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverterTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/converter/EncryptRuleStatementConverterTest.java
@@ -44,8 +44,10 @@ public final class EncryptRuleStatementConverterTest {
     }
     
     private Collection<EncryptColumnSegment> createColumns() {
-        return Collections.singleton(new EncryptColumnSegment("user_id", 
"user_cipher", "user_plain", "assisted_column",
-                new AlgorithmSegment("MD5", createProperties()), new 
AlgorithmSegment("MD5", createProperties())));
+        return Collections.singleton(new EncryptColumnSegment("user_id", 
"user_cipher", "user_plain", "assisted_column", "fuzzy_column",
+                new AlgorithmSegment("MD5", createProperties()),
+                new AlgorithmSegment("MD5", createProperties()),
+                new AlgorithmSegment("CHAR_DIGEST_FUZZY", 
createProperties())));
     }
     
     private Properties createProperties() {
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/query/EncryptRuleQueryResultSetTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/query/EncryptRuleQueryResultSetTest.java
index bc77430dc06..9b6c51d6fe7 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/query/EncryptRuleQueryResultSetTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/query/EncryptRuleQueryResultSetTest.java
@@ -65,7 +65,7 @@ public final class EncryptRuleQueryResultSetTest {
     }
     
     private RuleConfiguration getRuleConfiguration() {
-        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", null, "user_plain", 
"test", null);
+        EncryptColumnRuleConfiguration encryptColumnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", null, null, 
"user_plain", "test", null);
         EncryptTableRuleConfiguration encryptTableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(encryptColumnRuleConfig), null);
         AlgorithmConfiguration shardingSphereAlgorithmConfig = new 
AlgorithmConfiguration("md5", new Properties());
         return new 
EncryptRuleConfiguration(Collections.singleton(encryptTableRuleConfig), 
Collections.singletonMap("test", shardingSphereAlgorithmConfig));
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleStatementUpdaterTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleStatementUpdaterTest.java
index d868767ad46..e473ab8d1f7 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleStatementUpdaterTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/AlterEncryptRuleStatementUpdaterTest.java
@@ -62,8 +62,9 @@ public final class AlterEncryptRuleStatementUpdaterTest {
     
     @Test(expected = InvalidRuleConfigurationException.class)
     public void assertCheckSQLStatementWithIncompleteDataType() {
-        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column",
-                "int varchar(10)", null, null, null, new 
AlgorithmSegment("test", new Properties()),
+        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column", 
"fuzzy_column",
+                "int varchar(10)", null, null, null, null, new 
AlgorithmSegment("test", new Properties()),
+                new AlgorithmSegment("test", new Properties()),
                 new AlgorithmSegment("test", new Properties()));
         EncryptRuleSegment ruleSegment = new EncryptRuleSegment("t_encrypt", 
Collections.singleton(columnSegment), null);
         AlterEncryptRuleStatement statement = new 
AlterEncryptRuleStatement(Collections.singleton(ruleSegment));
@@ -71,8 +72,10 @@ public final class AlterEncryptRuleStatementUpdaterTest {
     }
     
     private AlterEncryptRuleStatement createSQLStatement(final String 
encryptorName) {
-        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column",
-                new AlgorithmSegment(encryptorName, new Properties()), new 
AlgorithmSegment("test", new Properties()));
+        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column", 
"fuzzy_column",
+                new AlgorithmSegment(encryptorName, new Properties()),
+                new AlgorithmSegment("test", new Properties()),
+                new AlgorithmSegment("test", new Properties()));
         EncryptRuleSegment ruleSegment = new EncryptRuleSegment("t_encrypt", 
Collections.singleton(columnSegment), null);
         return new 
AlterEncryptRuleStatement(Collections.singleton(ruleSegment));
     }
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdaterTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdaterTest.java
index 3cdf181e65f..a4a92827149 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdaterTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/CreateEncryptRuleStatementUpdaterTest.java
@@ -56,17 +56,20 @@ public final class CreateEncryptRuleStatementUpdaterTest {
     
     @Test(expected = InvalidRuleConfigurationException.class)
     public void assertCheckSQLStatementWithIncompleteDataType() {
-        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column",
-                "int varchar(10)", null, null, null, new 
AlgorithmSegment("test", new Properties()),
-                new AlgorithmSegment("test", new Properties()));
+        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column", 
"fuzzy_column",
+                "int varchar(10)", null, null, null, null, new 
AlgorithmSegment("test", new Properties()),
+                new AlgorithmSegment("test", new Properties()),
+                new AlgorithmSegment("CHAR_DIGEST_FUZZY", new Properties()));
         EncryptRuleSegment ruleSegment = new EncryptRuleSegment("t_encrypt", 
Collections.singleton(columnSegment), null);
         CreateEncryptRuleStatement statement = new 
CreateEncryptRuleStatement(Collections.singleton(ruleSegment));
         updater.checkSQLStatement(database, statement, null);
     }
     
     private CreateEncryptRuleStatement createSQLStatement(final String 
encryptorName) {
-        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column",
-                new AlgorithmSegment(encryptorName, new Properties()), new 
AlgorithmSegment(encryptorName, new Properties()));
+        EncryptColumnSegment columnSegment = new 
EncryptColumnSegment("user_id", "user_cipher", "user_plain", "assisted_column", 
"fuzzy_column",
+                new AlgorithmSegment(encryptorName, new Properties()),
+                new AlgorithmSegment(encryptorName, new Properties()),
+                new AlgorithmSegment(encryptorName, new Properties()));
         EncryptRuleSegment ruleSegment = new EncryptRuleSegment("t_encrypt", 
Collections.singleton(columnSegment), null);
         return new 
CreateEncryptRuleStatement(Collections.singleton(ruleSegment));
     }
diff --git 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
index fc68fd5e10e..8fbce9d4700 100644
--- 
a/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
+++ 
b/features/encrypt/distsql/handler/src/test/java/org/apache/shardingsphere/encrypt/distsql/handler/update/DropEncryptRuleStatementUpdaterTest.java
@@ -93,7 +93,7 @@ public final class DropEncryptRuleStatementUpdaterTest {
     }
     
     private EncryptRuleConfiguration createCurrentRuleConfiguration() {
-        EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "", "user_plain", 
"t_encrypt_user_id_MD5", null);
+        EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "", "", "user_plain", 
"t_encrypt_user_id_MD5", null);
         EncryptTableRuleConfiguration tableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(columnRuleConfig), null);
         Map<String, AlgorithmConfiguration> encryptors = new HashMap<>(
                 Collections.singletonMap("t_encrypt_user_id_MD5", new 
AlgorithmConfiguration("TEST", new Properties())));
@@ -101,7 +101,7 @@ public final class DropEncryptRuleStatementUpdaterTest {
     }
     
     private EncryptRuleConfiguration 
createCurrentRuleConfigurationWithMultipleTableRules() {
-        EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "", "user_plain", 
"t_encrypt_user_id_MD5", null);
+        EncryptColumnRuleConfiguration columnRuleConfig = new 
EncryptColumnRuleConfiguration("user_id", "user_cipher", "", "", "user_plain", 
"t_encrypt_user_id_MD5", null);
         EncryptTableRuleConfiguration tableRuleConfig = new 
EncryptTableRuleConfiguration("t_encrypt", 
Collections.singleton(columnRuleConfig), null);
         Map<String, AlgorithmConfiguration> encryptors = 
Collections.singletonMap("t_encrypt_user_id_MD5", new 
AlgorithmConfiguration("TEST", new Properties()));
         return new EncryptRuleConfiguration(new 
LinkedList<>(Arrays.asList(tableRuleConfig,
diff --git 
a/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/Keyword.g4 
b/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/Keyword.g4
index 7b03b4413b4..2ab6b2c151a 100644
--- a/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/Keyword.g4
+++ b/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/Keyword.g4
@@ -94,7 +94,11 @@ PLAIN
 ASSISTED_QUERY_COLUMN
     : A S S I S T E D UL_ Q U E R Y UL_ C O L U M N
     ;
-    
+
+FUZZY_QUERY_COLUMN
+    : F U Z Z Y UL_ Q U E R Y UL_ C O L U M N
+    ;
+
 QUERY_WITH_CIPHER_COLUMN
     : Q U E R Y UL_ W I T H UL_ C I P H E R UL_ C O L U M N
     ;
@@ -123,6 +127,10 @@ ASSISTED_QUERY_DATA_TYPE
     : A S S I S T E D UL_ Q U E R Y UL_ D A T A UL_ T Y P E
     ;
 
+FUZZY_QUERY_DATA_TYPE
+    : F U Z Z Y UL_ Q U E R Y UL_ D A T A UL_ T Y P E
+    ;
+
 IF  
     : I F
     ;
diff --git 
a/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/RDLStatement.g4
 
b/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/RDLStatement.g4
index 11b364953dc..0edd6d55c21 100644
--- 
a/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/RDLStatement.g4
+++ 
b/features/encrypt/distsql/parser/src/main/antlr4/imports/encrypt/RDLStatement.g4
@@ -44,7 +44,7 @@ resourceName
     ;
 
 encryptColumnDefinition
-    : LP columnDefinition (COMMA plainColumnDefinition)? COMMA 
cipherColumnDefinition (COMMA assistedQueryColumnDefinition)? COMMA 
algorithmDefinition (COMMA algorithmDefinition)? RP
+    : LP columnDefinition (COMMA plainColumnDefinition)? COMMA 
cipherColumnDefinition (COMMA assistedQueryColumnDefinition)? (COMMA 
fuzzyQueryColumnDefinition)? COMMA algorithmDefinition (COMMA 
algorithmDefinition)? (COMMA algorithmDefinition)? RP
     ;
 
 columnDefinition
@@ -82,6 +82,14 @@ assistedQueryColumnDefinition
 assistedQueryColumnName
     : IDENTIFIER
     ;
+
+fuzzyQueryColumnDefinition
+    : FUZZY_QUERY_COLUMN EQ fuzzyQueryColumnName (COMMA FUZZY_QUERY_DATA_TYPE 
EQ dataType)?
+    ;
+
+fuzzyQueryColumnName
+    : IDENTIFIER
+    ;
     
 queryWithCipherColumn
     : TRUE | FALSE
diff --git 
a/features/encrypt/distsql/parser/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/core/EncryptDistSQLStatementVisitor.java
 
b/features/encrypt/distsql/parser/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/core/EncryptDistSQLStatementVisitor.java
index a264c3d8ce4..1cc7850f94f 100644
--- 
a/features/encrypt/distsql/parser/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/core/EncryptDistSQLStatementVisitor.java
+++ 
b/features/encrypt/distsql/parser/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/core/EncryptDistSQLStatementVisitor.java
@@ -48,6 +48,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.Identifi
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -95,11 +96,17 @@ public final class EncryptDistSQLStatementVisitor extends 
EncryptDistSQLStatemen
                 
getIdentifierValue(ctx.cipherColumnDefinition().cipherColumnName()),
                 null == ctx.plainColumnDefinition() ? null : 
getIdentifierValue(ctx.plainColumnDefinition().plainColumnName()),
                 null == ctx.assistedQueryColumnDefinition() ? null : 
getIdentifierValue(ctx.assistedQueryColumnDefinition().assistedQueryColumnName()),
+                null == ctx.fuzzyQueryColumnDefinition() ? null : 
getIdentifierValue(ctx.fuzzyQueryColumnDefinition().fuzzyQueryColumnName()),
                 getIdentifierValue(ctx.columnDefinition().dataType()),
                 getIdentifierValue(ctx.cipherColumnDefinition().dataType()),
                 null == ctx.plainColumnDefinition() ? null : 
getIdentifierValue(ctx.plainColumnDefinition().dataType()),
                 null == ctx.assistedQueryColumnDefinition() ? null : 
getIdentifierValue(ctx.assistedQueryColumnDefinition().dataType()),
-                algorithmSegments.get(0), 1 == algorithmSegments.size() ? null 
: algorithmSegments.get(1));
+                null == ctx.fuzzyQueryColumnDefinition() ? null : 
getIdentifierValue(ctx.fuzzyQueryColumnDefinition().dataType()),
+                algorithmSegments.get(0),
+                null == ctx.assistedQueryColumnDefinition() || 1 == 
algorithmSegments.size() ? null : algorithmSegments.get(1),
+                null == ctx.fuzzyQueryColumnDefinition() ? null
+                        : 
Optional.ofNullable(algorithmSegments).filter(algorithm -> algorithm.size() > 
2).map(algorithm -> algorithm.get(2)).orElse(null));
+        
     }
     
     @Override
diff --git 
a/features/encrypt/distsql/statement/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/segment/EncryptColumnSegment.java
 
b/features/encrypt/distsql/statement/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/segment/EncryptColumnSegment.java
index d4cdc140cf3..3f8281bf93b 100644
--- 
a/features/encrypt/distsql/statement/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/segment/EncryptColumnSegment.java
+++ 
b/features/encrypt/distsql/statement/src/main/java/org/apache/shardingsphere/encrypt/distsql/parser/segment/EncryptColumnSegment.java
@@ -40,6 +40,8 @@ public final class EncryptColumnSegment implements ASTNode {
     
     private final String assistedQueryColumn;
     
+    private final String fuzzyQueryColumn;
+    
     private String dataType;
     
     private String cipherDataType;
@@ -48,10 +50,14 @@ public final class EncryptColumnSegment implements ASTNode {
     
     private String assistedQueryDataType;
     
+    private String fuzzyQueryDataType;
+    
     private final AlgorithmSegment encryptor;
     
     private final AlgorithmSegment assistedQueryEncryptor;
     
+    private final AlgorithmSegment fuzzyQueryEncryptor;
+    
     /**
      * Is the data type correct.
      *
@@ -60,7 +66,8 @@ public final class EncryptColumnSegment implements ASTNode {
     public boolean isCorrectDataType() {
         boolean requireDataType = !Strings.isNullOrEmpty(dataType);
         return isCorrectDataType(requireDataType, name, dataType) && 
isCorrectDataType(requireDataType, plainColumn, plainDataType)
-                && isCorrectDataType(requireDataType, cipherColumn, 
cipherDataType) && isCorrectDataType(requireDataType, assistedQueryColumn, 
assistedQueryDataType);
+                && isCorrectDataType(requireDataType, cipherColumn, 
cipherDataType) && isCorrectDataType(requireDataType, assistedQueryColumn, 
assistedQueryDataType)
+                && isCorrectDataType(requireDataType, fuzzyQueryColumn, 
fuzzyQueryDataType);
     }
     
     private boolean isCorrectDataType(final boolean requireDataType, final 
String field, final String fieldDataType) {
diff --git 
a/features/encrypt/spring/spring-boot-starter/src/test/java/org/apache/shardingsphere/encrypt/spring/boot/EncryptSpringBootStarterTest.java
 
b/features/encrypt/spring/spring-boot-starter/src/test/java/org/apache/shardingsphere/encrypt/spring/boot/EncryptSpringBootStarterTest.java
index e1ed0e448ac..911ab000732 100644
--- 
a/features/encrypt/spring/spring-boot-starter/src/test/java/org/apache/shardingsphere/encrypt/spring/boot/EncryptSpringBootStarterTest.java
+++ 
b/features/encrypt/spring/spring-boot-starter/src/test/java/org/apache/shardingsphere/encrypt/spring/boot/EncryptSpringBootStarterTest.java
@@ -17,9 +17,10 @@
 
 package org.apache.shardingsphere.encrypt.spring.boot;
 
+import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
 import org.apache.shardingsphere.encrypt.algorithm.encrypt.AESEncryptAlgorithm;
 import org.apache.shardingsphere.encrypt.algorithm.encrypt.MD5EncryptAlgorithm;
-import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.algorithm.fuzzy.CharDigestFuzzyEncryptAlgorithm;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
@@ -65,10 +66,11 @@ public class EncryptSpringBootStarterTest {
     }
     
     private void assertEncryptors(final Map<String, EncryptAlgorithm<?, ?>> 
encryptors) {
-        assertThat(encryptors.size(), is(2));
+        assertThat(encryptors.size(), is(3));
         assertThat(encryptors.get("aesEncryptor"), 
instanceOf(AESEncryptAlgorithm.class));
         
assertThat(encryptors.get("aesEncryptor").getProps().getProperty("aes-key-value"),
 is("123456"));
         assertThat(encryptors.get("md5Encryptor"), 
instanceOf(MD5EncryptAlgorithm.class));
+        assertThat(encryptors.get("fuzzyCnEncryptor"), 
instanceOf(CharDigestFuzzyEncryptAlgorithm.class));
     }
     
     private void assertEncryptTable(final EncryptTableRuleConfiguration 
tableRuleConfig) {
@@ -90,7 +92,9 @@ public class EncryptSpringBootStarterTest {
         assertThat(columnRuleConfig.getLogicColumn(), is("credit_card"));
         assertThat(columnRuleConfig.getCipherColumn(), 
is("credit_card_cipher"));
         assertThat(columnRuleConfig.getAssistedQueryColumn(), 
is("credit_card_assisted_query"));
+        assertThat(columnRuleConfig.getFuzzyQueryColumn(), 
is("credit_card_fuzzy_query"));
         assertThat(columnRuleConfig.getPlainColumn(), is("credit_card_plain"));
         assertThat(columnRuleConfig.getEncryptorName(), is("md5Encryptor"));
+        assertThat(columnRuleConfig.getFuzzyQueryEncryptorName(), 
is("fuzzyCnEncryptor"));
     }
 }
diff --git 
a/features/encrypt/spring/spring-boot-starter/src/test/resources/application-encrypt.properties
 
b/features/encrypt/spring/spring-boot-starter/src/test/resources/application-encrypt.properties
index cd73cbca661..3b5f6c0de76 100644
--- 
a/features/encrypt/spring/spring-boot-starter/src/test/resources/application-encrypt.properties
+++ 
b/features/encrypt/spring/spring-boot-starter/src/test/resources/application-encrypt.properties
@@ -20,6 +20,8 @@ 
spring.shardingsphere.rules.encrypt.encryptors.aesEncryptor.props.aes-key-value=
 
 spring.shardingsphere.rules.encrypt.encryptors.md5Encryptor.type=MD5
 
+spring.shardingsphere.rules.encrypt.encryptors.fuzzyCnEncryptor.type=CHAR_DIGEST_FUZZY
+
 
spring.shardingsphere.rules.encrypt.tables.t_order.query-with-cipher-column=false
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.pwd.cipher-column=pwd_cipher
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.pwd.plain-column=pwd_plain
@@ -28,6 +30,8 @@ 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.pwd.encryptor-name=ae
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.cipher-column=credit_card_cipher
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.plain-column=credit_card_plain
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.assisted-query-column=credit_card_assisted_query
+spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.fuzzy-query-column=credit_card_fuzzy_query
 
spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.encryptor-name=md5Encryptor
+spring.shardingsphere.rules.encrypt.tables.t_order.columns.credit_card.fuzzyQueryEncryptorName=fuzzyCnEncryptor
 
 spring.main.banner-mode=off
diff --git 
a/features/encrypt/spring/spring-namespace/src/test/java/org/apache/shardingsphere/encrypt/spring/namespace/EncryptSpringNamespaceTest.java
 
b/features/encrypt/spring/spring-namespace/src/test/java/org/apache/shardingsphere/encrypt/spring/namespace/EncryptSpringNamespaceTest.java
index 2d46eed0da9..655b2dd8563 100644
--- 
a/features/encrypt/spring/spring-namespace/src/test/java/org/apache/shardingsphere/encrypt/spring/namespace/EncryptSpringNamespaceTest.java
+++ 
b/features/encrypt/spring/spring-namespace/src/test/java/org/apache/shardingsphere/encrypt/spring/namespace/EncryptSpringNamespaceTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.encrypt.spring.namespace;
 import org.apache.shardingsphere.encrypt.algorithm.encrypt.AESEncryptAlgorithm;
 import org.apache.shardingsphere.encrypt.algorithm.encrypt.MD5EncryptAlgorithm;
 import 
org.apache.shardingsphere.encrypt.algorithm.config.AlgorithmProvidedEncryptRuleConfiguration;
+import 
org.apache.shardingsphere.encrypt.algorithm.fuzzy.CharDigestFuzzyEncryptAlgorithm;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptColumnRuleConfiguration;
 import 
org.apache.shardingsphere.encrypt.api.config.rule.EncryptTableRuleConfiguration;
 import org.apache.shardingsphere.encrypt.spi.EncryptAlgorithm;
@@ -46,6 +47,9 @@ public final class EncryptSpringNamespaceTest extends 
AbstractJUnit4SpringContex
     @Resource
     private EncryptAlgorithm<Object, String> md5Encryptor;
     
+    @Resource
+    private EncryptAlgorithm<Object, String> fuzzyCnEncryptor;
+    
     @Resource
     private AlgorithmProvidedEncryptRuleConfiguration encryptRule;
     
@@ -60,6 +64,11 @@ public final class EncryptSpringNamespaceTest extends 
AbstractJUnit4SpringContex
         assertThat(md5Encryptor.getType(), is("MD5"));
     }
     
+    @Test
+    public void assertFuzzyCnEncryptor() {
+        assertThat(fuzzyCnEncryptor.getType(), is("CHAR_DIGEST_FUZZY"));
+    }
+    
     @Test
     public void assertEncryptRuleConfiguration() {
         assertEncryptors(encryptRule.getEncryptors());
@@ -68,19 +77,21 @@ public final class EncryptSpringNamespaceTest extends 
AbstractJUnit4SpringContex
     }
     
     private void assertEncryptors(final Map<String, EncryptAlgorithm<?, ?>> 
encryptors) {
-        assertThat(encryptors.size(), is(2));
+        assertThat(encryptors.size(), is(3));
         assertThat(encryptors.get("aesEncryptor"), 
instanceOf(AESEncryptAlgorithm.class));
         
assertThat(encryptors.get("aesEncryptor").getProps().getProperty("aes-key-value"),
 is("123456"));
         assertThat(encryptors.get("md5Encryptor"), 
instanceOf(MD5EncryptAlgorithm.class));
+        assertThat(encryptors.get("fuzzyCnEncryptor"), 
instanceOf(CharDigestFuzzyEncryptAlgorithm.class));
     }
     
     private void assertEncryptTable(final EncryptTableRuleConfiguration 
tableRuleConfig) {
         assertThat(tableRuleConfig.getName(), is("t_order"));
         assertFalse(tableRuleConfig.getQueryWithCipherColumn());
-        assertThat(tableRuleConfig.getColumns().size(), is(2));
+        assertThat(tableRuleConfig.getColumns().size(), is(3));
         Iterator<EncryptColumnRuleConfiguration> columnRuleConfigs = 
tableRuleConfig.getColumns().iterator();
         assertEncryptColumn1(columnRuleConfigs.next());
         assertEncryptColumn2(columnRuleConfigs.next());
+        assertEncryptColumn3(columnRuleConfigs.next());
     }
     
     private void assertEncryptColumn1(final EncryptColumnRuleConfiguration 
columnRuleConfig) {
@@ -98,4 +109,13 @@ public final class EncryptSpringNamespaceTest extends 
AbstractJUnit4SpringContex
         assertThat(columnRuleConfig.getEncryptorName(), is("md5Encryptor"));
         assertFalse(columnRuleConfig.getQueryWithCipherColumn());
     }
+    
+    private void assertEncryptColumn3(final EncryptColumnRuleConfiguration 
columnRuleConfig) {
+        assertThat(columnRuleConfig.getLogicColumn(), is("credit_card"));
+        assertThat(columnRuleConfig.getCipherColumn(), 
is("credit_card_cipher"));
+        assertThat(columnRuleConfig.getFuzzyQueryColumn(), 
is("credit_card_fuzzy_query"));
+        assertThat(columnRuleConfig.getPlainColumn(), is("credit_card_plain"));
+        assertThat(columnRuleConfig.getEncryptorName(), 
is("fuzzyCnEncryptor"));
+        assertFalse(columnRuleConfig.getQueryWithCipherColumn());
+    }
 }
diff --git 
a/features/encrypt/spring/spring-namespace/src/test/resources/META-INF/spring/encrypt-application-context.xml
 
b/features/encrypt/spring/spring-namespace/src/test/resources/META-INF/spring/encrypt-application-context.xml
index 772ae6cd945..04cf5397db8 100644
--- 
a/features/encrypt/spring/spring-namespace/src/test/resources/META-INF/spring/encrypt-application-context.xml
+++ 
b/features/encrypt/spring/spring-namespace/src/test/resources/META-INF/spring/encrypt-application-context.xml
@@ -35,11 +35,13 @@
         </props>
     </encrypt:encrypt-algorithm>
     <encrypt:encrypt-algorithm id="md5Encryptor" type="MD5" />
+    <encrypt:encrypt-algorithm id="fuzzyCnEncryptor" type="CHAR_DIGEST_FUZZY" 
/>
     
     <encrypt:rule id="encryptRule">
         <encrypt:table name="t_order" query-with-cipher-column="false">
             <encrypt:column logic-column="pwd" cipher-column="pwd_cipher" 
encrypt-algorithm-ref="aesEncryptor" query-with-cipher-column="true" />
             <encrypt:column logic-column="credit_card" 
cipher-column="credit_card_cipher" 
assisted-query-column="credit_card_assisted_query" 
plain-column="credit_card_plain" encrypt-algorithm-ref="md5Encryptor" 
query-with-cipher-column="false" />
+            <encrypt:column logic-column="credit_card" 
cipher-column="credit_card_cipher" fuzzy-query-column="credit_card_fuzzy_query" 
plain-column="credit_card_plain" encrypt-algorithm-ref="fuzzyCnEncryptor" 
query-with-cipher-column="false" />
         </encrypt:table>
     </encrypt:rule>
 </beans>

Reply via email to