Skip to content

EQL Parser fails using nested aggregation function arguments #4013

@vhbcm

Description

@vhbcm

We are having issues with this query with the latest update to 2024.1.9 Spring Data. This is with EclipseLink.

SELECT MAX(MOD(e.salary, 10)), e.address.city FROM Employee e GROUP BY e.address.city

The exception call stack when running in the test suite of spring-data-jpa is

org.springframework.data.jpa.repository.query.BadJpqlGrammarException: At 1:11 and token 'MOD', no viable alternative at input 'SELECT MAX(*MOD(e.salary, 10)), e.address.city FROM Employee e GROUP BY e.address.city'; Bad EQL grammar [SELECT MAX(MOD(e.salary, 10)), e.address.city FROM Employee e GROUP BY e.address.city]

	at org.springframework.data.jpa.repository.query.BadJpqlGrammarErrorListener.syntaxError(BadJpqlGrammarErrorListener.java:53)
	at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41)
	at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544)
	at org.antlr.v4.runtime.DefaultErrorStrategy.reportNoViableAlternative(DefaultErrorStrategy.java:310)
	at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:136)
	at org.springframework.data.jpa.repository.query.EqlParser.select_expression(EqlParser.java:3215)
	at org.springframework.data.jpa.repository.query.EqlParser.select_item(EqlParser.java:3085)
	at org.springframework.data.jpa.repository.query.EqlParser.select_clause(EqlParser.java:3020)
	at org.springframework.data.jpa.repository.query.EqlParser.select_statement(EqlParser.java:460)
	at org.springframework.data.jpa.repository.query.EqlParser.ql_statement(EqlParser.java:329)
	at org.springframework.data.jpa.repository.query.EqlParser.start(EqlParser.java:271)
	at org.springframework.data.jpa.repository.query.JpaQueryEnhancer.parse(JpaQueryEnhancer.java:101)
	at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.<init>(JpaQueryEnhancer.java:291)
	at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.parseQuery(JpaQueryEnhancer.java:303)
	at org.springframework.data.jpa.repository.query.EqlQueryRendererTests.parseWithoutChanges(EqlQueryRendererTests.java:50)
	at org.springframework.data.jpa.repository.query.EqlQueryRendererTests.assertQuery(EqlQueryRendererTests.java:62)
	at org.springframework.data.jpa.repository.query.EqlQueryRendererTests.groupByClause(EqlQueryRendererTests.java:165)

This was tested with this patch:

diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java
index a98a01adc..e30450271 100644
--- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java
+++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java
@@ -162,6 +162,7 @@ class EqlQueryRendererTests {
        void groupByClause() {
 
                assertQuery("SELECT AVG(e.salary), e.address.city FROM Employee e GROUP BY e.address.city");
+               assertQuery("SELECT MAX(MOD(e.salary, 10)), e.address.city FROM Employee e GROUP BY e.address.city");
                assertQuery("SELECT e, COUNT(p) FROM Employee e LEFT JOIN e.projects p GROUP BY e");
        }

Metadata

Metadata

Assignees

Labels

type: regressionA regression from a previous release

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions