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 68682beb16c [ISSUE #21668] Fix nullPointer when encrypt value is null 
(#21686)
68682beb16c is described below

commit 68682beb16c5d4ea982ebdf7fecab318f005aa66
Author: zzzwjZhang <[email protected]>
AuthorDate: Mon Oct 31 10:52:18 2022 +0800

    [ISSUE #21668] Fix nullPointer when encrypt value is null (#21686)
    
    * [ISSUE #21668] Fix nullPointer when encrypt value is null
    
    * Add tests to null field and fix checkstyle
    
    * Update InsertValueContextTest.java
    
    fix checkstyle
    
    Co-authored-by: zhangweijie <[email protected]>
---
 .../rewriter/EncryptInsertValueParameterRewriter.java       |  3 +--
 .../token/generator/EncryptInsertValuesTokenGenerator.java  |  3 +--
 .../generator/EncryptInsertValuesTokenGeneratorTest.java    | 13 ++++++++++++-
 .../binder/segment/insert/values/InsertValueContext.java    |  4 ++--
 .../segment/insert/values/InsertValueContextTest.java       | 12 ++++++++++++
 5 files changed, 28 insertions(+), 7 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
index cf7417fe7b6..72144d9cc45 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.encrypt.rewrite.parameter.rewriter;
 import com.google.common.base.Preconditions;
 import lombok.Setter;
 import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
-import 
org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptInsertValueException;
 import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.encrypt.rule.aware.EncryptRuleAware;
@@ -84,7 +83,7 @@ public final class EncryptInsertValueParameterRewriter 
implements ParameterRewri
                 ExpressionSegment expressionSegment = 
insertStatementContext.getInsertValueContexts().get(count).getValueExpressions().get(columnIndex);
                 if (expressionSegment instanceof 
ParameterMarkerExpressionSegment) {
                     Object literalValue = 
insertStatementContext.getInsertValueContexts().get(count).getLiteralValue(columnIndex)
-                            .orElseThrow(() -> new 
UnsupportedEncryptInsertValueException(columnIndex));
+                            .orElse(null);
                     encryptInsertValue(encryptAlgorithm, 
assistEncryptAlgorithm, parameterIndex, literalValue, standardParameterBuilder, 
encryptContext);
                 }
             }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
index 420f20a7bfb..ab60dd8fafd 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.encrypt.rewrite.token.generator;
 
 import lombok.Setter;
 import org.apache.shardingsphere.encrypt.context.EncryptContextBuilder;
-import 
org.apache.shardingsphere.encrypt.exception.syntax.UnsupportedEncryptInsertValueException;
 import org.apache.shardingsphere.encrypt.rewrite.aware.DatabaseNameAware;
 import 
org.apache.shardingsphere.encrypt.rewrite.token.pojo.EncryptInsertValuesToken;
 import org.apache.shardingsphere.encrypt.rule.EncryptRule;
@@ -134,7 +133,7 @@ public final class EncryptInsertValuesTokenGenerator 
implements OptionalSQLToken
             if (encryptor.isPresent()) {
                 int columnIndex = useDefaultInsertColumnsToken.map(optional -> 
((UseDefaultInsertColumnsToken) optional).getColumns().indexOf(columnName))
                         .orElseGet(() -> 
insertStatementContext.getColumnNames().indexOf(columnName));
-                Object originalValue = 
insertValueContext.getLiteralValue(columnIndex).orElseThrow(() -> new 
UnsupportedEncryptInsertValueException(columnIndex));
+                Object originalValue = 
insertValueContext.getLiteralValue(columnIndex).orElse(null);
                 EncryptContext encryptContext = 
EncryptContextBuilder.build(databaseName, schemaName, tableName, columnName);
                 addPlainColumn(insertValueToken, columnIndex, encryptContext, 
insertValueContext, originalValue);
                 if (encryptRule.findAssistedQueryEncryptor(tableName, 
columnName).isPresent()) {
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 be7e9a85a27..60f08d50adb 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
@@ -17,9 +17,10 @@
 
 package org.apache.shardingsphere.encrypt.rewrite.token.generator;
 
+import org.junit.Test;
+
 import java.util.Arrays;
 import java.util.Collections;
-import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -43,6 +44,16 @@ public final class EncryptInsertValuesTokenGeneratorTest 
extends EncryptGenerato
         
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.setEncryptRule(createEncryptRule());
+        
encryptInsertValuesTokenGenerator.setPreviousSQLTokens(getPreviousSQLTokens());
+        encryptInsertValuesTokenGenerator.setDatabaseName("db_schema");
+        
assertThat(encryptInsertValuesTokenGenerator.generateSQLToken(createInsertStatementContext(Arrays.asList(1,
 "Tom", 0, null))).toString(), is("(?, ?, ?, ?, ?, ?)"));
+    }
+    
     @Test
     public void assertGenerateSQLTokenFromPreviousSQLTokens() {
         EncryptInsertValuesTokenGenerator encryptInsertValuesTokenGenerator = 
new EncryptInsertValuesTokenGenerator();
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
index a28b05c7aa6..85fc76f79f6 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
@@ -77,10 +77,10 @@ public final class InsertValueContext {
     public Optional<Object> getLiteralValue(final int index) {
         ExpressionSegment valueExpression = valueExpressions.get(index);
         if (valueExpression instanceof ParameterMarkerExpressionSegment) {
-            return 
Optional.of(parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) 
valueExpression)));
+            return 
Optional.ofNullable(parameters.get(getParameterIndex((ParameterMarkerExpressionSegment)
 valueExpression)));
         }
         if (valueExpression instanceof LiteralExpressionSegment) {
-            return Optional.of(((LiteralExpressionSegment) 
valueExpression).getLiterals());
+            return Optional.ofNullable(((LiteralExpressionSegment) 
valueExpression).getLiterals());
         }
         return Optional.empty();
     }
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 eb922756a0f..977d807afd3 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
@@ -32,6 +32,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -65,6 +66,17 @@ public final class InsertValueContextTest {
         Object valueFromInsertValueContext = 
insertValueContext.getLiteralValue(0).get();
         assertThat(valueFromInsertValueContext, is(parameterValue));
     }
+
+    @Test
+    public void assertGetLiteralValueWhenParameterisNull() {
+        Collection<ExpressionSegment> assignments = 
makeParameterMarkerExpressionSegment();
+        String parameterValue = null;
+        List<Object> parameters = Collections.singletonList(parameterValue);
+        int parametersOffset = 0;
+        InsertValueContext insertValueContext = new 
InsertValueContext(assignments, parameters, parametersOffset);
+        Optional<Object> literalValue = insertValueContext.getLiteralValue(0);
+        assertThat(false, is(literalValue.isPresent()));
+    }
     
     private Collection<ExpressionSegment> 
makeParameterMarkerExpressionSegment() {
         return Collections.singleton(new ParameterMarkerExpressionSegment(0, 
10, 5));

Reply via email to