This is an automated email from the ASF dual-hosted git repository.

panjuan 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 98f04e6  Revise pr 12295 (#12507)
98f04e6 is described below

commit 98f04e683e0e3d435b66ef1dce746f7da363e366
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Sep 17 11:06:50 2021 +0800

    Revise pr 12295 (#12507)
---
 .../segment/insert/values/InsertValueContext.java  | 26 +++++----
 .../insert/values/OnDuplicateUpdateContext.java    | 22 ++++----
 .../insert/values/InsertValueContextTest.java      |  4 +-
 .../values/OnDuplicateUpdateContextTest.java       | 61 ++++++++--------------
 .../statement/InsertContextExpressSegmentUtil.java | 54 -------------------
 .../simple/ParameterMarkerExpressionSegment.java   |  2 +
 .../sql/common/util/ExpressionExtractUtil.java     | 26 ++++++++-
 7 files changed, 79 insertions(+), 116 deletions(-)

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 c4a2be7..1a9b83e 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
@@ -17,12 +17,13 @@
 
 package org.apache.shardingsphere.infra.binder.segment.insert.values;
 
+import com.google.common.base.Preconditions;
 import lombok.Getter;
 import lombok.ToString;
-import 
org.apache.shardingsphere.infra.statement.InsertContextExpressSegmentUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,14 +41,14 @@ public final class InsertValueContext {
     
     private final List<ExpressionSegment> valueExpressions;
 
-    private final List<ParameterMarkerExpressionSegment> 
parametersValueExpressions;
+    private final List<ParameterMarkerExpressionSegment> 
parameterMarkerExpressions;
     
     private final List<Object> parameters;
     
     public InsertValueContext(final Collection<ExpressionSegment> assignments, 
final List<Object> parameters, final int parametersOffset) {
         valueExpressions = getValueExpressions(assignments);
-        parametersValueExpressions = 
InsertContextExpressSegmentUtil.extractParameterMarkerExpressionSegment(assignments);
-        parameterCount = parametersValueExpressions.size();
+        parameterMarkerExpressions = 
ExpressionExtractUtil.getParameterMarkerExpressions(assignments);
+        parameterCount = parameterMarkerExpressions.size();
         this.parameters = getParameters(parameters, parametersOffset);
     }
     
@@ -74,13 +75,16 @@ public final class InsertValueContext {
      */
     public Object getValue(final int index) {
         ExpressionSegment valueExpression = valueExpressions.get(index);
-        if (parametersValueExpressions.contains(valueExpression)) {
-            return 
parameters.get(parametersValueExpressions.indexOf(valueExpression));
-        } else {
-            return ((LiteralExpressionSegment) valueExpression).getLiterals();
-        }
+        return valueExpression instanceof ParameterMarkerExpressionSegment 
+                ? 
parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) 
valueExpression)) : ((LiteralExpressionSegment) valueExpression).getLiterals();
     }
-
+    
+    private int getParameterIndex(final ParameterMarkerExpressionSegment 
parameterMarkerExpression) {
+        int parameterIndex = 
parameterMarkerExpressions.indexOf(parameterMarkerExpression);
+        Preconditions.checkArgument(parameterIndex >= 0, "Can not get 
parameter index.");
+        return parameterIndex;
+    }
+    
     /**
      * Get parameter index via column index.
      *
@@ -89,6 +93,6 @@ public final class InsertValueContext {
      */
     public int getParameterIndex(final int index) {
         ExpressionSegment valueExpression = valueExpressions.get(index);
-        return parametersValueExpressions.indexOf(valueExpression);
+        return valueExpression instanceof ParameterMarkerExpressionSegment ? 
getParameterIndex((ParameterMarkerExpressionSegment) valueExpression) : -1;
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
index e382586..c0e50ec 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContext.java
@@ -17,14 +17,15 @@
 
 package org.apache.shardingsphere.infra.binder.segment.insert.values;
 
+import com.google.common.base.Preconditions;
 import lombok.Getter;
 import lombok.ToString;
-import 
org.apache.shardingsphere.infra.statement.InsertContextExpressSegmentUtil;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.AssignmentSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtil;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,7 +41,7 @@ public final class OnDuplicateUpdateContext {
     
     private final List<ExpressionSegment> valueExpressions;
 
-    private final List<ParameterMarkerExpressionSegment> 
parametersValueExpressions;
+    private final List<ParameterMarkerExpressionSegment> 
parameterMarkerExpressions;
     
     private final List<Object> parameters;
     
@@ -49,8 +50,8 @@ public final class OnDuplicateUpdateContext {
     public OnDuplicateUpdateContext(final Collection<AssignmentSegment> 
assignments, final List<Object> parameters, final int parametersOffset) {
         List<ExpressionSegment> expressionSegments = 
assignments.stream().map(AssignmentSegment::getValue).collect(Collectors.toList());
         valueExpressions = getValueExpressions(expressionSegments);
-        parametersValueExpressions = 
InsertContextExpressSegmentUtil.extractParameterMarkerExpressionSegment(expressionSegments);
-        parameterCount = parametersValueExpressions.size();
+        parameterMarkerExpressions = 
ExpressionExtractUtil.getParameterMarkerExpressions(expressionSegments);
+        parameterCount = parameterMarkerExpressions.size();
         this.parameters = getParameters(parameters, parametersOffset);
         columns = assignments.stream().map(assignment -> 
assignment.getColumns().get(0)).collect(Collectors.toList());
     }
@@ -78,11 +79,14 @@ public final class OnDuplicateUpdateContext {
      */
     public Object getValue(final int index) {
         ExpressionSegment valueExpression = valueExpressions.get(index);
-        if (parametersValueExpressions.contains(valueExpression)) {
-            return 
parameters.get(parametersValueExpressions.indexOf(valueExpression));
-        } else {
-            return ((LiteralExpressionSegment) valueExpression).getLiterals();
-        }
+        return valueExpression instanceof ParameterMarkerExpressionSegment 
+                ? 
parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) 
valueExpression)) : ((LiteralExpressionSegment) valueExpression).getLiterals();
+    }
+    
+    private int getParameterIndex(final ParameterMarkerExpressionSegment 
parameterMarkerExpression) {
+        int parameterIndex = 
parameterMarkerExpressions.indexOf(parameterMarkerExpression);
+        Preconditions.checkArgument(parameterIndex >= 0, "Can not get 
parameter index.");
+        return parameterIndex;
     }
     
     /**
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 cc824c8..3e19daa 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
@@ -86,14 +86,14 @@ public final class InsertValueContextTest {
 
     @Test
     public void assertGetParameterCount() {
-        Collection<ExpressionSegment> assignments = Arrays.asList(
+        Collection<ExpressionSegment> expressions = Arrays.asList(
                 new LiteralExpressionSegment(0, 10, null),
                 new ExpressionProjectionSegment(0, 10, ""),
                 new ParameterMarkerExpressionSegment(0, 10, 5),
                 new BinaryOperationExpression(0, 0, new ColumnSegment(0, 0, 
new IdentifierValue("")), new ParameterMarkerExpressionSegment(0, 10, 5), "=", 
"")
         );
         List<Object> parameters = Arrays.asList("", "");
-        InsertValueContext insertValueContext = new 
InsertValueContext(assignments, parameters, 0);
+        InsertValueContext insertValueContext = new 
InsertValueContext(expressions, parameters, 0);
         assertThat(insertValueContext.getParameterCount(), is(2));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
index 8bc72dc..160069b 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/insert/values/OnDuplicateUpdateContextTest.java
@@ -33,7 +33,6 @@ import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -60,7 +59,7 @@ public final class OnDuplicateUpdateContextTest {
     
     @Test
     public void assertGetValueWhenParameterMarker() {
-        Collection<AssignmentSegment> assignments = 
makeParameterMarkerExpressionAssignmentSegment();
+        Collection<AssignmentSegment> assignments = 
createParameterMarkerExpressionAssignmentSegment();
         String parameterValue1 = "test1";
         String parameterValue2 = "test2";
         List<Object> parameters = Arrays.asList(parameterValue1, 
parameterValue2);
@@ -72,63 +71,50 @@ public final class OnDuplicateUpdateContextTest {
         assertThat(valueFromInsertValueContext2, is(parameterValue2));
     }
     
-    private Collection<AssignmentSegment> 
makeParameterMarkerExpressionAssignmentSegment() {
+    private Collection<AssignmentSegment> 
createParameterMarkerExpressionAssignmentSegment() {
         ParameterMarkerExpressionSegment parameterMarkerExpressionSegment0 = 
new ParameterMarkerExpressionSegment(0, 10, 5);
-        AssignmentSegment assignmentSegment1 = 
makeAssignmentSegment(parameterMarkerExpressionSegment0);
+        AssignmentSegment assignmentSegment1 = 
createAssignmentSegment(parameterMarkerExpressionSegment0);
         ParameterMarkerExpressionSegment parameterMarkerExpressionSegment1 = 
new ParameterMarkerExpressionSegment(0, 10, 6);
-        AssignmentSegment assignmentSegment2 = 
makeAssignmentSegment(parameterMarkerExpressionSegment1);
+        AssignmentSegment assignmentSegment2 = 
createAssignmentSegment(parameterMarkerExpressionSegment1);
         return Arrays.asList(assignmentSegment1, assignmentSegment2);
     }
     
     @Test
     public void assertGetValueWhenLiteralExpressionSegment() {
         Object literalObject = new Object();
-        Collection<AssignmentSegment> assignments = 
makeLiteralExpressionSegment(literalObject);
+        Collection<AssignmentSegment> assignments = 
createLiteralExpressionSegment(literalObject);
         List<Object> parameters = Collections.emptyList();
         OnDuplicateUpdateContext onDuplicateUpdateContext = new 
OnDuplicateUpdateContext(assignments, parameters, 0);
         Object valueFromInsertValueContext = 
onDuplicateUpdateContext.getValue(0);
         assertThat(valueFromInsertValueContext, is(literalObject));
     }
     
-    private Collection<AssignmentSegment> makeLiteralExpressionSegment(final 
Object literalObject) {
+    private Collection<AssignmentSegment> createLiteralExpressionSegment(final 
Object literalObject) {
         LiteralExpressionSegment parameterLiteralExpression = new 
LiteralExpressionSegment(0, 10, literalObject);
-        AssignmentSegment assignmentSegment = 
makeAssignmentSegment(parameterLiteralExpression);
+        AssignmentSegment assignmentSegment = 
createAssignmentSegment(parameterLiteralExpression);
         return Collections.singleton(assignmentSegment);
     }
 
-    private BinaryOperationExpression makeBinaryOperationExpression() {
-        int doesNotMatterIndex = 0;
-        String doesNotMatterColumnName = "columnNameStr";
-        String doesNotMatterColumnText = "columnNameStr=?";
-        ExpressionSegment left = new ColumnSegment(doesNotMatterIndex, 
doesNotMatterIndex, new IdentifierValue(doesNotMatterColumnName));
-        ExpressionSegment right = new 
ParameterMarkerExpressionSegment(doesNotMatterIndex, doesNotMatterIndex, 
doesNotMatterIndex);
-        return new BinaryOperationExpression(doesNotMatterIndex, 
doesNotMatterIndex, left, right, "=", doesNotMatterColumnText);
+    private BinaryOperationExpression createBinaryOperationExpression() {
+        ExpressionSegment left = new ColumnSegment(0, 0, new 
IdentifierValue("columnNameStr"));
+        ExpressionSegment right = new ParameterMarkerExpressionSegment(0, 0, 
0);
+        return new BinaryOperationExpression(0, 0, left, right, "=", 
"columnNameStr=?");
     }
     
-    private AssignmentSegment makeAssignmentSegment(final 
SimpleExpressionSegment expressionSegment) {
-        int doesNotMatterLexicalIndex = 0;
-        String doesNotMatterColumnName = "columnNameStr";
-        ColumnSegment column = new ColumnSegment(doesNotMatterLexicalIndex, 
doesNotMatterLexicalIndex, new IdentifierValue(doesNotMatterColumnName));
-        List<ColumnSegment> columnSegments = new LinkedList<>();
-        columnSegments.add(column);
-        AssignmentSegment result = new 
ColumnAssignmentSegment(doesNotMatterLexicalIndex, doesNotMatterLexicalIndex, 
columnSegments, expressionSegment);
-        return result;
+    private AssignmentSegment createAssignmentSegment(final 
SimpleExpressionSegment expressionSegment) {
+        List<ColumnSegment> columnSegments = Collections.singletonList(new 
ColumnSegment(0, 0, new IdentifierValue("columnNameStr")));
+        return new ColumnAssignmentSegment(0, 0, columnSegments, 
expressionSegment);
     }
 
-    private AssignmentSegment makeAssignmentSegment(final 
BinaryOperationExpression binaryOperationExpression) {
-        int doesNotMatterLexicalIndex = 0;
-        String doesNotMatterColumnName = "columnNameStr";
-        ColumnSegment column = new ColumnSegment(doesNotMatterLexicalIndex, 
doesNotMatterLexicalIndex, new IdentifierValue(doesNotMatterColumnName));
-        List<ColumnSegment> columnSegments = new LinkedList<>();
-        columnSegments.add(column);
-        AssignmentSegment result = new 
ColumnAssignmentSegment(doesNotMatterLexicalIndex, doesNotMatterLexicalIndex, 
columnSegments, binaryOperationExpression);
-        return result;
+    private AssignmentSegment createAssignmentSegment(final 
BinaryOperationExpression binaryOperationExpression) {
+        List<ColumnSegment> columnSegments = Collections.singletonList(new 
ColumnSegment(0, 0, new IdentifierValue("columnNameStr")));
+        return new ColumnAssignmentSegment(0, 0, columnSegments, 
binaryOperationExpression);
     }
     
     @Test
     public void assertGetColumn() {
         Object literalObject = new Object();
-        Collection<AssignmentSegment> assignments = 
makeLiteralExpressionSegment(literalObject);
+        Collection<AssignmentSegment> assignments = 
createLiteralExpressionSegment(literalObject);
         List<Object> parameters = Collections.emptyList();
         OnDuplicateUpdateContext onDuplicateUpdateContext = new 
OnDuplicateUpdateContext(assignments, parameters, 0);
         ColumnSegment column = onDuplicateUpdateContext.getColumn(0);
@@ -138,14 +124,11 @@ public final class OnDuplicateUpdateContextTest {
     @Test
     public void assertParameterCount() {
         List<AssignmentSegment> assignments = Arrays.asList(
-                makeAssignmentSegment(makeBinaryOperationExpression()),
-                makeAssignmentSegment(new ParameterMarkerExpressionSegment(0, 
10, 5)),
-                makeAssignmentSegment(new LiteralExpressionSegment(0, 10, new 
Object()))
+                createAssignmentSegment(createBinaryOperationExpression()),
+                createAssignmentSegment(new 
ParameterMarkerExpressionSegment(0, 10, 5)),
+                createAssignmentSegment(new LiteralExpressionSegment(0, 10, 
new Object()))
         );
-        int doestNotMatterParametersOffset = 0;
-        String doesNotMatterParameterValue = "";
-        List<Object> parameters = Arrays.asList(doesNotMatterParameterValue, 
doesNotMatterParameterValue);
-        OnDuplicateUpdateContext onDuplicateUpdateContext = new 
OnDuplicateUpdateContext(assignments, parameters, 
doestNotMatterParametersOffset);
+        OnDuplicateUpdateContext onDuplicateUpdateContext = new 
OnDuplicateUpdateContext(assignments, Arrays.asList("1", "2"), 0);
         assertThat(onDuplicateUpdateContext.getParameterCount(), is(2));
     }
 
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
deleted file mode 100644
index ce65d1a..0000000
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/statement/InsertContextExpressSegmentUtil.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.statement;
-
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Insert context expression segment util.
- */
-public final class InsertContextExpressSegmentUtil {
-    /**
-     * Extract all ParameterMarkerExpressionSegment from ExpressionSegment 
list.
-     *
-     * @param expressions ExpressionSegment list
-     * @return ParameterMarkerExpressionSegment list
-     */
-    public static List<ParameterMarkerExpressionSegment> 
extractParameterMarkerExpressionSegment(final Collection<ExpressionSegment> 
expressions) {
-        List<ParameterMarkerExpressionSegment> result = new ArrayList<>();
-        for (ExpressionSegment each : expressions) {
-            if (each instanceof ParameterMarkerExpressionSegment) {
-                result.add((ParameterMarkerExpressionSegment) each);
-            } else if (each instanceof BinaryOperationExpression) {
-                if (((BinaryOperationExpression) each).getLeft() instanceof 
ParameterMarkerExpressionSegment) {
-                    result.add((ParameterMarkerExpressionSegment) 
((BinaryOperationExpression) each).getLeft());
-                }
-                if (((BinaryOperationExpression) each).getRight() instanceof 
ParameterMarkerExpressionSegment) {
-                    result.add((ParameterMarkerExpressionSegment) 
((BinaryOperationExpression) each).getRight());
-                }
-            }
-        }
-        return result;
-    }
-}
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
index 4ae2bba..2cd3fbd 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/simple/ParameterMarkerExpressionSegment.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple;
 
+import lombok.EqualsAndHashCode;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
@@ -28,6 +29,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.Projecti
 @RequiredArgsConstructor
 @Getter
 @ToString
+@EqualsAndHashCode
 public class ParameterMarkerExpressionSegment implements 
SimpleExpressionSegment, ProjectionSegment {
     
     private final int startIndex;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
index e082a4c..f019473 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/util/ExpressionExtractUtil.java
@@ -22,11 +22,14 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.constant.LogicalOperator;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.predicate.AndPredicate;
 
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedList;
 import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -78,4 +81,25 @@ public final class ExpressionExtractUtil {
         result.getPredicates().add(expression);
         return result;
     }
+    
+    /**
+     * Get parameter marker expression collection.
+     * 
+     * @param expressions expression collection
+     * @return parameter marker expression collection
+     */
+    public static List<ParameterMarkerExpressionSegment> 
getParameterMarkerExpressions(final Collection<ExpressionSegment> expressions) {
+        List<ParameterMarkerExpressionSegment> result = new ArrayList<>();
+        for (ExpressionSegment each : expressions) {
+            if (each instanceof ParameterMarkerExpressionSegment) {
+                result.add((ParameterMarkerExpressionSegment) each);
+            }
+            // TODO support more expression type if necessary 
+            if (each instanceof BinaryOperationExpression) {
+                
result.addAll(getParameterMarkerExpressions(Collections.singletonList(((BinaryOperationExpression)
 each).getLeft())));
+                
result.addAll(getParameterMarkerExpressions(Collections.singletonList(((BinaryOperationExpression)
 each).getRight())));
+            }
+        }
+        return result;
+    }
 }

Reply via email to