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 370e0b2c878 fix:Support for the PRODUCT aggregate function (#36142) 370e0b2c878 is described below commit 370e0b2c878df43be74b0365e9fdbf5da20093ed Author: cxy <xiaosaxiao...@qq.com> AuthorDate: Fri Aug 1 14:21:28 2025 +0800 fix:Support for the PRODUCT aggregate function (#36142) --- RELEASE-NOTES.md | 1 + .../src/main/antlr4/imports/sqlserver/BaseRule.g4 | 4 +- .../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 4 ++ .../statement/core/enums/AggregationType.java | 2 +- .../parser/src/main/resources/case/dml/select.xml | 52 ++++++++++++++++++++++ .../main/resources/sql/supported/dml/select.xml | 1 + 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index c681ee6d279..285bf72c3af 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -112,6 +112,7 @@ 1. SQL Parser: Support SQL Server the OPENDATASOURCE function in INSERT statements parse - [#36093](https://github.com/apache/shardingsphere/pull/36093) 1. SQL Parser: Support SQL Server the LANGUAGE identifier parse - [#36110](https://github.com/apache/shardingsphere/pull/36110) 1. SQL Parser: Support SQL Server clustered index parse - [#36132](https://github.com/apache/shardingsphere/pull/36132) +1. SQL Parser: Support SQL Server the CATALOG identifier parse - [#36137](https://github.com/apache/shardingsphere/pull/36137) ### Bug Fixes 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 47c5b2b631f..5b764cfced7 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 | TRY_PARSE | HIERARCHYID | PATINDEX | POSITION | FORCESEEK | FORCESCAN | NOEXPAND | SPATIAL_WINDOW_MAX_CELLS | LANGUAGE | CATALOG + | 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 | HIERARCHYID | PATINDEX | POSITION | FORCESEEK | FORCESCAN | NOEXPAND | SPATIAL_WINDOW_MAX_CELLS | LANGUAGE | CATALOG | PRODUCT ; databaseName @@ -315,7 +315,7 @@ aggregationFunction ; aggregationFunctionName - : MAX | MIN | SUM | COUNT | AVG | STRING_AGG + : MAX | MIN | SUM | COUNT | AVG | STRING_AGG | PRODUCT ; distinct 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 fac415d3380..7cb795d0e37 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 @@ -2114,3 +2114,7 @@ REDUCE REDISTRIBUTE : R E D I S T R I B U T E ; + +PRODUCT + : P R O D U C T + ; diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/AggregationType.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/AggregationType.java index c5ad21974c8..fc9996e5243 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/AggregationType.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/enums/AggregationType.java @@ -24,7 +24,7 @@ import java.util.Arrays; */ public enum AggregationType { - MAX, MIN, SUM, COUNT, AVG, BIT_XOR, GROUP_CONCAT; + MAX, MIN, SUM, COUNT, AVG, BIT_XOR, GROUP_CONCAT, PRODUCT; /** * Is aggregation type. 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 feef4846a39..ffbc5c9a1ca 100644 --- a/test/it/parser/src/main/resources/case/dml/select.xml +++ b/test/it/parser/src/main/resources/case/dml/select.xml @@ -11367,4 +11367,56 @@ </expr> </where> </select> + + <select sql-case-id="select_product_function"> + <projections start-index="7" stop-index="125"> + <column-projection name="Name" start-index="7" stop-index="12"> + <owner name="e" start-index="7" stop-index="7"/> + </column-projection> + <aggregation-projection type="PRODUCT" expression="PRODUCT(1 + edh.rateOfReturn) OVER (PARTITION BY e.DepartmentID ORDER BY edh.EffectiveDate)" alias="CompoundedReturn" start-index="15" stop-index="105"> + <parameter> + <binary-operation-expression start-index="21" stop-index="42"> + <left> + <literal-expression value="1" start-index="21" stop-index="21" /> + </left> + <operator>+</operator> + <right> + <column name="rateOfReturn" start-index="23" stop-index="42"> + <owner name="edh" start-index="23" stop-index="25"/> + </column> + </right> + </binary-operation-expression> + </parameter> + </aggregation-projection> + </projections> + <from> + <join-table join-type="INNER"> + <left> + <simple-table name="Employee" alias="e" start-index="132" stop-index="156"> + <owner name="HumanResources" start-index="132" stop-index="145"/> + </simple-table> + </left> + <right> + <simple-table name="EmployeePayHistory" alias="edh" start-index="163" stop-index="199"> + <owner name="HumanResources" start-index="163" stop-index="176"/> + </simple-table> + </right> + <on-condition> + <binary-operation-expression start-index="204" stop-index="244"> + <left> + <column name="BusinessEntityID" start-index="204" stop-index="221"> + <owner name="e" start-index="204" stop-index="204"/> + </column> + </left> + <operator>=</operator> + <right> + <column name="BusinessEntityID" start-index="225" stop-index="244"> + <owner name="edh" start-index="225" stop-index="227"/> + </column> + </right> + </binary-operation-expression> + </on-condition> + </join-table> + </from> + </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 e6cba8fdba1..2e28d0f5efb 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 @@ -356,4 +356,5 @@ <sql-case id="select_language_identifier" value="SELECT counter_name, counter_value FROM sys.dm_external_script_execution_stats WHERE language = 'Python';" db-types="SQLServer"/> <sql-case id="select_with_clustered_index" value="SELECT e.BusinessEntityID FROM Employee e WITH (INDEX = 1) INNER JOIN Person pp ON e.BusinessEntityID = pp.BusinessEntityID WHERE pp.LastName = 'Johnson';" db-types="SQLServer"/> <sql-case id="select_catalog_identifier" value="SELECT catalog.name, catalog.catalog_id, catalog.database_id FROM sys.dm_fts_active_catalogs catalog WHERE catalog.database_id = DB_ID();" db-types="SQLServer"/> + <sql-case id="select_product_function" value="SELECT e.Name, PRODUCT(1 + edh.rateOfReturn) OVER (PARTITION BY e.DepartmentID ORDER BY edh.EffectiveDate) AS CompoundedReturn FROM HumanResources.Employee e JOIN HumanResources.EmployeePayHistory edh ON e.BusinessEntityID = edh.BusinessEntityID;" db-types="SQLServer"/> </sql-cases>