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">