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 85abe604471 Support query assist column rewrite when insert null value 
with encrypt column (#21864)
85abe604471 is described below

commit 85abe604471c44867a50a3fc3c825f61fbe99826
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Oct 31 18:10:10 2022 +0800

    Support query assist column rewrite when insert null value with encrypt 
column (#21864)
    
    * Support query assist column rewrite when insert null value with encrypt 
column
    
    * fix unit test
---
 .../EncryptInsertValuesTokenGeneratorTest.java     | 10 ++++-----
 .../insert/values/InsertValueContextTest.java      |  2 +-
 .../infra/hint/SQLHintExtractor.java               |  3 ++-
 .../sql/token/pojo/generic/InsertValue.java        |  9 +++++++-
 .../RewriteNormalEncryptAlgorithmFixture.java      |  6 ++++++
 ...ewriteQueryAssistedEncryptAlgorithmFixture.java |  6 ++++++
 ...SchemaMetaDataAwareEncryptAlgorithmFixture.java |  6 ++++++
 .../AbstractSQLRewriterParameterizedTest.java      |  2 +-
 .../parameter/SQLRewriteEngineTestParameters.java  |  2 +-
 .../SQLRewriteEngineTestParametersBuilder.java     | 25 +++++++++++++---------
 .../query-with-cipher/dml/insert/insert-column.xml |  5 +++++
 .../query-with-plain/dml/insert/insert-column.xml  |  5 +++++
 12 files changed, 61 insertions(+), 20 deletions(-)

diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGeneratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGeneratorTest.java
index 60f08d50adb..6feb3ea71e7 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGeneratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGeneratorTest.java
@@ -40,27 +40,27 @@ public final class EncryptInsertValuesTokenGeneratorTest 
extends EncryptGenerato
         EncryptInsertValuesTokenGenerator encryptInsertValuesTokenGenerator = 
new EncryptInsertValuesTokenGenerator();
         encryptInsertValuesTokenGenerator.setEncryptRule(createEncryptRule());
         
encryptInsertValuesTokenGenerator.setPreviousSQLTokens(Collections.emptyList());
-        encryptInsertValuesTokenGenerator.setDatabaseName("db_schema");
+        encryptInsertValuesTokenGenerator.setDatabaseName("encrypt_db");
         
assertThat(encryptInsertValuesTokenGenerator.generateSQLToken(createInsertStatementContext(Arrays.asList(1,
 "Tom", 0, "123456"))).toString(), is("(?, ?, ?, ?, ?, ?)"));
     }
     
     @Test
     public void assertGenerateSQLTokenFromPreviousSQLTokensWithNullField() {
         EncryptInsertValuesTokenGenerator encryptInsertValuesTokenGenerator = 
new EncryptInsertValuesTokenGenerator();
-        encryptInsertValuesTokenGenerator.setDatabaseName("db-001");
+        encryptInsertValuesTokenGenerator.setDatabaseName("encrypt_db");
         encryptInsertValuesTokenGenerator.setEncryptRule(createEncryptRule());
         
encryptInsertValuesTokenGenerator.setPreviousSQLTokens(getPreviousSQLTokens());
-        encryptInsertValuesTokenGenerator.setDatabaseName("db_schema");
+        encryptInsertValuesTokenGenerator.setDatabaseName("encrypt_db");
         
assertThat(encryptInsertValuesTokenGenerator.generateSQLToken(createInsertStatementContext(Arrays.asList(1,
 "Tom", 0, null))).toString(), is("(?, ?, ?, ?, ?, ?)"));
     }
     
     @Test
     public void assertGenerateSQLTokenFromPreviousSQLTokens() {
         EncryptInsertValuesTokenGenerator encryptInsertValuesTokenGenerator = 
new EncryptInsertValuesTokenGenerator();
-        encryptInsertValuesTokenGenerator.setDatabaseName("db-001");
+        encryptInsertValuesTokenGenerator.setDatabaseName("encrypt_db");
         encryptInsertValuesTokenGenerator.setEncryptRule(createEncryptRule());
         
encryptInsertValuesTokenGenerator.setPreviousSQLTokens(getPreviousSQLTokens());
-        encryptInsertValuesTokenGenerator.setDatabaseName("db_schema");
+        encryptInsertValuesTokenGenerator.setDatabaseName("encrypt_db");
         
assertThat(encryptInsertValuesTokenGenerator.generateSQLToken(createInsertStatementContext(Arrays.asList(1,
 "Tom", 0, "123456"))).toString(), is("(?, ?, ?, ?, ?, ?)"));
     }
 }
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
index 977d807afd3..38b74c6b7b3 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
@@ -66,7 +66,7 @@ public final class InsertValueContextTest {
         Object valueFromInsertValueContext = 
insertValueContext.getLiteralValue(0).get();
         assertThat(valueFromInsertValueContext, is(parameterValue));
     }
-
+    
     @Test
     public void assertGetLiteralValueWhenParameterisNull() {
         Collection<ExpressionSegment> assignments = 
makeParameterMarkerExpressionSegment();
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
index edab5129f1d..0398c42ee95 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintExtractor.java
@@ -46,7 +46,8 @@ public final class SQLHintExtractor {
     
     public SQLHintExtractor(final String sqlComment) {
         sqlHintProperties = Strings.isNullOrEmpty(sqlComment)
-                ? DEFAULT_SQL_HINT_PROPERTIES : new 
SQLHintProperties(SQLHintUtils.getSQLHintProps(sqlComment));
+                ? DEFAULT_SQL_HINT_PROPERTIES
+                : new 
SQLHintProperties(SQLHintUtils.getSQLHintProps(sqlComment));
     }
     
     private SQLHintProperties extract(final AbstractSQLStatement statement) {
diff --git 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/InsertValue.java
 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/InsertValue.java
index 976036c3b8e..2ba80ca37c0 100644
--- 
a/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/InsertValue.java
+++ 
b/infra/rewrite/src/main/java/org/apache/shardingsphere/infra/rewrite/sql/token/pojo/generic/InsertValue.java
@@ -55,11 +55,18 @@ public class InsertValue {
         }
         if (expressionSegment instanceof LiteralExpressionSegment) {
             Object literals = ((LiteralExpressionSegment) 
expressionSegment).getLiterals();
-            return literals instanceof String ? "'" + 
((LiteralExpressionSegment) expressionSegment).getLiterals() + "'" : 
literals.toString();
+            return getLiteralValue((LiteralExpressionSegment) 
expressionSegment, literals);
         }
         if (expressionSegment instanceof BinaryOperationExpression) {
             return ((BinaryOperationExpression) expressionSegment).getText();
         }
         return ((ComplexExpressionSegment) expressionSegment).getText();
     }
+    
+    private String getLiteralValue(final LiteralExpressionSegment 
expressionSegment, final Object literals) {
+        if (null == literals) {
+            return "NULL";
+        }
+        return literals instanceof String ? "'" + 
expressionSegment.getLiterals() + "'" : String.valueOf(literals);
+    }
 }
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteNormalEncryptAlgorithmFixture.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteNormalEncryptAlgorithmFixture.java
index cda812f3861..68f18cd601b 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteNormalEncryptAlgorithmFixture.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteNormalEncryptAlgorithmFixture.java
@@ -35,11 +35,17 @@ public final class RewriteNormalEncryptAlgorithmFixture 
implements EncryptAlgori
     
     @Override
     public String encrypt(final Object plainValue, final EncryptContext 
encryptContext) {
+        if (null == plainValue) {
+            return null;
+        }
         return "encrypt_" + plainValue;
     }
     
     @Override
     public Object decrypt(final String cipherValue, final EncryptContext 
encryptContext) {
+        if (null == cipherValue) {
+            return null;
+        }
         return cipherValue.replaceAll("encrypt_", "");
     }
     
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteQueryAssistedEncryptAlgorithmFixture.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteQueryAssistedEncryptAlgorithmFixture.java
index 543addd6711..80de92867f5 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteQueryAssistedEncryptAlgorithmFixture.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteQueryAssistedEncryptAlgorithmFixture.java
@@ -35,11 +35,17 @@ public final class 
RewriteQueryAssistedEncryptAlgorithmFixture implements Encryp
     
     @Override
     public String encrypt(final Object plainValue, final EncryptContext 
encryptContext) {
+        if (null == plainValue) {
+            return null;
+        }
         return "assisted_query_" + plainValue;
     }
     
     @Override
     public Object decrypt(final String cipherValue, final EncryptContext 
encryptContext) {
+        if (null == cipherValue) {
+            return null;
+        }
         return cipherValue.replaceAll("encrypt_", "");
     }
     
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteSchemaMetaDataAwareEncryptAlgorithmFixture.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteSchemaMetaDataAwareEncryptAlgorithmFixture.java
index b5d770d7545..c712be5df51 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteSchemaMetaDataAwareEncryptAlgorithmFixture.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/fixture/encrypt/RewriteSchemaMetaDataAwareEncryptAlgorithmFixture.java
@@ -46,11 +46,17 @@ public final class 
RewriteSchemaMetaDataAwareEncryptAlgorithmFixture implements
     
     @Override
     public String encrypt(final Object plainValue, final EncryptContext 
encryptContext) {
+        if (null == plainValue) {
+            return null;
+        }
         return "encrypt_" + plainValue + "_" + 
schemas.get(databaseName).getTable(encryptContext.getTableName()).getName();
     }
     
     @Override
     public Object decrypt(final String cipherValue, final EncryptContext 
encryptContext) {
+        if (null == cipherValue) {
+            return null;
+        }
         ShardingSphereTable table = 
schemas.get(databaseName).getTable(encryptContext.getTableName());
         return cipherValue.replaceAll("encrypt_", "").replaceAll("_" + 
table.getName(), "");
     }
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
index 658155cefca..7e55d67840e 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
@@ -97,7 +97,7 @@ public abstract class AbstractSQLRewriterParameterizedTest {
             assertThat(each.getSql(), 
is(testParameters.getOutputSQLs().get(count)));
             assertThat(each.getParameters().size(), 
is(testParameters.getOutputGroupedParameters().get(count).size()));
             for (int i = 0; i < each.getParameters().size(); i++) {
-                assertThat(each.getParameters().get(i).toString(), 
is(testParameters.getOutputGroupedParameters().get(count).get(i)));
+                assertThat(String.valueOf(each.getParameters().get(i)), 
is(String.valueOf(testParameters.getOutputGroupedParameters().get(count).get(i))));
             }
             count++;
         }
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParameters.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParameters.java
index 245a5760a2d..695530e8bef 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParameters.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParameters.java
@@ -43,7 +43,7 @@ public final class SQLRewriteEngineTestParameters {
     
     private final List<String> outputSQLs;
     
-    private final List<List<String>> outputGroupedParameters;
+    private final List<List<Object>> outputGroupedParameters;
     
     private final String databaseType;
     
diff --git 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParametersBuilder.java
 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParametersBuilder.java
index ae557e76e8d..cb4b40640ec 100644
--- 
a/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParametersBuilder.java
+++ 
b/test/rewrite/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/parameter/SQLRewriteEngineTestParametersBuilder.java
@@ -19,9 +19,10 @@ package 
org.apache.shardingsphere.sharding.rewrite.parameterized.engine.paramete
 
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
-import com.google.common.primitives.Ints;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
 import 
org.apache.shardingsphere.sharding.rewrite.parameterized.entity.RewriteAssertionEntity;
 import 
org.apache.shardingsphere.sharding.rewrite.parameterized.entity.RewriteAssertionsRootEntity;
 import 
org.apache.shardingsphere.sharding.rewrite.parameterized.entity.RewriteOutputEntity;
@@ -97,7 +98,7 @@ public final class SQLRewriteEngineTestParametersBuilder {
         for (RewriteAssertionEntity each : rootAssertions.getAssertions()) {
             for (String databaseType : 
getDatabaseTypes(each.getDatabaseTypes())) {
                 result.add(new SQLRewriteEngineTestParameters(type, 
each.getId(), fileName, rootAssertions.getYamlRule(), each.getInput().getSql(),
-                        
createInputParameters(each.getInput().getParameters()), 
createOutputSQLs(each.getOutputs()), 
createOutputGroupedParameters(each.getOutputs()), databaseType).toArray());
+                        createParameters(each.getInput().getParameters()), 
createOutputSQLs(each.getOutputs()), 
createOutputGroupedParameters(each.getOutputs()), databaseType).toArray());
             }
         }
         return result;
@@ -111,14 +112,18 @@ public final class SQLRewriteEngineTestParametersBuilder {
         return Arrays.asList("MySQL", "PostgreSQL", "Oracle", "SQLServer", 
"SQL92", "openGauss");
     }
     
-    private static List<Object> createInputParameters(final String 
inputParameters) {
+    private static List<Object> createParameters(final String inputParameters) 
{
         if (null == inputParameters) {
             return Collections.emptyList();
         }
-        return 
Splitter.on(",").trimResults().splitToList(inputParameters).stream().map(each 
-> {
-            Object result = Ints.tryParse(each);
-            return null == result ? each : result;
-        }).collect(Collectors.toList());
+        return 
Splitter.on(",").trimResults().splitToList(inputParameters).stream().map(SQLRewriteEngineTestParametersBuilder::createInputParameter).collect(Collectors.toList());
+    }
+    
+    private static Object createInputParameter(final String inputParameter) {
+        if (StringUtils.isNumeric(inputParameter)) {
+            return NumberUtils.createNumber(inputParameter);
+        }
+        return "NULL".equals(inputParameter) ? null : inputParameter;
     }
     
     private static List<String> createOutputSQLs(final 
List<RewriteOutputEntity> outputs) {
@@ -129,10 +134,10 @@ public final class SQLRewriteEngineTestParametersBuilder {
         return result;
     }
     
-    private static List<List<String>> createOutputGroupedParameters(final 
List<RewriteOutputEntity> outputs) {
-        List<List<String>> result = new ArrayList<>(outputs.size());
+    private static List<List<Object>> createOutputGroupedParameters(final 
List<RewriteOutputEntity> outputs) {
+        List<List<Object>> result = new ArrayList<>(outputs.size());
         for (RewriteOutputEntity each : outputs) {
-            result.add(null == each.getParameters() ? Collections.emptyList() 
: Splitter.on(",").trimResults().splitToList(each.getParameters()));
+            result.add(createParameters(each.getParameters()));
         }
         return result;
     }
diff --git 
a/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-column.xml
 
b/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-column.xml
index 1669a6b2e25..3bf1ccbaa0d 100644
--- 
a/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-column.xml
+++ 
b/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-cipher/dml/insert/insert-column.xml
@@ -131,4 +131,9 @@
         <input sql="INSERT INTO t_order(ORDER_ID, USER_ID, CONTENT) VALUES (?, 
?, ?);" parameters="1, 1, TEST" />
         <output sql="INSERT INTO t_order(ORDER_ID, USER_ID, CIPHER_CONTENT, 
PLAIN_CONTENT) VALUES (?, ?, ?, ?);" parameters="1, 1, encrypt_TEST_t_order, 
TEST" />
     </rewrite-assertion>
+
+    <rewrite-assertion 
id="insert_values_with_null_encrypt_column_for_parameters" 
db-types="MySQL,PostgreSQL,openGauss">
+        <input sql="INSERT INTO t_account(account_id, certificate_number, 
password, amount, status) VALUES (?, ?, ?, ?, ?), (2, '222X', NULL, 2000, 
'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', NULL, 'OK')" parameters="1, NULL, 
aaa, 1000, OK, 3, 333X, NULL, 3000, OK" />
+        <output sql="INSERT INTO t_account(account_id, 
cipher_certificate_number, assisted_query_certificate_number, cipher_password, 
assisted_query_password, cipher_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?), 
(2, 'encrypt_222X', 'assisted_query_222X', NULL, NULL, 'encrypt_2000', 'OK'), 
(?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', 
'encrypt_ddd', 'assisted_query_ddd', NULL, 'OK')" parameters="1, NULL, NULL, 
encrypt_aaa, assisted_query_aaa, encrypt_1000, OK, 3, encry [...]
+    </rewrite-assertion>
 </rewrite-assertions>
diff --git 
a/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-plain/dml/insert/insert-column.xml
 
b/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-plain/dml/insert/insert-column.xml
index 0ae07f4d841..0787e0ed036 100644
--- 
a/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-plain/dml/insert/insert-column.xml
+++ 
b/test/rewrite/src/test/resources/scenario/encrypt/case/query-with-plain/dml/insert/insert-column.xml
@@ -126,4 +126,9 @@
         <input sql="INSERT INTO t_order(ORDER_ID, USER_ID, CONTENT) VALUES (?, 
?, ?);" parameters="1, 1, TEST" />
         <output sql="INSERT INTO t_order(ORDER_ID, USER_ID, CIPHER_CONTENT, 
PLAIN_CONTENT) VALUES (?, ?, ?, ?);" parameters="1, 1, encrypt_TEST_t_order, 
TEST" />
     </rewrite-assertion>
+
+    <rewrite-assertion id="insert_values_with_null_encrypt_column_for_plain" 
db-types="MySQL,PostgreSQL,openGauss">
+        <input sql="INSERT INTO t_account(account_id, certificate_number, 
password, amount, status) VALUES (?, ?, ?, ?, ?), (2, '222X', NULL, 2000, 
'OK'), (?, ?, ?, ?, ?), (4, '444X', 'ddd', NULL, 'OK')" parameters="1, NULL, 
aaa, 1000, OK, 3, 333X, NULL, 3000, OK" />
+        <output sql="INSERT INTO t_account(account_id, 
cipher_certificate_number, assisted_query_certificate_number, cipher_password, 
assisted_query_password, cipher_amount, status) VALUES (?, ?, ?, ?, ?, ?, ?), 
(2, 'encrypt_222X', 'assisted_query_222X', NULL, NULL, 'encrypt_2000', 'OK'), 
(?, ?, ?, ?, ?, ?, ?), (4, 'encrypt_444X', 'assisted_query_444X', 
'encrypt_ddd', 'assisted_query_ddd', NULL, 'OK')" parameters="1, NULL, NULL, 
encrypt_aaa, assisted_query_aaa, encrypt_1000, OK, 3, encry [...]
+    </rewrite-assertion>
 </rewrite-assertions>

Reply via email to