@@ -3657,31 +3657,12 @@ public void visitQuerySpec(QuerySpec querySpec) {
36573657 this .queryPartForRowNumbering = null ;
36583658 this .queryPartForRowNumberingClauseDepth = -1 ;
36593659 }
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+ );
36853666 queryPartStack .push ( querySpec );
36863667 if ( queryGroupAlias != null ) {
36873668 appendSql ( OPEN_PARENTHESIS );
@@ -3710,6 +3691,40 @@ else if ( !dialect.supportsDuplicateSelectItemsInQueryGroup() ) {
37103691 }
37113692 }
37123693
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+
37133728 protected void visitQueryClauses (QuerySpec querySpec ) {
37143729 visitSelectClause ( querySpec .getSelectClause () );
37153730 visitFromClause ( querySpec .getFromClause () );
0 commit comments