@@ -3483,3 +3483,107 @@ fn parse_match_against_with_alias() {
34833483 _ => unreachable ! ( ) ,
34843484 }
34853485}
3486+
3487+ #[ test]
3488+ fn test_variable_assignment_using_colon_equal ( ) {
3489+ let sql_select = "SELECT @price := price, @tax := price * 0.1 FROM products WHERE id = 1" ;
3490+ let stmt = mysql ( ) . verified_stmt ( sql_select) ;
3491+ match stmt {
3492+ Statement :: Query ( query) => {
3493+ let select = query. body . as_select ( ) . unwrap ( ) ;
3494+
3495+ assert_eq ! (
3496+ select. projection,
3497+ vec![
3498+ SelectItem :: UnnamedExpr ( Expr :: BinaryOp {
3499+ left: Box :: new( Expr :: Identifier ( Ident {
3500+ value: "@price" . to_string( ) ,
3501+ quote_style: None ,
3502+ span: Span :: empty( ) ,
3503+ } ) ) ,
3504+ op: BinaryOperator :: Assignment ,
3505+ right: Box :: new( Expr :: Identifier ( Ident {
3506+ value: "price" . to_string( ) ,
3507+ quote_style: None ,
3508+ span: Span :: empty( ) ,
3509+ } ) ) ,
3510+ } ) ,
3511+ SelectItem :: UnnamedExpr ( Expr :: BinaryOp {
3512+ left: Box :: new( Expr :: Identifier ( Ident {
3513+ value: "@tax" . to_string( ) ,
3514+ quote_style: None ,
3515+ span: Span :: empty( ) ,
3516+ } ) ) ,
3517+ op: BinaryOperator :: Assignment ,
3518+ right: Box :: new( Expr :: BinaryOp {
3519+ left: Box :: new( Expr :: Identifier ( Ident {
3520+ value: "price" . to_string( ) ,
3521+ quote_style: None ,
3522+ span: Span :: empty( ) ,
3523+ } ) ) ,
3524+ op: BinaryOperator :: Multiply ,
3525+ right: Box :: new( Expr :: Value (
3526+ ( test_utils:: number( "0.1" ) ) . with_empty_span( )
3527+ ) ) ,
3528+ } ) ,
3529+ } ) ,
3530+ ]
3531+ ) ;
3532+
3533+ assert_eq ! (
3534+ select. selection,
3535+ Some ( Expr :: BinaryOp {
3536+ left: Box :: new( Expr :: Identifier ( Ident {
3537+ value: "id" . to_string( ) ,
3538+ quote_style: None ,
3539+ span: Span :: empty( ) ,
3540+ } ) ) ,
3541+ op: BinaryOperator :: Eq ,
3542+ right: Box :: new( Expr :: Value ( ( test_utils:: number( "1" ) ) . with_empty_span( ) ) ) ,
3543+ } )
3544+ ) ;
3545+ }
3546+ _ => panic ! ( "Unexpected statement {stmt}" ) ,
3547+ }
3548+
3549+ let sql_update =
3550+ "UPDATE products SET price = @new_price := price * 1.1 WHERE category = 'Books'" ;
3551+ let stmt = mysql ( ) . verified_stmt ( sql_update) ;
3552+
3553+ match stmt {
3554+ Statement :: Update { assignments, .. } => {
3555+ assert_eq ! (
3556+ assignments,
3557+ vec![ Assignment {
3558+ target: AssignmentTarget :: ColumnName ( ObjectName ( vec![
3559+ ObjectNamePart :: Identifier ( Ident {
3560+ value: "price" . to_string( ) ,
3561+ quote_style: None ,
3562+ span: Span :: empty( ) ,
3563+ } )
3564+ ] ) ) ,
3565+ value: Expr :: BinaryOp {
3566+ left: Box :: new( Expr :: Identifier ( Ident {
3567+ value: "@new_price" . to_string( ) ,
3568+ quote_style: None ,
3569+ span: Span :: empty( ) ,
3570+ } ) ) ,
3571+ op: BinaryOperator :: Assignment ,
3572+ right: Box :: new( Expr :: BinaryOp {
3573+ left: Box :: new( Expr :: Identifier ( Ident {
3574+ value: "price" . to_string( ) ,
3575+ quote_style: None ,
3576+ span: Span :: empty( ) ,
3577+ } ) ) ,
3578+ op: BinaryOperator :: Multiply ,
3579+ right: Box :: new( Expr :: Value (
3580+ ( test_utils:: number( "1.1" ) ) . with_empty_span( )
3581+ ) ) ,
3582+ } ) ,
3583+ } ,
3584+ } ]
3585+ )
3586+ }
3587+ _ => panic ! ( "Unexpected statement {stmt}" ) ,
3588+ }
3589+ }
0 commit comments