@@ -11399,3 +11399,113 @@ fn test_show_dbs_schemas_tables_views() {
1139911399 verified_stmt ( "SHOW MATERIALIZED VIEWS FROM db1" ) ;
1140011400 verified_stmt ( "SHOW MATERIALIZED VIEWS FROM db1 'abc'" ) ;
1140111401}
11402+
11403+ #[ test]
11404+ fn parse_bang_not ( ) {
11405+ let dialects = all_dialects_where ( |d| d. supports_bang_not_operator ( ) ) ;
11406+ let sql = "SELECT !a, !(b > 3)" ;
11407+ let Select { projection, .. } = dialects. verified_only_select ( sql) ;
11408+
11409+ for ( i, expr) in [
11410+ Box :: new ( Expr :: Identifier ( Ident :: new ( "a" ) ) ) ,
11411+ Box :: new ( Expr :: Nested ( Box :: new ( Expr :: BinaryOp {
11412+ left : Box :: new ( Expr :: Identifier ( Ident :: new ( "b" ) ) ) ,
11413+ op : BinaryOperator :: Gt ,
11414+ right : Box :: new ( Expr :: Value ( Value :: Number ( "3" . parse ( ) . unwrap ( ) , false ) ) ) ,
11415+ } ) ) ) ,
11416+ ]
11417+ . into_iter ( )
11418+ . enumerate ( )
11419+ {
11420+ assert_eq ! (
11421+ SelectItem :: UnnamedExpr ( Expr :: UnaryOp {
11422+ op: UnaryOperator :: BangNot ,
11423+ expr
11424+ } ) ,
11425+ projection[ i]
11426+ )
11427+ }
11428+
11429+ let sql_statements = [ "SELECT a!" , "SELECT a ! b" , "SELECT a ! as b" ] ;
11430+
11431+ for & sql in & sql_statements {
11432+ assert_eq ! (
11433+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11434+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11435+ ) ;
11436+ }
11437+
11438+ let sql_statements = [ "SELECT !a" , "SELECT !a b" , "SELECT !a as b" ] ;
11439+ let dialects = all_dialects_where ( |d| !d. supports_bang_not_operator ( ) ) ;
11440+
11441+ for & sql in & sql_statements {
11442+ assert_eq ! (
11443+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11444+ ParserError :: ParserError ( "Expected: an expression, found: !" . to_string( ) )
11445+ ) ;
11446+ }
11447+ }
11448+
11449+ #[ test]
11450+ fn parse_factorial_operator ( ) {
11451+ let dialects = all_dialects_where ( |d| d. supports_factorial_operator ( ) ) ;
11452+ let sql = "SELECT a!, (b + c)!" ;
11453+ let Select { projection, .. } = dialects. verified_only_select ( sql) ;
11454+
11455+ for ( i, expr) in [
11456+ Box :: new ( Expr :: Identifier ( Ident :: new ( "a" ) ) ) ,
11457+ Box :: new ( Expr :: Nested ( Box :: new ( Expr :: BinaryOp {
11458+ left : Box :: new ( Expr :: Identifier ( Ident :: new ( "b" ) ) ) ,
11459+ op : BinaryOperator :: Plus ,
11460+ right : Box :: new ( Expr :: Identifier ( Ident :: new ( "c" ) ) ) ,
11461+ } ) ) ) ,
11462+ ]
11463+ . into_iter ( )
11464+ . enumerate ( )
11465+ {
11466+ assert_eq ! (
11467+ SelectItem :: UnnamedExpr ( Expr :: UnaryOp {
11468+ op: UnaryOperator :: PGPostfixFactorial ,
11469+ expr
11470+ } ) ,
11471+ projection[ i]
11472+ )
11473+ }
11474+
11475+ let sql_statements = [ "SELECT !a" , "SELECT !a b" , "SELECT !a as b" ] ;
11476+
11477+ for & sql in & sql_statements {
11478+ assert_eq ! (
11479+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11480+ ParserError :: ParserError ( "Expected: an expression, found: !" . to_string( ) )
11481+ ) ;
11482+ }
11483+
11484+ let sql_statements = [ "SELECT a!" , "SELECT a ! b" , "SELECT a ! as b" ] ;
11485+
11486+ // Due to the exclamation mark, which is both part of the `bang not` operator
11487+ // and the `factorial` operator, additional filtering not supports
11488+ // `bang not` operator is required here.
11489+ let dialects =
11490+ all_dialects_where ( |d| !d. supports_factorial_operator ( ) && !d. supports_bang_not_operator ( ) ) ;
11491+
11492+ for & sql in & sql_statements {
11493+ assert_eq ! (
11494+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11495+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11496+ ) ;
11497+ }
11498+
11499+ // Due to the exclamation mark, which is both part of the `bang not` operator
11500+ // and the `factorial` operator, additional filtering supports
11501+ // `bang not` operator is required here.
11502+ let dialects =
11503+ all_dialects_where ( |d| !d. supports_factorial_operator ( ) && d. supports_bang_not_operator ( ) ) ;
11504+
11505+ for & sql in & sql_statements {
11506+ assert_eq ! (
11507+ dialects. parse_sql_statements( sql) . unwrap_err( ) ,
11508+ ParserError :: ParserError ( "No infix parser for token ExclamationMark" . to_string( ) )
11509+ ) ;
11510+ }
11511+ }
0 commit comments