diff --git a/src/parser/mod.rs b/src/parser/mod.rs index f72a91e3f..860f24e4f 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -16854,6 +16854,10 @@ impl<'a> Parser<'a> { Token::Mul => RepetitionQuantifier::ZeroOrMore, Token::Plus => RepetitionQuantifier::OneOrMore, Token::Placeholder(s) if s == "?" => RepetitionQuantifier::AtMostOne, + Token::LBrace if matches!(self.peek_token_ref().token, Token::Minus) => { + self.prev_token(); + return Ok(pattern); + } Token::LBrace => { // quantifier is a range like {n} or {n,} or {,m} or {n,m} let token = self.next_token(); diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index b2632a5da..22a633137 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -13408,6 +13408,15 @@ fn test_match_recognize_patterns() { // exclusion check("{- FOO -}", Exclude(Named(Ident::new("FOO")))); + // exclusion immediately after a symbol is concatenation, not a range quantifier + check( + "S1 {- S2 -}", + Concat(vec![ + Symbol(Named(Ident::new("S1"))), + Exclude(Named(Ident::new("S2"))), + ]), + ); + check( "PERMUTE(A, B, C)", Permute(vec![