@@ -267,22 +267,64 @@ pub struct Limit {
267267/// Evaluates correlated sub queries 
268268#[ derive( Clone ) ]  
269269pub  struct  Subquery  { 
270-     /// The list of sub queries 
271- pub  subqueries :  Vec < LogicalPlan > , 
272270    /// The incoming logical plan 
273271pub  input :  Arc < LogicalPlan > , 
272+     /// The list of sub queries 
273+ pub  subqueries :  Vec < LogicalPlan > , 
274+     /// The list of subquery types 
275+ pub  types :  Vec < SubqueryType > , 
274276    /// The schema description of the output 
275277pub  schema :  DFSchemaRef , 
276278} 
277279
280+ /// Subquery type 
281+ #[ derive( Debug ,  Clone ,  Copy ,  PartialEq ,  Eq ,  Hash ,  PartialOrd ,  Ord ) ]  
282+ pub  enum  SubqueryType  { 
283+     /// Scalar (SELECT, WHERE) evaluating to one value 
284+ Scalar , 
285+     // This will be extended with `Exists` and `AnyAll` types. 
286+ } 
287+ 
288+ impl  Display  for  SubqueryType  { 
289+     fn  fmt ( & self ,  f :  & mut  Formatter )  -> fmt:: Result  { 
290+         let  subquery_type = match  self  { 
291+             SubqueryType :: Scalar  => "Scalar" , 
292+         } ; 
293+         write ! ( f,  "{}" ,  subquery_type) 
294+     } 
295+ } 
296+ 
278297impl  Subquery  { 
279298    /// Merge schema of main input and correlated subquery columns 
280- pub  fn  merged_schema ( input :  & LogicalPlan ,  subqueries :  & [ LogicalPlan ] )  -> DFSchema  { 
281-         subqueries. iter ( ) . fold ( ( * * input. schema ( ) ) . clone ( ) ,  |a,  b| { 
282-             let  mut  res = a; 
283-             res. merge ( b. schema ( ) ) ; 
284-             res
285-         } ) 
299+ pub  fn  merged_schema ( 
300+         input :  & LogicalPlan , 
301+         subqueries :  & [ LogicalPlan ] , 
302+         types :  & [ SubqueryType ] , 
303+     )  -> DFSchema  { 
304+         subqueries. iter ( ) . zip ( types. iter ( ) ) . fold ( 
305+             ( * * input. schema ( ) ) . clone ( ) , 
306+             |schema,  ( plan,  typ) | { 
307+                 let  mut  schema = schema; 
308+                 schema. merge ( & Self :: transform_dfschema ( plan. schema ( ) ,  * typ) ) ; 
309+                 schema
310+             } , 
311+         ) 
312+     } 
313+ 
314+     /// Transform DataFusion schema according to subquery type 
315+ pub  fn  transform_dfschema ( schema :  & DFSchema ,  typ :  SubqueryType )  -> DFSchema  { 
316+         match  typ { 
317+             SubqueryType :: Scalar  => schema. clone ( ) , 
318+             // Schema will be transformed for `Exists` and `AnyAll` 
319+         } 
320+     } 
321+ 
322+     /// Transform Arrow field according to subquery type 
323+ pub  fn  transform_field ( field :  & Field ,  typ :  SubqueryType )  -> Field  { 
324+         match  typ { 
325+             SubqueryType :: Scalar  => field. clone ( ) , 
326+             // Field will be transformed for `Exists` and `AnyAll` 
327+         } 
286328    } 
287329} 
288330
@@ -475,13 +517,23 @@ impl LogicalPlan {
475517            LogicalPlan :: Values ( Values  {  schema,  .. } )  => vec ! [ schema] , 
476518            LogicalPlan :: Window ( Window  {  input,  schema,  .. } ) 
477519            | LogicalPlan :: Projection ( Projection  {  input,  schema,  .. } ) 
478-             | LogicalPlan :: Subquery ( Subquery  {  input,  schema,  .. } ) 
479520            | LogicalPlan :: Aggregate ( Aggregate  {  input,  schema,  .. } ) 
480521            | LogicalPlan :: TableUDFs ( TableUDFs  {  input,  schema,  .. } )  => { 
481522                let  mut  schemas = input. all_schemas ( ) ; 
482523                schemas. insert ( 0 ,  schema) ; 
483524                schemas
484525            } 
526+             LogicalPlan :: Subquery ( Subquery  { 
527+                 input, 
528+                 subqueries, 
529+                 schema, 
530+                 ..
531+             } )  => { 
532+                 let  mut  schemas = input. all_schemas ( ) ; 
533+                 schemas. extend ( subqueries. iter ( ) . map ( |s| s. schema ( ) ) ) ; 
534+                 schemas. insert ( 0 ,  schema) ; 
535+                 schemas
536+             } 
485537            LogicalPlan :: Join ( Join  { 
486538                left, 
487539                right, 
@@ -1063,7 +1115,9 @@ impl LogicalPlan {
10631115                        } 
10641116                        Ok ( ( ) ) 
10651117                    } 
1066-                     LogicalPlan :: Subquery ( Subquery  {  .. } )  => write ! ( f,  "Subquery" ) , 
1118+                     LogicalPlan :: Subquery ( Subquery  {  types,  .. } )  => { 
1119+                         write ! ( f,  "Subquery: types={:?}" ,  types) 
1120+                     } 
10671121                    LogicalPlan :: Filter ( Filter  { 
10681122                        predicate :  ref  expr, 
10691123                        ..
0 commit comments