@@ -6696,22 +6696,26 @@ fn parse_searched_case_expr() {
66966696 & Case {
66976697 operand: None ,
66986698 conditions: vec![
6699- IsNull ( Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ) ,
6700- BinaryOp {
6701- left: Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ,
6702- op: Eq ,
6703- right: Box :: new( Expr :: Value ( number( "0" ) ) ) ,
6699+ CaseWhen {
6700+ condition: IsNull ( Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ) ,
6701+ result: Expr :: Value ( Value :: SingleQuotedString ( "null" . to_string( ) ) ) ,
67046702 } ,
6705- BinaryOp {
6706- left: Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ,
6707- op: GtEq ,
6708- right: Box :: new( Expr :: Value ( number( "0" ) ) ) ,
6703+ CaseWhen {
6704+ condition: BinaryOp {
6705+ left: Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ,
6706+ op: Eq ,
6707+ right: Box :: new( Expr :: Value ( number( "0" ) ) ) ,
6708+ } ,
6709+ result: Expr :: Value ( Value :: SingleQuotedString ( "=0" . to_string( ) ) ) ,
6710+ } ,
6711+ CaseWhen {
6712+ condition: BinaryOp {
6713+ left: Box :: new( Identifier ( Ident :: new( "bar" ) ) ) ,
6714+ op: GtEq ,
6715+ right: Box :: new( Expr :: Value ( number( "0" ) ) ) ,
6716+ } ,
6717+ result: Expr :: Value ( Value :: SingleQuotedString ( ">=0" . to_string( ) ) ) ,
67096718 } ,
6710- ] ,
6711- results: vec![
6712- Expr :: Value ( Value :: SingleQuotedString ( "null" . to_string( ) ) ) ,
6713- Expr :: Value ( Value :: SingleQuotedString ( "=0" . to_string( ) ) ) ,
6714- Expr :: Value ( Value :: SingleQuotedString ( ">=0" . to_string( ) ) ) ,
67156719 ] ,
67166720 else_result: Some ( Box :: new( Expr :: Value ( Value :: SingleQuotedString (
67176721 "<0" . to_string( )
@@ -6730,8 +6734,10 @@ fn parse_simple_case_expr() {
67306734 assert_eq ! (
67316735 & Case {
67326736 operand: Some ( Box :: new( Identifier ( Ident :: new( "foo" ) ) ) ) ,
6733- conditions: vec![ Expr :: Value ( number( "1" ) ) ] ,
6734- results: vec![ Expr :: Value ( Value :: SingleQuotedString ( "Y" . to_string( ) ) ) ] ,
6737+ conditions: vec![ CaseWhen {
6738+ condition: Expr :: Value ( number( "1" ) ) ,
6739+ result: Expr :: Value ( Value :: SingleQuotedString ( "Y" . to_string( ) ) ) ,
6740+ } ] ,
67356741 else_result: Some ( Box :: new( Expr :: Value ( Value :: SingleQuotedString (
67366742 "N" . to_string( )
67376743 ) ) ) ) ,
@@ -13905,6 +13911,31 @@ fn test_trailing_commas_in_from() {
1390513911 ) ;
1390613912}
1390713913
13914+ #[ test]
13915+ #[ cfg( feature = "visitor" ) ]
13916+ fn test_visit_order ( ) {
13917+ let sql = "SELECT CASE a WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END" ;
13918+ let stmt = verified_stmt ( sql) ;
13919+ let mut visited = vec ! [ ] ;
13920+ sqlparser:: ast:: visit_expressions ( & stmt, |expr| {
13921+ visited. push ( expr. to_string ( ) ) ;
13922+ core:: ops:: ControlFlow :: < ( ) > :: Continue ( ( ) )
13923+ } ) ;
13924+
13925+ assert_eq ! (
13926+ visited,
13927+ [
13928+ "CASE a WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END" ,
13929+ "a" ,
13930+ "1" ,
13931+ "2" ,
13932+ "3" ,
13933+ "4" ,
13934+ "5"
13935+ ]
13936+ ) ;
13937+ }
13938+
1390813939#[ test]
1390913940fn test_lambdas ( ) {
1391013941 let dialects = all_dialects_where ( |d| d. supports_lambda_functions ( ) ) ;
@@ -13932,28 +13963,30 @@ fn test_lambdas() {
1393213963 body: Box :: new( Expr :: Case {
1393313964 operand: None ,
1393413965 conditions: vec![
13935- Expr :: BinaryOp {
13936- left: Box :: new( Expr :: Identifier ( Ident :: new( "p1" ) ) ) ,
13937- op: BinaryOperator :: Eq ,
13938- right: Box :: new( Expr :: Identifier ( Ident :: new( "p2" ) ) )
13966+ CaseWhen {
13967+ condition: Expr :: BinaryOp {
13968+ left: Box :: new( Expr :: Identifier ( Ident :: new( "p1" ) ) ) ,
13969+ op: BinaryOperator :: Eq ,
13970+ right: Box :: new( Expr :: Identifier ( Ident :: new( "p2" ) ) )
13971+ } ,
13972+ result: Expr :: Value ( number( "0" ) )
1393913973 } ,
13940- Expr :: BinaryOp {
13941- left: Box :: new( call(
13942- "reverse" ,
13943- [ Expr :: Identifier ( Ident :: new( "p1" ) ) ]
13944- ) ) ,
13945- op: BinaryOperator :: Lt ,
13946- right: Box :: new( call(
13947- "reverse" ,
13948- [ Expr :: Identifier ( Ident :: new( "p2" ) ) ]
13949- ) )
13950- }
13951- ] ,
13952- results: vec![
13953- Expr :: Value ( number( "0" ) ) ,
13954- Expr :: UnaryOp {
13955- op: UnaryOperator :: Minus ,
13956- expr: Box :: new( Expr :: Value ( number( "1" ) ) )
13974+ CaseWhen {
13975+ condition: Expr :: BinaryOp {
13976+ left: Box :: new( call(
13977+ "reverse" ,
13978+ [ Expr :: Identifier ( Ident :: new( "p1" ) ) ]
13979+ ) ) ,
13980+ op: BinaryOperator :: Lt ,
13981+ right: Box :: new( call(
13982+ "reverse" ,
13983+ [ Expr :: Identifier ( Ident :: new( "p2" ) ) ]
13984+ ) )
13985+ } ,
13986+ result: Expr :: UnaryOp {
13987+ op: UnaryOperator :: Minus ,
13988+ expr: Box :: new( Expr :: Value ( number( "1" ) ) )
13989+ }
1395713990 }
1395813991 ] ,
1395913992 else_result: Some ( Box :: new( Expr :: Value ( number( "1" ) ) ) )
0 commit comments