@@ -33,8 +33,8 @@ use sqlparser::keywords::ALL_KEYWORDS;
3333use sqlparser:: parser:: { Parser , ParserError , ParserOptions } ;
3434use sqlparser:: tokenizer:: Tokenizer ;
3535use test_utils:: {
36- all_dialects, alter_table_op, assert_eq_vec, expr_from_projection, join, number , only , table ,
37- table_alias, TestedDialects ,
36+ all_dialects, all_dialects_where , alter_table_op, assert_eq_vec, expr_from_projection, join,
37+ number , only , table , table_alias, TestedDialects ,
3838} ;
3939
4040#[ macro_use]
@@ -4045,7 +4045,9 @@ fn parse_named_argument_function() {
40454045#[ test]
40464046fn parse_named_argument_function_with_eq_operator ( ) {
40474047 let sql = "SELECT FUN(a = '1', b = '2') FROM foo" ;
4048- let select = verified_only_select ( sql) ;
4048+
4049+ let select = all_dialects_where ( |d| d. supports_named_fn_args_with_eq_operator ( ) )
4050+ . verified_only_select ( sql) ;
40494051 assert_eq ! (
40504052 & Expr :: Function ( Function {
40514053 name: ObjectName ( vec![ Ident :: new( "FUN" ) ] ) ,
@@ -4074,6 +4076,33 @@ fn parse_named_argument_function_with_eq_operator() {
40744076 } ) ,
40754077 expr_from_projection( only( & select. projection) )
40764078 ) ;
4079+
4080+ // Ensure that bar = 42 in a function argument parses as an equality binop
4081+ // rather than a named function argument.
4082+ assert_eq ! (
4083+ all_dialects_except( |d| d. supports_named_fn_args_with_eq_operator( ) )
4084+ . verified_expr( "foo(bar = 42)" ) ,
4085+ Expr :: Function ( Function {
4086+ name: ObjectName ( vec![ Ident :: new( "foo" ) ] ) ,
4087+ args: vec![ FunctionArg :: Unnamed ( FunctionArgExpr :: Expr (
4088+ Expr :: BinaryOp {
4089+ left: Box :: new( Expr :: Identifier ( Ident :: new( "bar" ) ) ) ,
4090+ op: BinaryOperator :: Eq ,
4091+ right: Box :: new( Expr :: Value ( number( "42" ) ) ) ,
4092+ } ,
4093+ ) ) ] ,
4094+ filter: None ,
4095+ null_treatment: None ,
4096+ over: None ,
4097+ distinct: false ,
4098+ special: false ,
4099+ order_by: vec![ ] ,
4100+ } )
4101+ ) ;
4102+
4103+ // TODO: should this parse for all dialects?
4104+ all_dialects_except ( |d| d. supports_named_fn_args_with_eq_operator ( ) )
4105+ . verified_expr ( "iff(1 = 1, 1, 0)" ) ;
40774106}
40784107
40794108#[ test]
0 commit comments