@@ -1175,6 +1175,14 @@ impl<'a> Parser<'a> {
11751175 ) ,
11761176 } )
11771177 }
1178+ Token :: ExclamationMark if self . dialect . supports_bang_not_operator ( ) => {
1179+ Ok ( Expr :: UnaryOp {
1180+ op : UnaryOperator :: BangNot ,
1181+ expr : Box :: new (
1182+ self . parse_subexpr ( self . dialect . prec_value ( Precedence :: UnaryNot ) ) ?,
1183+ ) ,
1184+ } )
1185+ }
11781186 tok @ Token :: DoubleExclamationMark
11791187 | tok @ Token :: PGSquareRoot
11801188 | tok @ Token :: PGCubeRoot
@@ -1268,7 +1276,6 @@ impl<'a> Parser<'a> {
12681276 }
12691277 _ => self . expected ( "an expression" , next_token) ,
12701278 } ?;
1271-
12721279 if self . parse_keyword ( Keyword :: COLLATE ) {
12731280 Ok ( Expr :: Collate {
12741281 expr : Box :: new ( expr) ,
@@ -2028,6 +2035,13 @@ impl<'a> Parser<'a> {
20282035 }
20292036 }
20302037
2038+ pub fn parse_bang_not ( & mut self ) -> Result < Expr , ParserError > {
2039+ Ok ( Expr :: UnaryOp {
2040+ op : UnaryOperator :: BangNot ,
2041+ expr : Box :: new ( self . parse_subexpr ( self . dialect . prec_value ( Precedence :: UnaryNot ) ) ?) ,
2042+ } )
2043+ }
2044+
20312045 /// Parses fulltext expressions [`sqlparser::ast::Expr::MatchAgainst`]
20322046 ///
20332047 /// # Errors
@@ -2800,11 +2814,40 @@ impl<'a> Parser<'a> {
28002814 format : None ,
28012815 } )
28022816 } else if Token :: ExclamationMark == tok {
2803- // PostgreSQL factorial operation
2804- Ok ( Expr :: UnaryOp {
2805- op : UnaryOperator :: PGPostfixFactorial ,
2806- expr : Box :: new ( expr) ,
2807- } )
2817+ if self . dialect . supports_factorial_operator ( ) {
2818+ match expr {
2819+ Expr :: Value ( _) | Expr :: Identifier ( _) | Expr :: Nested ( _) | Expr :: BinaryOp { ..} => Ok ( Expr :: UnaryOp {
2820+ op : UnaryOperator :: PGPostfixFactorial ,
2821+ expr : Box :: new ( expr) ,
2822+ } ) ,
2823+ _ => {
2824+ self . expected (
2825+ "Value or Identifier or Nested or BinaryOp struct before factorial operator(!)" , self . peek_token ( ) )
2826+ } ,
2827+ }
2828+ } else if self . dialect . supports_bang_not_operator ( ) {
2829+ let token = self . next_token ( ) ;
2830+ match token. token {
2831+ Token :: Word ( _) | Token :: Number ( ..) => Ok ( Expr :: UnaryOp {
2832+ op : UnaryOperator :: BangNot ,
2833+ expr : Box :: new ( expr) ,
2834+ } ) ,
2835+ _ => {
2836+ parser_err ! (
2837+ "current dialect support bang not operator, but with wrong synx" ,
2838+ tok. location
2839+ )
2840+ }
2841+ }
2842+ } else {
2843+ parser_err ! (
2844+ format!(
2845+ "current dialect: {:?} does not support factorial operator or bang not operator" ,
2846+ self . dialect
2847+ ) ,
2848+ self . peek_token( ) . location
2849+ )
2850+ }
28082851 } else if Token :: LBracket == tok {
28092852 if dialect_of ! ( self is PostgreSqlDialect | DuckDbDialect | GenericDialect ) {
28102853 self . parse_subscript ( expr)
0 commit comments