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

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 95344b68f9f Add more test cases on EncryptOrderByItemSupportedChecker 
(#33644)
95344b68f9f is described below

commit 95344b68f9f387955a0bd3b5438779330f21fe02
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Nov 13 22:18:15 2024 +0800

    Add more test cases on EncryptOrderByItemSupportedChecker (#33644)
---
 .../sql/EncryptOrderByItemSupportedChecker.java    | 16 +++---
 .../EncryptOrderByItemSupportedCheckerTest.java    | 63 +++++++++++++++++++---
 2 files changed, 63 insertions(+), 16 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedChecker.java
index 43cc349c2c7..7d5b335c5c5 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedChecker.java
@@ -68,14 +68,6 @@ public final class EncryptOrderByItemSupportedChecker 
implements SupportedSQLChe
         }
     }
     
-    private void checkColumnOrderByItem(final EncryptRule encryptRule, final 
ShardingSphereSchema schema, final SelectStatementContext sqlStatementContext, 
final ColumnSegment columnSegment) {
-        Map<String, String> columnTableNames = 
sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment),
 schema);
-        String tableName = 
columnTableNames.getOrDefault(columnSegment.getExpression(), "");
-        Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
-        String columnName = columnSegment.getIdentifier().getValue();
-        ShardingSpherePreconditions.checkState(!encryptTable.isPresent() || 
!encryptTable.get().isEncryptColumn(columnName), () -> new 
UnsupportedEncryptSQLException("ORDER BY"));
-    }
-    
     private Collection<OrderByItem> getOrderByItems(final 
SelectStatementContext sqlStatementContext) {
         Collection<OrderByItem> result = new LinkedList<>();
         if (!sqlStatementContext.getOrderByContext().isGenerated()) {
@@ -86,4 +78,12 @@ public final class EncryptOrderByItemSupportedChecker 
implements SupportedSQLChe
         }
         return result;
     }
+    
+    private void checkColumnOrderByItem(final EncryptRule encryptRule, final 
ShardingSphereSchema schema, final SelectStatementContext sqlStatementContext, 
final ColumnSegment columnSegment) {
+        Map<String, String> columnTableNames = 
sqlStatementContext.getTablesContext().findTableNames(Collections.singleton(columnSegment),
 schema);
+        String tableName = 
columnTableNames.getOrDefault(columnSegment.getExpression(), "");
+        Optional<EncryptTable> encryptTable = 
encryptRule.findEncryptTable(tableName);
+        String columnName = columnSegment.getIdentifier().getValue();
+        ShardingSpherePreconditions.checkState(!encryptTable.isPresent() || 
!encryptTable.get().isEncryptColumn(columnName), () -> new 
UnsupportedEncryptSQLException("ORDER BY"));
+    }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedCheckerTest.java
index 989e1cae997..7be8bb0425e 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/EncryptOrderByItemSupportedCheckerTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.encrypt.rule.column.EncryptColumn;
 import org.apache.shardingsphere.encrypt.rule.table.EncryptTable;
 import 
org.apache.shardingsphere.infra.binder.context.segment.select.orderby.OrderByItem;
 import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
+import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
@@ -39,10 +40,14 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Optional;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -52,25 +57,67 @@ class EncryptOrderByItemSupportedCheckerTest {
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
     @Test
-    void assertCheck() {
-        assertThrows(UnsupportedEncryptSQLException.class, () -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereSchema.class), buildSelectStatementContext()));
+    void assertIsCheckWithNotSelectStatementContext() {
+        assertFalse(new 
EncryptOrderByItemSupportedChecker().isCheck(mock(SQLStatementContext.class)));
+    }
+    
+    @Test
+    void assertIsCheckWithoutOrderBy() {
+        SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(sqlStatementContext.getOrderByContext().getItems().isEmpty()).thenReturn(true);
+        assertFalse(new 
EncryptOrderByItemSupportedChecker().isCheck(sqlStatementContext));
+    }
+    
+    @Test
+    void assertIsCheckWithGeneratedOrderBy() {
+        SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(sqlStatementContext.getOrderByContext().isGenerated()).thenReturn(true);
+        assertFalse(new 
EncryptOrderByItemSupportedChecker().isCheck(sqlStatementContext));
+    }
+    
+    @Test
+    void assertIsCheckWithOrderBy() {
+        SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        assertTrue(new 
EncryptOrderByItemSupportedChecker().isCheck(sqlStatementContext));
+    }
+    
+    @Test
+    void assertIsCheckWithSubQueryOrderBy() {
+        SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(sqlStatementContext.getOrderByContext().isGenerated()).thenReturn(true);
+        SelectStatementContext subQuerySelectStatementContext0 = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(subQuerySelectStatementContext0.getOrderByContext().getItems().isEmpty()).thenReturn(true);
+        SelectStatementContext subQuerySelectStatementContext1 = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
+        
when(sqlStatementContext.getSubqueryContexts().values()).thenReturn(Arrays.asList(subQuerySelectStatementContext0,
 subQuerySelectStatementContext1));
+        assertTrue(new 
EncryptOrderByItemSupportedChecker().isCheck(sqlStatementContext));
+    }
+    
+    @Test
+    void assertCheckFailed() {
+        assertThrows(UnsupportedEncryptSQLException.class,
+                () -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereSchema.class), mockSelectStatementContext("foo_tbl")));
+    }
+    
+    @Test
+    void assertCheckSuccess() {
+        assertDoesNotThrow(() -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereSchema.class), mockSelectStatementContext("bar_tbl")));
     }
     
     private EncryptRule mockEncryptRule() {
         EncryptRule result = mock(EncryptRule.class);
         EncryptTable encryptTable = mock(EncryptTable.class);
-        
when(encryptTable.isEncryptColumn("certificate_number")).thenReturn(true);
+        when(encryptTable.isEncryptColumn("foo_col")).thenReturn(true);
         EncryptColumn encryptColumn = mock(EncryptColumn.class, 
RETURNS_DEEP_STUBS);
         when(encryptColumn.getAssistedQuery()).thenReturn(Optional.empty());
-        
when(encryptTable.getEncryptColumn("certificate_number")).thenReturn(encryptColumn);
-        
when(result.findEncryptTable("t_encrypt")).thenReturn(Optional.of(encryptTable));
+        
when(encryptTable.getEncryptColumn("foo_col")).thenReturn(encryptColumn);
+        
when(result.findEncryptTable("foo_tbl")).thenReturn(Optional.of(encryptTable));
         return result;
     }
     
-    private SelectStatementContext buildSelectStatementContext() {
-        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("t_encrypt")));
+    private SelectStatementContext mockSelectStatementContext(final String 
tableName) {
+        SimpleTableSegment simpleTableSegment = new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue(tableName)));
         simpleTableSegment.setAlias(new AliasSegment(0, 0, new 
IdentifierValue("a")));
-        ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("certificate_number"));
+        ColumnSegment columnSegment = new ColumnSegment(0, 0, new 
IdentifierValue("foo_col"));
         columnSegment.setOwner(new OwnerSegment(0, 0, new 
IdentifierValue("a")));
         SelectStatementContext result = mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS);
         when(result.getDatabaseType()).thenReturn(databaseType);

Reply via email to