Given an expression of the form `((a + b) * (c * d))`, the parenthesis is redundant if the precedence of the nested expression is already higher than the surrounding operators' precedence. The above expression would become `(a + b) * c * d`. Also note that when fetching the precedence of a nested expression, we ignore other nested expressions, so precedence of expr `(a * (b + c))` equals `*` and
(
&self,
expr: ast::Expr,
left_op: &BinaryOperator,
right_op: &BinaryOperator,
)
| 969 | /// Also note that when fetching the precedence of a nested expression, we ignore other nested |
| 970 | /// expressions, so precedence of expr `(a * (b + c))` equals `*` and not `+`. |
| 971 | fn remove_unnecessary_nesting( |
| 972 | &self, |
| 973 | expr: ast::Expr, |
| 974 | left_op: &BinaryOperator, |
| 975 | right_op: &BinaryOperator, |
| 976 | ) -> ast::Expr { |
| 977 | match expr { |
| 978 | ast::Expr::Nested(nested) => { |
| 979 | let surrounding_precedence = self |
| 980 | .sql_op_precedence(left_op) |
| 981 | .max(self.sql_op_precedence(right_op)); |
| 982 | |
| 983 | let inner_precedence = self.inner_precedence(&nested); |
| 984 | |
| 985 | let not_associative = |
| 986 | matches!(left_op, BinaryOperator::Minus | BinaryOperator::Divide); |
| 987 | |
| 988 | if inner_precedence == surrounding_precedence && not_associative { |
| 989 | ast::Expr::Nested(Box::new( |
| 990 | self.remove_unnecessary_nesting(*nested, LOWEST, LOWEST), |
| 991 | )) |
| 992 | } else if inner_precedence >= surrounding_precedence { |
| 993 | self.remove_unnecessary_nesting(*nested, left_op, right_op) |
| 994 | } else { |
| 995 | ast::Expr::Nested(Box::new( |
| 996 | self.remove_unnecessary_nesting(*nested, LOWEST, LOWEST), |
| 997 | )) |
| 998 | } |
| 999 | } |
| 1000 | ast::Expr::BinaryOp { left, op, right } => ast::Expr::BinaryOp { |
| 1001 | left: Box::new(self.remove_unnecessary_nesting(*left, left_op, &op)), |
| 1002 | right: Box::new(self.remove_unnecessary_nesting(*right, &op, right_op)), |
| 1003 | op, |
| 1004 | }, |
| 1005 | ast::Expr::IsTrue(expr) => ast::Expr::IsTrue(Box::new( |
| 1006 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1007 | )), |
| 1008 | ast::Expr::IsNotTrue(expr) => ast::Expr::IsNotTrue(Box::new( |
| 1009 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1010 | )), |
| 1011 | ast::Expr::IsFalse(expr) => ast::Expr::IsFalse(Box::new( |
| 1012 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1013 | )), |
| 1014 | ast::Expr::IsNotFalse(expr) => ast::Expr::IsNotFalse(Box::new( |
| 1015 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1016 | )), |
| 1017 | ast::Expr::IsNull(expr) => ast::Expr::IsNull(Box::new( |
| 1018 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1019 | )), |
| 1020 | ast::Expr::IsNotNull(expr) => ast::Expr::IsNotNull(Box::new( |
| 1021 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1022 | )), |
| 1023 | ast::Expr::IsUnknown(expr) => ast::Expr::IsUnknown(Box::new( |
| 1024 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1025 | )), |
| 1026 | ast::Expr::IsNotUnknown(expr) => ast::Expr::IsNotUnknown(Box::new( |
| 1027 | self.remove_unnecessary_nesting(*expr, left_op, IS), |
| 1028 | )), |
no test coverage detected