You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/02/24 01:27:55 UTC
[shardingsphere] branch master updated: Fix InsertValueContext.getValue cast exception (#15597)
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 9c4258d Fix InsertValueContext.getValue cast exception (#15597)
9c4258d is described below
commit 9c4258dc73858683803ab8eb65db6c2ce2d0d14c
Author: tuichenchuxin <86...@users.noreply.github.com>
AuthorDate: Thu Feb 24 09:26:48 2022 +0800
Fix InsertValueContext.getValue cast exception (#15597)
---
.../rewriter/EncryptInsertValueParameterRewriter.java | 4 +++-
.../token/generator/EncryptInsertValuesTokenGenerator.java | 3 ++-
.../route/engine/dml/ShadowInsertStatementRoutingEngine.java | 6 +++---
.../binder/segment/insert/values/InsertValueContext.java | 12 +++++++++---
.../binder/segment/insert/values/InsertValueContextTest.java | 4 ++--
.../binder/statement/impl/InsertStatementContextTest.java | 12 ++++++------
6 files changed, 25 insertions(+), 16 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
index b6847d9..77b5439 100644
--- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
+++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/parameter/rewriter/EncryptInsertValueParameterRewriter.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.encrypt.spi.QueryAssistedEncryptAlgorithm;
import org.apache.shardingsphere.encrypt.spi.context.EncryptContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.rewrite.parameter.builder.ParameterBuilder;
import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.GroupedParameterBuilder;
import org.apache.shardingsphere.infra.rewrite.parameter.builder.impl.StandardParameterBuilder;
@@ -82,7 +83,8 @@ public final class EncryptInsertValueParameterRewriter implements ParameterRewri
ExpressionSegment expressionSegment = insertStatementContext.getInsertValueContexts().get(count).getValueExpressions().get(columnIndex);
if (expressionSegment instanceof ParameterMarkerExpressionSegment) {
encryptInsertValue(
- encryptAlgorithm, parameterIndex, insertStatementContext.getInsertValueContexts().get(count).getValue(columnIndex),
+ encryptAlgorithm, parameterIndex, insertStatementContext.getInsertValueContexts().get(count).getValue(columnIndex)
+ .orElseThrow(() -> new ShardingSphereException("Not support for encrypt!")),
standardParameterBuilder, encryptContext);
}
}
diff --git a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
index 42b466e..4e1734b 100644
--- a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
+++ b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/EncryptInsertValuesTokenGenerator.java
@@ -32,6 +32,7 @@ import org.apache.shardingsphere.infra.binder.segment.insert.values.expression.D
import org.apache.shardingsphere.infra.binder.segment.insert.values.expression.DerivedSimpleExpressionSegment;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.InsertStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.OptionalSQLTokenGenerator;
import org.apache.shardingsphere.infra.rewrite.sql.token.generator.aware.PreviousSQLTokensAware;
import org.apache.shardingsphere.infra.rewrite.sql.token.pojo.SQLToken;
@@ -130,7 +131,7 @@ public final class EncryptInsertValuesTokenGenerator implements OptionalSQLToken
if (encryptor.isPresent()) {
int columnIndex = useDefaultInsertColumnsToken.map(sqlToken -> ((UseDefaultInsertColumnsToken) sqlToken).getColumns().indexOf(columnName))
.orElseGet(() -> insertStatementContext.getColumnNames().indexOf(columnName));
- Object originalValue = insertValueContext.getValue(columnIndex);
+ Object originalValue = insertValueContext.getValue(columnIndex).orElseThrow(() -> new ShardingSphereException("Not support for encrypt!"));
EncryptContext encryptContext = EncryptContextBuilder.build(schemaName, tableName, columnName, encryptRule);
addPlainColumn(insertValueToken, columnIndex, encryptContext, insertValueContext, originalValue);
addAssistedQueryColumn(insertValueToken, encryptor.get(), columnIndex, encryptContext, insertValueContext, originalValue);
diff --git a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngine.java b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngine.java
index 136e484..bbda543 100644
--- a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngine.java
+++ b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/main/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngine.java
@@ -94,9 +94,9 @@ public final class ShadowInsertStatementRoutingEngine extends AbstractShadowDMLS
private Optional<Collection<Comparable<?>>> getColumnValues(final List<InsertValueContext> insertValueContexts, final int index) {
Collection<Comparable<?>> result = new LinkedList<>();
for (InsertValueContext each : insertValueContexts) {
- Object valueObject = each.getValue(index);
- if (valueObject instanceof Comparable<?>) {
- result.add((Comparable<?>) valueObject);
+ Optional<Object> valueObject = each.getValue(index);
+ if (valueObject.isPresent() && valueObject.get() instanceof Comparable<?>) {
+ result.add((Comparable<?>) valueObject.get());
} else {
return Optional.empty();
}
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
index 1a9b83e..1dd8730 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContext.java
@@ -29,6 +29,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
/**
* Insert value context.
@@ -73,10 +74,15 @@ public final class InsertValueContext {
* @param index index
* @return value
*/
- public Object getValue(final int index) {
+ public Optional<Object> getValue(final int index) {
ExpressionSegment valueExpression = valueExpressions.get(index);
- return valueExpression instanceof ParameterMarkerExpressionSegment
- ? parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) valueExpression)) : ((LiteralExpressionSegment) valueExpression).getLiterals();
+ if (valueExpression instanceof ParameterMarkerExpressionSegment) {
+ return Optional.of(parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) valueExpression)));
+ }
+ if (valueExpression instanceof LiteralExpressionSegment) {
+ return Optional.of(((LiteralExpressionSegment) valueExpression).getLiterals());
+ }
+ return Optional.empty();
}
private int getParameterIndex(final ParameterMarkerExpressionSegment parameterMarkerExpression) {
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
index 3e19daa..80d4bef 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/InsertValueContextTest.java
@@ -62,7 +62,7 @@ public final class InsertValueContextTest {
List<Object> parameters = Collections.singletonList(parameterValue);
int parametersOffset = 0;
InsertValueContext insertValueContext = new InsertValueContext(assignments, parameters, parametersOffset);
- Object valueFromInsertValueContext = insertValueContext.getValue(0);
+ Object valueFromInsertValueContext = insertValueContext.getValue(0).get();
assertThat(valueFromInsertValueContext, is(parameterValue));
}
@@ -76,7 +76,7 @@ public final class InsertValueContextTest {
Collection<ExpressionSegment> assignments = makeLiteralExpressionSegment(literalObject);
List<Object> parameters = Collections.emptyList();
InsertValueContext insertValueContext = new InsertValueContext(assignments, parameters, 0);
- Object valueFromInsertValueContext = insertValueContext.getValue(0);
+ Object valueFromInsertValueContext = insertValueContext.getValue(0).get();
assertThat(valueFromInsertValueContext, is(literalObject));
}
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/InsertStatementContextTest.java b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/InsertStatementContextTest.java
index d52c994..5a2156c 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/InsertStatementContextTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/InsertStatementContextTest.java
@@ -188,12 +188,12 @@ public final class InsertStatementContextTest {
assertThat(actual.getGeneratedKeyContext(), is(Optional.empty()));
assertThat(actual.getColumnNames(), is(Arrays.asList("id", "name", "status")));
assertThat(actual.getInsertValueContexts().size(), is(2));
- assertThat(actual.getInsertValueContexts().get(0).getValue(0), is(1));
- assertThat(actual.getInsertValueContexts().get(0).getValue(1), is("Tom"));
- assertThat(actual.getInsertValueContexts().get(0).getValue(2), is("init"));
- assertThat(actual.getInsertValueContexts().get(1).getValue(0), is(2));
- assertThat(actual.getInsertValueContexts().get(1).getValue(1), is("Jerry"));
- assertThat(actual.getInsertValueContexts().get(1).getValue(2), is("init"));
+ assertThat(actual.getInsertValueContexts().get(0).getValue(0).get(), is(1));
+ assertThat(actual.getInsertValueContexts().get(0).getValue(1).get(), is("Tom"));
+ assertThat(actual.getInsertValueContexts().get(0).getValue(2).get(), is("init"));
+ assertThat(actual.getInsertValueContexts().get(1).getValue(0).get(), is(2));
+ assertThat(actual.getInsertValueContexts().get(1).getValue(1).get(), is("Jerry"));
+ assertThat(actual.getInsertValueContexts().get(1).getValue(2).get(), is("init"));
}
@Test