This is an automated email from the ASF dual-hosted git repository.
chengzhang 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 9c48df5b925 Fix wrong parameter count parse when function contains
placeholder (#38019)
9c48df5b925 is described below
commit 9c48df5b92508d19d1d7f30c4bf167df09ec831a
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Thu Feb 12 16:27:54 2026 +0800
Fix wrong parameter count parse when function contains placeholder (#38019)
---
RELEASE-NOTES.md | 1 +
.../statement/ClickHouseStatementVisitor.java | 18 +-
.../visitor/statement/DorisStatementVisitor.java | 38 ++--
.../statement/FirebirdStatementVisitor.java | 15 +-
.../statement/type/HiveDMLStatementVisitor.java | 23 +--
.../visitor/statement/MySQLStatementVisitor.java | 12 --
.../visitor/statement/OracleStatementVisitor.java | 8 -
.../statement/type/PrestoDMLStatementVisitor.java | 23 +--
.../visitor/statement/SQL92StatementVisitor.java | 18 +-
.../statement/SQLServerStatementVisitor.java | 8 -
.../src/main/resources/case/dml/clickhouse.xml | 23 ++-
.../parser/src/main/resources/case/dml/presto.xml | 49 ++++-
.../src/main/resources/case/dml/select-hive.xml | 49 ++++-
.../resources/case/dml/select-special-function.xml | 224 ++++++++++++++++++++-
.../parser/src/main/resources/case/dml/select.xml | 18 +-
.../main/resources/sql/supported/dml/presto.xml | 2 +
.../resources/sql/supported/dml/select-hive.xml | 2 +
.../sql/supported/dml/select-special-function.xml | 12 ++
18 files changed, 420 insertions(+), 123 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index c223ded15f6..7029301d88c 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -99,6 +99,7 @@
1. SQL Parser: Fix SQL parser error when SQL contains implicit concat
expression for MySQL -
[#34660](https://github.com/apache/shardingsphere/pull/34660)
1. SQL Parser: Fix SQL parser error when SQL contains subquery with alias for
Oracle - [#35239](https://github.com/apache/shardingsphere/pull/35239)
1. SQL Parser: Fix multiple SQLs split error when comma contained -
[#31609](https://github.com/apache/shardingsphere/pull/31609)
+1. SQL Parser: Fix wrong parameter count parse when function contains
placeholder [#38019](https://github.com/apache/shardingsphere/pull/38019)
1. SQL Binder: Fix unable to find the outer table in the NotExpressionBinder -
[36135](https://github.com/apache/shardingsphere/pull/36135)
1. SQL Binder: Fix unable to find the outer table in the
ExistsSubqueryExpressionBinder -
[#36068](https://github.com/apache/shardingsphere/pull/36068)
1. SQL Binder: Fix column bind exception caused by oracle XMLELEMENT function
first parameter without quote -
[#36963](https://github.com/apache/shardingsphere/pull/36963)
diff --git
a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
index 76e7bbdeb9c..5689336f136 100644
---
a/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
+++
b/parser/sql/engine/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/engine/clickhouse/visitor/statement/ClickHouseStatementVisitor.java
@@ -37,6 +37,8 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Bina
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
@@ -367,6 +369,9 @@ public abstract class ClickHouseStatementVisitor extends
ClickHouseStatementBase
if (null != ctx.literals()) {
return SQLUtils.createLiteralExpression(visit(ctx.literals()),
startIndex, stopIndex, ctx.literals().start.getInputStream().getText(new
Interval(startIndex, stopIndex)));
}
+ if (null != ctx.intervalExpression()) {
+ return visit(ctx.intervalExpression());
+ }
if (null != ctx.functionCall()) {
return visit(ctx.functionCall());
}
@@ -378,8 +383,9 @@ public abstract class ClickHouseStatementVisitor extends
ClickHouseStatementBase
@Override
public final ASTNode visitIntervalExpression(final
ClickHouseStatementParser.IntervalExpressionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ IntervalUnit intervalUnit =
IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase());
+ return new
IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(),
ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()),
intervalUnit,
+ getOriginalText(ctx));
}
@Override
@@ -434,7 +440,6 @@ public abstract class ClickHouseStatementVisitor extends
ClickHouseStatementBase
@Override
public final ASTNode visitCastFunction(final
ClickHouseStatementParser.CastFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CAST().getText(), getOriginalText(ctx));
ASTNode exprSegment = visit(ctx.expr());
if (exprSegment instanceof ColumnSegment) {
@@ -458,13 +463,6 @@ public abstract class ClickHouseStatementVisitor extends
ClickHouseStatementBase
return new KeywordValue(IntStream.range(0,
ctx.getChildCount()).mapToObj(i ->
ctx.getChild(i).getText()).collect(Collectors.joining(" ")));
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final
Collection<ClickHouseStatementParser.ExprContext> exprContexts) {
- for (ClickHouseStatementParser.ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitOrderByClause(final
ClickHouseStatementParser.OrderByClauseContext ctx) {
return new OrderBySegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.orderByItem().stream().map(each ->
(OrderByItemSegment) visit(each)).collect(Collectors.toList()));
diff --git
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
index b2bf8dc4cfd..bf377a154ab 100644
---
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
+++
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/DorisStatementVisitor.java
@@ -98,11 +98,8 @@ import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.NumberL
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OnDuplicateKeyClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OrderByClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OrderByItemContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OwnerContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OutfilePropertyContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectFieldsIntoContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectIntoExpressionContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectLinesIntoContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OwnerContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ParameterMarkerContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.PositionFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.PrecisionContext;
@@ -121,6 +118,9 @@ import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.Replace
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ReplaceValuesClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.RowConstructorListContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectFieldsIntoContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectIntoExpressionContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectLinesIntoContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectSpecificationContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SelectWithIntoContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SetAssignmentsClauseContext;
@@ -151,17 +151,13 @@ import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.UpdateC
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.UserVariableContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ValuesFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.VariableContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewColumnDefinitionContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewColumnDefinitionsContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewNameContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewNamesContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WeightStringFunctionContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WhereClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WithClauseContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewColumnDefinitionContext;
-import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ViewColumnDefinitionsContext;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.view.ViewColumnSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileColumnsSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileLinesSegment;
-import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.AggregationType;
import org.apache.shardingsphere.sql.parser.statement.core.enums.CombineType;
import org.apache.shardingsphere.sql.parser.statement.core.enums.JoinType;
@@ -173,6 +169,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constrain
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.engine.EngineSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexNameSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.view.ViewColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.ColumnAssignmentSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.InsertValuesSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.assignment.SetAssignmentSegment;
@@ -214,6 +211,9 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.ite
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ExpressionOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.IndexOrderByItemSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.OrderByItemSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileColumnsSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileLinesSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.outfile.OutfileSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.PaginationValueSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.LimitSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.pagination.limit.NumberLiteralLimitValueSegment;
@@ -257,11 +257,11 @@ import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
-import java.util.stream.Collectors;
import java.util.Map;
-import java.util.LinkedHashMap;
+import java.util.stream.Collectors;
/**
* Statement visitor for Doris.
@@ -1161,7 +1161,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitGroupConcatFunction(final
GroupConcatFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.GROUP_CONCAT().getText(), getOriginalText(ctx));
for (ExprContext each : getTargetRuleContextFromParseTree(ctx,
ExprContext.class)) {
result.getParameters().add((ExpressionSegment) visit(each));
@@ -1263,7 +1262,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitPositionFunction(final PositionFunctionContext
ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.POSITION().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
@@ -1283,7 +1281,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitExtractFunction(final ExtractFunctionContext
ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.EXTRACT().getText(), getOriginalText(ctx));
result.getParameters().add(new
LiteralExpressionSegment(ctx.intervalUnit().getStart().getStartIndex(),
ctx.intervalUnit().getStop().getStopIndex(), ctx.intervalUnit().getText()));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
@@ -1292,7 +1289,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitCharFunction(final CharFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CHAR().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -1324,7 +1320,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
@Override
public final ASTNode visitWeightStringFunction(final
WeightStringFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.WEIGHT_STRING().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
return result;
@@ -1464,13 +1459,6 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
return result;
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment result = new DataTypeSegment();
@@ -1978,12 +1966,10 @@ public abstract class DorisStatementVisitor extends
DorisStatementBaseVisitor<AS
}
return result;
}
- // DORIS ADDED BEGIN
if (null != ctx.regularFunction()) {
FunctionSegment functionSegment = (FunctionSegment)
visit(ctx.regularFunction());
return new FunctionTableSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex(), functionSegment);
}
- // DORIS ADDED END
return result;
}
diff --git
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
index 724be9bdbeb..d451dbbcc5b 100644
---
a/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
+++
b/parser/sql/engine/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/engine/firebird/visitor/statement/FirebirdStatementVisitor.java
@@ -78,6 +78,8 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Exis
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
@@ -430,8 +432,9 @@ public abstract class FirebirdStatementVisitor extends
FirebirdStatementBaseVisi
@Override
public final ASTNode visitIntervalExpression(final
IntervalExpressionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ IntervalUnit intervalUnit =
IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase());
+ return new
IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(),
ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()),
intervalUnit,
+ getOriginalText(ctx));
}
@Override
@@ -501,7 +504,6 @@ public abstract class FirebirdStatementVisitor extends
FirebirdStatementBaseVisi
@Override
public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CAST().getText(), getOriginalText(ctx));
ASTNode exprSegment = visit(ctx.expr());
if (exprSegment instanceof ColumnSegment) {
@@ -563,13 +565,6 @@ public abstract class FirebirdStatementVisitor extends
FirebirdStatementBaseVisi
return new KeywordValue(String.join(" ", dataTypeNames));
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitOrderByClause(final OrderByClauseContext ctx) {
Collection<OrderByItemSegment> items = new LinkedList<>();
diff --git
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
index 2f610623ca1..1cb5ac65484 100644
---
a/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/hive/src/main/java/org/apache/shardingsphere/sql/parser/engine/hive/visitor/statement/type/HiveDMLStatementVisitor.java
@@ -574,7 +574,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitGroupConcatFunction(final GroupConcatFunctionContext
ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.GROUP_CONCAT().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
result.getParameters().add((ExpressionSegment) visit(each));
@@ -590,7 +589,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitCastFunction(final CastFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CAST().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -635,13 +633,18 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitConvertFunction(final ConvertFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
- return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CONVERT().getText(), getOriginalText(ctx));
+ FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CONVERT().getText(), getOriginalText(ctx));
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
+ if (null != ctx.castType()) {
+ result.getParameters().add((DataTypeSegment)
visit(ctx.castType()));
+ } else if (null != ctx.charsetName()) {
+ result.getParameters().add((ExpressionSegment)
visit(ctx.charsetName()));
+ }
+ return result;
}
@Override
public ASTNode visitPositionFunction(final PositionFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.POSITION().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
@@ -661,7 +664,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitExtractFunction(final ExtractFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.EXTRACT().getText(), getOriginalText(ctx));
result.getParameters().add(new
LiteralExpressionSegment(ctx.identifier().getStart().getStartIndex(),
ctx.identifier().getStop().getStopIndex(), ctx.identifier().getText()));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
@@ -670,7 +672,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitCharFunction(final CharFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CHAR().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -702,7 +703,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
@Override
public ASTNode visitWeightStringFunction(final WeightStringFunctionContext
ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.WEIGHT_STRING().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
return result;
@@ -791,13 +791,6 @@ public final class HiveDMLStatementVisitor extends
HiveStatementVisitor implemen
return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment result = new DataTypeSegment();
diff --git
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
index 4ce39ab25a3..b4fff545c77 100644
---
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
+++
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -1100,7 +1100,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
@Override
public final ASTNode visitGroupConcatFunction(final
GroupConcatFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.GROUP_CONCAT().getText(), getOriginalText(ctx));
for (ExprContext each : getTargetRuleContextFromParseTree(ctx,
ExprContext.class)) {
result.getParameters().add((ExpressionSegment) visit(each));
@@ -1188,7 +1187,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
@Override
public final ASTNode visitPositionFunction(final PositionFunctionContext
ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.POSITION().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
@@ -1212,7 +1210,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
@Override
public final ASTNode visitExtractFunction(final ExtractFunctionContext
ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.EXTRACT().getText(), getOriginalText(ctx));
result.getParameters().add(new
IntervalUnitExpression(ctx.intervalUnit().getStart().getStartIndex(),
ctx.intervalUnit().getStop().getStopIndex(),
IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase())));
@@ -1222,7 +1219,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
@Override
public final ASTNode visitCharFunction(final CharFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CHAR().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -1254,7 +1250,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
@Override
public final ASTNode visitWeightStringFunction(final
WeightStringFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.WEIGHT_STRING().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
return result;
@@ -1411,13 +1406,6 @@ public abstract class MySQLStatementVisitor extends
MySQLStatementBaseVisitor<AS
return result;
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitDataType(final DataTypeContext ctx) {
DataTypeSegment result = new DataTypeSegment();
diff --git
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
index cbf3b099279..2bd9d4a6b8b 100644
---
a/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
+++
b/parser/sql/engine/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/engine/oracle/visitor/statement/OracleStatementVisitor.java
@@ -1237,7 +1237,6 @@ public abstract class OracleStatementVisitor extends
OracleStatementBaseVisitor<
@Override
public final ASTNode visitCharFunction(final CharFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result;
if (null != ctx.CHR()) {
result = new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CHR().getText(), getOriginalText(ctx));
@@ -1302,13 +1301,6 @@ public abstract class OracleStatementVisitor extends
OracleStatementBaseVisitor<
return new KeywordValue(String.join(" ", dataTypeNames));
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitOrderByClause(final OrderByClauseContext ctx) {
Collection<OrderByItemSegment> items = new LinkedList<>();
diff --git
a/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDMLStatementVisitor.java
b/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDMLStatementVisitor.java
index 19389429b54..50dfb9393e0 100644
---
a/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDMLStatementVisitor.java
+++
b/parser/sql/engine/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/engine/presto/visitor/statement/type/PrestoDMLStatementVisitor.java
@@ -546,7 +546,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitGroupConcatFunction(final GroupConcatFunctionContext
ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.GROUP_CONCAT().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
result.getParameters().add((ExpressionSegment) visit(each));
@@ -562,7 +561,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitCastFunction(final CastFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CAST().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -607,13 +605,18 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitConvertFunction(final ConvertFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
- return new FunctionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), ctx.CONVERT().getText(), getOriginalText(ctx));
+ FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CONVERT().getText(), getOriginalText(ctx));
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
+ if (null != ctx.castType()) {
+ result.getParameters().add((DataTypeSegment)
visit(ctx.castType()));
+ } else if (null != ctx.charsetName()) {
+ result.getParameters().add((ExpressionSegment)
visit(ctx.charsetName()));
+ }
+ return result;
}
@Override
public ASTNode visitPositionFunction(final PositionFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.POSITION().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
@@ -633,7 +636,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitExtractFunction(final ExtractFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.EXTRACT().getText(), getOriginalText(ctx));
result.getParameters().add(new
LiteralExpressionSegment(ctx.identifier().getStart().getStartIndex(),
ctx.identifier().getStop().getStopIndex(), ctx.identifier().getText()));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
@@ -642,7 +644,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitCharFunction(final CharFunctionContext ctx) {
- calculateParameterCount(ctx.expr());
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CHAR().getText(), getOriginalText(ctx));
for (ExprContext each : ctx.expr()) {
ASTNode expr = visit(each);
@@ -674,7 +675,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
@Override
public ASTNode visitWeightStringFunction(final WeightStringFunctionContext
ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.WEIGHT_STRING().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
return result;
@@ -763,13 +763,6 @@ public final class PrestoDMLStatementVisitor extends
PrestoStatementVisitor impl
return new CommonExpressionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), text);
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public ASTNode visitTypeDatetimePrecision(final
TypeDatetimePrecisionContext ctx) {
DataTypeLengthSegment result = new DataTypeLengthSegment();
diff --git
a/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/SQL92StatementVisitor.java
b/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/SQL92StatementVisitor.java
index 69d5b98bf75..cc3e7c5fcf9 100644
---
a/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/SQL92StatementVisitor.java
+++
b/parser/sql/engine/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/engine/sql92/visitor/statement/SQL92StatementVisitor.java
@@ -68,6 +68,8 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.Bina
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.InExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalExpression;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.IntervalUnit;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ListExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.NotExpression;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.complex.CommonExpressionSegment;
@@ -403,6 +405,9 @@ public abstract class SQL92StatementVisitor extends
SQL92StatementBaseVisitor<AS
if (null != ctx.literals()) {
return SQLUtils.createLiteralExpression(visit(ctx.literals()),
startIndex, stopIndex, ctx.literals().start.getInputStream().getText(new
Interval(startIndex, stopIndex)));
}
+ if (null != ctx.intervalExpression()) {
+ return visit(ctx.intervalExpression());
+ }
if (null != ctx.functionCall()) {
return visit(ctx.functionCall());
}
@@ -414,8 +419,9 @@ public abstract class SQL92StatementVisitor extends
SQL92StatementBaseVisitor<AS
@Override
public final ASTNode visitIntervalExpression(final
IntervalExpressionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
- return new ExpressionProjectionSegment(ctx.getStart().getStartIndex(),
ctx.getStop().getStopIndex(), getOriginalText(ctx));
+ IntervalUnit intervalUnit =
IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase());
+ return new
IntervalExpression(ctx.INTERVAL().getSymbol().getStartIndex(),
ctx.getStop().getStopIndex(), (ExpressionSegment) visit(ctx.expr()),
intervalUnit,
+ getOriginalText(ctx));
}
@Override
@@ -482,7 +488,6 @@ public abstract class SQL92StatementVisitor extends
SQL92StatementBaseVisitor<AS
@Override
public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
ctx.CAST().getText(), getOriginalText(ctx));
ASTNode exprSegment = visit(ctx.expr());
if (exprSegment instanceof ColumnSegment) {
@@ -511,13 +516,6 @@ public abstract class SQL92StatementVisitor extends
SQL92StatementBaseVisitor<AS
return new KeywordValue(String.join(" ", dataTypeNames));
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitOrderByClause(final OrderByClauseContext ctx) {
Collection<OrderByItemSegment> items = new LinkedList<>();
diff --git
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index 9a03fccdeca..9578e7686f4 100644
---
a/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++
b/parser/sql/engine/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/engine/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -1056,7 +1056,6 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
@Override
public final ASTNode visitCastFunction(final CastFunctionContext ctx) {
- calculateParameterCount(Collections.singleton(ctx.expr()));
String functionName = null == ctx.CAST() ? ctx.TRY_CAST().getText() :
ctx.CAST().getText();
FunctionSegment result = new
FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(),
functionName, getOriginalText(ctx));
ASTNode exprSegment = visit(ctx.expr());
@@ -1135,13 +1134,6 @@ public abstract class SQLServerStatementVisitor extends
SQLServerStatementBaseVi
return new KeywordValue(ctx.getText());
}
- // TODO :FIXME, sql case id: insert_with_str_to_date
- private void calculateParameterCount(final Collection<ExprContext>
exprContexts) {
- for (ExprContext each : exprContexts) {
- visit(each);
- }
- }
-
@Override
public final ASTNode visitOrderByItem(final OrderByItemContext ctx) {
OrderDirection orderDirection = null == ctx.DESC() ?
OrderDirection.ASC : OrderDirection.DESC;
diff --git a/test/it/parser/src/main/resources/case/dml/clickhouse.xml
b/test/it/parser/src/main/resources/case/dml/clickhouse.xml
index 1b28d833354..55b7d7b8e51 100644
--- a/test/it/parser/src/main/resources/case/dml/clickhouse.xml
+++ b/test/it/parser/src/main/resources/case/dml/clickhouse.xml
@@ -342,9 +342,14 @@
</function>
</expr>
</expression-projection>
- <expression-projection alias="inter" text="INTERVAL2DAY"
start-index="105" stop-index="127">
+ <expression-projection alias="inter" text="INTERVAL 2 DAY"
start-index="105" stop-index="127">
<expr>
- <common-expression text="INTERVAL2DAY" start-index="105"
stop-index="118" />
+ <interval-expression start-index="105" stop-index="118">
+ <value>
+ <literal-expression value="2" start-index="114"
stop-index="114" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
</expr>
</expression-projection>
<aggregation-distinct-projection type="COUNT"
expression="COUNT(DISTINCT user_id)" distinct-inner-expression="user_id"
alias="cnt" start-index="130" stop-index="152" />
@@ -686,7 +691,12 @@
</left>
<operator>+</operator>
<right>
- <common-expression text="INTERVAL2DAY"
literal-text="INTERVAL2DAY" start-index="20" stop-index="33" />
+ <interval-expression start-index="20"
stop-index="33">
+ <value>
+ <literal-expression value="2"
start-index="29" stop-index="29" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
</right>
</binary-operation-expression>
</expr>
@@ -1128,7 +1138,12 @@
</left>
<operator>+</operator>
<right>
- <common-expression text="INTERVAL1DAY"
literal-text="INTERVAL1DAY" start-index="20" stop-index="33" />
+ <interval-expression start-index="20"
stop-index="33">
+ <value>
+ <literal-expression value="1"
start-index="29" stop-index="29" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
</right>
</binary-operation-expression>
</expr>
diff --git a/test/it/parser/src/main/resources/case/dml/presto.xml
b/test/it/parser/src/main/resources/case/dml/presto.xml
index 59c2515a85b..a600b661ab9 100644
--- a/test/it/parser/src/main/resources/case/dml/presto.xml
+++ b/test/it/parser/src/main/resources/case/dml/presto.xml
@@ -547,7 +547,54 @@
<projections start-index="7" stop-index="29">
<expression-projection text="CONVERT(order_id, CHAR)"
start-index="7" stop-index="29">
<expr>
- <function function-name="CONVERT" text="CONVERT(order_id,
CHAR)" start-index="7" stop-index="29" />
+ <function function-name="CONVERT" text="CONVERT(order_id,
CHAR)" start-index="7" stop-index="29">
+ <parameter>
+ <column name="order_id" start-index="15"
stop-index="22" />
+ </parameter>
+ <parameter>
+ <data-type value="CHAR" start-index="25"
stop-index="28" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="36" stop-index="42" />
+ </from>
+ </select>
+
+ <select sql-case-id="presto_select_convert_with_placeholder">
+ <projections start-index="7" stop-index="24">
+ <expression-projection text="CONVERT(?, CHAR)" start-index="7"
stop-index="24">
+ <expr>
+ <function function-name="CONVERT" text="CONVERT(?, CHAR)"
start-index="7" stop-index="24">
+ <parameter>
+ <parameter-marker index="0" start-index="15"
stop-index="15" />
+ </parameter>
+ <parameter>
+ <data-type value="CHAR" start-index="18"
stop-index="21" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="31" stop-index="37" />
+ </from>
+ </select>
+
+ <select sql-case-id="presto_select_convert_using_with_placeholder">
+ <projections start-index="7" stop-index="29">
+ <expression-projection text="CONVERT(? USING utf8)"
start-index="7" stop-index="29">
+ <expr>
+ <function function-name="CONVERT" text="CONVERT(? USING
utf8)" start-index="7" stop-index="29">
+ <parameter>
+ <parameter-marker index="0" start-index="15"
stop-index="15" />
+ </parameter>
+ <parameter>
+ <literal-expression value="utf8" start-index="23"
stop-index="26" />
+ </parameter>
+ </function>
</expr>
</expression-projection>
</projections>
diff --git a/test/it/parser/src/main/resources/case/dml/select-hive.xml
b/test/it/parser/src/main/resources/case/dml/select-hive.xml
index 237c9dcaf67..cec35e7bb9f 100644
--- a/test/it/parser/src/main/resources/case/dml/select-hive.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-hive.xml
@@ -840,10 +840,57 @@
<projections start-index="7" stop-index="33">
<expression-projection text="CONVERT('2020-10-01', DATE)"
start-index="7" stop-index="33">
<expr>
- <function function-name="CONVERT"
text="CONVERT('2020-10-01', DATE)" start-index="7" stop-index="33" />
+ <function function-name="CONVERT"
text="CONVERT('2020-10-01', DATE)" start-index="7" stop-index="33">
+ <parameter>
+ <literal-expression value="2020-10-01"
start-index="15" stop-index="26" />
+ </parameter>
+ <parameter>
+ <data-type value="DATE" start-index="29"
stop-index="32" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="hive_convert_with_placeholder">
+ <projections start-index="7" stop-index="23">
+ <expression-projection text="CONVERT(?, DATE)" start-index="7"
stop-index="23">
+ <expr>
+ <function function-name="CONVERT" text="CONVERT(?, DATE)"
start-index="7" stop-index="23">
+ <parameter>
+ <parameter-marker index="0" start-index="15"
stop-index="15" />
+ </parameter>
+ <parameter>
+ <data-type value="DATE" start-index="18"
stop-index="21" />
+ </parameter>
+ </function>
</expr>
</expression-projection>
</projections>
+ <from>
+ <simple-table name="t_order" start-index="30" stop-index="36" />
+ </from>
+ </select>
+
+ <select sql-case-id="hive_convert_using_with_placeholder">
+ <projections start-index="7" stop-index="28">
+ <expression-projection text="CONVERT(? USING utf8)"
start-index="7" stop-index="28">
+ <expr>
+ <function function-name="CONVERT" text="CONVERT(? USING
utf8)" start-index="7" stop-index="28">
+ <parameter>
+ <parameter-marker index="0" start-index="15"
stop-index="15" />
+ </parameter>
+ <parameter>
+ <literal-expression value="utf8" start-index="23"
stop-index="26" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="35" stop-index="41" />
+ </from>
</select>
<select sql-case-id="hive_limit_param" parameters="1,2">
diff --git
a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index 6968db63601..ceed8ed7d4c 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -5024,7 +5024,7 @@
</expression-projection>
</projections>
</select>
-
+
<select sql-case-id="select_last_insert_id">
<projections start-index="7" stop-index="22">
<expression-projection start-index="7" stop-index="22"
text="LAST_INSERT_ID()">
@@ -5053,7 +5053,6 @@
<simple-table name="TEST" start-index="65" stop-index="68"
literal-start-index="65" literal-stop-index="68" />
</from>
</select>
-
<select sql-case-id="select_lcase_function">
<projections start-index="7" stop-index="28">
<expression-projection start-index="7" stop-index="28"
text="LCASE('QUADRATICALLY')">
@@ -5661,4 +5660,225 @@
</expression-projection>
</projections>
</select>
+
+ <select sql-case-id="select_position_with_placeholder">
+ <from>
+ <simple-table name="t_user" start-index="51" stop-index="57" />
+ </from>
+ <projections start-index="7" stop-index="42">
+ <expression-projection text="POSITION(? IN user_name) AS a_pos"
start-index="7" stop-index="42">
+ <alias identifier="a_pos" start-index="45" stop-index="49" />
+ <expr>
+ <function function-name="POSITION" start-index="7"
stop-index="36" text="POSITION(? IN user_name)">
+ <parameter>
+ <parameter-marker index="0" start-index="16"
stop-index="16" />
+ </parameter>
+ <parameter>
+ <column name="user_name" start-index="21"
stop-index="28" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <order-by>
+ <column-item name="user_id" order-direction="ASC" start-index="68"
stop-index="75" />
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_char_nested_with_placeholder">
+ <from>
+ <simple-table name="t_user" start-index="63" stop-index="69" />
+ </from>
+ <projections start-index="7" stop-index="54">
+ <expression-projection text="CHAR(ASCII(SUBSTRING(user_name, ?,
?))) AS first_char" start-index="7" stop-index="54">
+ <alias identifier="first_char" start-index="58"
stop-index="67" />
+ <expr>
+ <function function-name="CHAR" start-index="7"
stop-index="51" text="CHAR(ASCII(SUBSTRING(user_name, ?, ?)))">
+ <parameter>
+ <function function-name="ASCII" start-index="12"
stop-index="48" text="ASCII(SUBSTRING(user_name, ?, ?))">
+ <parameter>
+ <function function-name="SUBSTRING"
start-index="19" stop-index="45" text="SUBSTRING(user_name, ?, ?)">
+ <parameter>
+ <column name="user_name"
start-index="29" stop-index="36" />
+ </parameter>
+ <parameter>
+ <parameter-marker index="0"
start-index="39" stop-index="39" />
+ </parameter>
+ <parameter>
+ <parameter-marker index="1"
start-index="42" stop-index="42" />
+ </parameter>
+ </function>
+ </parameter>
+ </function>
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <order-by>
+ <column-item name="user_id" order-direction="ASC" start-index="80"
stop-index="87" />
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_extract_with_placeholder">
+ <from>
+ <simple-table name="t_order" start-index="42" stop-index="49" />
+ </from>
+ <projections start-index="7" stop-index="36">
+ <expression-projection text="EXTRACT(? FROM creation_date)"
start-index="7" stop-index="36">
+ <expr>
+ <function function-name="EXTRACT" start-index="7"
stop-index="36" text="EXTRACT(? FROM creation_date)">
+ <parameter>
+ <parameter-marker index="0" start-index="16"
stop-index="16" />
+ </parameter>
+ <parameter>
+ <column name="creation_date" start-index="23"
stop-index="35" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_weight_string_with_placeholder">
+ <from>
+ <simple-table name="t_order" start-index="33" stop-index="40" />
+ </from>
+ <projections start-index="7" stop-index="25">
+ <expression-projection text="WEIGHT_STRING(?)" start-index="7"
stop-index="25">
+ <expr>
+ <function function-name="WEIGHT_STRING" start-index="7"
stop-index="25" text="WEIGHT_STRING(?)">
+ <parameter>
+ <parameter-marker index="0" start-index="21"
stop-index="21" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_group_concat_with_placeholder">
+ <from>
+ <simple-table name="t_order" start-index="49" stop-index="55" />
+ </from>
+ <projections start-index="7" stop-index="41">
+ <expression-projection text="GROUP_CONCAT(? ORDER BY ?)"
start-index="7" stop-index="41">
+ <expr>
+ <function function-name="GROUP_CONCAT" start-index="7"
stop-index="41" text="GROUP_CONCAT(? ORDER BY ?)">
+ <parameter>
+ <parameter-marker index="0" start-index="20"
stop-index="20" />
+ </parameter>
+ <parameter>
+ <parameter-marker index="1" start-index="32"
stop-index="32" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
+
+ <select sql-case-id="select_substring_with_placeholder">
+ <from>
+ <simple-table name="t_user" start-index="60" stop-index="66" />
+ </from>
+ <projections start-index="7" stop-index="44">
+ <expression-projection text="SUBSTRING(user_name, ?, ?) AS
first_char" start-index="7" stop-index="44">
+ <alias identifier="first_char" start-index="48"
stop-index="57" />
+ <expr>
+ <function function-name="SUBSTRING" start-index="7"
stop-index="39" text="SUBSTRING(user_name, ?, ?)">
+ <parameter>
+ <column name="user_name" start-index="17"
stop-index="24" />
+ </parameter>
+ <parameter>
+ <parameter-marker index="0" start-index="27"
stop-index="27" />
+ </parameter>
+ <parameter>
+ <parameter-marker index="1" start-index="30"
stop-index="30" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <order-by>
+ <column-item name="user_id" order-direction="ASC" start-index="67"
stop-index="74" />
+ </order-by>
+ </select>
+
+ <select sql-case-id="select_cast_with_placeholder_mysql">
+ <projections start-index="7" stop-index="33">
+ <expression-projection text="CAST(? AS UNSIGNED)" start-index="7"
stop-index="33">
+ <expr>
+ <function function-name="CAST" text="CAST(? AS UNSIGNED)"
start-index="7" stop-index="33">
+ <parameter>
+ <parameter-marker index="0" start-index="12"
stop-index="12" />
+ </parameter>
+ <parameter>
+ <data-type value="UNSIGNED" start-index="23"
stop-index="30" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="40" stop-index="46" />
+ </from>
+ </select>
+
+ <select sql-case-id="select_cast_with_placeholder_clickhouse">
+ <projections start-index="7" stop-index="31">
+ <expression-projection text="CAST(? AS INT8)" start-index="7"
stop-index="31">
+ <expr>
+ <function function-name="CAST" text="CAST(? AS INT8)"
start-index="7" stop-index="31">
+ <parameter>
+ <parameter-marker index="0" start-index="12"
stop-index="12" />
+ </parameter>
+ <parameter>
+ <data-type value="INT8" start-index="21"
stop-index="25" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="38" stop-index="44" />
+ </from>
+ </select>
+
+ <select sql-case-id="select_cast_with_placeholder_standard">
+ <projections start-index="7" stop-index="30">
+ <expression-projection text="CAST(? AS INT)" start-index="7"
stop-index="30">
+ <expr>
+ <function function-name="CAST" text="CAST(? AS INT)"
start-index="7" stop-index="30">
+ <parameter>
+ <parameter-marker index="0" start-index="12"
stop-index="12" />
+ </parameter>
+ <parameter>
+ <data-type value="INT" start-index="21"
stop-index="24" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="37" stop-index="43" />
+ </from>
+ </select>
+
+ <select sql-case-id="select_interval_with_placeholder">
+ <projections start-index="7" stop-index="22">
+ <expression-projection text="INTERVAL ? DAY" start-index="7"
stop-index="22">
+ <expr>
+ <interval-expression start-index="7" stop-index="22">
+ <value>
+ <parameter-marker index="0" start-index="16"
stop-index="16" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="t_order" start-index="29" stop-index="35" />
+ </from>
+ </select>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/select.xml
b/test/it/parser/src/main/resources/case/dml/select.xml
index 77b056ee8a5..b2cbc94c45f 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -12501,6 +12501,14 @@
<select sql-case-id="select_interval_firebird">
<projections start-index="7" stop-index="20">
<expression-projection text="INTERVAL 1 DAY" start-index="7"
stop-index="20">
+ <expr>
+ <interval-expression start-index="7" stop-index="20">
+ <value>
+ <literal-expression value="1" start-index="16"
stop-index="16" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
+ </expr>
</expression-projection>
</projections>
<from>
@@ -13436,7 +13444,15 @@
<select sql-case-id="select_interval_expression_sql92">
<projections start-index="7" stop-index="20">
- <expression-projection text="INTERVAL1DAY" start-index="7"
stop-index="20">
+ <expression-projection text="INTERVAL 1 DAY" start-index="7"
stop-index="20">
+ <expr>
+ <interval-expression start-index="7" stop-index="20">
+ <value>
+ <literal-expression value="1" start-index="16"
stop-index="16" />
+ </value>
+ <interval-unit>DAY</interval-unit>
+ </interval-expression>
+ </expr>
</expression-projection>
</projections>
</select>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/presto.xml
b/test/it/parser/src/main/resources/sql/supported/dml/presto.xml
index 9f1d1e1f0ca..22040581b7c 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/presto.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/presto.xml
@@ -35,6 +35,8 @@
<sql-case id="presto_select_searched_case" value="SELECT CASE WHEN flag
THEN 1 ELSE 0 END FROM t_order" db-types="Presto" />
<sql-case id="presto_select_in_subquery" value="SELECT * FROM t_order
WHERE order_id IN (SELECT order_id FROM t_order_item)" db-types="Presto" />
<sql-case id="presto_select_convert_function" value="SELECT
CONVERT(order_id, CHAR) FROM t_order" db-types="Presto" />
+ <sql-case id="presto_select_convert_with_placeholder" value="SELECT
CONVERT(?, CHAR) FROM t_order" case-types="placeholder" db-types="Presto" />
+ <sql-case id="presto_select_convert_using_with_placeholder" value="SELECT
CONVERT(? USING utf8) FROM t_order" case-types="placeholder" db-types="Presto"
/>
<sql-case id="presto_select_position_function" value="SELECT POSITION('a'
IN 'abc')" db-types="Presto" />
<sql-case id="presto_select_current_user" value="SELECT CURRENT_USER()"
db-types="Presto" />
<sql-case id="presto_select_limit_offset" value="SELECT * FROM t_order
LIMIT 5 OFFSET 2" db-types="Presto" />
diff --git
a/test/it/parser/src/main/resources/sql/supported/dml/select-hive.xml
b/test/it/parser/src/main/resources/sql/supported/dml/select-hive.xml
index 86bedeef66e..1b097bcae09 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-hive.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-hive.xml
@@ -60,6 +60,8 @@
<sql-case id="hive_group_concat_order" value="SELECT GROUP_CONCAT(status
ORDER BY status) FROM t_order" db-types="Hive" />
<sql-case id="hive_json_array_simple" value="SELECT JSON_ARRAY(1, 'abc',
NULL, TRUE, CURTIME())" db-types="Hive" />
<sql-case id="hive_convert_date" value="SELECT CONVERT('2020-10-01',
DATE)" db-types="Hive" />
+ <sql-case id="hive_convert_with_placeholder" value="SELECT CONVERT(?,
DATE) FROM t_order" case-types="placeholder" db-types="Hive" />
+ <sql-case id="hive_convert_using_with_placeholder" value="SELECT CONVERT(?
USING utf8) FROM t_order" case-types="placeholder" db-types="Hive" />
<sql-case id="hive_limit_param" value="SELECT * FROM t_order LIMIT ?
OFFSET ?" db-types="Hive" />
<sql-case id="hive_select_not" value="SELECT * FROM t_pred WHERE NOT
status" db-types="Hive" />
<sql-case id="hive_select_is_null" value="SELECT * FROM t_pred WHERE
status IS NULL" db-types="Hive" />
diff --git
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
index e26b462660a..98b835f4592 100644
---
a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
+++
b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
@@ -324,4 +324,16 @@
<sql-case id="select_translate_nchar_cs_oracle" value="SELECT
TRANSLATE(col USING NCHAR_CS) FROM translate_tab" db-types="Oracle" />
<sql-case id="select_approx_rank_oracle" value="SELECT APPROX_RANK(0.5)
FROM dual" db-types="Oracle" />
<sql-case id="select_isschemavalid_function_oracle" value="SELECT
ISSCHEMAVALID(xml_doc, 'schema.xsd') FROM dual" db-types="Oracle" />
+ <!-- Parameter count test cases for functions with placeholders -->
+ <sql-case id="select_position_with_placeholder" value="SELECT POSITION(?
IN user_name) AS a_pos FROM t_user ORDER BY user_id" case-types="placeholder"
db-types="MySQL,Doris,Hive,Presto,GoldenDB,StarRocks,SQL92" />
+ <sql-case id="select_char_nested_with_placeholder" value="SELECT
CHAR(ASCII(SUBSTRING(user_name, ?, ?))) AS first_char FROM t_user ORDER BY
user_id" case-types="placeholder"
db-types="MySQL,Doris,Hive,Presto,GoldenDB,StarRocks" />
+ <sql-case id="select_substring_with_placeholder" value="SELECT
SUBSTRING(user_name, ?, ?) AS first_char FROM t_user ORDER BY user_id"
case-types="placeholder" db-types="MySQL,Doris,Hive,Presto,GoldenDB,StarRocks"
/>
+ <sql-case id="select_group_concat_with_placeholder" value="SELECT
GROUP_CONCAT(? ORDER BY ?) FROM t_order" case-types="placeholder"
db-types="MySQL,Doris,GoldenDB,StarRocks,Hive,Presto" />
+ <sql-case id="select_extract_with_placeholder" value="SELECT EXTRACT(?
FROM creation_date) FROM t_order" case-types="placeholder"
db-types="MySQL,Doris,Hive,Presto,GoldenDB,StarRocks" />
+ <sql-case id="select_weight_string_with_placeholder" value="SELECT
WEIGHT_STRING(?) FROM t_order" case-types="placeholder"
db-types="MySQL,Doris,Hive" />
+ <!-- CAST test cases per dialect group - different syntax for data types
-->
+ <sql-case id="select_cast_with_placeholder_mysql" value="SELECT CAST(? AS
UNSIGNED) FROM t_order" case-types="placeholder" db-types="MySQL,Hive,Presto" />
+ <sql-case id="select_cast_with_placeholder_clickhouse" value="SELECT
CAST(? AS INT8) FROM t_order" case-types="placeholder" db-types="ClickHouse" />
+ <sql-case id="select_cast_with_placeholder_standard" value="SELECT CAST(?
AS INT) FROM t_order" case-types="placeholder"
db-types="SQL92,Firebird,SQLServer" />
+ <sql-case id="select_interval_with_placeholder" value="SELECT INTERVAL ?
DAY FROM t_order" case-types="placeholder"
db-types="MySQL,ClickHouse,SQL92,Firebird" />
</sql-cases>