Skip to content

Commit 0e158e0

Browse files
committed
HHH-19240 Simplify queryExpression grammar rule
1 parent 0692e0c commit 0e158e0

File tree

2 files changed

+13
-22
lines changed

2 files changed

+13
-22
lines changed

hibernate-core/src/main/antlr/org/hibernate/grammars/hql/HqlParser.g4

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ cycleClause
151151
* A toplevel query of subquery, which may be a union or intersection of subqueries
152152
*/
153153
queryExpression
154-
: withClause? orderedQuery # SimpleQueryGroup
155-
| withClause? orderedQuery (setOperator orderedQuery)+ # SetQueryGroup
154+
: withClause? orderedQuery (setOperator orderedQuery)*
156155
;
157156

158157
/**

hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -755,12 +755,10 @@ public Object visitCte(HqlParser.CteContext ctx) {
755755
final var oldCte = currentPotentialRecursiveCte;
756756
try {
757757
currentPotentialRecursiveCte = null;
758-
if ( queryExpressionContext instanceof HqlParser.SetQueryGroupContext setContext ) {
759-
// A recursive query is only possible if the child count is lower than 5 e.g. `withClause? q1 op q2`
760-
if ( setContext.getChildCount() < 5 ) {
761-
if ( handleRecursive( ctx, setContext, cteContainer, name, cte, materialization ) ) {
762-
return null;
763-
}
758+
// A recursive query is only possible if there are 2 ordered queries e.g. `q1 op q2`
759+
if ( queryExpressionContext.orderedQuery().size() == 2 ) {
760+
if ( handleRecursive( ctx, queryExpressionContext, cteContainer, name, cte, materialization ) ) {
761+
return null;
764762
}
765763
}
766764
queryExpressionContext.accept( this );
@@ -778,7 +776,7 @@ public Object visitCte(HqlParser.CteContext ctx) {
778776

779777
private boolean handleRecursive(
780778
HqlParser.CteContext cteContext,
781-
HqlParser.SetQueryGroupContext setContext,
779+
HqlParser.QueryExpressionContext setContext,
782780
SqmCteContainer cteContainer,
783781
String name,
784782
SqmSelectQuery<Object> cte,
@@ -941,15 +939,6 @@ private static CteSearchClauseKind getCteSearchClauseKind(HqlParser.SearchClause
941939
return ctx.BREADTH() != null ? CteSearchClauseKind.BREADTH_FIRST : CteSearchClauseKind.DEPTH_FIRST;
942940
}
943941

944-
@Override
945-
public SqmQueryPart<?> visitSimpleQueryGroup(HqlParser.SimpleQueryGroupContext ctx) {
946-
final var withClauseContext = ctx.withClause();
947-
if ( withClauseContext != null ) {
948-
withClauseContext.accept( this );
949-
}
950-
return (SqmQueryPart<?>) ctx.orderedQuery().accept( this );
951-
}
952-
953942
@Override
954943
public SqmQueryPart<?> visitQueryOrderExpression(HqlParser.QueryOrderExpressionContext ctx) {
955944
final var sqmQuerySpec = currentQuerySpec();
@@ -986,24 +975,27 @@ public SqmQueryPart<?> visitNestedQueryExpression(HqlParser.NestedQueryExpressio
986975
}
987976

988977
@Override
989-
public SqmQueryGroup<?> visitSetQueryGroup(HqlParser.SetQueryGroupContext ctx) {
978+
public SqmQueryPart<?> visitQueryExpression(HqlParser.QueryExpressionContext ctx) {
990979
var withClauseContext = ctx.withClause();
991980
if ( withClauseContext != null ) {
992981
withClauseContext.accept( this );
993982
}
994-
final var firstQueryPart = (SqmQueryPart<?>) ctx.orderedQuery(0).accept( this );
983+
final var orderedQueryContexts = ctx.orderedQuery();
984+
final var firstQueryPart = (SqmQueryPart<?>) orderedQueryContexts.get( 0 ).accept( this );
985+
if ( orderedQueryContexts.size() == 1 ) {
986+
return firstQueryPart;
987+
}
995988
SqmQueryGroup<?> queryGroup =
996989
firstQueryPart instanceof SqmQueryGroup<?> sqmQueryGroup
997990
? sqmQueryGroup
998991
: new SqmQueryGroup<>( firstQueryPart );
999992
setCurrentQueryPart( queryGroup );
1000-
final var orderedQueryContexts = ctx.orderedQuery();
1001993
final var setOperatorContexts = ctx.setOperator();
1002994
final var firstProcessingState = processingStateStack.pop();
1003995
for ( int i = 0; i < setOperatorContexts.size(); i++ ) {
1004996
queryGroup = getSqmQueryGroup(
1005997
visitSetOperator( setOperatorContexts.get(i) ),
1006-
orderedQueryContexts.get( i+1 ),
998+
orderedQueryContexts.get( i + 1 ),
1007999
queryGroup,
10081000
setOperatorContexts.size(),
10091001
firstProcessingState,

0 commit comments

Comments
 (0)