From 1610f6b87123d59c9c4041fa23ee6bcdef323a1e Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 20 Dec 2023 10:29:39 +0100 Subject: [PATCH] Fix JPQL long literal parsing. Closes #3308 Original pull request: #3280 --- .../org/springframework/data/jpa/repository/query/Jpql.g4 | 4 ++++ .../data/jpa/repository/query/JpqlQueryRenderer.java | 5 +++++ .../repository/query/JSqlParserQueryEnhancerUnitTests.java | 3 +++ 3 files changed, 12 insertions(+) diff --git a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4 b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4 index 637bac6c3..fe1e502a6 100644 --- a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4 +++ b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4 @@ -23,6 +23,7 @@ grammar Jpql; * * @see https://github.com/jakartaee/persistence/blob/master/spec/src/main/asciidoc/ch04-query-language.adoc#bnf * @author Greg Turnquist + * @author Christoph Strobl * @since 3.1 */ } @@ -621,6 +622,7 @@ literal : STRINGLITERAL | INTLITERAL | FLOATLITERAL + | LONGLITERAL | boolean_literal | entity_type_literal ; @@ -650,6 +652,7 @@ escape_character numeric_literal : INTLITERAL | FLOATLITERAL + | LONGLITERAL ; boolean_literal @@ -855,3 +858,4 @@ IDENTIFICATION_VARIABLE : ('a' .. 'z' | 'A' .. 'Z' | '\u0080' .. '\ufffe' | STRINGLITERAL : '\'' (~ ('\'' | '\\'))* '\'' ; FLOATLITERAL : ('0' .. '9')* '.' ('0' .. '9')+ (E '0' .. '9')* ; INTLITERAL : ('0' .. '9')+ ; +LONGLITERAL : ('0' .. '9')+L ; diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java index 9ca4d6fd2..c07811bd7 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java @@ -24,6 +24,7 @@ import java.util.List; * An ANTLR {@link org.antlr.v4.runtime.tree.ParseTreeVisitor} that renders a JPQL query without making any changes. * * @author Greg Turnquist + * @author Christoph Strobl * @since 3.1 */ class JpqlQueryRenderer extends JpqlBaseVisitor> { @@ -2155,6 +2156,8 @@ class JpqlQueryRenderer extends JpqlBaseVisitor> { tokens.add(new JpaQueryParsingToken(ctx.INTLITERAL())); } else if (ctx.FLOATLITERAL() != null) { tokens.add(new JpaQueryParsingToken(ctx.FLOATLITERAL())); + } else if(ctx.LONGLITERAL() != null) { + tokens.add(new JpaQueryParsingToken(ctx.LONGLITERAL())); } else if (ctx.boolean_literal() != null) { tokens.addAll(visit(ctx.boolean_literal())); } else if (ctx.entity_type_literal() != null) { @@ -2215,6 +2218,8 @@ class JpqlQueryRenderer extends JpqlBaseVisitor> { return List.of(new JpaQueryParsingToken(ctx.INTLITERAL())); } else if (ctx.FLOATLITERAL() != null) { return List.of(new JpaQueryParsingToken(ctx.FLOATLITERAL())); + } else if(ctx.LONGLITERAL() != null) { + return List.of(new JpaQueryParsingToken(ctx.LONGLITERAL())); } else { return List.of(); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerUnitTests.java index 5cbcda1a5..639a156bf 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancerUnitTests.java @@ -32,6 +32,7 @@ import org.springframework.data.domain.Sort; * @author Mark Paluch * @author Diego Krupitza * @author Geoffrey Deremetz + * @author Christoph Strobl */ public class JSqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests { @@ -49,6 +50,8 @@ public class JSqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests { assumeThat(query).as("JSQLParser does not support constructor JPQL syntax").doesNotContain(" new "); + assumeThat(query).as("JSQLParser does not support MOD JPQL syntax").doesNotContain("MOD("); + super.shouldDeriveJpqlCountQuery(query, expected); }