From 0fa812bd2bb6072a04e42ffce7f10e1fce8b7c24 Mon Sep 17 00:00:00 2001 From: Riccardo Azzolini <103407078+razzolini-qpq@users.noreply.github.com> Date: Wed, 25 May 2022 22:10:38 +0200 Subject: [PATCH] Fix parsing of COLLATE after parentheses in expressions (#507) --- 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 b99d4999d..02a739954 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -525,17 +525,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 760f1d8c4..e931cd96f 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 \