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= <server_name>; Integrated
Security=SSPI').AdventureWorks2022.HumanResources.Department">
+ <parameter>
+ <literal-expression value="SQLNCLI" start-index="26"
stop-index="34" />
+ </parameter>
+ <parameter>
+ <literal-expression value="Data Source=
<server_name>; 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 < @startOfYear" db-types="SQLServer"
/>
<sql-case id="delete_returning_expressions" value="DELETE FROM t2 WHERE id
= 2 RETURNING id,t&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= <server_name>; Integrated
Security=SSPI').AdventureWorks2022.HumanResources.Department WHERE DepartmentID
= 17;" db-types="SQLServer" />
</sql-cases>