Skip to content

Commit ac4c6e6

Browse files
committed
Accept functions and paths with reserved words (string expressions) in EQL IN expressions.
Closes #3834
1 parent e101ce4 commit ac4c6e6

File tree

6 files changed

+12
-8
lines changed

6 files changed

+12
-8
lines changed

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Eql.g4

+1-1
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ between_expression
349349
;
350350

351351
in_expression
352-
: (state_valued_path_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
352+
: (string_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
353353
;
354354

355355
in_item

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Jpql.g4

+1-1
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ between_expression
333333
;
334334

335335
in_expression
336-
: (state_valued_path_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
336+
: (string_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
337337
;
338338

339339
in_item

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/EqlQueryRenderer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1228,8 +1228,8 @@ public List<JpaQueryParsingToken> visitIn_expression(EqlParser.In_expressionCont
12281228

12291229
List<JpaQueryParsingToken> tokens = new ArrayList<>();
12301230

1231-
if (ctx.state_valued_path_expression() != null) {
1232-
tokens.addAll(visit(ctx.state_valued_path_expression()));
1231+
if (ctx.string_expression() != null) {
1232+
tokens.addAll(visit(ctx.string_expression()));
12331233
}
12341234
if (ctx.type_discriminator() != null) {
12351235
tokens.addAll(visit(ctx.type_discriminator()));

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpqlQueryRenderer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1149,8 +1149,8 @@ public List<JpaQueryParsingToken> visitIn_expression(JpqlParser.In_expressionCon
11491149

11501150
List<JpaQueryParsingToken> tokens = new ArrayList<>();
11511151

1152-
if (ctx.state_valued_path_expression() != null) {
1153-
tokens.addAll(visit(ctx.state_valued_path_expression()));
1152+
if (ctx.string_expression() != null) {
1153+
tokens.addAll(visit(ctx.string_expression()));
11541154
}
11551155
if (ctx.type_discriminator() != null) {
11561156
tokens.addAll(visit(ctx.type_discriminator()));

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/EqlQueryRendererTests.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*
3838
* @author Greg Turnquist
3939
* @author Christoph Strobl
40+
* @author Mark Paluch
4041
*/
4142
class EqlQueryRendererTests {
4243

@@ -1032,12 +1033,14 @@ void lateralShouldBeAValidParameter() {
10321033
assertQuery("select te from TestEntity te where te.lateral = :lateral");
10331034
}
10341035

1035-
@Test
1036+
@Test // GH-3834
10361037
void reservedWordsShouldWork() {
10371038

10381039
assertQuery("select ie from ItemExample ie left join ie.object io where io.externalId = :externalId");
10391040
assertQuery("select ie.object from ItemExample ie left join ie.object io where io.externalId = :externalId");
10401041
assertQuery("select ie from ItemExample ie left join ie.object io where io.object = :externalId");
10411042
assertQuery("select ie from ItemExample ie where ie.status = com.app.domain.object.Status.UP");
1043+
assertQuery("select f from FooEntity f where upper(f.name) IN :names");
1044+
assertQuery("select f from FooEntity f where f.size IN :sizes");
10421045
}
10431046
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/JpqlQueryRendererTests.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
*
3838
* @author Greg Turnquist
3939
* @author Christoph Strobl
40+
* @author Mark Paluch
4041
* @since 3.1
4142
*/
4243
class JpqlQueryRendererTests {
@@ -1033,7 +1034,7 @@ void entityNameWithPackageContainingReservedWord(String reservedWord) {
10331034
assertQuery(source);
10341035
}
10351036

1036-
@Test
1037+
@Test // GH-3834
10371038
void reservedWordsShouldWork() {
10381039

10391040
assertQuery("select ie from ItemExample ie left join ie.object io where io.externalId = :externalId");

0 commit comments

Comments
 (0)