@@ -13332,3 +13332,68 @@ fn test_trailing_commas_in_from() {
1333213332 "SELECT 1, 2 FROM (SELECT * FROM t1), (SELECT * FROM t2)" ,
1333313333 ) ;
1333413334}
13335+
13336+ #[ test]
13337+ fn test_lambdas ( ) {
13338+ let dialects = all_dialects_where ( |d| d. supports_lambda_functions ( ) ) ;
13339+
13340+ #[ rustfmt:: skip]
13341+ let sql = concat ! (
13342+ "SELECT array_sort(array('Hello', 'World'), " ,
13343+ "(p1, p2) -> CASE WHEN p1 = p2 THEN 0 " ,
13344+ "WHEN reverse(p1) < reverse(p2) THEN -1 " ,
13345+ "ELSE 1 END)" ,
13346+ ) ;
13347+ pretty_assertions:: assert_eq!(
13348+ SelectItem :: UnnamedExpr ( call(
13349+ "array_sort" ,
13350+ [
13351+ call(
13352+ "array" ,
13353+ [
13354+ Expr :: Value ( Value :: SingleQuotedString ( "Hello" . to_owned( ) ) ) ,
13355+ Expr :: Value ( Value :: SingleQuotedString ( "World" . to_owned( ) ) )
13356+ ]
13357+ ) ,
13358+ Expr :: Lambda ( LambdaFunction {
13359+ params: OneOrManyWithParens :: Many ( vec![ Ident :: new( "p1" ) , Ident :: new( "p2" ) ] ) ,
13360+ body: Box :: new( Expr :: Case {
13361+ operand: None ,
13362+ conditions: vec![
13363+ Expr :: BinaryOp {
13364+ left: Box :: new( Expr :: Identifier ( Ident :: new( "p1" ) ) ) ,
13365+ op: BinaryOperator :: Eq ,
13366+ right: Box :: new( Expr :: Identifier ( Ident :: new( "p2" ) ) )
13367+ } ,
13368+ Expr :: BinaryOp {
13369+ left: Box :: new( call(
13370+ "reverse" ,
13371+ [ Expr :: Identifier ( Ident :: new( "p1" ) ) ]
13372+ ) ) ,
13373+ op: BinaryOperator :: Lt ,
13374+ right: Box :: new( call(
13375+ "reverse" ,
13376+ [ Expr :: Identifier ( Ident :: new( "p2" ) ) ]
13377+ ) )
13378+ }
13379+ ] ,
13380+ results: vec![
13381+ Expr :: Value ( number( "0" ) ) ,
13382+ Expr :: UnaryOp {
13383+ op: UnaryOperator :: Minus ,
13384+ expr: Box :: new( Expr :: Value ( number( "1" ) ) )
13385+ }
13386+ ] ,
13387+ else_result: Some ( Box :: new( Expr :: Value ( number( "1" ) ) ) )
13388+ } )
13389+ } )
13390+ ]
13391+ ) ) ,
13392+ dialects. verified_only_select( sql) . projection[ 0 ]
13393+ ) ;
13394+
13395+ dialects. verified_expr (
13396+ "map_zip_with(map(1, 'a', 2, 'b'), map(1, 'x', 2, 'y'), (k, v1, v2) -> concat(v1, v2))" ,
13397+ ) ;
13398+ dialects. verified_expr ( "transform(array(1, 2, 3), x -> x + 1)" ) ;
13399+ }
0 commit comments