Skip to content

Commit 6f0aa2d

Browse files
committed
Fix JPQL and EQL CAST(…) function parsing.
We now define arithmetic, string, and typed cast functions to support all potential variants of casting supported by JPQL and EQL. Closes #3863
1 parent 77da010 commit 6f0aa2d

File tree

7 files changed

+21
-36
lines changed

7 files changed

+21
-36
lines changed

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

-4
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,6 @@ scalar_expression
314314
| datetime_expression
315315
| boolean_expression
316316
| case_expression
317-
| cast_function
318317
| entity_type_expression
319318
;
320319

@@ -954,7 +953,6 @@ FETCH : F E T C H;
954953
FIRST : F I R S T;
955954
FLOAT : F L O A T;
956955
FLOOR : F L O O R;
957-
FLOAT : F L O A T;
958956
FROM : F R O M;
959957
FUNCTION : F U N C T I O N;
960958
GROUP : G R O U P;
@@ -965,7 +963,6 @@ INNER : I N N E R;
965963
INTEGER : I N T E G E R;
966964
INTERSECT : I N T E R S E C T;
967965
IS : I S;
968-
INTEGER : I N T E G E R;
969966
JOIN : J O I N;
970967
KEY : K E Y;
971968
LAST : L A S T;
@@ -1006,7 +1003,6 @@ SOME : S O M E;
10061003
SQRT : S Q R T;
10071004
STRING : S T R I N G;
10081005
SUBSTRING : S U B S T R I N G;
1009-
STRING : S T R I N G;
10101006
SUM : S U M;
10111007
THEN : T H E N;
10121008
TIME : T I M E;

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

-5
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,6 @@ scalar_expression
307307
| datetime_expression
308308
| boolean_expression
309309
| case_expression
310-
| cast_function
311310
| entity_type_expression
312311
;
313312

@@ -454,7 +453,6 @@ string_expression
454453
| aggregate_expression
455454
| case_expression
456455
| function_invocation
457-
| string_expression op='||' string_expression
458456
| string_cast_function
459457
| type_cast_function
460458
| '(' subquery ')'
@@ -950,7 +948,6 @@ FETCH : F E T C H;
950948
FIRST : F I R S T;
951949
FLOAT : F L O A T;
952950
FLOOR : F L O O R;
953-
FLOAT : F L O A T;
954951
FROM : F R O M;
955952
FUNCTION : F U N C T I O N;
956953
GROUP : G R O U P;
@@ -961,7 +958,6 @@ INNER : I N N E R;
961958
INTEGER : I N T E G E R;
962959
INTERSECT : I N T E R S E C T;
963960
IS : I S;
964-
INTEGER : I N T E G E R;
965961
JOIN : J O I N;
966962
KEY : K E Y;
967963
LAST : L A S T;
@@ -1002,7 +998,6 @@ SOME : S O M E;
1002998
SQRT : S Q R T;
1003999
STRING : S T R I N G;
10041000
SUBSTRING : S U B S T R I N G;
1005-
STRING : S T R I N G;
10061001
SUM : S U M;
10071002
THEN : T H E N;
10081003
TIME : T I M E;

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

+7-9
Original file line numberDiff line numberDiff line change
@@ -1010,8 +1010,6 @@ public QueryTokenStream visitScalar_expression(EqlParser.Scalar_expressionContex
10101010
return visit(ctx.case_expression());
10111011
} else if (ctx.entity_type_expression() != null) {
10121012
return visit(ctx.entity_type_expression());
1013-
} else if (ctx.cast_function() != null) {
1014-
return (visit(ctx.cast_function()));
10151013
}
10161014

10171015
return QueryTokenStream.empty();
@@ -1363,8 +1361,8 @@ public QueryTokenStream visitStringComparison(EqlParser.StringComparisonContext
13631361

13641362
QueryRendererBuilder builder = QueryRenderer.builder();
13651363

1366-
builder.appendExpression(visit(ctx.string_expression(0)));
1367-
builder.appendExpression(visit(ctx.comparison_operator()));
1364+
builder.appendInline(visit(ctx.string_expression(0)));
1365+
builder.appendInline(visit(ctx.comparison_operator()));
13681366

13691367
if (ctx.string_expression(1) != null) {
13701368
builder.appendExpression(visit(ctx.string_expression(1)));
@@ -1420,7 +1418,7 @@ public QueryTokenStream visitDatetimeComparison(EqlParser.DatetimeComparisonCont
14201418
QueryRendererBuilder builder = QueryRenderer.builder();
14211419

14221420
builder.appendInline(visit(ctx.datetime_expression(0)));
1423-
builder.append(QueryTokens.ventilated(ctx.comparison_operator().op));
1421+
builder.appendInline(visit(ctx.comparison_operator()));
14241422

14251423
if (ctx.datetime_expression(1) != null) {
14261424
builder.appendExpression(visit(ctx.datetime_expression(1)));
@@ -1453,8 +1451,8 @@ public QueryTokenStream visitArithmeticComparison(EqlParser.ArithmeticComparison
14531451

14541452
QueryRendererBuilder builder = QueryRenderer.builder();
14551453

1456-
builder.appendExpression(visit(ctx.arithmetic_expression(0)));
1457-
builder.appendExpression(visit(ctx.comparison_operator()));
1454+
builder.appendInline(visit(ctx.arithmetic_expression(0)));
1455+
builder.appendInline(visit(ctx.comparison_operator()));
14581456

14591457
if (ctx.arithmetic_expression(1) != null) {
14601458
builder.appendExpression(visit(ctx.arithmetic_expression(1)));
@@ -1491,7 +1489,7 @@ public QueryTokenStream visitRegexpComparison(EqlParser.RegexpComparisonContext
14911489

14921490
@Override
14931491
public QueryTokenStream visitComparison_operator(EqlParser.Comparison_operatorContext ctx) {
1494-
return QueryTokenStream.ofToken(ctx.op);
1492+
return QueryTokenStream.from(QueryTokens.ventilated(ctx.op));
14951493
}
14961494

14971495
@Override
@@ -2005,7 +2003,7 @@ public QueryTokenStream visitType_cast_function(EqlParser.Type_cast_functionCont
20052003
if (ctx.AS() != null) {
20062004
builder.append(QueryTokens.expression(ctx.AS()));
20072005
}
2008-
builder.appendInline(QueryTokenStream.concat(ctx.identification_variable(), this::visit, TOKEN_SPACE));
2006+
builder.appendInline(visit(ctx.identification_variable()));
20092007

20102008
if (!CollectionUtils.isEmpty(ctx.numeric_literal())) {
20112009

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

+8-12
Original file line numberDiff line numberDiff line change
@@ -985,8 +985,6 @@ public QueryTokenStream visitScalar_expression(JpqlParser.Scalar_expressionConte
985985
return visit(ctx.case_expression());
986986
} else if (ctx.entity_type_expression() != null) {
987987
return visit(ctx.entity_type_expression());
988-
} else if (ctx.cast_function() != null) {
989-
return (visit(ctx.cast_function()));
990988
}
991989

992990
return QueryTokenStream.empty();
@@ -1336,7 +1334,7 @@ public QueryTokenStream visitStringComparison(JpqlParser.StringComparisonContext
13361334
QueryRendererBuilder builder = QueryRenderer.builder();
13371335

13381336
builder.appendInline(visit(ctx.string_expression(0)));
1339-
builder.append(visit(ctx.comparison_operator()));
1337+
builder.appendInline(visit(ctx.comparison_operator()));
13401338

13411339
if (ctx.string_expression(1) != null) {
13421340
builder.append(visit(ctx.string_expression(1)));
@@ -1392,7 +1390,7 @@ public QueryTokenStream visitDatetimeComparison(JpqlParser.DatetimeComparisonCon
13921390
QueryRendererBuilder builder = QueryRenderer.builder();
13931391

13941392
builder.appendInline(visit(ctx.datetime_expression(0)));
1395-
builder.append(QueryTokens.ventilated(ctx.comparison_operator().op));
1393+
builder.appendInline(visit(ctx.comparison_operator()));
13961394

13971395
if (ctx.datetime_expression(1) != null) {
13981396
builder.append(visit(ctx.datetime_expression(1)));
@@ -1425,8 +1423,8 @@ public QueryTokenStream visitArithmeticComparison(JpqlParser.ArithmeticCompariso
14251423

14261424
QueryRendererBuilder builder = QueryRenderer.builder();
14271425

1428-
builder.append(visit(ctx.arithmetic_expression(0)));
1429-
builder.append(visit(ctx.comparison_operator()));
1426+
builder.appendInline(visit(ctx.arithmetic_expression(0)));
1427+
builder.appendInline(visit(ctx.comparison_operator()));
14301428

14311429
if (ctx.arithmetic_expression(1) != null) {
14321430
builder.append(visit(ctx.arithmetic_expression(1)));
@@ -1469,19 +1467,17 @@ public QueryTokenStream visitComparison_operator(JpqlParser.Comparison_operatorC
14691467
@Override
14701468
public QueryTokenStream visitArithmetic_expression(JpqlParser.Arithmetic_expressionContext ctx) {
14711469

1472-
QueryRendererBuilder builder = QueryRenderer.builder();
1473-
14741470
if (ctx.arithmetic_expression() != null) {
14751471

1472+
QueryRendererBuilder builder = QueryRenderer.builder();
14761473
builder.append(visit(ctx.arithmetic_expression()));
1477-
builder.append(QueryTokens.expression(ctx.op));
1474+
builder.append(QueryTokens.ventilated(ctx.op));
14781475
builder.append(visit(ctx.arithmetic_term()));
1476+
return builder;
14791477

14801478
} else {
1481-
builder.append(visit(ctx.arithmetic_term()));
1479+
return visit(ctx.arithmetic_term());
14821480
}
1483-
1484-
return builder;
14851481
}
14861482

14871483
@Override

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
*
2626
* @author Greg Turnquist
2727
*/
28-
public class EqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
28+
class EqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
2929

3030
@Override
3131
QueryEnhancer createQueryEnhancer(DeclaredQuery query) {
3232

33-
assumeThat(query.isNative()).isFalse();
33+
assumeThat(query.isNative()).describedAs("EQL (non-native) only").isFalse();
3434

3535
return JpaQueryEnhancer.forEql(query.getQueryString());
3636
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
*
2626
* @author Greg Turnquist
2727
*/
28-
public class HqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
28+
class HqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
2929

3030
@Override
3131
QueryEnhancer createQueryEnhancer(DeclaredQuery query) {
3232

33-
assumeThat(query.isNative()).isFalse();
33+
assumeThat(query.isNative()).describedAs("HQL (non-native) only").isFalse();
3434

3535
return JpaQueryEnhancer.forHql(query.getQueryString());
3636
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
*
2626
* @author Greg Turnquist
2727
*/
28-
public class JpqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
28+
class JpqlParserQueryEnhancerUnitTests extends QueryEnhancerTckTests {
2929

3030
@Override
3131
QueryEnhancer createQueryEnhancer(DeclaredQuery query) {
3232

33-
assumeThat(query.isNative()).isFalse();
33+
assumeThat(query.isNative()).describedAs("JPQL (non-native) only").isFalse();
3434

3535
return JpaQueryEnhancer.forJpql(query.getQueryString());
3636
}

0 commit comments

Comments
 (0)