@@ -868,6 +868,21 @@ fn matches_keyword_at(upper: &str, idx: usize, keyword: &str) -> bool {
868868 is_boundary_char ( prev) && is_boundary_char ( next)
869869}
870870
871+ fn advance_after_group_by ( query : & str , group_pos : usize ) -> Option < usize > {
872+ let upper = query. to_uppercase ( ) ;
873+ let mut idx = group_pos;
874+ if !matches_keyword_at ( & upper, idx, "GROUP" ) {
875+ return None ;
876+ }
877+ idx += "GROUP" . len ( ) ;
878+ idx = skip_whitespace ( query, idx) ;
879+ if !matches_keyword_at ( & upper, idx, "BY" ) {
880+ return None ;
881+ }
882+ idx += "BY" . len ( ) ;
883+ Some ( skip_whitespace ( query, idx) )
884+ }
885+
871886struct CteExpansion {
872887 sql : String ,
873888 had_aggregate : bool ,
@@ -1110,7 +1125,8 @@ fn extract_view_group_by_cols(view_query: &str) -> Vec<String> {
11101125 None => return Vec :: new ( ) ,
11111126 } ;
11121127
1113- let start = group_pos + "GROUP BY" . len ( ) ;
1128+ let start = advance_after_group_by ( query, group_pos)
1129+ . unwrap_or_else ( || group_pos + "GROUP BY" . len ( ) ) ;
11141130 let end = find_first_top_level_keyword (
11151131 query,
11161132 start,
@@ -3865,7 +3881,8 @@ fn extract_group_by_columns(sql: &str) -> Vec<String> {
38653881
38663882 let query = sql. trim ( ) . trim_end_matches ( ';' ) . trim ( ) ;
38673883 if let Some ( group_by_pos) = find_top_level_keyword ( query, "GROUP BY" , 0 ) {
3868- let start = group_by_pos + "GROUP BY" . len ( ) ;
3884+ let start = advance_after_group_by ( query, group_by_pos)
3885+ . unwrap_or_else ( || group_by_pos + "GROUP BY" . len ( ) ) ;
38693886 let end = find_first_top_level_keyword (
38703887 query,
38713888 start,
0 commit comments