You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2023/03/22 07:41:09 UTC
[shardingsphere] branch master updated: Fix rewrite exception when execute encrypt like concat with prepared statement (#24738)
This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 b1e91a45baa Fix rewrite exception when execute encrypt like concat with prepared statement (#24738)
b1e91a45baa is described below
commit b1e91a45baac775ea0627e00cff9e0f44e8535a2
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Wed Mar 22 15:40:59 2023 +0800
Fix rewrite exception when execute encrypt like concat with prepared statement (#24738)
---
.../condition/impl/EncryptBinaryCondition.java | 24 ++++++++--------------
.../cases/dql/dql-integration-select-aggregate.xml | 4 ++--
2 files changed, 10 insertions(+), 18 deletions(-)
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java
index 3c78e95cdd9..8e1365c2ee1 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/condition/impl/EncryptBinaryCondition.java
@@ -27,8 +27,6 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.L
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -65,24 +63,18 @@ public final class EncryptBinaryCondition implements EncryptCondition {
this.startIndex = startIndex;
this.stopIndex = stopIndex;
this.expressionSegment = expressionSegment;
- putPositionMap(expressionSegment);
+ putPositionMap(0, expressionSegment);
}
- private void putPositionMap(final ExpressionSegment expressionSegment) {
+ private void putPositionMap(final int index, final ExpressionSegment expressionSegment) {
if (expressionSegment instanceof ParameterMarkerExpressionSegment) {
- positionIndexMap.put(0, ((ParameterMarkerExpressionSegment) expressionSegment).getParameterMarkerIndex());
+ positionIndexMap.put(index, ((ParameterMarkerExpressionSegment) expressionSegment).getParameterMarkerIndex());
} else if (expressionSegment instanceof LiteralExpressionSegment) {
- positionValueMap.put(0, ((LiteralExpressionSegment) expressionSegment).getLiterals());
- } else if (expressionSegment instanceof FunctionSegment) {
- Collection<ExpressionSegment> parameters = ((FunctionSegment) expressionSegment).getParameters();
- Iterator<ExpressionSegment> iterator = parameters.iterator();
- int i = 0;
- while (iterator.hasNext()) {
- ExpressionSegment next = iterator.next();
- if (next instanceof LiteralExpressionSegment) {
- positionValueMap.put(i, ((LiteralExpressionSegment) next).getLiterals());
- }
- i++;
+ positionValueMap.put(index, ((LiteralExpressionSegment) expressionSegment).getLiterals());
+ } else if (expressionSegment instanceof FunctionSegment && "CONCAT".equalsIgnoreCase(((FunctionSegment) expressionSegment).getFunctionName())) {
+ int parameterIndex = index;
+ for (ExpressionSegment each : ((FunctionSegment) expressionSegment).getParameters()) {
+ putPositionMap(parameterIndex++, each);
}
}
}
diff --git a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-aggregate.xml b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
index a18673c5446..e5591aa03ff 100644
--- a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
+++ b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
@@ -134,7 +134,7 @@
<assertion parameters="10000:int" expected-data-source-name="read_dataset" />
</test-case>
- <test-case sql="SELECT * FROM t_merchant WHERE business_code LIKE CONCAT('%','abc','%')" db-types="MySQL,PostgreSQL,openGauss" scenario-types="encrypt">
- <assertion expected-data-source-name="read_dataset" />
+ <test-case sql="SELECT * FROM t_merchant WHERE business_code LIKE CONCAT('%', ?, '%')" db-types="MySQL,PostgreSQL,openGauss" scenario-types="encrypt">
+ <assertion parameters="abc:String" expected-data-source-name="read_dataset" />
</test-case>
</integration-test-cases>