(
expr: Expr,
guarantees: &HashMap<&Expr, &NullableInterval>,
)
| 98 | } |
| 99 | |
| 100 | fn rewrite_expr( |
| 101 | expr: Expr, |
| 102 | guarantees: &HashMap<&Expr, &NullableInterval>, |
| 103 | ) -> Result<Transformed<Expr>> { |
| 104 | // If an expression collapses to a single value, replace it with a literal |
| 105 | if let Some(interval) = guarantees.get(&expr) |
| 106 | && let Some(value) = interval.single_value() |
| 107 | { |
| 108 | return Ok(Transformed::yes(lit(value))); |
| 109 | } |
| 110 | |
| 111 | let result = match expr { |
| 112 | Expr::IsNull(inner) => match guarantees.get(inner.as_ref()) { |
| 113 | Some(NullableInterval::Null { .. }) => Transformed::yes(lit(true)), |
| 114 | Some(NullableInterval::NotNull { .. }) => Transformed::yes(lit(false)), |
| 115 | _ => Transformed::no(Expr::IsNull(inner)), |
| 116 | }, |
| 117 | Expr::IsNotNull(inner) => match guarantees.get(inner.as_ref()) { |
| 118 | Some(NullableInterval::Null { .. }) => Transformed::yes(lit(false)), |
| 119 | Some(NullableInterval::NotNull { .. }) => Transformed::yes(lit(true)), |
| 120 | _ => Transformed::no(Expr::IsNotNull(inner)), |
| 121 | }, |
| 122 | Expr::Between(b) => rewrite_between(b, guarantees)?, |
| 123 | Expr::BinaryExpr(b) => rewrite_binary_expr(b, guarantees)?, |
| 124 | Expr::InList(i) => rewrite_inlist(i, guarantees)?, |
| 125 | expr => Transformed::no(expr), |
| 126 | }; |
| 127 | Ok(result) |
| 128 | } |
| 129 | |
| 130 | fn rewrite_between( |
| 131 | between: Between, |
no test coverage detected
searching dependent graphs…