From 186c81e8f879d7ea2a0eac702e1062217f7bd03c Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini Date: Tue, 24 May 2022 15:21:13 +0200 Subject: [PATCH] Fix parsing of COLLATE after parentheses in expressions --- src/parser.rs | 21 +++++++++++---------- tests/sqlparser_common.rs | 9 +++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 6a3c9c442..9d7df213f 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -520,17 +520,18 @@ impl<'a> Parser<'a> { }; self.expect_token(&Token::RParen)?; if !self.consume_token(&Token::Period) { - return Ok(expr); + Ok(expr) + } else { + let tok = self.next_token(); + let key = match tok { + Token::Word(word) => word.to_ident(), + _ => return parser_err!(format!("Expected identifier, found: {}", tok)), + }; + Ok(Expr::CompositeAccess { + expr: Box::new(expr), + key, + }) } - let tok = self.next_token(); - let key = match tok { - Token::Word(word) => word.to_ident(), - _ => return parser_err!(format!("Expected identifier, found: {}", tok)), - }; - Ok(Expr::CompositeAccess { - expr: Box::new(expr), - key, - }) } Token::Placeholder(_) => { self.prev_token(); diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 46d824175..0b8a3fe93 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -561,6 +561,15 @@ fn parse_collate() { ); } +#[test] +fn parse_collate_after_parens() { + let sql = "SELECT (name) COLLATE \"de_DE\" FROM customer"; + assert_matches!( + only(&all_dialects().verified_only_select(sql).projection), + SelectItem::UnnamedExpr(Expr::Collate { .. }) + ); +} + #[test] fn parse_select_string_predicate() { let sql = "SELECT id, fname, lname FROM customer \