Skip to content

EQL parser rejects reserved words and functions in IN expressions #3834

Closed
@afrunt

Description

@afrunt

EqlParser cannot parse the valid EQL queries. Here are the queries

select f from FooEntity f where upper(f.name) IN :names

select f from FooEntity f where f.size IN :sizes

The demo project is attached

eql-bug-check.zip

Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: At 1:46 and token 'IN', no viable alternative at input 'select f from FooEntity f where upper(f.name) *IN :names'; Bad EQL grammar [select f from FooEntity f where upper(f.name) IN :names]
at org.springframework.data.jpa.repository.query.BadJpqlGrammarErrorListener.syntaxError(BadJpqlGrammarErrorListener.java:53) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.DefaultErrorStrategy.reportNoViableAlternative(DefaultErrorStrategy.java:310) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:136) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.springframework.data.jpa.repository.query.EqlParser.simple_cond_expression(EqlParser.java:5267) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_primary(EqlParser.java:5128) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_factor(EqlParser.java:5076) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_term(EqlParser.java:4994) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_expression(EqlParser.java:4909) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.where_clause(EqlParser.java:3368) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.select_statement(EqlParser.java:423) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.ql_statement(EqlParser.java:322) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.start(EqlParser.java:265) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer.parse(JpaQueryEnhancer.java:101) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.(JpaQueryEnhancer.java:316) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.parseQuery(JpaQueryEnhancer.java:328) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer.forEql(JpaQueryEnhancer.java:177) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.QueryEnhancerFactory.forQuery(QueryEnhancerFactory.java:70) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.StringQuery.(StringQuery.java:98) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.StringQuery.(StringQuery.java:77) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.ExpressionBasedStringQuery.(ExpressionBasedStringQuery.java:65) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.(AbstractStringBasedJpaQuery.java:84) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.(SimpleJpaQuery.java:65) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:49) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:174) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:256) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:99) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:116) ~[spring-data-commons-3.4.4.jar:3.4.4]
... 109 common frames omitted


Caused by: org.springframework.data.jpa.repository.query.BadJpqlGrammarException: At 1:34 and token 'size', no viable alternative at input 'select f from FooEntity f where f.*size IN :sizes'; Bad EQL grammar [select f from FooEntity f where f.size IN :sizes]
at org.springframework.data.jpa.repository.query.BadJpqlGrammarErrorListener.syntaxError(BadJpqlGrammarErrorListener.java:53) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.antlr.v4.runtime.ProxyErrorListener.syntaxError(ProxyErrorListener.java:41) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.Parser.notifyErrorListeners(Parser.java:544) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.DefaultErrorStrategy.reportNoViableAlternative(DefaultErrorStrategy.java:310) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.antlr.v4.runtime.DefaultErrorStrategy.reportError(DefaultErrorStrategy.java:136) ~[antlr4-runtime-4.13.0.jar:4.13.0]
at org.springframework.data.jpa.repository.query.EqlParser.simple_cond_expression(EqlParser.java:5267) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_primary(EqlParser.java:5128) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_factor(EqlParser.java:5076) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_term(EqlParser.java:4994) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.conditional_expression(EqlParser.java:4909) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.where_clause(EqlParser.java:3368) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.select_statement(EqlParser.java:423) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.ql_statement(EqlParser.java:322) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.EqlParser.start(EqlParser.java:265) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer.parse(JpaQueryEnhancer.java:101) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.(JpaQueryEnhancer.java:316) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer$EqlQueryParser.parseQuery(JpaQueryEnhancer.java:328) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryEnhancer.forEql(JpaQueryEnhancer.java:177) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.QueryEnhancerFactory.forQuery(QueryEnhancerFactory.java:70) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.StringQuery.(StringQuery.java:98) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.StringQuery.(StringQuery.java:77) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.ExpressionBasedStringQuery.(ExpressionBasedStringQuery.java:65) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.(AbstractStringBasedJpaQuery.java:84) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.(SimpleJpaQuery.java:65) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:49) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:174) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:256) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:99) ~[spring-data-jpa-3.4.4.jar:3.4.4]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:116) ~[spring-data-commons-3.4.4.jar:3.4.4]
... 109 common frames omitted

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions