This is an automated email from the ASF dual-hosted git repository.
zhaojinchao pushed a commit to branch 5.3.2-release
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/5.3.2-release by this push:
new 2f1383a36ac Fix rewrite exception when execute encrypt like concat
with prepared statement (#24739)
2f1383a36ac is described below
commit 2f1383a36ac2ee562c5ed5b5672d009cd4d0a03a
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Mar 22 15:52:50 2023 +0800
Fix rewrite exception when execute encrypt like concat with prepared
statement (#24739)
---
.../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/suite/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
b/test/e2e/suite/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
index a18673c5446..e5591aa03ff 100644
---
a/test/e2e/suite/src/test/resources/cases/dql/dql-integration-select-aggregate.xml
+++
b/test/e2e/suite/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>