Skip to content

Commit 4466656

Browse files
authored
fix: Do not extract expression from cast to date (#977)
solves #976 by not transforming `Cast`s to `DATE`.
1 parent cf96478 commit 4466656

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

crates/integrations/datafusion/src/physical_plan/expr_to_predicate.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
use std::vec;
1919

20+
use datafusion::arrow::datatypes::DataType;
2021
use datafusion::logical_expr::{Expr, Operator};
2122
use datafusion::scalar::ScalarValue;
2223
use iceberg::expr::{BinaryExpression, Predicate, PredicateOperator, Reference, UnaryExpression};
@@ -119,7 +120,14 @@ fn to_iceberg_predicate(expr: &Expr) -> TransformedResult {
119120
_ => TransformedResult::NotTransformed,
120121
}
121122
}
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+
}
123131
_ => TransformedResult::NotTransformed,
124132
}
125133
}
@@ -403,4 +411,11 @@ mod tests {
403411
Reference::new("ts").greater_than_or_equal_to(Datum::string("2023-01-05T00:00:00"));
404412
assert_eq!(predicate, expected_predicate);
405413
}
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+
}
406421
}

0 commit comments

Comments
 (0)