Is your feature request related to a problem or challenge?
Currently ListingTable partition prunning doesn't support volatile functions and scalar variables, like now() or $var, which is checked at
|
pub fn expr_applicable_for_cols(col_names: &[&str], expr: &Expr) -> bool { |
|
let mut is_applicable = true; |
|
expr.apply(|expr| match expr { |
|
Expr::Column(Column { name, .. }) => { |
|
is_applicable &= col_names.contains(&name.as_str()); |
|
if is_applicable { |
|
Ok(TreeNodeRecursion::Jump) |
|
} else { |
|
Ok(TreeNodeRecursion::Stop) |
|
} |
|
} |
|
Expr::Literal(_, _) |
|
| Expr::Alias(_) |
|
| Expr::OuterReferenceColumn(_, _) |
|
| Expr::ScalarVariable(_, _) |
|
| Expr::Not(_) |
|
| Expr::IsNotNull(_) |
|
| Expr::IsNull(_) |
|
| Expr::IsTrue(_) |
|
| Expr::IsFalse(_) |
|
| Expr::IsUnknown(_) |
|
| Expr::IsNotTrue(_) |
|
| Expr::IsNotFalse(_) |
|
| Expr::IsNotUnknown(_) |
|
| Expr::Negative(_) |
|
| Expr::Cast(_) |
|
| Expr::TryCast(_) |
|
| Expr::BinaryExpr(_) |
|
| Expr::Between(_) |
|
| Expr::Like(_) |
|
| Expr::SimilarTo(_) |
|
| Expr::InList(_) |
|
| Expr::Exists(_) |
|
| Expr::InSubquery(_) |
|
| Expr::ScalarSubquery(_) |
|
| Expr::SetComparison(_) |
|
| Expr::GroupingSet(_) |
|
| Expr::Case(_) => Ok(TreeNodeRecursion::Continue), |
|
|
|
Expr::ScalarFunction(scalar_function) => { |
|
match scalar_function.func.signature().volatility { |
|
Volatility::Immutable => Ok(TreeNodeRecursion::Continue), |
|
// TODO: Stable functions could be `applicable`, but that would require access to the context |
|
Volatility::Stable | Volatility::Volatile => { |
|
is_applicable = false; |
|
Ok(TreeNodeRecursion::Stop) |
|
} |
|
} |
|
} |
|
|
|
// TODO other expressions are not handled yet: |
|
// - AGGREGATE and WINDOW should not end up in filter conditions, except maybe in some edge cases |
|
// - Can `Wildcard` be considered as a `Literal`? |
|
// - ScalarVariable could be `applicable`, but that would require access to the context |
|
// TODO: remove the next line after `Expr::Wildcard` is removed |
|
#[expect(deprecated)] |
|
Expr::AggregateFunction { .. } |
|
| Expr::WindowFunction { .. } |
|
| Expr::Wildcard { .. } |
|
| Expr::Unnest { .. } |
|
| Expr::Placeholder(_) => { |
|
is_applicable = false; |
|
Ok(TreeNodeRecursion::Stop) |
|
} |
|
}) |
|
.unwrap(); |
|
is_applicable |
|
} |
Describe the solution you'd like
Volatile functions and scalar variables being supported in ListingTable partition pruning
Describe alternatives you've considered
No response
Additional context
Suggested by @comphead at #21679
Is your feature request related to a problem or challenge?
Currently
ListingTablepartition prunning doesn't support volatile functions and scalar variables, likenow()or$var, which is checked atdatafusion/datafusion/catalog-listing/src/helpers.rs
Lines 51 to 118 in 4b8c1d9
Describe the solution you'd like
Volatile functions and scalar variables being supported in
ListingTablepartition pruningDescribe alternatives you've considered
No response
Additional context
Suggested by @comphead at #21679