Skip to content

Commit 0f1f4ca

Browse files
committed
Handle spacing in GROUP BY parsing
1 parent 1b45909 commit 0f1f4ca

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

yardstick-rs/src/sql/measures.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
871886
struct 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

Comments
 (0)