@@ -21,7 +21,6 @@ use crate::AnalyzerRule;
21
21
use datafusion_common:: config:: ConfigOptions ;
22
22
use datafusion_common:: tree_node:: { Transformed , TransformedResult } ;
23
23
use datafusion_common:: { Column , Result } ;
24
- use datafusion_expr:: builder:: validate_unique_names;
25
24
use datafusion_expr:: expr:: PlannedReplaceSelectItem ;
26
25
use datafusion_expr:: utils:: {
27
26
expand_qualified_wildcard, expand_wildcard, find_base_plan,
@@ -53,12 +52,16 @@ impl AnalyzerRule for ExpandWildcardRule {
53
52
54
53
fn expand_internal ( plan : LogicalPlan ) -> Result < Transformed < LogicalPlan > > {
55
54
match plan {
56
- LogicalPlan :: Projection ( Projection { expr, input, .. } ) => {
57
- let projected_expr = expand_exprlist ( & input, expr) ?;
58
- Ok ( Transformed :: yes (
59
- Projection :: try_new ( projected_expr, Arc :: clone ( & input) )
60
- . map ( LogicalPlan :: Projection ) ?,
61
- ) )
55
+ LogicalPlan :: Projection ( projection) => {
56
+ let projected_expr =
57
+ expand_exprlist ( & projection. input , projection. expr . clone ( ) ) ?;
58
+ match projected_expr {
59
+ None => Ok ( Transformed :: no ( LogicalPlan :: Projection ( projection) ) ) ,
60
+ Some ( projected_expr) => Ok ( Transformed :: yes (
61
+ Projection :: try_new ( projected_expr, Arc :: clone ( & projection. input ) )
62
+ . map ( LogicalPlan :: Projection ) ?,
63
+ ) ) ,
64
+ }
62
65
}
63
66
// The schema of the plan should also be updated if the child plan is transformed.
64
67
LogicalPlan :: SubqueryAlias ( SubqueryAlias { input, alias, .. } ) => {
@@ -68,22 +71,30 @@ fn expand_internal(plan: LogicalPlan) -> Result<Transformed<LogicalPlan>> {
68
71
}
69
72
LogicalPlan :: Distinct ( Distinct :: On ( distinct_on) ) => {
70
73
let projected_expr =
71
- expand_exprlist ( & distinct_on. input , distinct_on. select_expr ) ?;
72
- validate_unique_names ( "Distinct" , projected_expr. iter ( ) ) ?;
73
- Ok ( Transformed :: yes ( LogicalPlan :: Distinct ( Distinct :: On (
74
- DistinctOn :: try_new (
75
- distinct_on. on_expr ,
76
- projected_expr,
77
- distinct_on. sort_expr ,
78
- distinct_on. input ,
79
- ) ?,
80
- ) ) ) )
74
+ expand_exprlist ( & distinct_on. input , distinct_on. select_expr . clone ( ) ) ?;
75
+ match projected_expr {
76
+ None => Ok ( Transformed :: no ( LogicalPlan :: Distinct ( Distinct :: On (
77
+ distinct_on,
78
+ ) ) ) ) ,
79
+ Some ( projected_expr) => Ok ( Transformed :: yes ( LogicalPlan :: Distinct (
80
+ Distinct :: On ( DistinctOn :: try_new (
81
+ distinct_on. on_expr ,
82
+ projected_expr,
83
+ distinct_on. sort_expr ,
84
+ distinct_on. input ,
85
+ ) ?) ,
86
+ ) ) ) ,
87
+ }
81
88
}
82
89
_ => Ok ( Transformed :: no ( plan) ) ,
83
90
}
84
91
}
85
92
86
- fn expand_exprlist ( input : & LogicalPlan , expr : Vec < Expr > ) -> Result < Vec < Expr > > {
93
+ fn expand_exprlist ( input : & LogicalPlan , expr : Vec < Expr > ) -> Result < Option < Vec < Expr > > > {
94
+ if !expr. iter ( ) . any ( |e| matches ! ( e, Expr :: Wildcard { .. } ) ) {
95
+ return Ok ( None ) ;
96
+ }
97
+
87
98
let mut projected_expr = vec ! [ ] ;
88
99
let input = find_base_plan ( input) ;
89
100
for e in expr {
@@ -144,7 +155,7 @@ fn expand_exprlist(input: &LogicalPlan, expr: Vec<Expr>) -> Result<Vec<Expr>> {
144
155
_ => projected_expr. push ( e) ,
145
156
}
146
157
}
147
- Ok ( projected_expr)
158
+ Ok ( Some ( projected_expr) )
148
159
}
149
160
150
161
/// If there is a REPLACE statement in the projected expression in the form of
0 commit comments