@@ -39,74 +39,71 @@ impl OptimizerRule for ScalarSubqueryToJoin {
3939 }
4040
4141 fn rewrite ( & self , plan : LogicalPlan ) -> Result < LogicalPlan > {
42- let new_plan = plan
43- . transform ( |plan| match plan {
44- LogicalPlan :: Filter ( filter) => {
45- if !contains_scalar_subquery ( & filter. expr ) {
46- return Ok ( Transformed :: no ( LogicalPlan :: Filter ( filter) ) ) ;
47- }
48-
49- let ( subqueries, rewritten_expr) = extract_subquery_exprs ( filter. expr . clone ( ) , & self . id_generator ) ?;
50- let mut cur_input = filter. input . as_ref ( ) . clone ( ) ;
51-
52- // iterate through all subqueries in predicate, turning each into a left join
53- for ( subquery, subquery_alias) in subqueries {
54- let ( correlated_exprs, new_subquery_plan) =
55- find_correlated_exprs ( subquery. subquery . as_ref ( ) . clone ( ) ) ?;
56-
57- let new_subquery_plan = LogicalPlanBuilder :: from ( new_subquery_plan)
58- . alias ( & subquery_alias) ?
59- . build ( ) ;
60-
61- cur_input = match filter. input . as_ref ( ) {
62- LogicalPlan :: EmptyRelation ( _) => new_subquery_plan,
63- _ => {
64- let mut all_correlated_cols = BTreeSet :: new ( ) ;
65- correlated_exprs
66- . correlated_subquery_cols_map
67- . values ( )
68- . for_each ( |cols| all_correlated_cols. extend ( cols. clone ( ) ) ) ;
69-
70- let join_filter = correlated_exprs
71- . join_filters
72- . into_iter ( )
73- . reduce ( LogicalExpr :: and)
74- . map_or ( Ok ( Some ( LogicalExpr :: Literal ( true . into ( ) ) ) ) , |expr| {
75- expr. transform ( |expr| match expr {
76- LogicalExpr :: Column ( col) if all_correlated_cols. contains ( & col) => {
77- Ok ( Transformed :: yes ( LogicalExpr :: Column (
78- col. with_relation ( subquery_alias. clone ( ) ) ,
79- ) ) )
80- }
81- _ => Ok ( Transformed :: no ( expr) ) ,
82- } )
83- . data ( )
84- . map ( Some )
85- } ) ?;
86-
87- LogicalPlanBuilder :: from ( cur_input)
88- . join_on ( new_subquery_plan, JoinType :: Left , join_filter) ?
89- . build ( )
90- }
91- } ;
92- }
42+ let plan = match plan {
43+ LogicalPlan :: Filter ( filter) => {
44+ if !contains_scalar_subquery ( & filter. expr ) {
45+ return Ok ( LogicalPlan :: Filter ( filter) ) ;
46+ }
9347
94- Ok ( Transformed :: yes ( LogicalPlanBuilder :: filter ( cur_input, rewritten_expr) ?) )
48+ let ( subqueries, rewritten_expr) = extract_subquery_exprs ( filter. expr . clone ( ) , & self . id_generator ) ?;
49+ let mut cur_input = filter. input . as_ref ( ) . clone ( ) ;
50+
51+ // iterate through all subqueries in predicate, turning each into a left join
52+ for ( subquery, subquery_alias) in subqueries {
53+ let ( correlated_exprs, new_subquery_plan) =
54+ find_correlated_exprs ( subquery. subquery . as_ref ( ) . clone ( ) ) ?;
55+
56+ let new_subquery_plan = LogicalPlanBuilder :: from ( new_subquery_plan)
57+ . alias ( & subquery_alias) ?
58+ . build ( ) ;
59+
60+ cur_input = match filter. input . as_ref ( ) {
61+ LogicalPlan :: EmptyRelation ( _) => new_subquery_plan,
62+ _ => {
63+ let mut all_correlated_cols = BTreeSet :: new ( ) ;
64+ correlated_exprs
65+ . correlated_subquery_cols_map
66+ . values ( )
67+ . for_each ( |cols| all_correlated_cols. extend ( cols. clone ( ) ) ) ;
68+
69+ let join_filter = correlated_exprs
70+ . join_filters
71+ . into_iter ( )
72+ . reduce ( LogicalExpr :: and)
73+ . map_or ( Ok ( Some ( LogicalExpr :: Literal ( true . into ( ) ) ) ) , |expr| {
74+ expr. transform ( |expr| match expr {
75+ LogicalExpr :: Column ( col) if all_correlated_cols. contains ( & col) => {
76+ Ok ( Transformed :: yes ( LogicalExpr :: Column (
77+ col. with_relation ( subquery_alias. clone ( ) ) ,
78+ ) ) )
79+ }
80+ _ => Ok ( Transformed :: no ( expr) ) ,
81+ } )
82+ . data ( )
83+ . map ( Some )
84+ } ) ?;
85+
86+ LogicalPlanBuilder :: from ( cur_input)
87+ . join_on ( new_subquery_plan, JoinType :: Left , join_filter) ?
88+ . build ( )
89+ }
90+ } ;
9591 }
96- LogicalPlan :: SubqueryAlias ( subquery_alias) => self
97- . rewrite ( Arc :: unwrap_or_clone ( subquery_alias. input ) )
98- . and_then ( |new_plan| {
99- LogicalPlanBuilder :: from ( new_plan)
100- . alias ( & subquery_alias. alias . to_qualified_name ( ) )
101- . map ( LogicalPlanBuilder :: build)
102- } )
103- . map ( Transformed :: yes) ,
104- _ => Ok ( Transformed :: no ( plan) ) ,
105- } )
106- . data ( ) ?;
10792
108- new_plan
109- . map_children ( |child_plan| self . rewrite ( child_plan) . map ( Transformed :: yes) )
93+ LogicalPlanBuilder :: filter ( cur_input, rewritten_expr) ?
94+ }
95+ LogicalPlan :: SubqueryAlias ( subquery_alias) => self
96+ . rewrite ( Arc :: unwrap_or_clone ( subquery_alias. input ) )
97+ . and_then ( |new_plan| {
98+ LogicalPlanBuilder :: from ( new_plan)
99+ . alias ( & subquery_alias. alias . to_qualified_name ( ) )
100+ . map ( LogicalPlanBuilder :: build)
101+ } ) ?,
102+ _ => plan,
103+ } ;
104+
105+ // rewrite children
106+ plan. map_children ( |child_plan| self . rewrite ( child_plan) . map ( Transformed :: yes) )
110107 . data ( )
111108 }
112109}
0 commit comments