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 ffe3aa5ea46 fix:Support for the rowSetFunction in DELETE statements 
(#36297)
ffe3aa5ea46 is described below

commit ffe3aa5ea46f5cff11ac6b87265938e8c815367f
Author: cxy <[email protected]>
AuthorDate: Fri Aug 15 09:15:37 2025 +0800

    fix:Support for the rowSetFunction in DELETE statements (#36297)
---
 .../main/antlr4/imports/sqlserver/DMLStatement.g4  |  2 +-
 .../statement/SQLServerStatementVisitor.java       | 18 +++++++++++----
 .../dml/standard/type/DeleteStatementAssert.java   |  6 +++++
 .../dml/standard/DeleteStatementTestCase.java      |  4 ++++
 .../parser/src/main/resources/case/dml/delete.xml  | 26 ++++++++++++++++++++++
 .../main/resources/sql/supported/dml/delete.xml    |  1 +
 6 files changed, 52 insertions(+), 5 deletions(-)

diff --git 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
index 2cefdd81418..0d94971e31a 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
+++ 
b/parser/sql/dialect/sqlserver/src/main/antlr4/imports/sqlserver/DMLStatement.g4
@@ -110,7 +110,7 @@ optionHint
     ;
 
 singleTableClause
-    : FROM? LP_? tableName RP_? (AS? alias)?
+    : FROM? LP_? (tableName | rowSetFunction) RP_? (AS? alias)?
     ;
 
 multipleTablesClause
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 d7e1bdebef6..d1dc774802c 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
@@ -1764,11 +1764,21 @@ public abstract class SQLServerStatementVisitor extends 
SQLServerStatementBaseVi
     
     @Override
     public ASTNode visitSingleTableClause(final SingleTableClauseContext ctx) {
-        SimpleTableSegment result = (SimpleTableSegment) 
visit(ctx.tableName());
-        if (null != ctx.alias()) {
-            result.setAlias((AliasSegment) visit(ctx.alias()));
+        if (null != ctx.tableName()) {
+            SimpleTableSegment result = (SimpleTableSegment) 
visit(ctx.tableName());
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
+        } else if (null != ctx.rowSetFunction()) {
+            FunctionSegment functionSegment = (FunctionSegment) 
visit(ctx.rowSetFunction());
+            FunctionTableSegment result = new 
FunctionTableSegment(functionSegment.getStartIndex(), 
functionSegment.getStopIndex(), functionSegment);
+            if (null != ctx.alias()) {
+                result.setAlias((AliasSegment) visit(ctx.alias()));
+            }
+            return result;
         }
-        return result;
+        return null;
     }
     
     @Override
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
index 7331d854211..a7dd2537e2d 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dml/standard/type/DeleteStatementAssert.java
@@ -35,6 +35,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.out
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.where.WhereClauseAssert;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.with.WithClauseAssert;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.standard.DeleteStatementTestCase;
 
 import java.util.LinkedList;
@@ -89,6 +90,11 @@ public final class DeleteStatementAssert {
                 
actualTableSegments.addAll(deleteMultiTableSegment.getActualDeleteTables());
             }
             TableAssert.assertIs(assertContext, actualTableSegments, 
expected.getTables());
+        } else if (null != expected.getFunctionTable()) {
+            assertNotNull(actual.getTable(), assertContext.getText("Actual 
function table segment should exist."));
+            ExpectedTable expectedTable = new ExpectedTable();
+            expectedTable.setFunctionTable(expected.getFunctionTable());
+            TableAssert.assertIs(assertContext, actual.getTable(), 
expectedTable);
         } else if (null != expected.getSubqueryTable()) {
             assertNotNull(actual.getTable(), assertContext.getText("Actual 
subquery table segment should exist."));
             TableAssert.assertIs(assertContext, (SubqueryTableSegment) 
actual.getTable(), expected.getSubqueryTable());
diff --git 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
index b235adfe551..a234a41a81e 100644
--- 
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
+++ 
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dml/standard/DeleteStatementTestCase.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.S
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.limit.ExpectedLimitClause;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.orderby.ExpectedOrderByClause;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.output.ExpectedOutputClause;
+import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedFunctionTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSubqueryTable;
 import 
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.where.ExpectedWhereClause;
@@ -59,4 +60,7 @@ public final class DeleteStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "subquery-table")
     private ExpectedSubqueryTable subqueryTable;
+    
+    @XmlElement(name = "function-table")
+    private ExpectedFunctionTable functionTable;
 }
diff --git a/test/it/parser/src/main/resources/case/dml/delete.xml 
b/test/it/parser/src/main/resources/case/dml/delete.xml
index 59b31169406..859a05afd96 100644
--- a/test/it/parser/src/main/resources/case/dml/delete.xml
+++ b/test/it/parser/src/main/resources/case/dml/delete.xml
@@ -823,4 +823,30 @@
             </expr>
         </where>
     </delete>
+
+    <delete sql-case-id="delete_rowset_function">
+        <function-table start-index="12" stop-index="144">
+            <table-function function-name="OPENDATASOURCE" 
text="OPENDATASOURCE('SQLNCLI', 'Data Source= &lt;server_name&gt;; Integrated 
Security=SSPI').AdventureWorks2022.HumanResources.Department">
+                <parameter>
+                    <literal-expression value="SQLNCLI" start-index="26" 
stop-index="34" />
+                </parameter>
+                <parameter>
+                    <literal-expression value="Data Source= 
&lt;server_name&gt;; Integrated Security=SSPI" start-index="37" stop-index="93" 
/>
+                </parameter>
+            </table-function>
+        </function-table>
+        <where start-index="139" stop-index="161">
+            <expr>
+                <binary-operation-expression start-index="145" 
stop-index="161">
+                    <left>
+                        <column name="DepartmentID" start-index="145" 
stop-index="156" />
+                    </left>
+                    <operator>=</operator>
+                    <right>
+                        <literal-expression value="17" start-index="160" 
stop-index="161" />
+                    </right>
+                </binary-operation-expression>
+            </expr>
+        </where>
+    </delete>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml 
b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
index f31ae9e16eb..997bac36bf4 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/delete.xml
@@ -47,4 +47,5 @@
     <sql-case id="delete_with_output_clause_with_compress_function" 
value="DELETE FROM player OUTPUT deleted.id,deleted.name, 
deleted.surname,deleted.datemodifier,COMPRESS(deleted.info) INTO 
dbo.inactivePlayers WHERE datemodified &lt; @startOfYear" db-types="SQLServer" 
/>
     <sql-case id="delete_returning_expressions" value="DELETE FROM t2 WHERE id 
= 2 RETURNING id,t&amp;t" db-types="MySQL,Firebird" />
     <sql-case id="delete_with_table_hint" value="DELETE TOP(1) dbo.DatabaseLog 
WITH (READPAST) OUTPUT DELETED.* WHERE DatabaseLogID = 7;" 
db-types="SQLServer"/>
+    <sql-case id="delete_rowset_function" value="DELETE FROM 
OPENDATASOURCE('SQLNCLI', 'Data Source= &lt;server_name&gt;; Integrated 
Security=SSPI').AdventureWorks2022.HumanResources.Department WHERE DepartmentID 
= 17;" db-types="SQLServer" />
 </sql-cases>

Reply via email to