Fix parsing entity names in HQL query with package names that contain reserved exp keyword.

Resolves: #3451
Original pull request: #3457
This commit is contained in:
Christoph Strobl
2024-04-29 13:24:29 +02:00
committed by Mark Paluch
parent 268809768f
commit f3918d8349
2 changed files with 17 additions and 0 deletions

View File

@@ -737,6 +737,7 @@ reservedWord
| EXCEPT
| EXCLUDE
| EXISTS
| EXP
| EXTRACT
| FETCH
| FILTER

View File

@@ -18,11 +18,15 @@ package org.springframework.data.jpa.repository.query;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.data.jpa.repository.query.JpaQueryParsingToken.*;
import java.util.stream.Stream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
/**
@@ -57,6 +61,10 @@ class HqlQueryRendererTests {
return render(new HqlQueryRenderer().visit(parsedQuery));
}
public static Stream<Arguments> reservedWords() {
return Stream.of("abs", "exp", "any", "case", "else", "index", "time").map(Arguments::of);
}
private void assertQuery(String query) {
String slimmedDownQuery = reduceWhitespace(query);
@@ -1661,4 +1669,12 @@ class HqlQueryRendererTests {
void signedExpressionsShouldWork(String query) {
assertQuery(query);
}
@ParameterizedTest // GH-3451
@MethodSource({"reservedWords"})
void entityNameWithPackageContainingReservedWord(String reservedWord) {
String source = "select new com.company.%s.thing.stuff.ClassName(e.id) from Experience e".formatted(reservedWord);
assertQuery(source);
}
}