@@ -3657,31 +3657,12 @@ public void visitQuerySpec(QuerySpec querySpec) {
3657
3657
this .queryPartForRowNumbering = null ;
3658
3658
this .queryPartForRowNumberingClauseDepth = -1 ;
3659
3659
}
3660
- String queryGroupAlias = null ;
3661
- if ( currentQueryPart instanceof QueryGroup ) {
3662
- // We always need query wrapping if we are in a query group and this query spec has a fetch or order by
3663
- // clause, because of order by precedence in SQL
3664
- if ( querySpec .hasOffsetOrFetchClause () || querySpec .hasSortSpecifications () ) {
3665
- queryGroupAlias = "" ;
3666
- // If the parent is a query group with a fetch clause we must use a select wrapper,
3667
- // or if the database does not support simple query grouping, we must use a select wrapper
3668
- if ( ( !dialect .supportsSimpleQueryGrouping () || currentQueryPart .hasOffsetOrFetchClause () )
3669
- // We can skip it though if this query spec is being row numbered,
3670
- // because then we already have a wrapper
3671
- && queryPartForRowNumbering != querySpec ) {
3672
- queryGroupAlias = " grp_" + queryGroupAliasCounter + '_' ;
3673
- queryGroupAliasCounter ++;
3674
- appendSql ( "select" );
3675
- appendSql ( queryGroupAlias );
3676
- appendSql ( ".* from " );
3677
- // We need to assign aliases when we render a query spec as subquery to avoid clashing aliases
3678
- this .needsSelectAliases = this .needsSelectAliases || hasDuplicateSelectItems ( querySpec );
3679
- }
3680
- else if ( !dialect .supportsDuplicateSelectItemsInQueryGroup () ) {
3681
- this .needsSelectAliases = this .needsSelectAliases || hasDuplicateSelectItems ( querySpec );
3682
- }
3683
- }
3684
- }
3660
+ final String queryGroupAlias =
3661
+ wrapQueryPartsIfNecessary (
3662
+ querySpec ,
3663
+ currentQueryPart ,
3664
+ queryPartForRowNumbering
3665
+ );
3685
3666
queryPartStack .push ( querySpec );
3686
3667
if ( queryGroupAlias != null ) {
3687
3668
appendSql ( OPEN_PARENTHESIS );
@@ -3710,6 +3691,40 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
3710
3691
}
3711
3692
}
3712
3693
3694
+ private String wrapQueryPartsIfNecessary (
3695
+ QuerySpec querySpec , QueryPart currentQueryPart , QueryPart queryPartForRowNumbering ) {
3696
+ // We always need query wrapping if we are in a query group and if this query
3697
+ // spec has a fetch or order by clause, because of order by precedence in SQL
3698
+ if ( currentQueryPart instanceof QueryGroup
3699
+ && ( querySpec .hasOffsetOrFetchClause () || querySpec .hasSortSpecifications () ) ) {
3700
+ // If the parent is a query group with a fetch clause, we must use a select wrapper
3701
+ // Or, if the database does not support simple query grouping, we must use a select wrapper
3702
+ if ( ( !dialect .supportsSimpleQueryGrouping () || currentQueryPart .hasOffsetOrFetchClause () )
3703
+ // We can skip it though if this query spec is being row numbered,
3704
+ // because then we already have a wrapper
3705
+ && queryPartForRowNumbering != querySpec ) {
3706
+ final String queryGroupAlias = " grp_" + queryGroupAliasCounter + '_' ;
3707
+ queryGroupAliasCounter ++;
3708
+ appendSql ( "select" );
3709
+ appendSql ( queryGroupAlias );
3710
+ appendSql ( ".* from " );
3711
+ // We need to assign aliases when we render a query spec as subquery to avoid clashing aliases
3712
+ this .needsSelectAliases = this .needsSelectAliases || hasDuplicateSelectItems ( querySpec );
3713
+ return queryGroupAlias ;
3714
+ }
3715
+ else if ( !dialect .supportsDuplicateSelectItemsInQueryGroup () ) {
3716
+ this .needsSelectAliases = this .needsSelectAliases || hasDuplicateSelectItems ( querySpec );
3717
+ return "" ;
3718
+ }
3719
+ else {
3720
+ return "" ;
3721
+ }
3722
+ }
3723
+ else {
3724
+ return null ;
3725
+ }
3726
+ }
3727
+
3713
3728
protected void visitQueryClauses (QuerySpec querySpec ) {
3714
3729
visitSelectClause ( querySpec .getSelectClause () );
3715
3730
visitFromClause ( querySpec .getFromClause () );
0 commit comments