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>

Reply via email to