diff --git a/src/parser/mod.rs b/src/parser/mod.rs index c23b27053..5d827888e 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -3101,6 +3101,21 @@ impl<'a> Parser<'a> { trim_where = Some(self.parse_trim_where()?); } } + if self.dialect.supports_comma_separated_trim() && self.parse_keyword(Keyword::FROM) { + let expr = self.parse_expr()?; + let trim_characters = if self.consume_token(&Token::Comma) { + Some(self.parse_comma_separated(Parser::parse_expr)?) + } else { + None + }; + self.expect_token(&Token::RParen)?; + return Ok(Expr::Trim { + expr: Box::new(expr), + trim_where, + trim_what: None, + trim_characters, + }); + } let expr = self.parse_expr()?; if self.parse_keyword(Keyword::FROM) { let trim_what = Box::new(expr); @@ -3118,7 +3133,7 @@ impl<'a> Parser<'a> { self.expect_token(&Token::RParen)?; Ok(Expr::Trim { expr: Box::new(expr), - trim_where: None, + trim_where, trim_what: None, trim_characters: Some(characters), }) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 29b060a82..e1382a9c7 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -8528,6 +8528,11 @@ fn parse_trim() { expr_from_projection(only(&select.projection)) ); + dialects.one_statement_parses_to( + "SELECT TRIM(BOTH FROM 'yxTomxx', 'xyz')", + "SELECT TRIM(BOTH 'yxTomxx', 'xyz')", + ); + // dialects without comma-style TRIM syntax should fail let unsupported_dialects = all_dialects_where(|d| !d.supports_comma_separated_trim()); assert_eq!( @@ -8536,6 +8541,12 @@ fn parse_trim() { .parse_sql_statements("SELECT TRIM('xyz', 'a')") .unwrap_err() ); + assert_eq!( + ParserError::ParserError("Expected: ), found: 'xyz'".to_owned()), + unsupported_dialects + .parse_sql_statements("SELECT TRIM(FROM 'xyz')") + .unwrap_err() + ); } #[test] diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 8f390b5ea..5cc4b04a5 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -9931,3 +9931,8 @@ fn parse_non_reserved_keywords_as_table_alias() { )); } } + +#[test] +fn parse_trim_from_without_characters() { + pg().one_statement_parses_to("SELECT TRIM(FROM ' x ')", "SELECT TRIM(' x ')"); +}