Fix parsing of EQL/JPQL using string literals and enums in IN items.

Closes #3835
This commit is contained in:
Mark Paluch
2025-04-14 08:50:46 +02:00
parent ac436da2c8
commit 2016417b63
6 changed files with 57 additions and 5 deletions

View File

@@ -354,7 +354,12 @@ in_expression
in_item
: literal
| string_expression
| boolean_literal
| numeric_literal
| date_time_timestamp_literal
| single_valued_input_parameter
| conditional_expression
;
like_expression

View File

@@ -342,7 +342,12 @@ in_expression
in_item
: literal
| string_expression
| boolean_literal
| numeric_literal
| date_time_timestamp_literal
| single_valued_input_parameter
| conditional_expression
;
like_expression

View File

@@ -1189,15 +1189,23 @@ class EqlQueryRenderer extends EqlBaseVisitor<QueryTokenStream> {
@Override
public QueryTokenStream visitIn_item(EqlParser.In_itemContext ctx) {
QueryRendererBuilder builder = QueryRenderer.builder();
if (ctx.literal() != null) {
builder.append(visit(ctx.literal()));
return visit(ctx.literal());
} else if (ctx.string_expression() != null) {
return visit(ctx.string_expression());
} else if (ctx.boolean_literal() != null) {
return visit(ctx.boolean_literal());
} else if (ctx.numeric_literal() != null) {
return visit(ctx.numeric_literal());
} else if (ctx.date_time_timestamp_literal() != null) {
return visit(ctx.date_time_timestamp_literal());
} else if (ctx.single_valued_input_parameter() != null) {
builder.append(visit(ctx.single_valued_input_parameter()));
return visit(ctx.single_valued_input_parameter());
} else if (ctx.conditional_expression() != null) {
return visit(ctx.conditional_expression());
}
return builder;
return QueryTokenStream.empty();
}
@Override

View File

@@ -1113,8 +1113,18 @@ class JpqlQueryRenderer extends JpqlBaseVisitor<QueryTokenStream> {
if (ctx.literal() != null) {
return visit(ctx.literal());
} else if (ctx.string_expression() != null) {
return visit(ctx.string_expression());
} else if (ctx.boolean_literal() != null) {
return visit(ctx.boolean_literal());
} else if (ctx.numeric_literal() != null) {
return visit(ctx.numeric_literal());
} else if (ctx.date_time_timestamp_literal() != null) {
return visit(ctx.date_time_timestamp_literal());
} else if (ctx.single_valued_input_parameter() != null) {
return visit(ctx.single_valued_input_parameter());
} else if (ctx.conditional_expression() != null) {
return visit(ctx.conditional_expression());
}
return QueryTokenStream.empty();

View File

@@ -555,6 +555,18 @@ class EqlQueryRendererTests {
""");
}
@Test
void inClauseWithFunctionAndLiterals() {
assertQuery("""
select f from FooEntity f where upper(f.name) IN ('Y', 'Basic', 'Remit')
""");
assertQuery(
"""
select count(f) from FooEntity f where f.status IN (com.example.eql_bug_check.entity.FooStatus.FOO, com.example.eql_bug_check.entity.FooStatus.BAR)
""");
}
@Test
void notEqualsForTypeShouldWork() {

View File

@@ -556,6 +556,18 @@ class JpqlQueryRendererTests {
""");
}
@Test
void inClauseWithFunctionAndLiterals() {
assertQuery("""
select f from FooEntity f where upper(f.name) IN ('Y', 'Basic', 'Remit')
""");
assertQuery(
"""
select count(f) from FooEntity f where f.status IN (com.example.eql_bug_check.entity.FooStatus.FOO, com.example.eql_bug_check.entity.FooStatus.BAR)
""");
}
@Test
void notEqualsForTypeShouldWork() {