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

panjuan 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 8220f02  optimize the logic of findTableName to batch (#12016)
8220f02 is described below

commit 8220f02f56c6c990eab5e920b90bddc8071e2488
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Aug 26 18:08:28 2021 +0800

    optimize the logic of findTableName to batch (#12016)
    
    * optimize the logic of findTableName to batch
    
    * rename variable
    
    * optimize code
    
    * fix test case
    
    * fix test case
    
    * fix test case
---
 .../rewrite/condition/EncryptConditionEngine.java  | 27 +++++++---
 .../impl/EncryptPredicateColumnTokenGenerator.java | 25 +++++++---
 .../impl/WhereClauseShardingConditionEngine.java   | 26 +++++++---
 .../infra/binder/segment/table/TablesContext.java  | 57 +++++++++++++++++++---
 .../binder/segment/table/TablesContextTest.java    | 26 +++++-----
 .../ShardingSQLRewriterParameterizedTest.java      |  3 +-
 6 files changed, 119 insertions(+), 45 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
index 2915db8..b47afdc 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/EncryptConditionEngine.java
@@ -41,7 +41,10 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Encrypt condition engine.
@@ -68,8 +71,10 @@ public final class EncryptConditionEngine {
             return Collections.emptyList();
         }
         List<EncryptCondition> result = new LinkedList<>();
-        for (AndPredicate each : 
ExpressionExtractUtil.getAndPredicates(whereSegment.get().getExpr())) {
-            result.addAll(createEncryptConditions(sqlStatementContext, each));
+        Collection<AndPredicate> andPredicates = 
ExpressionExtractUtil.getAndPredicates(whereSegment.get().getExpr());
+        Map<String, String> columnTableNames = 
getColumnTableNames(sqlStatementContext, andPredicates);
+        for (AndPredicate each : andPredicates) {
+            result.addAll(createEncryptConditions(each.getPredicates(), 
columnTableNames));
         }
         // FIXME process subquery
 //        for (SubqueryPredicateSegment each : 
sqlStatementContext.getSqlStatement().findSQLSegments(SubqueryPredicateSegment.class))
 {
@@ -80,23 +85,29 @@ public final class EncryptConditionEngine {
         return result;
     }
     
-    private Collection<EncryptCondition> createEncryptConditions(final 
SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
+    private Collection<EncryptCondition> createEncryptConditions(final 
Collection<ExpressionSegment> predicates, final Map<String, String> 
columnTableNames) {
         Collection<EncryptCondition> result = new LinkedList<>();
         Collection<Integer> stopIndexes = new HashSet<>();
-        for (ExpressionSegment predicate : andPredicate.getPredicates()) {
-            if (stopIndexes.add(predicate.getStopIndex())) {
-                createEncryptCondition(sqlStatementContext, 
predicate).ifPresent(result::add);
+        for (ExpressionSegment each : predicates) {
+            if (stopIndexes.add(each.getStopIndex())) {
+                createEncryptCondition(each, 
columnTableNames).ifPresent(result::add);
             }
         }
         return result;
     }
     
-    private Optional<EncryptCondition> createEncryptCondition(final 
SQLStatementContext sqlStatementContext, final ExpressionSegment expression) {
+    private Map<String, String> getColumnTableNames(final SQLStatementContext 
sqlStatementContext, final Collection<AndPredicate> andPredicates) {
+        Collection<ColumnSegment> columns = 
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+                .map(each -> 
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+        return sqlStatementContext.getTablesContext().findTableName(columns, 
schema);
+    }
+    
+    private Optional<EncryptCondition> createEncryptCondition(final 
ExpressionSegment expression, final Map<String, String> columnTableNames) {
         Optional<ColumnSegment> column = ColumnExtractor.extract(expression);
         if (!column.isPresent()) {
             return Optional.empty();
         }
-        Optional<String> tableName = 
sqlStatementContext.getTablesContext().findTableName(column.get(), schema);
+        Optional<String> tableName = 
Optional.ofNullable(columnTableNames.get(column.get().getQualifiedName()));
         return tableName.isPresent() && 
encryptRule.findEncryptor(tableName.get(), 
column.get().getIdentifier().getValue()).isPresent()
                 ? createEncryptCondition(expression, tableName.get()) : 
Optional.empty();
     }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
index 1333d16..c2b705c 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/impl/EncryptPredicateColumnTokenGenerator.java
@@ -39,7 +39,10 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
+import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Predicate column token generator for encrypt.
@@ -61,20 +64,22 @@ public final class EncryptPredicateColumnTokenGenerator 
extends BaseEncryptSQLTo
         Preconditions.checkState(((WhereAvailable) 
sqlStatementContext).getWhere().isPresent());
         Collection<SubstitutableColumnNameToken> result = new 
LinkedHashSet<>();
         ExpressionSegment expression = ((WhereAvailable) 
sqlStatementContext).getWhere().get().getExpr();
-        for (AndPredicate each : 
ExpressionExtractUtil.getAndPredicates(expression)) {
-            result.addAll(generateSQLTokens(sqlStatementContext, each));
+        Collection<AndPredicate> andPredicates = 
ExpressionExtractUtil.getAndPredicates(expression);
+        Map<String, String> columnTableNames = 
getColumnTableNames(sqlStatementContext, andPredicates);
+        for (AndPredicate each : andPredicates) {
+            result.addAll(generateSQLTokens(each.getPredicates(), 
columnTableNames));
         }
         return result;
     }
     
-    private Collection<SubstitutableColumnNameToken> generateSQLTokens(final 
SQLStatementContext sqlStatementContext, final AndPredicate andPredicate) {
+    private Collection<SubstitutableColumnNameToken> generateSQLTokens(final 
Collection<ExpressionSegment> predicates, final Map<String, String> 
columnTableNames) {
         Collection<SubstitutableColumnNameToken> result = new LinkedList<>();
-        for (ExpressionSegment each : andPredicate.getPredicates()) {
+        for (ExpressionSegment each : predicates) {
             Optional<ColumnSegment> column = ColumnExtractor.extract(each);
             if (!column.isPresent()) {
                 continue;
             }
-            Optional<EncryptTable> encryptTable = 
findEncryptTable(sqlStatementContext, column.get());
+            Optional<EncryptTable> encryptTable = 
findEncryptTable(columnTableNames, column.get());
             if (!encryptTable.isPresent() || 
!encryptTable.get().findEncryptorName(column.get().getIdentifier().getValue()).isPresent())
 {
                 continue;
             }
@@ -96,8 +101,14 @@ public final class EncryptPredicateColumnTokenGenerator 
extends BaseEncryptSQLTo
         return result;
     }
     
-    private Optional<EncryptTable> findEncryptTable(final SQLStatementContext 
sqlStatementContext, final ColumnSegment column) {
-        return sqlStatementContext.getTablesContext().findTableName(column, 
schema).flatMap(tableName -> getEncryptRule().findEncryptTable(tableName));
+    private Map<String, String> getColumnTableNames(final SQLStatementContext 
sqlStatementContext, final Collection<AndPredicate> andPredicates) {
+        Collection<ColumnSegment> columns = 
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+                .map(each -> 
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+        return sqlStatementContext.getTablesContext().findTableName(columns, 
schema);
+    }
+    
+    private Optional<EncryptTable> findEncryptTable(final Map<String, String> 
columnTableNames, final ColumnSegment column) {
+        return 
Optional.ofNullable(columnTableNames.get(column.getQualifiedName())).flatMap(tableName
 -> getEncryptRule().findEncryptTable(tableName));
     }
     
     private Collection<ColumnProjection> getColumnProjections(final String 
columnName) {
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
index 2e0eb2d..7491d22 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/impl/WhereClauseShardingConditionEngine.java
@@ -51,7 +51,9 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 /**
  * Sharding condition engine for where clause.
@@ -76,9 +78,11 @@ public final class WhereClauseShardingConditionEngine 
implements ShardingConditi
     }
     
     private Collection<ShardingCondition> createShardingConditions(final 
SQLStatementContext<?> sqlStatementContext, final ExpressionSegment 
expressionSegment, final List<Object> parameters) {
+        Collection<AndPredicate> andPredicates = 
ExpressionExtractUtil.getAndPredicates(expressionSegment);
+        Map<String, String> columnTableNames = 
getColumnTableNames(sqlStatementContext, andPredicates);
         Collection<ShardingCondition> result = new LinkedList<>();
-        for (AndPredicate each : 
ExpressionExtractUtil.getAndPredicates(expressionSegment)) {
-            Map<Column, Collection<ShardingConditionValue>> 
shardingConditionValues = createShardingConditionValueMap(sqlStatementContext, 
each, parameters);
+        for (AndPredicate each : andPredicates) {
+            Map<Column, Collection<ShardingConditionValue>> 
shardingConditionValues = createShardingConditionValueMap(each.getPredicates(), 
parameters, columnTableNames);
             if (shardingConditionValues.isEmpty()) {
                 return Collections.emptyList();
             }
@@ -87,6 +91,12 @@ public final class WhereClauseShardingConditionEngine 
implements ShardingConditi
         return result;
     }
     
+    private Map<String, String> getColumnTableNames(final 
SQLStatementContext<?> sqlStatementContext, final Collection<AndPredicate> 
andPredicates) {
+        Collection<ColumnSegment> columns = 
andPredicates.stream().flatMap(each -> each.getPredicates().stream())
+                .map(each -> 
ColumnExtractor.extract(each).orElse(null)).filter(Objects::nonNull).collect(Collectors.toList());
+        return sqlStatementContext.getTablesContext().findTableName(columns, 
schema);
+    }
+    
     private Collection<WhereSegment> getWhereSegments(final 
SQLStatementContext<?> sqlStatementContext) {
         Collection<WhereSegment> result = new LinkedList<>();
         ((WhereAvailable) 
sqlStatementContext).getWhere().ifPresent(result::add);
@@ -97,16 +107,16 @@ public final class WhereClauseShardingConditionEngine 
implements ShardingConditi
         return result;
     }
     
-    private Map<Column, Collection<ShardingConditionValue>> 
createShardingConditionValueMap(final SQLStatementContext<?> 
sqlStatementContext, 
-                                                                               
             final AndPredicate andPredicate, final List<Object> parameters) {
-        Map<Column, Collection<ShardingConditionValue>> result = new 
HashMap<>(andPredicate.getPredicates().size(), 1);
-        for (ExpressionSegment each : andPredicate.getPredicates()) {
+    private Map<Column, Collection<ShardingConditionValue>> 
createShardingConditionValueMap(final Collection<ExpressionSegment> predicates, 
+                                                                               
             final List<Object> parameters, final Map<String, String> 
columnTableNames) {
+        Map<Column, Collection<ShardingConditionValue>> result = new 
HashMap<>(predicates.size(), 1);
+        for (ExpressionSegment each : predicates) {
             Optional<ColumnSegment> columnSegment = 
ColumnExtractor.extract(each);
             if (!columnSegment.isPresent()) {
                 continue;
             }
-            Optional<String> tableName = 
sqlStatementContext.getTablesContext().findTableName(columnSegment.get(), 
schema);
-            if (!(tableName.isPresent() && 
shardingRule.isShardingColumn(columnSegment.get().getIdentifier().getValue(), 
tableName.get()))) {
+            Optional<String> tableName = 
Optional.ofNullable(columnTableNames.get(columnSegment.get().getQualifiedName()));
+            if (!tableName.isPresent() || 
!shardingRule.isShardingColumn(columnSegment.get().getIdentifier().getValue(), 
tableName.get())) {
                 continue;
             }
             Column column = new 
Column(columnSegment.get().getIdentifier().getValue(), tableName.get());
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
index 13d3d7d..23b09d9 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContext.java
@@ -32,6 +32,8 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Optional;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 /**
  * Tables context.
@@ -73,18 +75,22 @@ public final class TablesContext {
     /**
      * Find table name.
      *
-     * @param column column segment
+     * @param columns column segment collection
      * @param schema schema meta data
-     * @return table name
+     * @return table name map
      */
-    public Optional<String> findTableName(final ColumnSegment column, final 
ShardingSphereSchema schema) {
+    public Map<String, String> findTableName(final Collection<ColumnSegment> 
columns, final ShardingSphereSchema schema) {
         if (1 == uniqueTables.size()) {
-            return Optional.of(uniqueTables.keySet().iterator().next());
-        }
-        if (column.getOwner().isPresent()) {
-            return 
findTableNameFromSQL(column.getOwner().get().getIdentifier().getValue());
+            String tableName = uniqueTables.keySet().iterator().next();
+            return 
columns.stream().collect(Collectors.toMap(ColumnSegment::getQualifiedName, each 
-> tableName, (oldValue, currentValue) -> oldValue));
         }
-        return findTableNameFromMetaData(column.getIdentifier().getValue(), 
schema);
+        Map<String, String> result = new HashMap<>(columns.size(), 1);
+        Map<String, String> ownerColumnNames = columns.stream().filter(each -> 
each.getOwner().isPresent()).collect(Collectors.toMap(each 
+            -> each.getOwner().get().getIdentifier().getValue(), 
ColumnSegment::getQualifiedName, (oldValue, currentValue) -> oldValue, () -> 
new TreeMap<>(String.CASE_INSENSITIVE_ORDER)));
+        result.putAll(findTableNameFromSQL(ownerColumnNames));
+        Collection<String> columnNames = columns.stream().filter(each -> 
!each.getOwner().isPresent()).map(each -> 
each.getIdentifier().getValue()).collect(Collectors.toSet());
+        result.putAll(findTableNameFromMetaData(columnNames, schema));
+        return result;
     }
     
     /**
@@ -118,6 +124,41 @@ public final class TablesContext {
         return Optional.empty();
     }
     
+    private Map<String, String> findTableNameFromSQL(final Map<String, String> 
ownerColumnNames) {
+        if (ownerColumnNames.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Map<String, String> result = new HashMap<>(ownerColumnNames.size(), 1);
+        for (String each : uniqueTables.keySet()) {
+            if (ownerColumnNames.containsKey(each)) {
+                result.put(ownerColumnNames.get(each), each);
+            }
+            Optional<String> alias = uniqueTables.get(each).getAlias();
+            if (alias.isPresent() && 
ownerColumnNames.containsKey(alias.get())) {
+                result.put(ownerColumnNames.get(alias.get()), each);
+            }
+        }
+        return result;
+    }
+    
+    private Map<String, String> findTableNameFromMetaData(final 
Collection<String> columnNames, final ShardingSphereSchema schema) {
+        if (columnNames.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        Map<String, String> result = new HashMap<>();
+        for (String each : uniqueTables.keySet()) {
+            Collection<String> tableColumnNames = 
schema.getAllColumnNames(each);
+            if (tableColumnNames.isEmpty()) {
+                continue;
+            }
+            tableColumnNames.retainAll(columnNames);
+            for (String columnName : tableColumnNames) {
+                result.put(columnName, each);
+            }
+        }
+        return result;
+    }
+    
     private Optional<String> findTableNameFromMetaData(final String 
columnName, final ShardingSphereSchema schema) {
         for (String each : uniqueTables.keySet()) {
             if (schema.containsColumn(each, columnName)) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
index cd87c3a..7da9e93 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/table/TablesContextTest.java
@@ -29,13 +29,13 @@ import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Map;
 import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -58,9 +58,9 @@ public final class TablesContextTest {
     @Test
     public void assertFindTableNameWhenSingleTable() {
         SimpleTableSegment tableSegment = createTableSegment("table_1", 
"tbl_1");
-        Optional<String> actual = new 
TablesContext(Collections.singletonList(tableSegment)).findTableName(createColumnSegment(),
 mock(ShardingSphereSchema.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("table_1"));
+        Map<String, String> actual = new 
TablesContext(Collections.singletonList(tableSegment)).findTableName(Collections.singletonList(createColumnSegment()),
 mock(ShardingSphereSchema.class));
+        assertFalse(actual.isEmpty());
+        assertThat(actual.get("col"), is("table_1"));
     }
     
     @Test
@@ -69,17 +69,17 @@ public final class TablesContextTest {
         SimpleTableSegment tableSegment2 = createTableSegment("table_2", 
"tbl_2");
         ColumnSegment columnSegment = createColumnSegment();
         columnSegment.setOwner(new OwnerSegment(0, 10, new 
IdentifierValue("table_1")));
-        Optional<String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(columnSegment, mock(ShardingSphereSchema.class));
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("table_1"));
+        Map<String, String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(Collections.singletonList(columnSegment), 
mock(ShardingSphereSchema.class));
+        assertFalse(actual.isEmpty());
+        assertThat(actual.get("table_1.col"), is("table_1"));
     }
     
     @Test
     public void assertFindTableNameWhenColumnSegmentOwnerAbsent() {
         SimpleTableSegment tableSegment1 = createTableSegment("table_1", 
"tbl_1");
         SimpleTableSegment tableSegment2 = createTableSegment("table_2", 
"tbl_2");
-        Optional<String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(createColumnSegment(), 
mock(ShardingSphereSchema.class));
-        assertFalse(actual.isPresent());
+        Map<String, String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(Collections.singletonList(createColumnSegment()), 
mock(ShardingSphereSchema.class));
+        assertTrue(actual.isEmpty());
     }
     
     @Test
@@ -87,10 +87,10 @@ public final class TablesContextTest {
         SimpleTableSegment tableSegment1 = createTableSegment("table_1", 
"tbl_1");
         SimpleTableSegment tableSegment2 = createTableSegment("table_2", 
"tbl_2");
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
-        when(schema.containsColumn(anyString(), anyString())).thenReturn(true);
-        Optional<String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(createColumnSegment(), schema);
-        assertTrue(actual.isPresent());
-        assertThat(actual.get(), is("table_1"));
+        
when(schema.getAllColumnNames("table_1")).thenReturn(Collections.singletonList("col"));
+        Map<String, String> actual = new 
TablesContext(Arrays.asList(tableSegment1, 
tableSegment2)).findTableName(Collections.singletonList(createColumnSegment()), 
schema);
+        assertFalse(actual.isEmpty());
+        assertThat(actual.get("col"), is("table_1"));
     }
     
     @Test
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
index fdbcf44..1bd8390 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/scenario/ShardingSQLRewriterParameterizedTest.java
@@ -35,6 +35,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URL;
 import java.sql.Types;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -91,7 +92,7 @@ public final class ShardingSQLRewriterParameterizedTest 
extends AbstractSQLRewri
         when(result.containsTable("t_account")).thenReturn(true);
         when(result.get("t_account")).thenReturn(accountTableMetaData);
         
when(result.get("t_account_detail")).thenReturn(mock(TableMetaData.class));
-        
when(result.getAllColumnNames("t_account")).thenReturn(Arrays.asList("account_id",
 "amount", "status"));
+        when(result.getAllColumnNames("t_account")).thenReturn(new 
ArrayList<>(Arrays.asList("account_id", "amount", "status")));
         when(result.containsColumn("t_account", 
"account_id")).thenReturn(true);
         return result;
     }

Reply via email to