Skip to content

Commit ac436da

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

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
@@ -337,7 +337,7 @@ between_expression
337337
;
338338

339339
in_expression
340-
: (state_valued_path_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
340+
: (string_expression | type_discriminator) (NOT)? IN (('(' in_item (',' in_item)* ')') | ( '(' subquery ')') | collection_valued_input_parameter)
341341
;
342342

343343
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
@@ -1155,8 +1155,8 @@ public QueryTokenStream visitIn_expression(EqlParser.In_expressionContext ctx) {
11551155

11561156
QueryRendererBuilder builder = QueryRenderer.builder();
11571157

1158-
if (ctx.state_valued_path_expression() != null) {
1159-
builder.append(visit(ctx.state_valued_path_expression()));
1158+
if (ctx.string_expression() != null) {
1159+
builder.append(visit(ctx.string_expression()));
11601160
}
11611161
if (ctx.type_discriminator() != null) {
11621162
builder.append(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
@@ -1078,8 +1078,8 @@ public QueryTokenStream visitIn_expression(JpqlParser.In_expressionContext ctx)
10781078

10791079
QueryRendererBuilder builder = QueryRenderer.builder();
10801080

1081-
if (ctx.state_valued_path_expression() != null) {
1082-
builder.appendExpression(visit(ctx.state_valued_path_expression()));
1081+
if (ctx.string_expression() != null) {
1082+
builder.appendExpression(visit(ctx.string_expression()));
10831083
}
10841084
if (ctx.type_discriminator() != null) {
10851085
builder.appendExpression(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
@@ -36,6 +36,7 @@
3636
*
3737
* @author Greg Turnquist
3838
* @author Christoph Strobl
39+
* @author Mark Paluch
3940
*/
4041
class EqlQueryRendererTests {
4142

@@ -1041,12 +1042,14 @@ void lateralShouldBeAValidParameter() {
10411042
assertQuery("select te from TestEntity te where te.lateral = :lateral");
10421043
}
10431044

1044-
@Test
1045+
@Test // GH-3834
10451046
void reservedWordsShouldWork() {
10461047

10471048
assertQuery("select ie from ItemExample ie left join ie.object io where io.externalId = :externalId");
10481049
assertQuery("select ie.object from ItemExample ie left join ie.object io where io.externalId = :externalId");
10491050
assertQuery("select ie from ItemExample ie left join ie.object io where io.object = :externalId");
10501051
assertQuery("select ie from ItemExample ie where ie.status = com.app.domain.object.Status.UP");
1052+
assertQuery("select f from FooEntity f where upper(f.name) IN :names");
1053+
assertQuery("select f from FooEntity f where f.size IN :sizes");
10511054
}
10521055
}

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*
3737
* @author Greg Turnquist
3838
* @author Christoph Strobl
39+
* @author Mark Paluch
3940
* @since 3.1
4041
*/
4142
class JpqlQueryRendererTests {
@@ -1027,7 +1028,7 @@ void entityNameWithPackageContainingReservedWord(String reservedWord) {
10271028
assertQuery(source);
10281029
}
10291030

1030-
@Test
1031+
@Test // GH-3834
10311032
void reservedWordsShouldWork() {
10321033

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

0 commit comments

Comments
 (0)