Skip to content

Commit f67dd9b

Browse files
committed
Backoff JSqlParserQueryEnhancer if query type is not a supported query type.
We now backoff from enhancing queries if the query type is not supported (e.g. TRUNCATE). Closes #3038
1 parent bcddc94 commit f67dd9b

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private ParsedType detectParsedType() {
9696
} else if (statement instanceof Merge) {
9797
return ParsedType.MERGE;
9898
} else {
99-
return ParsedType.SELECT;
99+
return ParsedType.OTHER;
100100
}
101101
} catch (JSQLParserException e) {
102102
throw new IllegalArgumentException("The query you provided is not a valid SQL Query!", e);
@@ -314,10 +314,10 @@ private String detectAlias(String query) {
314314
Select selectStatement = parseSelectStatement(query);
315315

316316
/*
317-
For all the other types ({@link ValuesStatement} and {@link SetOperationList}) it does not make sense to provide
318-
alias since:
319-
* ValuesStatement has no alias
320-
* SetOperation can have multiple alias for each operation item
317+
* For all the other types ({@link ValuesStatement} and {@link SetOperationList}) it does not make sense to provide
318+
* alias since:
319+
* ValuesStatement has no alias
320+
* SetOperation can have multiple alias for each operation item
321321
*/
322322
if (!(selectStatement.getSelectBody() instanceof PlainSelect)) {
323323
return null;
@@ -516,10 +516,11 @@ public DeclaredQuery getQuery() {
516516
* <li>{@code ParsedType.SELECT}: means the top level statement is {@link Select}</li>
517517
* <li>{@code ParsedType.INSERT}: means the top level statement is {@link Insert}</li>
518518
* <li>{@code ParsedType.MERGE}: means the top level statement is {@link Merge}</li>
519+
* <li>{@code ParsedType.OTHER}: means the top level statement is a different top-level type</li>
519520
* </ul>
520521
*/
521522
enum ParsedType {
522-
DELETE, UPDATE, SELECT, INSERT, MERGE;
523+
DELETE, UPDATE, SELECT, INSERT, MERGE, OTHER;
523524
}
524525

525526
}

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

+17
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,23 @@ void multipleWithStatementsWorks() {
191191
assertThat(queryEnhancer.hasConstructorExpression()).isFalse();
192192
}
193193

194+
@Test // GH-3038
195+
void truncateStatementShouldWork() {
196+
197+
StringQuery stringQuery = new StringQuery("TRUNCATE TABLE foo", true);
198+
QueryEnhancer queryEnhancer = QueryEnhancerFactory.forQuery(stringQuery);
199+
200+
assertThat(stringQuery.getAlias()).isNull();
201+
assertThat(stringQuery.getProjection()).isEmpty();
202+
assertThat(stringQuery.hasConstructorExpression()).isFalse();
203+
204+
assertThat(queryEnhancer.applySorting(Sort.by("day").descending())).isEqualTo("TRUNCATE TABLE foo");
205+
assertThat(queryEnhancer.getJoinAliases()).isEmpty();
206+
assertThat(queryEnhancer.detectAlias()).isNull();
207+
assertThat(queryEnhancer.getProjection()).isEmpty();
208+
assertThat(queryEnhancer.hasConstructorExpression()).isFalse();
209+
}
210+
194211
@ParameterizedTest // GH-2641
195212
@MethodSource("mergeStatementWorksSource")
196213
void mergeStatementWorksWithJSqlParser(String query, String alias) {

0 commit comments

Comments
 (0)