You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by yx...@apache.org on 2022/11/13 02:48:51 UTC

[shardingsphere] branch master updated: Fix wrong column result when config encrypt like column (#22131)

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

yx9o 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 063722d7aed Fix wrong column result when config encrypt like column (#22131)
063722d7aed is described below

commit 063722d7aed0b4318c381bde054f3f55eaba367c
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Sun Nov 13 10:48:43 2022 +0800

    Fix wrong column result when config encrypt like column (#22131)
---
 .../dal/show/EncryptShowColumnsMergedResult.java   |   3 +-
 .../metadata/EncryptSchemaMetaDataDecorator.java   |   3 +-
 ...ecoratedEncryptShowColumnsMergedResultTest.java | 112 +++++++++++++++++----
 .../MergedEncryptShowColumnsMergedResultTest.java  |  60 ++++++++---
 .../dal/show/fixture/TestStatementContext.java     |  59 -----------
 .../EncryptSchemaMetaDataDecoratorTest.java        |   9 +-
 6 files changed, 149 insertions(+), 97 deletions(-)

diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
index 69fc107771a..7f4734822bb 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
@@ -58,7 +58,8 @@ public abstract class EncryptShowColumnsMergedResult implements MergedResult {
             return false;
         }
         String columnName = getOriginalValue(COLUMN_FIELD_INDEX, String.class).toString();
-        while (encryptTable.get().getAssistedQueryColumns().contains(columnName) || encryptTable.get().getPlainColumns().contains(columnName)) {
+        while (encryptTable.get().getAssistedQueryColumns().contains(columnName) || encryptTable.get().getLikeQueryColumns().contains(columnName)
+                || encryptTable.get().getPlainColumns().contains(columnName)) {
             hasNext = nextValue();
             if (!hasNext) {
                 return false;
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
index 6cccf488784..6f29360e680 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
@@ -60,6 +60,7 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
         Collection<ColumnMetaData> result = new LinkedHashSet<>();
         Collection<String> plainColumns = encryptTable.getPlainColumns();
         Collection<String> assistedQueryColumns = encryptTable.getAssistedQueryColumns();
+        Collection<String> likeQueryColumns = encryptTable.getLikeQueryColumns();
         for (ColumnMetaData each : originalColumnMetaDataList) {
             String columnName = each.getName();
             if (plainColumns.contains(columnName)) {
@@ -70,7 +71,7 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
                 result.add(createColumnMetaData(encryptTable.getLogicColumnByCipherColumn(columnName), each));
                 continue;
             }
-            if (!assistedQueryColumns.contains(columnName)) {
+            if (!assistedQueryColumns.contains(columnName) && !likeQueryColumns.contains(columnName)) {
                 result.add(each);
             }
         }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
index 49fd7ae3110..8b06e443cbf 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/DecoratedEncryptShowColumnsMergedResultTest.java
@@ -17,42 +17,120 @@
 
 package org.apache.shardingsphere.encrypt.merge.dal.show;
 
-import org.apache.shardingsphere.encrypt.merge.dal.show.fixture.TestStatementContext;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
+import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.infra.binder.statement.dal.ShowColumnsStatementContext;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.Calendar;
 import java.util.Collections;
+import java.util.Date;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+@RunWith(MockitoJUnitRunner.class)
 public final class DecoratedEncryptShowColumnsMergedResultTest {
     
+    @Mock
+    private MergedResult mergedResult;
+    
     @Test
-    public void assertNewValidResult() throws SQLException {
-        TestStatementContext testStatementContext = mock(TestStatementContext.class);
-        SimpleTableSegment simpleTableSegment = mock(SimpleTableSegment.class);
-        IdentifierValue identifierValue = mock(IdentifierValue.class);
-        when(identifierValue.getValue()).thenReturn("value");
-        TableNameSegment tableNameSegment = new TableNameSegment(0, 1, identifierValue);
-        when(simpleTableSegment.getTableName()).thenReturn(tableNameSegment);
-        when(testStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment));
-        MergedResult mergedResult = mock(MergedResult.class);
+    public void assertNextWithNotHasNext() throws SQLException {
+        assertFalse(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).next());
+    }
+    
+    @Test
+    public void assertNextWithHasNext() throws SQLException {
         when(mergedResult.next()).thenReturn(true);
-        when(mergedResult.wasNull()).thenReturn(false);
-        when(mergedResult.getValue(1, getClass())).thenReturn("test");
-        DecoratedEncryptShowColumnsMergedResult actual = new DecoratedEncryptShowColumnsMergedResult(mergedResult, testStatementContext, mock(EncryptRule.class));
-        assertTrue(actual.nextValue());
-        assertFalse(actual.wasNull());
-        assertThat(actual.getOriginalValue(1, getClass()), is("test"));
+        assertTrue(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).next());
+    }
+    
+    @Test
+    public void assertNextWithAssistedQuery() throws SQLException {
+        when(mergedResult.next()).thenReturn(true).thenReturn(false);
+        when(mergedResult.getValue(1, String.class)).thenReturn("user_id_assisted");
+        assertFalse(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mockEncryptRule()).next());
+    }
+    
+    @Test
+    public void assertNextWithLikeQuery() throws SQLException {
+        when(mergedResult.next()).thenReturn(true).thenReturn(false);
+        when(mergedResult.getValue(1, String.class)).thenReturn("user_id_like");
+        assertFalse(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mockEncryptRule()).next());
+    }
+    
+    @Test
+    public void assertNextWithLikeQueryAndMultiColumns() throws SQLException {
+        when(mergedResult.next()).thenReturn(true, true, true, false);
+        when(mergedResult.getValue(1, String.class)).thenReturn("user_id_like", "order_id", "content");
+        DecoratedEncryptShowColumnsMergedResult actual = createDecoratedEncryptShowColumnsMergedResult(mergedResult, mockEncryptRule());
+        assertTrue(actual.next());
+        assertTrue(actual.next());
+        assertFalse(actual.next());
+    }
+    
+    @Test
+    public void assertGetValueWithCipherColumn() throws SQLException {
+        when(mergedResult.getValue(1, String.class)).thenReturn("user_id_cipher");
+        assertThat(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mockEncryptRule()).getValue(1, String.class), is("user_id"));
+    }
+    
+    private EncryptRule mockEncryptRule() {
+        EncryptRule result = mock(EncryptRule.class);
+        EncryptTable encryptTable = mock(EncryptTable.class);
+        when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
+        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("user_id_assisted"));
+        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singleton("user_id_like"));
+        when(encryptTable.isCipherColumn("user_id_cipher")).thenReturn(true);
+        when(encryptTable.getLogicColumnByCipherColumn("user_id_cipher")).thenReturn("user_id");
+        return result;
+    }
+    
+    @Test
+    public void assertGetValueWithOtherColumn() throws SQLException {
+        when(mergedResult.getValue(1, String.class)).thenReturn("user_id_assisted");
+        assertThat(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).getValue(1, String.class), is("user_id_assisted"));
+    }
+    
+    @Test
+    public void assertGetValueWithOtherIndex() throws SQLException {
+        when(mergedResult.getValue(2, String.class)).thenReturn("order_id");
+        assertThat(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).getValue(2, String.class), is("order_id"));
+    }
+    
+    @Test
+    public void assertWasNull() throws SQLException {
+        assertFalse(createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).wasNull());
+    }
+    
+    @Test(expected = SQLFeatureNotSupportedException.class)
+    public void assertGetCalendarValue() throws SQLException {
+        createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).getCalendarValue(1, Date.class, Calendar.getInstance());
+    }
+    
+    @Test(expected = SQLFeatureNotSupportedException.class)
+    public void assertGetInputStream() throws SQLException {
+        createDecoratedEncryptShowColumnsMergedResult(mergedResult, mock(EncryptRule.class)).getInputStream(1, "asc");
+    }
+    
+    private DecoratedEncryptShowColumnsMergedResult createDecoratedEncryptShowColumnsMergedResult(final MergedResult mergedResult, final EncryptRule encryptRule) {
+        ShowColumnsStatementContext showColumnsStatementContext = mock(ShowColumnsStatementContext.class);
+        when(showColumnsStatementContext.getAllTables()).thenReturn(Collections.singletonList(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_encrypt")))));
+        return new DecoratedEncryptShowColumnsMergedResult(mergedResult, showColumnsStatementContext, encryptRule);
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
index 940a448ca62..9bfcae6da2a 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
@@ -30,12 +30,15 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.Calendar;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -60,36 +63,54 @@ public final class MergedEncryptShowColumnsMergedResultTest {
     @Test
     public void assertNextWithAssistedQuery() throws SQLException {
         when(queryResult.next()).thenReturn(true).thenReturn(false);
-        when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery");
+        when(queryResult.getValue(1, String.class)).thenReturn("user_id_assisted");
+        assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).next());
+    }
+    
+    @Test
+    public void assertNextWithLikeQuery() throws SQLException {
+        when(queryResult.next()).thenReturn(true).thenReturn(false);
+        when(queryResult.getValue(1, String.class)).thenReturn("user_id_like");
         assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).next());
     }
     
+    @Test
+    public void assertNextWithLikeQueryAndMultiColumns() throws SQLException {
+        when(queryResult.next()).thenReturn(true, true, true, false);
+        when(queryResult.getValue(1, String.class)).thenReturn("user_id_like", "order_id", "content");
+        MergedEncryptShowColumnsMergedResult actual = createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule());
+        assertTrue(actual.next());
+        assertTrue(actual.next());
+        assertFalse(actual.next());
+    }
+    
     @Test
     public void assertGetValueWithCipherColumn() throws SQLException {
-        when(queryResult.getValue(1, String.class)).thenReturn("cipher");
-        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).getValue(1, String.class), is("id"));
+        when(queryResult.getValue(1, String.class)).thenReturn("user_id_cipher");
+        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mockEncryptRule()).getValue(1, String.class), is("user_id"));
     }
     
     private EncryptRule mockEncryptRule() {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
-        when(result.findEncryptTable("test")).thenReturn(Optional.of(encryptTable));
-        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("assistedQuery"));
-        when(encryptTable.isCipherColumn("cipher")).thenReturn(true);
-        when(encryptTable.getLogicColumnByCipherColumn("cipher")).thenReturn("id");
+        when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
+        when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("user_id_assisted"));
+        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singleton("user_id_like"));
+        when(encryptTable.isCipherColumn("user_id_cipher")).thenReturn(true);
+        when(encryptTable.getLogicColumnByCipherColumn("user_id_cipher")).thenReturn("user_id");
         return result;
     }
     
     @Test
     public void assertGetValueWithOtherColumn() throws SQLException {
-        when(queryResult.getValue(1, String.class)).thenReturn("assistedQuery");
-        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(1, String.class), is("assistedQuery"));
+        when(queryResult.getValue(1, String.class)).thenReturn("user_id_assisted");
+        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(1, String.class), is("user_id_assisted"));
     }
     
     @Test
     public void assertGetValueWithOtherIndex() throws SQLException {
-        when(queryResult.getValue(2, String.class)).thenReturn("id");
-        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(2, String.class), is("id"));
+        when(queryResult.getValue(2, String.class)).thenReturn("user_id");
+        assertThat(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getValue(2, String.class), is("user_id"));
     }
     
     @Test
@@ -97,12 +118,19 @@ public final class MergedEncryptShowColumnsMergedResultTest {
         assertFalse(createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).wasNull());
     }
     
+    @Test(expected = SQLFeatureNotSupportedException.class)
+    public void assertGetCalendarValue() throws SQLException {
+        createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getCalendarValue(1, Date.class, Calendar.getInstance());
+    }
+    
+    @Test(expected = SQLFeatureNotSupportedException.class)
+    public void assertGetInputStream() throws SQLException {
+        createMergedEncryptColumnsMergedResult(queryResult, mock(EncryptRule.class)).getInputStream(1, "asc");
+    }
+    
     private MergedEncryptShowColumnsMergedResult createMergedEncryptColumnsMergedResult(final QueryResult queryResult, final EncryptRule encryptRule) {
         SelectStatementContext sqlStatementContext = mock(SelectStatementContext.class);
-        IdentifierValue identifierValue = new IdentifierValue("test");
-        TableNameSegment tableNameSegment = new TableNameSegment(1, 4, identifierValue);
-        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(tableNameSegment);
-        when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(simpleTableSegment));
+        when(sqlStatementContext.getAllTables()).thenReturn(Collections.singletonList(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_encrypt")))));
         return new MergedEncryptShowColumnsMergedResult(queryResult, sqlStatementContext, encryptRule);
     }
 }
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/fixture/TestStatementContext.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/fixture/TestStatementContext.java
deleted file mode 100644
index 399a6903c7a..00000000000
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/fixture/TestStatementContext.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.encrypt.merge.dal.show.fixture;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import org.apache.shardingsphere.infra.binder.type.TableAvailable;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.util.Collection;
-
-@RequiredArgsConstructor
-public final class TestStatementContext implements SQLStatementContext<SQLStatement>, TableAvailable {
-    
-    private final SQLStatement sqlStatement;
-    
-    private final Collection<SimpleTableSegment> allTables;
-    
-    private final TablesContext tablesContext;
-    
-    @Override
-    public SQLStatement getSqlStatement() {
-        return sqlStatement;
-    }
-    
-    @Override
-    public Collection<SimpleTableSegment> getAllTables() {
-        return allTables;
-    }
-    
-    @Override
-    public TablesContext getTablesContext() {
-        return tablesContext;
-    }
-    
-    @Override
-    public DatabaseType getDatabaseType() {
-        return DatabaseTypeEngine.getDatabaseType("MySQL");
-    }
-}
diff --git a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
index 64b18a7e3b1..58bbab1993f 100644
--- a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
+++ b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.encrypt.metadata;
 
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
 import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecoratorFactory;
 import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
@@ -50,8 +51,8 @@ public final class EncryptSchemaMetaDataDecoratorTest {
         EncryptSchemaMetaDataDecorator loader = getEncryptMetaDataBuilder(rule, Collections.singleton(rule));
         Collection<TableMetaData> tableMetaDataList = new LinkedList<>();
         tableMetaDataList.add(createTableMetaData());
-        TableMetaData actual = loader.decorate(Collections.singletonMap("logic_db",
-                new SchemaMetaData("logic_db", tableMetaDataList)), rule, mock(GenericSchemaBuilderMaterial.class)).get("logic_db").getTables().iterator().next();
+        TableMetaData actual = loader.decorate(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
+                new SchemaMetaData(DefaultDatabase.LOGIC_NAME, tableMetaDataList)), rule, mock(GenericSchemaBuilderMaterial.class)).get(DefaultDatabase.LOGIC_NAME).getTables().iterator().next();
         assertThat(actual.getColumns().size(), is(2));
         Iterator<ColumnMetaData> columnsIterator = actual.getColumns().iterator();
         assertThat(columnsIterator.next().getName(), is("id"));
@@ -63,6 +64,7 @@ public final class EncryptSchemaMetaDataDecoratorTest {
         EncryptTable encryptTable = mock(EncryptTable.class);
         when(result.findEncryptTable(TABLE_NAME)).thenReturn(Optional.of(encryptTable));
         when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.emptyList());
+        when(encryptTable.getLikeQueryColumns()).thenReturn(Collections.singletonList("pwd_like"));
         when(encryptTable.getPlainColumns()).thenReturn(Collections.singleton("pwd_plain"));
         when(encryptTable.isCipherColumn("pwd_cipher")).thenReturn(true);
         when(encryptTable.getLogicColumnByCipherColumn("pwd_cipher")).thenReturn("pwd");
@@ -73,7 +75,8 @@ public final class EncryptSchemaMetaDataDecoratorTest {
     private TableMetaData createTableMetaData() {
         Collection<ColumnMetaData> columns = Arrays.asList(new ColumnMetaData("id", Types.INTEGER, true, true, true, true, false),
                 new ColumnMetaData("pwd_cipher", Types.VARCHAR, false, false, true, true, false),
-                new ColumnMetaData("pwd_plain", Types.VARCHAR, false, false, true, true, false));
+                new ColumnMetaData("pwd_plain", Types.VARCHAR, false, false, true, true, false),
+                new ColumnMetaData("pwd_like", Types.VARCHAR, false, false, true, true, false));
         return new TableMetaData(TABLE_NAME, columns, Collections.emptyList(), Collections.emptyList());
     }