@@ -1175,30 +1175,40 @@ else if ( fetchClauseContext == null ) {
1175
1175
public SqmQuerySpec <?> visitQuery (HqlParser .QueryContext ctx ) {
1176
1176
final SqmQuerySpec <?> sqmQuerySpec = currentQuerySpec ();
1177
1177
1178
+ final HqlParser .FromClauseContext fromClauseContext = ctx .fromClause ();
1179
+ final HqlParser .WhereClauseContext whereClauseContext = ctx .whereClause ();
1180
+ final HqlParser .GroupByClauseContext groupByClauseContext = ctx .groupByClause ();
1181
+ final HqlParser .HavingClauseContext havingClauseContext = ctx .havingClause ();
1182
+ final HqlParser .SelectClauseContext selectClauseContext = ctx .selectClause ();
1183
+
1184
+ if ( havingClauseContext != null && groupByClauseContext == null ) {
1185
+ throw new SemanticException ( "Query has 'having' but no 'group by'" , query );
1186
+ }
1187
+
1178
1188
// visit from clause first!!!
1179
1189
final SqmFromClause fromClause =
1180
- ctx . fromClause () == null
1181
- ? buildInferredFromClause ( ctx . selectClause () )
1182
- : visitFromClause ( ctx . fromClause () );
1190
+ fromClauseContext == null
1191
+ ? buildInferredFromClause ( selectClauseContext )
1192
+ : visitFromClause ( fromClauseContext );
1183
1193
sqmQuerySpec .setFromClause ( fromClause );
1184
1194
1185
1195
final SqmSelectClause selectClause =
1186
- ctx . selectClause () == null
1196
+ selectClauseContext == null
1187
1197
? buildInferredSelectClause ( fromClause )
1188
- : visitSelectClause ( ctx . selectClause () );
1198
+ : visitSelectClause ( selectClauseContext );
1189
1199
sqmQuerySpec .setSelectClause ( selectClause );
1190
1200
1191
- final SqmWhereClause whereClause = new SqmWhereClause ( creationContext . getNodeBuilder () );
1192
- if ( ctx . whereClause () != null ) {
1193
- whereClause .setPredicate ( (SqmPredicate ) ctx . whereClause () .accept ( this ) );
1201
+ final SqmWhereClause whereClause = new SqmWhereClause ( nodeBuilder () );
1202
+ if ( whereClauseContext != null ) {
1203
+ whereClause .setPredicate ( (SqmPredicate ) whereClauseContext .accept ( this ) );
1194
1204
}
1195
1205
sqmQuerySpec .setWhereClause ( whereClause );
1196
1206
1197
- if ( ctx . groupByClause () != null ) {
1198
- sqmQuerySpec .setGroupByClauseExpressions ( visitGroupByClause ( ctx . groupByClause () ) );
1207
+ if ( groupByClauseContext != null ) {
1208
+ sqmQuerySpec .setGroupByClauseExpressions ( visitGroupByClause ( groupByClauseContext ) );
1199
1209
}
1200
- if ( ctx . havingClause () != null ) {
1201
- sqmQuerySpec .setHavingClausePredicate ( visitHavingClause ( ctx . havingClause () ) );
1210
+ if ( havingClauseContext != null ) {
1211
+ sqmQuerySpec .setHavingClausePredicate ( visitHavingClause ( havingClauseContext ) );
1202
1212
}
1203
1213
1204
1214
return sqmQuerySpec ;
0 commit comments