Skip to content

Commit 0fa812b

Browse files
author
Riccardo Azzolini
authored
Fix parsing of COLLATE after parentheses in expressions (#507)
1 parent 901f5b9 commit 0fa812b

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

src/parser.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -525,17 +525,18 @@ impl<'a> Parser<'a> {
525525
};
526526
self.expect_token(&Token::RParen)?;
527527
if !self.consume_token(&Token::Period) {
528-
return Ok(expr);
528+
Ok(expr)
529+
} else {
530+
let tok = self.next_token();
531+
let key = match tok {
532+
Token::Word(word) => word.to_ident(),
533+
_ => return parser_err!(format!("Expected identifier, found: {}", tok)),
534+
};
535+
Ok(Expr::CompositeAccess {
536+
expr: Box::new(expr),
537+
key,
538+
})
529539
}
530-
let tok = self.next_token();
531-
let key = match tok {
532-
Token::Word(word) => word.to_ident(),
533-
_ => return parser_err!(format!("Expected identifier, found: {}", tok)),
534-
};
535-
Ok(Expr::CompositeAccess {
536-
expr: Box::new(expr),
537-
key,
538-
})
539540
}
540541
Token::Placeholder(_) => {
541542
self.prev_token();

tests/sqlparser_common.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,15 @@ fn parse_collate() {
561561
);
562562
}
563563

564+
#[test]
565+
fn parse_collate_after_parens() {
566+
let sql = "SELECT (name) COLLATE \"de_DE\" FROM customer";
567+
assert_matches!(
568+
only(&all_dialects().verified_only_select(sql).projection),
569+
SelectItem::UnnamedExpr(Expr::Collate { .. })
570+
);
571+
}
572+
564573
#[test]
565574
fn parse_select_string_predicate() {
566575
let sql = "SELECT id, fname, lname FROM customer \

0 commit comments

Comments
 (0)