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>