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 e8b0cc7fb54 fix:Support for multiple keywords in the OUTPUT clause
(#36191)
e8b0cc7fb54 is described below
commit e8b0cc7fb542341488523b35793657b95d645a19
Author: cxy <[email protected]>
AuthorDate: Thu Aug 7 14:15:33 2025 +0800
fix:Support for multiple keywords in the OUTPUT clause (#36191)
---
.../main/antlr4/imports/sqlserver/DMLStatement.g4 | 2 +-
.../parser/src/main/resources/case/dml/merge.xml | 67 ++++++++++++++++++++++
.../src/main/resources/sql/supported/dml/merge.xml | 1 +
3 files changed, 69 insertions(+), 1 deletion(-)
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 a93d69f88dd..ec2b49bf08a 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
@@ -290,7 +290,7 @@ outputWithColumn
;
outputWithAaterisk
- : (INSERTED | DELETED) DOT_ASTERISK_
+ : ((INSERTED | DELETED) DOT_ASTERISK_ | expr) (COMMA_ ((INSERTED |
DELETED) DOT_ASTERISK_ | expr))*
;
outputTableName
diff --git a/test/it/parser/src/main/resources/case/dml/merge.xml
b/test/it/parser/src/main/resources/case/dml/merge.xml
index 38036c26095..fbe1f8e61d8 100644
--- a/test/it/parser/src/main/resources/case/dml/merge.xml
+++ b/test/it/parser/src/main/resources/case/dml/merge.xml
@@ -578,4 +578,71 @@
</where>
</delete>
</merge>
+
+ <merge sql-case-id="merge_output_with_aaterisk">
+ <target>
+ <simple-table name="people_target" alias="pt" start-index="11"
stop-index="26" />
+ </target>
+ <source>
+ <simple-table name="people_source" alias="ps" start-index="34"
stop-index="49" />
+ </source>
+ <expr>
+ <binary-operation-expression start-index="55" stop-index="81">
+ <left>
+ <column name="person_id" start-index="55" stop-index="66">
+ <owner name="pt" start-index="55" stop-index="56" />
+ </column>
+ </left>
+ <operator>=</operator>
+ <right>
+ <column name="person_id" start-index="70" stop-index="81">
+ <owner name="ps" start-index="70" stop-index="71" />
+ </column>
+ </right>
+ </binary-operation-expression>
+ </expr>
+ <merge-items text="WHEN MATCHED THEN UPDATE SET first_name =
ps.first_name, pt.last_name = ps.last_name, pt.title = ps.title"
start-index="109" stop-index="188">
+ <update>
+ <set start-index="109" stop-index="188">
+ <assignment start-index="109" stop-index="141">
+ <column name="first_name" start-index="113"
stop-index="122" />
+ <assignment-value>
+ <column name="first_name" start-index="126"
stop-index="138">
+ <owner name="ps" start-index="126"
stop-index="127" />
+ </column>
+ </assignment-value>
+ </assignment>
+ <assignment start-index="142" stop-index="167">
+ <column name="last_name" start-index="141"
stop-index="152">
+ <owner name="pt" start-index="141"
stop-index="142" />
+ </column>
+ <assignment-value>
+ <column name="last_name" start-index="156"
stop-index="167">
+ <owner name="ps" start-index="156"
stop-index="157" />
+ </column>
+ </assignment-value>
+ </assignment>
+ <assignment start-index="170" stop-index="188">
+ <column name="title" start-index="170"
stop-index="177">
+ <owner name="pt" start-index="170"
stop-index="171" />
+ </column>
+ <assignment-value>
+ <column name="title" start-index="181"
stop-index="188">
+ <owner name="ps" start-index="181"
stop-index="182" />
+ </column>
+ </assignment-value>
+ </assignment>
+ </set>
+ </update>
+ </merge-items>
+ <output start-index="190" stop-index="226">
+ <output-columns start-index="197" stop-index="222">
+ <expression-projection text="$action" start-index="545"
stop-index="551">
+ <expr>
+ <common-expression text="$action" start-index="545"
stop-index="551" />
+ </expr>
+ </expression-projection>
+ </output-columns>
+ </output>
+ </merge>
</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
b/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
index 55883a17e4e..ba5f0c4e741 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/merge.xml
@@ -35,4 +35,5 @@
remark =
?,
status =
?;" db-types="Oracle" />
<sql-case id="merge_into_select" value="MERGE INTO (SELECT * FROM bonuses
WHERE department_id = 80) D USING (SELECT employee_id, salary, department_id
FROM employees WHERE department_id = 80) S ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 DELETE WHERE
(S.salary > 8000)" db-types="Oracle" />
+ <sql-case id="merge_output_with_aaterisk" value="MERGE INTO people_target
pt USING people_source ps ON (pt.person_id = ps.person_id) WHEN MATCHED THEN
UPDATE SET first_name = ps.first_name, pt.last_name = ps.last_name, pt.title =
ps.title OUTPUT deleted.*, $action, inserted.*" db-types="SQLServer" />
</sql-cases>