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);