pub struct Planner {
ctx: OptimizerContextRef,
share_cache: HashMap<usize, PlanRef>,
}
Expand description
Planner
converts a bound statement to a crate::optimizer::plan_node::PlanNode
tree
Fields§
§ctx: OptimizerContextRef
Mapping of ShareId
to its share plan.
The share plan can be a CTE, a source, a view and so on.
Implementations§
source§impl Planner
impl Planner
pub(super) fn plan_delete( &mut self, delete: BoundDelete, ) -> Result<PlanRoot, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_insert( &mut self, insert: BoundInsert, ) -> Result<PlanRoot, RwError>
source§impl Planner
impl Planner
sourcepub fn plan_query(&mut self, query: BoundQuery) -> Result<PlanRoot, RwError>
pub fn plan_query(&mut self, query: BoundQuery) -> Result<PlanRoot, RwError>
Plan a BoundQuery
. Need to bind before planning.
Works for both batch query and streaming query (CREATE MATERIALIZED VIEW
).
source§impl Planner
impl Planner
pub(super) fn plan_recursive_union( &mut self, base: BoundSetExpr, recursive: BoundSetExpr, id: usize, ) -> Result<PlanRef, RwError>
source§impl Planner
impl Planner
pub fn plan_relation(&mut self, relation: Relation) -> Result<PlanRef, RwError>
pub(crate) fn plan_sys_table( &mut self, sys_table: BoundSystemTable, ) -> Result<PlanRef, RwError>
pub(super) fn plan_base_table( &mut self, base_table: &BoundBaseTable, ) -> Result<PlanRef, RwError>
pub(super) fn plan_source( &mut self, source: BoundSource, ) -> Result<PlanRef, RwError>
pub(super) fn plan_join(&mut self, join: BoundJoin) -> Result<PlanRef, RwError>
pub(super) fn plan_apply(&mut self, join: BoundJoin) -> Result<PlanRef, RwError>
pub(super) fn plan_window_table_function( &mut self, table_function: BoundWindowTableFunction, ) -> Result<PlanRef, RwError>
pub(super) fn plan_table_function( &mut self, table_function: ExprImpl, with_ordinality: bool, ) -> Result<PlanRef, RwError>
pub(super) fn plan_watermark( &mut self, _watermark: BoundWatermark, ) -> Result<PlanRef, RwError>
pub(super) fn plan_cte_ref( &mut self, cte_ref: BoundBackCteRef, ) -> Result<PlanRef, RwError>
fn collect_col_data_types_for_tumble_window( relation: &Relation, ) -> Result<Vec<DataType>, RwError>
fn plan_tumble_window( &mut self, input: Relation, time_col: InputRef, args: Vec<ExprImpl>, ) -> Result<PlanRef, RwError>
fn plan_hop_window( &mut self, input: Relation, time_col: InputRef, args: Vec<ExprImpl>, ) -> Result<PlanRef, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_select( &mut self, _: BoundSelect, extra_order_exprs: Vec<ExprImpl>, order: &[ColumnOrder], ) -> Result<PlanRef, RwError>
sourcefn create_dummy_values(&self) -> PlanRef
fn create_dummy_values(&self) -> PlanRef
Helper to create a dummy node as child of LogicalProject
.
For example, select 1+2, 3*4
will be Project([1+2, 3+4]) - Values([[]])
.
sourcefn create_exists(&self, input: PlanRef) -> Result<PlanRef, RwError>
fn create_exists(&self, input: PlanRef) -> Result<PlanRef, RwError>
Helper to create an EXISTS
boolean operator with the given input
.
It is represented by Project([$0 >= 1]) -> Agg(count(*)) -> input
sourcepub(super) fn plan_where(
&mut self,
input: PlanRef,
where_clause: ExprImpl,
) -> Result<PlanRef, RwError>
pub(super) fn plan_where( &mut self, input: PlanRef, where_clause: ExprImpl, ) -> Result<PlanRef, RwError>
For (NOT) EXISTS subquery
or (NOT) IN subquery
, we can plan it as
LeftSemi/LeftAnti
LogicalApply
For other subqueries, we plan it as LeftOuter
LogicalApply
using
Self::substitute_subqueries
.
sourcefn handle_exists_and_in(
&mut self,
expr: ExprImpl,
negated: bool,
input: &mut PlanRef,
) -> Result<(), RwError>
fn handle_exists_and_in( &mut self, expr: ExprImpl, negated: bool, input: &mut PlanRef, ) -> Result<(), RwError>
Handle (NOT) EXISTS and (NOT) IN in WHERE clause.
We will use a = b to replace a in (select b from ….) for (NOT) IN thus avoiding adding a
LogicalFilter
on LogicalApply
.
sourcepub(super) fn substitute_subqueries(
&mut self,
root: PlanRef,
exprs: Vec<ExprImpl>,
) -> Result<(PlanRef, Vec<ExprImpl>), RwError>
pub(super) fn substitute_subqueries( &mut self, root: PlanRef, exprs: Vec<ExprImpl>, ) -> Result<(PlanRef, Vec<ExprImpl>), RwError>
Substitutes all Subquery
in exprs
.
Each time a Subquery
is found, it is replaced by a new InputRef
. And root
is
replaced by a new LeftOuter
LogicalApply
whose left side is root
and right side is
the planned subquery.
The InputRef
s’ indexes start from root.schema().len()
,
which means they are additional columns beyond the original root
.
fn create_apply( correlated_id: CorrelatedId, correlated_indices: Vec<usize>, left: PlanRef, right: PlanRef, on: ExprImpl, join_type: JoinType, max_one_row: bool, ) -> PlanRef
source§impl Planner
impl Planner
pub(super) fn plan_set_expr( &mut self, set_expr: BoundSetExpr, extra_order_exprs: Vec<ExprImpl>, order: &[ColumnOrder], ) -> Result<PlanRef, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_set_operation( &mut self, op: BoundSetOperation, all: bool, corresponding_col_indices: Option<(ColIndexMapping, ColIndexMapping)>, left: BoundSetExpr, right: BoundSetExpr, ) -> Result<PlanRef, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_statement( &mut self, stmt: BoundStatement, ) -> Result<PlanRoot, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_update( &mut self, update: BoundUpdate, ) -> Result<PlanRoot, RwError>
source§impl Planner
impl Planner
pub(super) fn plan_values( &mut self, values: BoundValues, ) -> Result<PlanRef, RwError>
source§impl Planner
impl Planner
pub fn new(ctx: OptimizerContextRef) -> Planner
sourcepub fn plan(&mut self, stmt: BoundStatement) -> Result<PlanRoot, RwError>
pub fn plan(&mut self, stmt: BoundStatement) -> Result<PlanRoot, RwError>
Plan a BoundStatement
. Need to bind a statement before plan.
pub fn ctx(&self) -> OptimizerContextRef
Auto Trait Implementations§
impl Freeze for Planner
impl !RefUnwindSafe for Planner
impl !Send for Planner
impl !Sync for Planner
impl Unpin for Planner
impl !UnwindSafe for Planner
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> IntoResult<T> for T
impl<T> IntoResult<T> for T
type Err = Infallible
fn into_result(self) -> Result<T, <T as IntoResult<T>>::Err>
§impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
source§impl<M> MetricVecRelabelExt for M
impl<M> MetricVecRelabelExt for M
source§fn relabel(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level
.source§fn relabel_n(
self,
metric_level: MetricLevel,
relabel_threshold: MetricLevel,
relabel_num: usize,
) -> RelabeledMetricVec<M>
fn relabel_n( self, metric_level: MetricLevel, relabel_threshold: MetricLevel, relabel_num: usize, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
.source§fn relabel_debug_1(
self,
relabel_threshold: MetricLevel,
) -> RelabeledMetricVec<M>
fn relabel_debug_1( self, relabel_threshold: MetricLevel, ) -> RelabeledMetricVec<M>
RelabeledMetricVec::with_metric_level_relabel_n
with metric_level
set to
MetricLevel::Debug
and relabel_num
set to 1.§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<Source> Sculptor<HNil, HNil> for Source
impl<Source> Sculptor<HNil, HNil> for Source
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.