You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by tu...@apache.org on 2022/08/18 03:01:36 UTC

[shardingsphere] branch master updated: Optimize PostgreSQL and openGuass function parameters parse and convert to SqlNode (#20242)

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

tuichenchuxin 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 0cd2ab9daba Optimize PostgreSQL and openGuass function parameters parse and convert to SqlNode (#20242)
0cd2ab9daba is described below

commit 0cd2ab9dabad55676797f1360735a5ca143966c0
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Thu Aug 18 11:01:25 2022 +0800

    Optimize PostgreSQL and openGuass function parameters parse and convert to SqlNode (#20242)
    
    * Optimize PostgreSQL and openGuass function parameters parse and convert to SqlNode
    
    * Update sql parse test case
    
    * fix checkstyle
---
 .../segment/expression/impl/FunctionConverter.java | 13 ++++--
 .../impl/AggregationProjectionConverter.java       | 40 +++++++++---------
 .../impl/OpenGaussStatementSQLVisitor.java         | 21 ++++++----
 .../impl/PostgreSQLStatementSQLVisitor.java        | 21 ++++++----
 .../SQLNodeConvertEngineParameterizedTest.java     |  3 ++
 .../src/main/resources/case/dml/select.xml         | 48 ++--------------------
 .../src/main/resources/case/dml/update.xml         | 17 +-------
 7 files changed, 62 insertions(+), 101 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/expression/impl/FunctionConverter.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/expression/impl/FunctionConverter.java
index 386779de22b..11839297f6d 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/expression/impl/FunctionConverter.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/expression/impl/FunctionConverter.java
@@ -44,10 +44,10 @@ import java.util.Optional;
 /**
  * Function converter.
  */
-public final class FunctionConverter implements SQLSegmentConverter<FunctionSegment, SqlBasicCall> {
+public final class FunctionConverter implements SQLSegmentConverter<FunctionSegment, SqlNode> {
     
     @Override
-    public Optional<SqlBasicCall> convert(final FunctionSegment segment) {
+    public Optional<SqlNode> convert(final FunctionSegment segment) {
         if ("POSITION".equalsIgnoreCase(segment.getFunctionName())) {
             return Optional.of(new SqlBasicCall(new SqlPositionFunction(), getSqlNodes(segment.getParameters()), SqlParserPos.ZERO));
         }
@@ -55,9 +55,16 @@ public final class FunctionConverter implements SQLSegmentConverter<FunctionSegm
             return Optional.of(new SqlBasicCall(new SqlCastFunction(), getSqlNodes(segment.getParameters()), SqlParserPos.ZERO));
         }
         if ("CONCAT".equalsIgnoreCase(segment.getFunctionName())) {
-            return Optional.of(new SqlBasicCall(new SqlUnresolvedFunction(new SqlIdentifier("CONCAT", SqlParserPos.ZERO),
+            return Optional.of(new SqlBasicCall(new SqlUnresolvedFunction(new SqlIdentifier(segment.getFunctionName(), SqlParserPos.ZERO),
                     null, null, null, null, SqlFunctionCategory.USER_DEFINED_FUNCTION), getSqlNodes(segment.getParameters()), SqlParserPos.ZERO));
         }
+        if ("DATABASE".equalsIgnoreCase(segment.getFunctionName())) {
+            return Optional.of(new SqlBasicCall(new SqlUnresolvedFunction(new SqlIdentifier(segment.getFunctionName(), SqlParserPos.ZERO),
+                    null, null, null, null, SqlFunctionCategory.USER_DEFINED_FUNCTION), getSqlNodes(segment.getParameters()), SqlParserPos.ZERO));
+        }
+        if ("CURRENT_USER".equalsIgnoreCase(segment.getFunctionName())) {
+            return Optional.of(new SqlIdentifier(segment.getFunctionName(), SqlParserPos.ZERO));
+        }
         return Optional.empty();
     }
     
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
index ee5628f83e8..cdb4059979b 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/segment/projection/impl/AggregationProjectionConverter.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.infra.federation.optimizer.converter.segment.projection.impl;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.SqlBasicCall;
 import org.apache.calcite.sql.SqlIdentifier;
@@ -28,12 +27,15 @@ import org.apache.calcite.sql.SqlSelectKeyword;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.shardingsphere.infra.federation.optimizer.converter.segment.SQLSegmentConverter;
+import org.apache.shardingsphere.infra.federation.optimizer.converter.segment.expression.ExpressionConverter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationDistinctProjectionSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.AggregationProjectionSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtil;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -64,20 +66,15 @@ public final class AggregationProjectionConverter implements SQLSegmentConverter
         if (null == segment) {
             return Optional.empty();
         }
-        SqlLiteral functionQuantifier = null;
-        List<String> parameters = Splitter.on(",").trimResults().splitToList(
-                SQLUtil.getExactlyValue(SQLUtil.getExpressionWithoutOutsideParentheses(segment.getInnerExpression())));
-        if (segment instanceof AggregationDistinctProjectionSegment) {
-            parameters = Collections.singletonList(((AggregationDistinctProjectionSegment) segment).getDistinctExpression());
-            functionQuantifier = SqlLiteral.createSymbol(SqlSelectKeyword.DISTINCT, SqlParserPos.ZERO);
-        }
+        SqlLiteral functionQuantifier = segment instanceof AggregationDistinctProjectionSegment ? SqlLiteral.createSymbol(SqlSelectKeyword.DISTINCT, SqlParserPos.ZERO) : null;
+        SqlAggFunction operator = convertOperator(segment.getType().name());
+        List<SqlNode> parameters = convertParameters(segment.getParameters(), segment.getInnerExpression());
+        SqlBasicCall sqlBasicCall = new SqlBasicCall(operator, parameters, SqlParserPos.ZERO, functionQuantifier);
         if (segment.getAlias().isPresent()) {
-            return Optional.of(new SqlBasicCall(SqlStdOperatorTable.AS, Arrays.asList(new SqlBasicCall(convertOperator(segment.getType().name()),
-                    Collections.singletonList(createParametersSqlNode(parameters)), SqlParserPos.ZERO, functionQuantifier).withExpanded(false),
+            return Optional.of(new SqlBasicCall(SqlStdOperatorTable.AS, Arrays.asList(sqlBasicCall,
                     SqlIdentifier.star(Collections.singletonList(segment.getAlias().get()), SqlParserPos.ZERO, Collections.singletonList(SqlParserPos.ZERO))), SqlParserPos.ZERO));
         }
-        return Optional.of((SqlBasicCall) new SqlBasicCall(convertOperator(segment.getType().name()),
-                Collections.singletonList(createParametersSqlNode(parameters)), SqlParserPos.ZERO, functionQuantifier).withExpanded(false));
+        return Optional.of(sqlBasicCall);
     }
     
     private SqlAggFunction convertOperator(final String operator) {
@@ -85,14 +82,15 @@ public final class AggregationProjectionConverter implements SQLSegmentConverter
         return REGISTRY.get(operator);
     }
     
-    private SqlNode createParametersSqlNode(final List<String> parameters) {
-        if (1 == parameters.size()) {
-            try {
-                Long.parseLong(parameters.get(0));
-                return SqlLiteral.createExactNumeric(parameters.get(0), SqlParserPos.ZERO);
-            } catch (NumberFormatException ignored) {
-            }
+    private List<SqlNode> convertParameters(final Collection<ExpressionSegment> parameters, final String innerExpression) {
+        if (innerExpression.contains("*")) {
+            return Collections.singletonList(SqlIdentifier.star(SqlParserPos.ZERO));
+        }
+        List<SqlNode> result = new LinkedList<>();
+        ExpressionConverter expressionConverter = new ExpressionConverter();
+        for (ExpressionSegment each : parameters) {
+            expressionConverter.convert(each).ifPresent(result::add);
         }
-        return SqlIdentifier.star(parameters, SqlParserPos.ZERO, Collections.singletonList(SqlParserPos.ZERO));
+        return result;
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
index 3015528f905..5a3e2665503 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/impl/OpenGaussStatementSQLVisitor.java
@@ -396,11 +396,11 @@ public abstract class OpenGaussStatementSQLVisitor extends OpenGaussStatementBas
         if (null != ctx.functionExprCommonSubexpr()) {
             return visit(ctx.functionExprCommonSubexpr());
         }
-        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, CExprContext.class));
+        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, AExprContext.class));
         // TODO replace aggregation segment
         String aggregationType = ctx.funcApplication().funcName().getText();
         if (AggregationType.isAggregationType(aggregationType)) {
-            return createAggregationSegment(ctx.funcApplication(), aggregationType);
+            return createAggregationSegment(ctx.funcApplication(), aggregationType, expressionSegments);
         }
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.funcApplication().funcName().getText(), getOriginalText(ctx));
         result.getParameters().addAll(expressionSegments);
@@ -410,7 +410,7 @@ public abstract class OpenGaussStatementSQLVisitor extends OpenGaussStatementBas
     @Override
     public ASTNode visitFunctionExprCommonSubexpr(final FunctionExprCommonSubexprContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getChild(0).getText(), getOriginalText(ctx));
-        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, CExprContext.class));
+        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, AExprContext.class));
         result.getParameters().addAll(expressionSegments);
         return result;
     }
@@ -428,9 +428,9 @@ public abstract class OpenGaussStatementSQLVisitor extends OpenGaussStatementBas
         return result;
     }
     
-    private Collection<ExpressionSegment> getExpressionSegments(final Collection<CExprContext> cexprContexts) {
+    private Collection<ExpressionSegment> getExpressionSegments(final Collection<AExprContext> aExprContexts) {
         Collection<ExpressionSegment> result = new LinkedList<>();
-        for (CExprContext each : cexprContexts) {
+        for (AExprContext each : aExprContexts) {
             result.add((ExpressionSegment) visit(each));
         }
         return result;
@@ -528,13 +528,18 @@ public abstract class OpenGaussStatementSQLVisitor extends OpenGaussStatementBas
         return new LiteralExpressionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), ctx.getText());
     }
     
-    private ProjectionSegment createAggregationSegment(final FuncApplicationContext ctx, final String aggregationType) {
+    private ProjectionSegment createAggregationSegment(final FuncApplicationContext ctx, final String aggregationType, final Collection<ExpressionSegment> expressionSegments) {
         AggregationType type = AggregationType.valueOf(aggregationType.toUpperCase());
         String innerExpression = ctx.start.getInputStream().getText(new Interval(ctx.LP_().getSymbol().getStartIndex(), ctx.stop.getStopIndex()));
         if (null == ctx.DISTINCT()) {
-            return new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression);
+            AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression);
+            result.getParameters().addAll(expressionSegments);
+            return result;
         }
-        return new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression, getDistinctExpression(ctx));
+        AggregationDistinctProjectionSegment result =
+                new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression, getDistinctExpression(ctx));
+        result.getParameters().addAll(expressionSegments);
+        return result;
     }
     
     private String getDistinctExpression(final FuncApplicationContext ctx) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
index a60694050ec..623f1b9cc6e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLStatementSQLVisitor.java
@@ -394,11 +394,11 @@ public abstract class PostgreSQLStatementSQLVisitor extends PostgreSQLStatementP
         if (null != ctx.functionExprCommonSubexpr()) {
             return visit(ctx.functionExprCommonSubexpr());
         }
-        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, CExprContext.class));
+        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, AExprContext.class));
         // TODO replace aggregation segment
         String aggregationType = ctx.funcApplication().funcName().getText();
         if (AggregationType.isAggregationType(aggregationType)) {
-            return createAggregationSegment(ctx.funcApplication(), aggregationType);
+            return createAggregationSegment(ctx.funcApplication(), aggregationType, expressionSegments);
         }
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.funcApplication().funcName().getText(), getOriginalText(ctx));
         result.getParameters().addAll(expressionSegments);
@@ -408,7 +408,7 @@ public abstract class PostgreSQLStatementSQLVisitor extends PostgreSQLStatementP
     @Override
     public ASTNode visitFunctionExprCommonSubexpr(final FunctionExprCommonSubexprContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getChild(0).getText(), getOriginalText(ctx));
-        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, CExprContext.class));
+        Collection<ExpressionSegment> expressionSegments = getExpressionSegments(getTargetRuleContextFromParseTree(ctx, AExprContext.class));
         result.getParameters().addAll(expressionSegments);
         return result;
     }
@@ -426,9 +426,9 @@ public abstract class PostgreSQLStatementSQLVisitor extends PostgreSQLStatementP
         return result;
     }
     
-    private Collection<ExpressionSegment> getExpressionSegments(final Collection<CExprContext> cexprContexts) {
+    private Collection<ExpressionSegment> getExpressionSegments(final Collection<AExprContext> aExprContexts) {
         Collection<ExpressionSegment> result = new LinkedList<>();
-        for (CExprContext each : cexprContexts) {
+        for (AExprContext each : aExprContexts) {
             result.add((ExpressionSegment) visit(each));
         }
         return result;
@@ -526,13 +526,18 @@ public abstract class PostgreSQLStatementSQLVisitor extends PostgreSQLStatementP
         return new LiteralExpressionSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), ctx.getText());
     }
     
-    private ProjectionSegment createAggregationSegment(final FuncApplicationContext ctx, final String aggregationType) {
+    private ProjectionSegment createAggregationSegment(final FuncApplicationContext ctx, final String aggregationType, final Collection<ExpressionSegment> expressionSegments) {
         AggregationType type = AggregationType.valueOf(aggregationType.toUpperCase());
         String innerExpression = ctx.start.getInputStream().getText(new Interval(ctx.LP_().getSymbol().getStartIndex(), ctx.stop.getStopIndex()));
         if (null == ctx.DISTINCT()) {
-            return new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression);
+            AggregationProjectionSegment result = new AggregationProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression);
+            result.getParameters().addAll(expressionSegments);
+            return result;
         }
-        return new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression, getDistinctExpression(ctx));
+        AggregationDistinctProjectionSegment result =
+                new AggregationDistinctProjectionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), type, innerExpression, getDistinctExpression(ctx));
+        result.getParameters().addAll(expressionSegments);
+        return result;
     }
     
     private String getDistinctExpression(final FuncApplicationContext ctx) {
diff --git a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
index 439973390a1..fd26d31174a 100644
--- a/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
+++ b/shardingsphere-test/shardingsphere-optimize-test/src/test/java/org/apache/shardingsphere/infra/federation/converter/parameterized/engine/SQLNodeConvertEngineParameterizedTest.java
@@ -101,6 +101,9 @@ public final class SQLNodeConvertEngineParameterizedTest {
         SUPPORTED_SQL_CASE_IDS.add("select_count_with_escape_character");
         SUPPORTED_SQL_CASE_IDS.add("select_group_by_with_order_by_and_limit");
         SUPPORTED_SQL_CASE_IDS.add("select_count_with_sub");
+        SUPPORTED_SQL_CASE_IDS.add("select_current_user");
+        SUPPORTED_SQL_CASE_IDS.add("select_database");
+        SUPPORTED_SQL_CASE_IDS.add("select_distinct_with_count_calculation");
     }
     
     private final String sqlCaseId;
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
index 6cd3bdec70b..cec26715a7b 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
@@ -1975,21 +1975,7 @@
                                             <right>
                                                 <function function-name="ST_GeographyFromText" text="ST_GeographyFromText('SRID=4326;POINT('||?||' '||?||')')" literal-text="ST_GeographyFromText('SRID=4326;POINT('||100||' '||200||')')" start-index="60" stop-index="115" literal-start-index="78" literal-stop-index="137">
                                                     <parameter>
-                                                        <literal-expression value="SRID=4326;POINT(" literal-start-index="99" start-index="81" literal-stop-index="116" stop-index="98"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value="100" literal-start-index="119" literal-stop-index="121"/>
-                                                        <parameter-marker-expression parameter-index="1" start-index="101" stop-index="101"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value=" " literal-start-index="124" literal-stop-index="126" start-index="104" stop-index="106"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value="200" literal-start-index="129" literal-stop-index="131"/>
-                                                        <parameter-marker-expression parameter-index="2" start-index="109" stop-index="109"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value=")" literal-start-index="134" literal-stop-index="136" start-index="112" stop-index="114"/>
+                                                        <common-expression text="'SRID=4326;POINT('||?||' '||?||')'" literal-text="'SRID=4326;POINT('||100||' '||200||')'" literal-start-index="99" start-index="81" literal-stop-index="136" stop-index="114"/>
                                                     </parameter>
                                                 </function>
                                             </right>
@@ -2074,21 +2060,7 @@
                                             <right>
                                                 <function function-name="ST_GeographyFromText" text="ST_GeographyFromText('SRID=4326;POINT('||?||' '||?||')')" literal-text="ST_GeographyFromText('SRID=4326;POINT('||100||' '||200||')')" start-index="73" stop-index="128" literal-start-index="109" literal-stop-index="168">
                                                     <parameter>
-                                                        <literal-expression value="SRID=4326;POINT(" literal-start-index="130" start-index="94" literal-stop-index="147" stop-index="111"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value="100" literal-start-index="150" literal-stop-index="152"/>
-                                                        <parameter-marker-expression parameter-index="2" start-index="114" stop-index="114"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value=" " literal-start-index="155" literal-stop-index="157" start-index="117" stop-index="119"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value="200" literal-start-index="160" literal-stop-index="162"/>
-                                                        <parameter-marker-expression parameter-index="3" start-index="122" stop-index="122"/>
-                                                    </parameter>
-                                                    <parameter>
-                                                        <literal-expression value=")" literal-start-index="165" literal-stop-index="167" start-index="125" stop-index="127"/>
+                                                        <common-expression text="'SRID=4326;POINT('||?||' '||?||')'" literal-text="'SRID=4326;POINT('||100||' '||200||')'" literal-start-index="130" start-index="94" literal-stop-index="167" stop-index="127"/>
                                                     </parameter>
                                                 </function>
                                             </right>
@@ -2175,21 +2147,7 @@
                                     <right>
                                         <function function-name="ST_GeographyFromText" literal-text="ST_GeographyFromText('SRID=4326;POINT('||100||' '||200||')')" text="ST_GeographyFromText('SRID=4326;POINT('||?||' '||?||')')" start-index="79" stop-index="134" literal-start-index="115" literal-stop-index="174">
                                             <parameter>
-                                                <literal-expression value="SRID=4326;POINT(" literal-start-index="136" start-index="100" literal-stop-index="153" stop-index="117"/>
-                                            </parameter>
-                                            <parameter>
-                                                <literal-expression value="100" literal-start-index="156" literal-stop-index="158"/>
-                                                <parameter-marker-expression parameter-index="2" start-index="120" stop-index="120"/>
-                                            </parameter>
-                                            <parameter>
-                                                <literal-expression value=" " literal-start-index="161" literal-stop-index="163" start-index="123" stop-index="125"/>
-                                            </parameter>
-                                            <parameter>
-                                                <literal-expression value="200" literal-start-index="166" literal-stop-index="168"/>
-                                                <parameter-marker-expression parameter-index="3" start-index="128" stop-index="128"/>
-                                            </parameter>
-                                            <parameter>
-                                                <literal-expression value=")" literal-start-index="171" literal-stop-index="173" start-index="131" stop-index="133"/>
+                                                <common-expression text="'SRID=4326;POINT('||?||' '||?||')'" literal-text="'SRID=4326;POINT('||100||' '||200||')'" literal-start-index="136" start-index="100" literal-stop-index="173" stop-index="133"/>
                                             </parameter>
                                         </function>
                                     </right>
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/update.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/update.xml
index bb865bee585..a3ce4f0d7f8 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/update.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/update.xml
@@ -188,24 +188,9 @@
                 <assignment-value>
                     <function function-name="ST_GeographyFromText" text="ST_GeographyFromText('SRID=4326;POINT('||?||' '||?||')')" literal-text="ST_GeographyFromText('SRID=4326;POINT('||100||' '||200||')')" start-index="61" stop-index="116" literal-start-index="72" literal-stop-index="131">
                         <parameter>
-                            <literal-expression value="SRID=4326;POINT(" literal-start-index="93" start-index="82" literal-stop-index="110" stop-index="99"/>
-                        </parameter>
-                        <parameter>
-                            <literal-expression value="100" literal-start-index="113" literal-stop-index="115"/>
-                            <parameter-marker-expression parameter-index="1" start-index="102" stop-index="102"/>
-                        </parameter>
-                        <parameter>
-                            <literal-expression value=" " literal-start-index="118" literal-stop-index="120" start-index="105" stop-index="107"/>
-                        </parameter>
-                        <parameter>
-                            <literal-expression value="200" literal-start-index="123" literal-stop-index="125"/>
-                            <parameter-marker-expression parameter-index="2" start-index="110" stop-index="110"/>
-                        </parameter>
-                        <parameter>
-                            <literal-expression value=")" literal-start-index="128" literal-stop-index="130" start-index="113" stop-index="115"/>
+                            <common-expression text="'SRID=4326;POINT('||?||' '||?||')'" literal-text="'SRID=4326;POINT('||100||' '||200||')'" literal-start-index="93" start-index="82" literal-stop-index="130" stop-index="115"/>
                         </parameter>
                     </function>
-                    <common-expression text="ST_GeographyFromText('SRID=4326;POINT('||?||' '||?||')')" literal-text="ST_GeographyFromText('SRID=4326;POINT('||100||' '||200||')')" start-index="61" stop-index="116" literal-start-index="72" literal-stop-index="131"/>
                 </assignment-value>
             </assignment>
             <assignment start-index="119" stop-index="133" literal-start-index="134" literal-stop-index="166">