You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2025/07/16 01:12:21 UTC
(shardingsphere) branch master updated: fix:Support for the TRY_PARSE function (#36016)
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 eb62e606bb3 fix:Support for the TRY_PARSE function (#36016)
eb62e606bb3 is described below
commit eb62e606bb3731eea62a62246d01ccfac3d1c387
Author: cxy <xi...@qq.com>
AuthorDate: Wed Jul 16 09:12:15 2025 +0800
fix:Support for the TRY_PARSE function (#36016)
---
.../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 7 ++++++-
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 4 ++++
.../visitor/statement/SQLServerStatementVisitor.java | 15 +++++++++++++++
.../it/parser/src/main/resources/case/dml/select.xml | 20 ++++++++++++++++++++
.../src/main/resources/sql/supported/dml/select.xml | 1 +
5 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4 b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
index 93302b49d80..636b192b11a 100644
--- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
+++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/BaseRule.g4
@@ -121,7 +121,7 @@ unreservedWord
| ELASTIC_POOL | SERVICE_OBJECTIVE | DATABASE_NAME | ALLOW_CONNECTIONS | GEO | NAMED | DATEFIRST | BACKUP_STORAGE_REDUNDANCY | FORCE_FAILOVER_ALLOW_DATA_LOSS | SECONDARY | FAILOVER | DEFAULT_FULLTEXT_LANGUAGE
| DEFAULT_LANGUAGE | INLINE | NESTED_TRIGGERS | TRANSFORM_NOISE_WORDS | TWO_DIGIT_YEAR_CUTOFF | PERSISTENT_LOG_BUFFER | DIRECTORY_NAME | DATEFORMAT | DELAYED_DURABILITY | TRANSFER | SCHEMA | PASSWORD | AUTHORIZATION
| MEMBER | SEARCH | TEXT | SECOND | PRECISION | VIEWS | PROVIDER | COLUMNS | SUBSTRING | RETURNS | SIZE | CONTAINS | MONTH | INPUT | YEAR
- | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID | OPENQUERY | ACTION | TARGET | HOUR | MINUTE | TABLE | NODES | VALUE | EXIST | CHANGETABLE | VERSION | CHANGES | MODEL | AI_GENERATE_EMBEDDINGS | PARAMETERS | USE | FREETEXTTABLE | NCHAR | LEFT | RANK | ROLLUP | PIVOT | UNPIVOT | PARSE
+ | TIMESTAMP | TRIM | USER | RIGHT | JSON | SID | OPENQUERY | ACTION | TARGET | HOUR | MINUTE | TABLE | NODES | VALUE | EXIST | CHANGETABLE | VERSION | CHANGES | MODEL | AI_GENERATE_EMBEDDINGS | PARAMETERS | USE | FREETEXTTABLE | NCHAR | LEFT | RANK | ROLLUP | PIVOT | UNPIVOT | PARSE | TRY_PARSE
;
databaseName
@@ -394,12 +394,17 @@ conversionFunction
: castFunction
| convertFunction
| parseFunction
+ | tryParseFunction
;
parseFunction
: PARSE LP_ expr AS dataType (USING expr)? RP_
;
+tryParseFunction
+ : TRY_PARSE LP_ expr AS dataType (USING expr)? RP_
+ ;
+
castFunction
: (CAST | TRY_CAST) LP_ expr AS dataType RP_
;
diff --git a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4 b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index c5e3cf555e3..194422dd938 100644
--- a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++ b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -2058,3 +2058,7 @@ UNPIVOT
PARSE
: P A R S E
;
+
+TRY_PARSE
+ : T R Y UL_ P A R S E
+ ;
diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index 0da030e82f8..b1d47ebb539 100644
--- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -249,6 +249,7 @@ import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Piv
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.PivotValueContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CurrentUserFunctionContext;
import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ParseFunctionContext;
+import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.TryParseFunctionContext;
import java.util.Collection;
import java.util.Collections;
@@ -866,6 +867,9 @@ public abstract class SQLServerStatementVisitor extends SQLServerStatementBaseVi
if (null != ctx.parseFunction()) {
return visit(ctx.parseFunction());
}
+ if (null != ctx.tryParseFunction()) {
+ return visit(ctx.tryParseFunction());
+ }
return new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.getChild(0).getChild(0).getText(), getOriginalText(ctx));
}
@@ -880,6 +884,17 @@ public abstract class SQLServerStatementVisitor extends SQLServerStatementBaseVi
return result;
}
+ @Override
+ public ASTNode visitTryParseFunction(final TryParseFunctionContext ctx) {
+ FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TRY_PARSE().getText(), getOriginalText(ctx));
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr(0)));
+ result.getParameters().add((DataTypeSegment) visit(ctx.dataType()));
+ if (null != ctx.USING() && ctx.expr().size() > 1) {
+ result.getParameters().add((ExpressionSegment) visit(ctx.expr(1)));
+ }
+ return result;
+ }
+
@Override
public final ASTNode visitWindowFunction(final WindowFunctionContext ctx) {
if (null != ctx.lagLeadFunction()) {
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 de3a6461e94..1274b093755 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -10877,4 +10877,24 @@
</expression-projection>
</projections>
</select>
+
+ <select sql-case-id="select_try_parse_function">
+ <projections start-index="7" stop-index="68">
+ <expression-projection text="TRY_PARSE('Jabberwokkie' AS datetime2 USING 'en-US')" alias="Result" start-index="7" stop-index="68">
+ <expr>
+ <function start-index="7" stop-index="58" text="TRY_PARSE('Jabberwokkie' AS datetime2 USING 'en-US')" function-name="TRY_PARSE">
+ <parameter>
+ <literal-expression value="Jabberwokkie" start-index="17" stop-index="30" />
+ </parameter>
+ <parameter>
+ <data-type value="datetime2" start-index="35" stop-index="43" />
+ </parameter>
+ <parameter>
+ <literal-expression value="en-US" start-index="51" stop-index="57" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ </select>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select.xml b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
index c5072713e96..f0d59fe25e7 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select.xml
@@ -338,4 +338,5 @@
<sql-case id="select_unpivot_operator" value="SELECT VendorID, Employee, Orders FROM pvt UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5)) AS unpvt;" db-types="SQLServer"/>
<sql-case id="select_sqlserver_current_user" value="SELECT CURRENT_USER;" db-types="SQLServer"/>
<sql-case id="select_parse_function" value="SELECT PARSE('Monday, 13 December 2010' AS datetime2 USING 'en-US') AS Result;" db-types="SQLServer"/>
+ <sql-case id="select_try_parse_function" value="SELECT TRY_PARSE('Jabberwokkie' AS datetime2 USING 'en-US') AS Result;" db-types="SQLServer"/>
</sql-cases>