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>