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