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 e407e9cf055 fix:Support for WITH ROLLUP (#36000)
e407e9cf055 is described below
commit e407e9cf055880864dda6dc3431b8cde42b30771
Author: cxy <[email protected]>
AuthorDate: Tue Jul 15 10:31:13 2025 +0800
fix:Support for WITH ROLLUP (#36000)
* fix:Support for WITH ROLLUP
* Update SQLServerKeyword.g4
---
.../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 2 +-
.../main/antlr4/imports/sqlserver/DMLStatement.g4 | 2 +-
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 4 ++++
.../parser/src/main/resources/case/dml/select.xml | 24 ++++++++++++++++++++++
.../main/resources/sql/supported/dml/select.xml | 1 +
5 files changed, 31 insertions(+), 2 deletions(-)
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 166c6a1b3e7..f2a13558113 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
+ | 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
;
databaseName
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 512743ed3bd..7ae505442e3 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
@@ -199,7 +199,7 @@ whereClause
;
groupByClause
- : GROUP BY orderByItem (COMMA_ orderByItem)*
+ : GROUP BY orderByItem (COMMA_ orderByItem)* (WITH ROLLUP)?
;
havingClause
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 b9492ec1008..ee8093d88b1 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
@@ -2042,3 +2042,7 @@ NTILE
RANK
: R A N K
;
+
+ROLLUP
+ : R O L L U P
+ ;
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 eca53faf6e7..05cfdccad37 100644
--- a/test/it/parser/src/main/resources/case/dml/select.xml
+++ b/test/it/parser/src/main/resources/case/dml/select.xml
@@ -10702,4 +10702,28 @@
</expr>
</where>
</select>
+
+ <select sql-case-id="select_with_rollup">
+ <projections start-index="7" stop-index="83">
+ <column-projection name="SalesQuota" start-index="7"
stop-index="16" />
+ <aggregation-projection type="SUM" expression="SUM(SalesYTD)"
alias="TotalSalesYTD" start-index="19" stop-index="31" />
+ <expression-projection text="GROUPING(SalesQuota)"
alias="Grouping" start-index="50" stop-index="83">
+ <expr>
+ <function start-index="50" stop-index="69"
text="GROUPING(SalesQuota)" function-name="GROUPING">
+ <parameter>
+ <column name="SalesQuota" start-index="59"
stop-index="68" />
+ </parameter>
+ </function>
+ </expr>
+ </expression-projection>
+ </projections>
+ <from>
+ <simple-table name="SalesPerson" start-index="90" stop-index="106">
+ <owner name="Sales" start-index="90" stop-index="94" />
+ </simple-table>
+ </from>
+ <group-by>
+ <column-item name="SalesQuota" order-direction="ASC"
start-index="117" stop-index="126" />
+ </group-by>
+ </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 c97090e97ed..4516ec7eb45 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
@@ -332,4 +332,5 @@
<sql-case id="select_string_left" value="SELECT LEFT('abcdefg',2);"
db-types="SQLServer"/>
<sql-case id="select_ntile_function" value="SELECT NTILE(4) OVER(ORDER BY
SalesYTD DESC) AS Quartile FROM Sales.SalesPerson WHERE TerritoryID IS NOT
NULL;" db-types="SQLServer"/>
<sql-case id="select_rank_function" value="SELECT RANK() OVER (PARTITION
BY LocationID ORDER BY Quantity DESC) AS Rank FROM Production.ProductInventory
WHERE LocationID BETWEEN 3 AND 4;" db-types="SQLServer"/>
+ <sql-case id="select_with_rollup" value="SELECT SalesQuota, SUM(SalesYTD)
'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping' FROM Sales.SalesPerson
GROUP BY SalesQuota WITH ROLLUP;" db-types="SQLServer"/>
</sql-cases>