pub struct UnwrapCastInComparison {}
Expand description
UnwrapCastInComparison
attempts to remove casts from
comparisons to literals (ScalarValue
s) by applying the casts
to the literals if possible. It is inspired by the optimizer rule
UnwrapCastInBinaryComparison
of Spark.
Removing casts often improves performance because:
- The cast is done once (to the literal) rather than to every value
- Can enable other optimizations such as predicate pushdown that don’t support casting
The rule is applied to expressions of the following forms:
cast(left_expr as data_type) comparison_op literal_expr
literal_expr comparison_op cast(left_expr as data_type)
cast(literal_expr) IN (expr1, expr2, ...)
literal_expr IN (cast(expr1) , cast(expr2), ...)
If the expression matches one of the forms above, the rule will
ensure the value of literal
is in range(min, max) of the
expr’s data_type, and if the scalar is within range, the literal
will be casted to the data type of expr on the other side, and the
cast will be removed from the other side.
§Example
If the DataType of c1 is INT32. Given the filter
Filter: cast(c1 as INT64) > INT64(10)`
This rule will remove the cast and rewrite the expression to:
Filter: c1 > INT32(10)
Implementations§
Trait Implementations§
source§impl Default for UnwrapCastInComparison
impl Default for UnwrapCastInComparison
source§fn default() -> UnwrapCastInComparison
fn default() -> UnwrapCastInComparison
Returns the “default value” for a type. Read more
source§impl OptimizerRule for UnwrapCastInComparison
impl OptimizerRule for UnwrapCastInComparison
source§fn apply_order(&self) -> Option<ApplyOrder>
fn apply_order(&self) -> Option<ApplyOrder>
How should the rule be applied by the optimizer? See comments on
ApplyOrder
for details. Read moresource§fn supports_rewrite(&self) -> bool
fn supports_rewrite(&self) -> bool
Does this rule support rewriting owned plans (rather than by reference)?
source§fn rewrite(
&self,
plan: LogicalPlan,
_config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>>
fn rewrite( &self, plan: LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>>
Try to rewrite
plan
to an optimized form, returning Transformed::yes
if the plan was rewritten and Transformed::no
if it was not. Read moresource§fn try_optimize(
&self,
_plan: &LogicalPlan,
_config: &dyn OptimizerConfig,
) -> Result<Option<LogicalPlan>>
fn try_optimize( &self, _plan: &LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Option<LogicalPlan>>
👎Deprecated since 40.0.0: please implement supports_rewrite and rewrite instead
Try and rewrite
plan
to an optimized form, returning None if the plan
cannot be optimized by this rule. Read moreAuto Trait Implementations§
impl Freeze for UnwrapCastInComparison
impl RefUnwindSafe for UnwrapCastInComparison
impl Send for UnwrapCastInComparison
impl Sync for UnwrapCastInComparison
impl Unpin for UnwrapCastInComparison
impl UnwindSafe for UnwrapCastInComparison
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more