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

tuichenchuxin 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 c241d50d119 Fix wrong encrypt rewrite result due to incorrect order of 
metadata (#19420)
c241d50d119 is described below

commit c241d50d1198149f1db32ac34a5a88247322578f
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Jul 21 16:33:33 2022 +0800

    Fix wrong encrypt rewrite result due to incorrect order of metadata (#19420)
---
 .../dal/show/EncryptShowColumnsMergedResult.java      |  2 +-
 .../metadata/EncryptSchemaMetaDataDecorator.java      | 11 ++++++++---
 .../shardingsphere/encrypt/rule/EncryptTable.java     | 19 +++++++++++++++++--
 .../MergedEncryptShowColumnsMergedResultTest.java     |  2 +-
 .../metadata/EncryptSchemaMetaDataDecoratorTest.java  |  3 ++-
 .../shardingsphere/encrypt/rule/EncryptTableTest.java | 18 ++++++++++++++----
 .../spring/boot/SpringBootStarterTest.java            |  2 +-
 7 files changed, 44 insertions(+), 13 deletions(-)

diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
index 1fe351c0fca..69fc107771a 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/show/EncryptShowColumnsMergedResult.java
@@ -76,7 +76,7 @@ public abstract class EncryptShowColumnsMergedResult 
implements MergedResult {
             if (!encryptTable.isPresent()) {
                 return columnName;
             }
-            Optional<String> logicColumn = 
encryptTable.get().isCipherColumn(columnName) ? 
Optional.of(encryptTable.get().getLogicColumn(columnName)) : Optional.empty();
+            Optional<String> logicColumn = 
encryptTable.get().isCipherColumn(columnName) ? 
Optional.of(encryptTable.get().getLogicColumnByCipherColumn(columnName)) : 
Optional.empty();
             return logicColumn.orElse(columnName);
         }
         return getOriginalValue(columnIndex, type);
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
index c176a8ea371..36df8591091 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.Tab
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -56,16 +57,20 @@ public final class EncryptSchemaMetaDataDecorator 
implements RuleBasedSchemaMeta
     }
     
     private Collection<ColumnMetaData> getEncryptColumnMetaDataList(final 
EncryptTable encryptTable, final Collection<ColumnMetaData> 
originalColumnMetaDataList) {
-        Collection<ColumnMetaData> result = new LinkedList<>();
+        Collection<ColumnMetaData> result = new LinkedHashSet<>();
         Collection<String> plainColumns = encryptTable.getPlainColumns();
         Collection<String> assistedQueryColumns = 
encryptTable.getAssistedQueryColumns();
         for (ColumnMetaData each : originalColumnMetaDataList) {
             String columnName = each.getName();
+            if (plainColumns.contains(columnName)) {
+                
result.add(createColumnMetaData(encryptTable.getLogicColumnByPlainColumn(columnName),
 each));
+                continue;
+            }
             if (encryptTable.isCipherColumn(columnName)) {
-                
result.add(createColumnMetaData(encryptTable.getLogicColumn(columnName), each));
+                
result.add(createColumnMetaData(encryptTable.getLogicColumnByCipherColumn(columnName),
 each));
                 continue;
             }
-            if (!plainColumns.contains(columnName) && 
!assistedQueryColumns.contains(columnName)) {
+            if (!assistedQueryColumns.contains(columnName)) {
                 result.add(each);
             }
         }
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
index 07e7b352232..db22488607d 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rule/EncryptTable.java
@@ -77,12 +77,12 @@ public final class EncryptTable {
     }
     
     /**
-     * Get logic column.
+     * Get logic column by cipher column.
      * 
      * @param cipherColumn cipher column
      * @return logic column
      */
-    public String getLogicColumn(final String cipherColumn) {
+    public String getLogicColumnByCipherColumn(final String cipherColumn) {
         for (Entry<String, EncryptColumn> entry : columns.entrySet()) {
             if (entry.getValue().getCipherColumn().equals(cipherColumn)) {
                 return entry.getKey();
@@ -91,6 +91,21 @@ public final class EncryptTable {
         throw new ShardingSphereException("Can not find logic column by %s.", 
cipherColumn);
     }
     
+    /**
+     * Get logic column by plain column.
+     *
+     * @param plainColumn plain column
+     * @return logic column
+     */
+    public String getLogicColumnByPlainColumn(final String plainColumn) {
+        for (Entry<String, EncryptColumn> entry : columns.entrySet()) {
+            if (entry.getValue().getPlainColumn().isPresent() && 
entry.getValue().getPlainColumn().get().equals(plainColumn)) {
+                return entry.getKey();
+            }
+        }
+        throw new ShardingSphereException("Can not find logic column by %s.", 
plainColumn);
+    }
+    
     /**
      * Is cipher column or not.
      *
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
index 3e3495f1eef..2112b10ca1c 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/show/MergedEncryptShowColumnsMergedResultTest.java
@@ -76,7 +76,7 @@ public final class MergedEncryptShowColumnsMergedResultTest {
         
when(result.findEncryptTable("test")).thenReturn(Optional.of(encryptTable));
         
when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.singleton("assistedQuery"));
         when(encryptTable.isCipherColumn("cipher")).thenReturn(true);
-        when(encryptTable.getLogicColumn("cipher")).thenReturn("id");
+        
when(encryptTable.getLogicColumnByCipherColumn("cipher")).thenReturn("id");
         return result;
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
index e3357bd3488..1e420b32a18 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecoratorTest.java
@@ -64,7 +64,8 @@ public final class EncryptSchemaMetaDataDecoratorTest {
         
when(encryptTable.getAssistedQueryColumns()).thenReturn(Collections.emptyList());
         
when(encryptTable.getPlainColumns()).thenReturn(Collections.singleton("pwd_plain"));
         when(encryptTable.isCipherColumn("pwd_cipher")).thenReturn(true);
-        when(encryptTable.getLogicColumn("pwd_cipher")).thenReturn("pwd");
+        
when(encryptTable.getLogicColumnByCipherColumn("pwd_cipher")).thenReturn("pwd");
+        
when(encryptTable.getLogicColumnByPlainColumn("pwd_plain")).thenReturn("pwd");
         return result;
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
index 064f2acf7b6..14119ea7caf 100644
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
+++ 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/rule/EncryptTableTest.java
@@ -58,13 +58,23 @@ public final class EncryptTableTest {
     }
     
     @Test
-    public void assertGetLogicColumn() {
-        assertNotNull(encryptTable.getLogicColumn("cipherColumn"));
+    public void assertGetLogicColumnByCipherColumn() {
+        
assertNotNull(encryptTable.getLogicColumnByCipherColumn("cipherColumn"));
     }
     
     @Test(expected = ShardingSphereException.class)
-    public void assertGetLogicColumnWhenNotFind() {
-        encryptTable.getLogicColumn("invalidColumn");
+    public void assertGetLogicColumnByCipherColumnWhenNotFind() {
+        encryptTable.getLogicColumnByCipherColumn("invalidColumn");
+    }
+    
+    @Test
+    public void assertGetLogicColumnByPlainColumn() {
+        assertNotNull(encryptTable.getLogicColumnByPlainColumn("plainColumn"));
+    }
+    
+    @Test(expected = ShardingSphereException.class)
+    public void assertGetLogicColumnByPlainColumnWhenNotFind() {
+        encryptTable.getLogicColumnByPlainColumn("invalidColumn");
     }
     
     @Test
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
index 1c42ebd5cf9..a9ae7026c06 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-spring/shardingsphere-jdbc-core-spring/shardingsphere-jdbc-core-spring-boot-starter/src/test/java/org/apache/shardingsphere/spring/boot/SpringBootStarterTest.java
@@ -157,7 +157,7 @@ public class SpringBootStarterTest {
     }
     
     private void assertEncryptTable(final EncryptTable actual) {
-        assertThat(actual.getLogicColumn("pwd_cipher"), is("pwd"));
+        assertThat(actual.getLogicColumnByCipherColumn("pwd_cipher"), 
is("pwd"));
         assertThat(actual.getPlainColumns(), 
is(Collections.singletonList("pwd_plain")));
         assertThat(actual.getAssistedQueryColumns(), 
is(Collections.singletonList("pwd_assisted_query_cipher")));
     }

Reply via email to