pub struct EliminateOuterJoin;
Expand description
Attempt to replace outer joins with inner joins.
Outer joins are typically more expensive to compute at runtime than inner joins and prevent various forms of predicate pushdown and other optimizations, so removing them if possible is beneficial.
Inner joins filter out rows that do match. Outer joins pass rows that do not match padded with nulls. If there is a filter in the query that would filter any such null rows after the join the rows introduced by the outer join are filtered.
For example, in the select ... from a left join b on ... where b.xx = 100;
For rows when b.xx
is null (as it would be after an outer join),
the b.xx = 100
predicate filters them out and there is no
need to produce null rows for output.
Generally, an outer join can be rewritten to inner join if the filters from the WHERE clause return false while any inputs are null and columns of those quals are come from nullable side of outer join.
Implementations§
Trait Implementations§
source§impl Default for EliminateOuterJoin
impl Default for EliminateOuterJoin
source§fn default() -> EliminateOuterJoin
fn default() -> EliminateOuterJoin
source§impl OptimizerRule for EliminateOuterJoin
impl OptimizerRule for EliminateOuterJoin
Attempt to eliminate outer joins.
source§fn apply_order(&self) -> Option<ApplyOrder>
fn apply_order(&self) -> Option<ApplyOrder>
ApplyOrder
for details. Read moresource§fn supports_rewrite(&self) -> bool
fn supports_rewrite(&self) -> bool
source§fn rewrite(
&self,
plan: LogicalPlan,
_config: &dyn OptimizerConfig,
) -> Result<Transformed<LogicalPlan>>
fn rewrite( &self, plan: LogicalPlan, _config: &dyn OptimizerConfig, ) -> Result<Transformed<LogicalPlan>>
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>>
plan
to an optimized form, returning None if the plan
cannot be optimized by this rule. Read moreAuto Trait Implementations§
impl Freeze for EliminateOuterJoin
impl RefUnwindSafe for EliminateOuterJoin
impl Send for EliminateOuterJoin
impl Sync for EliminateOuterJoin
impl Unpin for EliminateOuterJoin
impl UnwindSafe for EliminateOuterJoin
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
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>
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>
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