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>