Browse Source

Fix HQL rendering of CTE with CYCLE clause.

Ensure SET identifier is an expression.

Closes #4012
pull/4129/head
Mark Paluch 5 months ago
parent
commit
3f8a8cd413
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 8
      spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java
  2. 25
      spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java

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

@ -195,22 +195,22 @@ class HqlQueryRenderer extends HqlBaseVisitor<QueryTokenStream> { @@ -195,22 +195,22 @@ class HqlQueryRenderer extends HqlBaseVisitor<QueryTokenStream> {
QueryRendererBuilder builder = QueryRenderer.builder();
builder.append(QueryTokens.expression(ctx.CYCLE().getText()));
builder.append(visit(ctx.cteAttributes()));
builder.appendExpression(visit(ctx.cteAttributes()));
builder.append(QueryTokens.expression(ctx.SET().getText()));
builder.append(visit(ctx.identifier(0)));
builder.appendExpression(visit(ctx.identifier(0)));
if (ctx.TO() != null) {
builder.append(QueryTokens.expression(ctx.TO().getText()));
builder.append(visit(ctx.literal(0)));
builder.append(QueryTokens.expression(ctx.DEFAULT().getText()));
builder.append(visit(ctx.literal(1)));
builder.appendExpression(visit(ctx.literal(1)));
}
if (ctx.USING() != null) {
builder.append(QueryTokens.expression(ctx.USING().getText()));
builder.append(visit(ctx.identifier(1)));
builder.appendExpression(visit(ctx.identifier(1)));
}
return builder;

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

@ -1730,6 +1730,31 @@ class HqlQueryRendererTests { @@ -1730,6 +1730,31 @@ class HqlQueryRendererTests {
""");
}
@Test // GH-4012
void cteWithSearch() {
assertQuery("""
WITH Tree AS (SELECT o.uuid AS test_uuid FROM DemoEntity o)
SEARCH BREADTH FIRST BY foo ASC NULLS FIRST, bar DESC NULLS LAST SET baz
SELECT test_uuid FROM Tree
""");
}
@Test // GH-4012
void cteWithCycle() {
assertQuery("""
WITH Tree AS (SELECT o.uuid AS test_uuid FROM DemoEntity o) CYCLE test_uuid SET circular TO true DEFAULT false
SELECT test_uuid FROM Tree
""");
assertQuery(
"""
WITH Tree AS (SELECT o.uuid AS test_uuid FROM DemoEntity o) CYCLE test_uuid SET circular TO true DEFAULT false USING bar
SELECT test_uuid FROM Tree
""");
}
@Test // GH-2982
void floorShouldBeValidEntityName() {

Loading…
Cancel
Save