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

duanzhengqiang 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 d952966c347 Support SQLServer dml encrypt with schema (#30534)
d952966c347 is described below

commit d952966c3473642b344af019f5385202e7c2d638
Author: LotusMoon <chenyang...@aliyun.com>
AuthorDate: Wed Mar 20 11:26:17 2024 +0800

    Support SQLServer dml encrypt with schema (#30534)
    
    * Support SQLServer dml encrypt with schema
    
    * fix Test fail in SQLServer
    
    * apply spotless check
    
    * fix SQLServer rewrite error
    
    * adjust createSQLServerDatabase data type SQLServer
---
 .../merge/dql/ShardingDQLResultMergerTest.java       | 20 +++++++++++++++-----
 .../ShardingCreateTableStatementValidatorTest.java   |  2 +-
 .../statement/SQLStatementContextFactoryTest.java    |  2 ++
 .../metadata/database/SQLServerDatabaseMetaData.java |  7 +++++++
 .../query-with-cipher/dml/select/select-where.xml    |  5 +++++
 .../resources/scenario/sharding/case/dml/delete.xml  |  4 ++--
 .../resources/scenario/sharding/case/dml/select.xml  |  6 +++---
 7 files changed, 35 insertions(+), 11 deletions(-)

diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
index 5d7d81fa2e6..f8a5282b845 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/ShardingDQLResultMergerTest.java
@@ -158,7 +158,7 @@ class ShardingDQLResultMergerTest {
         selectStatement.setProjections(new ProjectionsSegment(0, 0));
         selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralLimitValueSegment(0, 0, 1), null));
         SelectStatementContext selectStatementContext = new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
-        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class));
+        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createSQLServerDatabase(), 
mock(ConnectionContext.class));
         assertThat(actual, 
instanceOf(TopAndRowNumberDecoratorMergedResult.class));
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), instanceOf(IteratorStreamMergedResult.class));
     }
@@ -235,7 +235,7 @@ class ShardingDQLResultMergerTest {
         selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, 1, true), null));
         SelectStatementContext selectStatementContext = new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(),
                 selectStatement, DefaultDatabase.LOGIC_NAME);
-        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class));
+        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createSQLServerDatabase(), 
mock(ConnectionContext.class));
         assertThat(actual, 
instanceOf(TopAndRowNumberDecoratorMergedResult.class));
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), instanceOf(OrderByStreamMergedResult.class));
     }
@@ -316,7 +316,7 @@ class ShardingDQLResultMergerTest {
         selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, 1, true), null));
         SelectStatementContext selectStatementContext = new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(),
                 selectStatement, DefaultDatabase.LOGIC_NAME);
-        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class));
+        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createSQLServerDatabase(), 
mock(ConnectionContext.class));
         assertThat(actual, 
instanceOf(TopAndRowNumberDecoratorMergedResult.class));
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), instanceOf(GroupByStreamMergedResult.class));
     }
@@ -395,7 +395,7 @@ class ShardingDQLResultMergerTest {
         selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, 1, true), null));
         SelectStatementContext selectStatementContext = new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(),
                 selectStatement, DefaultDatabase.LOGIC_NAME);
-        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class));
+        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createSQLServerDatabase(), 
mock(ConnectionContext.class));
         assertThat(actual, 
instanceOf(TopAndRowNumberDecoratorMergedResult.class));
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), instanceOf(GroupByMemoryMergedResult.class));
     }
@@ -477,7 +477,7 @@ class ShardingDQLResultMergerTest {
         selectStatement.setLimit(new LimitSegment(0, 0, new 
NumberLiteralRowNumberValueSegment(0, 0, 1, true), null));
         SelectStatementContext selectStatementContext = new 
SelectStatementContext(createShardingSphereMetaData(database), 
Collections.emptyList(),
                 selectStatement, DefaultDatabase.LOGIC_NAME);
-        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createDatabase(), mock(ConnectionContext.class));
+        MergedResult actual = resultMerger.merge(createQueryResults(), 
selectStatementContext, createSQLServerDatabase(), 
mock(ConnectionContext.class));
         assertThat(actual, 
instanceOf(TopAndRowNumberDecoratorMergedResult.class));
         assertThat(((TopAndRowNumberDecoratorMergedResult) 
actual).getMergedResult(), instanceOf(GroupByMemoryMergedResult.class));
     }
@@ -515,6 +515,16 @@ class ShardingDQLResultMergerTest {
                 mock(RuleMetaData.class), 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, schema));
     }
     
+    private ShardingSphereDatabase createSQLServerDatabase() {
+        ShardingSphereColumn column1 = new ShardingSphereColumn("col1", 0, 
false, false, false, true, false, false);
+        ShardingSphereColumn column2 = new ShardingSphereColumn("col2", 0, 
false, false, false, true, false, false);
+        ShardingSphereColumn column3 = new ShardingSphereColumn("col3", 0, 
false, false, false, true, false, false);
+        ShardingSphereTable table = new ShardingSphereTable("tbl", 
Arrays.asList(column1, column2, column3), Collections.emptyList(), 
Collections.emptyList());
+        ShardingSphereSchema schema = new 
ShardingSphereSchema(Collections.singletonMap("tbl", table), 
Collections.emptyMap());
+        return new ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, 
TypedSPILoader.getService(DatabaseType.class, "SQLServer"), 
mock(ResourceMetaData.class),
+                mock(RuleMetaData.class), Collections.singletonMap("dbo", 
schema));
+    }
+    
     private SelectStatement buildSelectStatement(final SelectStatement result) 
{
         result.setFrom(new SimpleTableSegment(new TableNameSegment(10, 13, new 
IdentifierValue("tbl"))));
         result.setProjections(new ProjectionsSegment(0, 0));
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateTableStatementValidatorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateTableStatementValidatorTest.java
index b872abe6bb9..10d1fbd16e3 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateTableStatementValidatorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateTableStatementValidatorTest.java
@@ -100,7 +100,7 @@ class ShardingCreateTableStatementValidatorTest {
     void assertPreValidateCreateTableForSQLServer() {
         SQLServerCreateTableStatement sqlStatement = new 
SQLServerCreateTableStatement();
         sqlStatement.setTable(new SimpleTableSegment(new TableNameSegment(1, 
2, new IdentifierValue("t_order"))));
-        assertThrows(TableExistsException.class, () -> 
assertPreValidateCreateTable(sqlStatement, "sharding_db"));
+        assertThrows(TableExistsException.class, () -> 
assertPreValidateCreateTable(sqlStatement, "dbo"));
     }
     
     private void assertPreValidateCreateTable(final CreateTableStatement 
sqlStatement, final String schemaName) {
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
index 98ed3ee0a0e..2d8cc5563b9 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactoryTest.java
@@ -154,6 +154,8 @@ class SQLStatementContextFactoryTest {
         when(database.containsSchema("public")).thenReturn(true);
         
when(database.getSchema(DefaultDatabase.LOGIC_NAME).containsTable("tbl")).thenReturn(true);
         
when(database.getSchema("public").containsTable("tbl")).thenReturn(true);
+        when(database.containsSchema("dbo")).thenReturn(true);
+        when(database.getSchema("dbo").containsTable("tbl")).thenReturn(true);
         Map<String, ShardingSphereDatabase> databases = 
Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database);
         return new ShardingSphereMetaData(databases, 
mock(ResourceMetaData.class), mock(RuleMetaData.class), 
mock(ConfigurationProperties.class));
     }
diff --git 
a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
 
b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
index 436257f8e09..69bed198459 100644
--- 
a/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
+++ 
b/infra/database/type/sqlserver/src/main/java/org/apache/shardingsphere/infra/database/sqlserver/metadata/database/SQLServerDatabaseMetaData.java
@@ -21,6 +21,8 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDa
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 
+import java.util.Optional;
+
 /**
  * Database meta data of SQLServer.
  */
@@ -40,4 +42,9 @@ public final class SQLServerDatabaseMetaData implements 
DialectDatabaseMetaData
     public String getDatabaseType() {
         return "SQLServer";
     }
+    
+    @Override
+    public Optional<String> getDefaultSchema() {
+        return Optional.of("dbo");
+    }
 }
diff --git 
a/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/select/select-where.xml
 
b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/select/select-where.xml
index b7f3a9add40..7e244df8ec7 100644
--- 
a/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/select/select-where.xml
+++ 
b/test/it/rewriter/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/select/select-where.xml
@@ -98,4 +98,9 @@
         <input sql="SELECT * FROM t_user where user_name like '%an%'"/>
         <output sql="SELECT t_user.[user_id], t_user.[user_name_cipher] AS 
[user_name], t_user.[password_cipher] AS [password], t_user.[email_cipher] AS 
[email], t_user.[user_telephone_cipher] AS [telephone], t_user.[creation_date] 
FROM t_user where user_name_like like '%`m%'"/>
     </rewrite-assertion>
+
+    <rewrite-assertion id="select_from_user_with_schema" db-types="SQLServer">
+        <input sql="SELECT * FROM dbo.t_user"/>
+        <output sql="SELECT t_user.[user_id], t_user.[user_name_cipher] AS 
[user_name], t_user.[password_cipher] AS [password], t_user.[email_cipher] AS 
[email], t_user.[user_telephone_cipher] AS [telephone], t_user.[creation_date] 
FROM dbo.t_user"/>
+    </rewrite-assertion>
 </rewrite-assertions>
diff --git 
a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml 
b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
index 922bfa12ceb..b1f89802f40 100644
--- a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
+++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/delete.xml
@@ -27,13 +27,13 @@
         <output sql="DELETE FROM t_account_0 WHERE account_id = 100" />
     </rewrite-assertion>
     
-    <rewrite-assertion id="delete_without_sharding_value_for_parameters" 
db-types="MySQL,Oracle,SQLServer,SQL92">
+    <rewrite-assertion id="delete_without_sharding_value_for_parameters" 
db-types="MySQL,Oracle,SQL92">
         <input sql="DELETE FROM logic_db.t_account WHERE status = ?" 
parameters="OK" />
         <output sql="DELETE FROM t_account_0 WHERE status = ?" parameters="OK" 
/>
         <output sql="DELETE FROM t_account_1 WHERE status = ?" parameters="OK" 
/>
     </rewrite-assertion>
     
-    <rewrite-assertion id="delete_without_sharding_value_for_literals" 
db-types="MySQL,Oracle,SQLServer,SQL92">
+    <rewrite-assertion id="delete_without_sharding_value_for_literals" 
db-types="MySQL,Oracle,SQL92">
         <input sql="DELETE FROM logic_db.t_account WHERE status = 'OK'" />
         <output sql="DELETE FROM t_account_0 WHERE status = 'OK'" />
         <output sql="DELETE FROM t_account_1 WHERE status = 'OK'" />
diff --git 
a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml 
b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
index a2a47e796b9..d72d7f1503e 100644
--- a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
+++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
@@ -58,7 +58,7 @@
         <output sql="SELECT DISTINCT amount AS AGGREGATION_DISTINCT_DERIVED_0, 
account_id FROM t_account_1  ORDER BY account_id ASC " />
     </rewrite-assertion>
 
-    <rewrite-assertion id="select_with_schema" 
db-types="MySQL,Oracle,SQLServer,SQL92">
+    <rewrite-assertion id="select_with_schema" db-types="MySQL,Oracle,SQL92">
         <input sql="SELECT * FROM logic_db.t_account" />
         <output sql="SELECT * FROM t_account_0 UNION ALL SELECT * FROM 
t_account_1" />
     </rewrite-assertion>
@@ -78,12 +78,12 @@
         <output sql="SELECT * FROM t_account_0 WHERE account_id = ? AND amount 
BETWEEN (SELECT amount FROM t_account_0 WHERE account_id = ?) AND ?"  
parameters="100, 100, 1500" />
     </rewrite-assertion>
     
-    <rewrite-assertion id="select_without_sharding_value_for_parameters" 
db-types="MySQL,Oracle,SQLServer,SQL92">
+    <rewrite-assertion id="select_without_sharding_value_for_parameters" 
db-types="MySQL,Oracle,SQL92">
         <input sql="SELECT * FROM logic_db.t_account WHERE amount = ?" 
parameters="1000" />
         <output sql="SELECT * FROM t_account_0 WHERE amount = ? UNION ALL 
SELECT * FROM t_account_1 WHERE amount = ?" parameters="1000, 1000" />
     </rewrite-assertion>
     
-    <rewrite-assertion id="select_without_sharding_value_for_literals" 
db-types="MySQL,Oracle,SQLServer,SQL92">
+    <rewrite-assertion id="select_without_sharding_value_for_literals" 
db-types="MySQL,Oracle,SQL92">
         <input sql="SELECT * FROM logic_db.t_account WHERE amount = 1000" />
         <output sql="SELECT * FROM t_account_0 WHERE amount = 1000 UNION ALL 
SELECT * FROM t_account_1 WHERE amount = 1000" />
     </rewrite-assertion>

Reply via email to