diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs index 51a43f893..b31a2310d 100644 --- a/src/dialect/mysql.rs +++ b/src/dialect/mysql.rs @@ -102,10 +102,15 @@ impl Dialect for MySqlDialect { ) -> Option> { // Parse DIV as an operator if parser.parse_keyword(Keyword::DIV) { + let left = Box::new(expr.clone()); + let right = Box::new(match parser.parse_expr() { + Ok(expr) => expr, + Err(e) => return Some(Err(e)), + }); Some(Ok(Expr::BinaryOp { - left: Box::new(expr.clone()), + left, op: BinaryOperator::MyIntegerDivide, - right: Box::new(parser.parse_expr().unwrap()), + right, })) } else { None diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 1b9d12f8c..4ad0404b0 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -3627,6 +3627,14 @@ fn parse_div_infix() { mysql().verified_stmt(r#"SELECT 5 DIV 2"#); } +#[test] +fn parse_div_infix_propagates_parse_error() { + let err = mysql() + .parse_sql_statements("SELECT 5 DIV") + .expect_err("expected an error"); + assert_matches!(err, ParserError::ParserError(_)); +} + #[test] fn parse_drop_temporary_table() { let sql = "DROP TEMPORARY TABLE foo";