|
17 | 17 |
|
18 | 18 | use std::vec; |
19 | 19 |
|
| 20 | +use datafusion::arrow::datatypes::DataType; |
20 | 21 | use datafusion::logical_expr::{Expr, Operator}; |
21 | 22 | use datafusion::scalar::ScalarValue; |
22 | 23 | use iceberg::expr::{BinaryExpression, Predicate, PredicateOperator, Reference, UnaryExpression}; |
@@ -119,7 +120,14 @@ fn to_iceberg_predicate(expr: &Expr) -> TransformedResult { |
119 | 120 | _ => TransformedResult::NotTransformed, |
120 | 121 | } |
121 | 122 | } |
122 | | - Expr::Cast(c) => to_iceberg_predicate(&c.expr), |
| 123 | + Expr::Cast(c) => { |
| 124 | + if c.data_type == DataType::Date32 || c.data_type == DataType::Date64 { |
| 125 | + // Casts to date truncate the expression, we cannot simply extract it as it |
| 126 | + // can create erroneous predicates. |
| 127 | + return TransformedResult::NotTransformed; |
| 128 | + } |
| 129 | + to_iceberg_predicate(&c.expr) |
| 130 | + } |
123 | 131 | _ => TransformedResult::NotTransformed, |
124 | 132 | } |
125 | 133 | } |
@@ -403,4 +411,11 @@ mod tests { |
403 | 411 | Reference::new("ts").greater_than_or_equal_to(Datum::string("2023-01-05T00:00:00")); |
404 | 412 | assert_eq!(predicate, expected_predicate); |
405 | 413 | } |
| 414 | + |
| 415 | + #[test] |
| 416 | + fn test_predicate_conversion_with_date_cast() { |
| 417 | + let sql = "ts >= date '2023-01-05T11:00:00'"; |
| 418 | + let predicate = convert_to_iceberg_predicate(sql); |
| 419 | + assert_eq!(predicate, None); |
| 420 | + } |
406 | 421 | } |
0 commit comments