diff --git a/src/queryplan/mod.rs b/src/queryplan/mod.rs index d394b73..7606912 100644 --- a/src/queryplan/mod.rs +++ b/src/queryplan/mod.rs @@ -658,6 +658,7 @@ fn ast_binaryop_to_sexpression_binaryop(ast: ast::BinaryOp) -> BinaryOp { ast::BinaryOp::Add => BinaryOp::Add, ast::BinaryOp::Subtract => BinaryOp::Subtract, ast::BinaryOp::Multiply => BinaryOp::Multiply, + ast::BinaryOp::Divide => BinaryOp::Divide, ast::BinaryOp::BitAnd => BinaryOp::BitAnd, ast::BinaryOp::BitOr => BinaryOp::BitOr, ast::BinaryOp::Concatenate => BinaryOp::Concatenate, diff --git a/src/queryplan/sexpression.rs b/src/queryplan/sexpression.rs index 3adbb18..81d4e59 100644 --- a/src/queryplan/sexpression.rs +++ b/src/queryplan/sexpression.rs @@ -148,6 +148,7 @@ pub enum BinaryOp { Add, Subtract, Multiply, + Divide, BitAnd, BitOr, Concatenate, @@ -169,6 +170,7 @@ impl BinaryOp { &Add => "+", &Subtract => "-", &Multiply => "*", + &Divide => "/", &BitAnd => "&", &BitOr => "|", &Concatenate => "concat" diff --git a/src/sqlsyntax/ast.rs b/src/sqlsyntax/ast.rs index aa2ff86..1139f03 100644 --- a/src/sqlsyntax/ast.rs +++ b/src/sqlsyntax/ast.rs @@ -16,6 +16,7 @@ pub enum BinaryOp { Add, Subtract, Multiply, + Divide, BitAnd, BitOr, Concatenate, diff --git a/src/sqlsyntax/mod.rs b/src/sqlsyntax/mod.rs index 5ccc772..078abb3 100644 --- a/src/sqlsyntax/mod.rs +++ b/src/sqlsyntax/mod.rs @@ -23,6 +23,7 @@ mod test { fn test_sql_parser() { parse("SELECT *, (name + 4), count(*) AS amount FROM (SELECT * FROM foo) subq, table1 GROUP BY name HAVING count(*) > 5;"); parse("SELECT * FROM foo INNER JOIN bar ON foo.id = bar.fooId ORDER BY a DESC, b;"); + parse("SELECT avg(milliseconds) / 1000 seconds FROM track;"); parse("INSERT INTO table1 VALUES (1, 2), (3, 4), (5, 6);"); parse("INSERT INTO table1 (a, b) VALUES ('foo' || 'bar', 2);"); diff --git a/src/sqlsyntax/parser/mod.rs b/src/sqlsyntax/parser/mod.rs index 3ad4af7..62ae138 100644 --- a/src/sqlsyntax/parser/mod.rs +++ b/src/sqlsyntax/parser/mod.rs @@ -163,6 +163,7 @@ impl Rule for BinaryOp { &Token::Plus => Ok(BinaryOp::Add), &Token::Minus => Ok(BinaryOp::Subtract), &Token::Asterisk => Ok(BinaryOp::Multiply), + &Token::ForwardSlash => Ok(BinaryOp::Divide), &Token::Ampersand => Ok(BinaryOp::BitAnd), &Token::Pipe => Ok(BinaryOp::BitOr), &Token::DoublePipe => Ok(BinaryOp::Concatenate), @@ -187,7 +188,7 @@ impl BinaryOp { use super::ast::BinaryOp::*; match self { - &Multiply => 5, + &Multiply | &Divide => 5, &Add | &Subtract | &BitAnd | &BitOr | &Concatenate => 4, // comparison &Equal | &NotEqual | &LessThan | &LessThanOrEqual | &GreaterThan | &GreaterThanOrEqual => 3,