@@ -11532,3 +11532,113 @@ fn test_select_top() {
1153211532 dialects. verified_stmt ( "SELECT TOP 3 DISTINCT * FROM tbl" ) ;
1153311533 dialects. verified_stmt ( "SELECT TOP 3 DISTINCT a, b, c FROM tbl" ) ;
1153411534}
11535+
11536+ #[ test]
11537+ fn parse_bang_not ( ) {
11538+ let dialects = all_dialects_where ( |d| d. supports_bang_not_operator ( ) ) ;
11539+ let sql = "SELECT !a, !(b > 3)" ;
11540+ let Select { projection, .. } = dialects. verified_only_select ( sql) ;
11541+
11542+ for ( i, expr) in [
11543+ Box :: new ( Expr :: Identifier ( Ident :: new ( "a" ) ) ) ,
11544+ Box :: new ( Expr :: Nested ( Box :: new ( Expr :: BinaryOp {
11545+ left : Box :: new ( Expr :: Identifier ( Ident :: new ( "b" ) ) ) ,
11546+ op : BinaryOperator :: Gt ,
11547+ right : Box :: new ( Expr :: Value ( Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ) ) ,
11548+ } ) ) ) ,
11549+ ]
11550+ . into_iter ( )
11551+ . enumerate ( )
11552+ {
11553+ assert_eq ! (
11554+ SelectItem :: UnnamedExpr ( Expr :: UnaryOp {
11555+ op: UnaryOperator :: BangNot ,
11556+ expr
11557+ } ) ,
11558+ projection[ i]
11559+ )
11560+ }
11561+
11562+ let sql_statements = [ "SELECT a!" , "SELECT a ! b" , "SELECT a ! as b" ] ;
11563+
11564+ for & sql in & sql_statements {
11565+ assert_eq ! (
11566+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11567+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11568+ ) ;
11569+ }
11570+
11571+ let sql_statements = [ "SELECT !a" , "SELECT !a b" , "SELECT !a as b" ] ;
11572+ let dialects = all_dialects_where ( |d| !d. supports_bang_not_operator ( ) ) ;
11573+
11574+ for & sql in & sql_statements {
11575+ assert_eq ! (
11576+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11577+ ParserError :: ParserError ( "Expected: an expression, found: !" . to_string( ) )
11578+ ) ;
11579+ }
11580+ }
11581+
11582+ #[ test]
11583+ fn parse_factorial_operator ( ) {
11584+ let dialects = all_dialects_where ( |d| d. supports_factorial_operator ( ) ) ;
11585+ let sql = "SELECT a!, (b + c)!" ;
11586+ let Select { projection, .. } = dialects. verified_only_select ( sql) ;
11587+
11588+ for ( i, expr) in [
11589+ Box :: new ( Expr :: Identifier ( Ident :: new ( "a" ) ) ) ,
11590+ Box :: new ( Expr :: Nested ( Box :: new ( Expr :: BinaryOp {
11591+ left : Box :: new ( Expr :: Identifier ( Ident :: new ( "b" ) ) ) ,
11592+ op : BinaryOperator :: Plus ,
11593+ right : Box :: new ( Expr :: Identifier ( Ident :: new ( "c" ) ) ) ,
11594+ } ) ) ) ,
11595+ ]
11596+ . into_iter ( )
11597+ . enumerate ( )
11598+ {
11599+ assert_eq ! (
11600+ SelectItem :: UnnamedExpr ( Expr :: UnaryOp {
11601+ op: UnaryOperator :: PGPostfixFactorial ,
11602+ expr
11603+ } ) ,
11604+ projection[ i]
11605+ )
11606+ }
11607+
11608+ let sql_statements = [ "SELECT !a" , "SELECT !a b" , "SELECT !a as b" ] ;
11609+
11610+ for & sql in & sql_statements {
11611+ assert_eq ! (
11612+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11613+ ParserError :: ParserError ( "Expected: an expression, found: !" . to_string( ) )
11614+ ) ;
11615+ }
11616+
11617+ let sql_statements = [ "SELECT a!" , "SELECT a ! b" , "SELECT a ! as b" ] ;
11618+
11619+ // Due to the exclamation mark, which is both part of the `bang not` operator
11620+ // and the `factorial` operator, additional filtering not supports
11621+ // `bang not` operator is required here.
11622+ let dialects =
11623+ all_dialects_where ( |d| !d. supports_factorial_operator ( ) && !d. supports_bang_not_operator ( ) ) ;
11624+
11625+ for & sql in & sql_statements {
11626+ assert_eq ! (
11627+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11628+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11629+ ) ;
11630+ }
11631+
11632+ // Due to the exclamation mark, which is both part of the `bang not` operator
11633+ // and the `factorial` operator, additional filtering supports
11634+ // `bang not` operator is required here.
11635+ let dialects =
11636+ all_dialects_where ( |d| !d. supports_factorial_operator ( ) && d. supports_bang_not_operator ( ) ) ;
11637+
11638+ for & sql in & sql_statements {
11639+ assert_eq ! (
11640+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11641+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11642+ ) ;
11643+ }
11644+ }
0 commit comments