Handle backslash characters for LIKE ESCAPE clause.

Hibernate HQL supports using a `\\` as the ESCAPE character so we need to support it in our custom parser.

See #3040
This commit is contained in:
Greg L. Turnquist
2023-06-26 12:07:39 -05:00
parent 37e88e9aa5
commit 37d031e98c
3 changed files with 10 additions and 4 deletions

View File

@@ -605,7 +605,7 @@ dealingWithNullExpression
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate
stringPatternMatching
: expression NOT? (LIKE | ILIKE) expression (ESCAPE (character|parameter))?
: expression NOT? (LIKE | ILIKE) expression (ESCAPE (stringLiteral|parameter))?
;
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices
@@ -1078,7 +1078,7 @@ fragment HEX_DIGIT : [0-9a-fA-F];
CHARACTER : '\'' (~ ('\'' | '\\' )) '\'' ;
STRINGLITERAL : '\'' ('\'' '\'' | ~('\'' | '\\'))* '\'' ;
STRINGLITERAL : '\'' ('\'' '\'' | ~('\''))* '\'' ;
JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
INTEGER_LITERAL : INTEGER_NUMBER (L | B I)? ;
FLOAT_LITERAL : FLOAT_NUMBER (D | F | B D)?;

View File

@@ -2231,8 +2231,9 @@ class HqlQueryRenderer extends HqlBaseVisitor<List<JpaQueryParsingToken>> {
if (ctx.ESCAPE() != null) {
tokens.add(new JpaQueryParsingToken(ctx.ESCAPE()));
if (ctx.character() != null) {
tokens.addAll(visit(ctx.character()));
if (ctx.stringLiteral() != null) {
tokens.addAll(visit(ctx.stringLiteral()));
} else if (ctx.parameter() != null) {
tokens.addAll(visit(ctx.parameter()));
}

View File

@@ -1544,4 +1544,9 @@ class HqlQueryRendererTests {
assertQuery("SELECT ce.id FROM CalendarEvent ce WHERE ce.value = X'DEADBEEF'");
assertQuery("SELECT ce.id FROM CalendarEvent ce WHERE ce.value = x'deadbeef'");
}
@Test // GH-3040
void escapeClauseShouldWork() {
assertQuery("select t.name from SomeDbo t where t.name LIKE :name escape '\\\\'");
}
}