@@ -27,8 +27,9 @@ use crate::datasource::TableProvider;
2727use crate :: logical_plan:: window_frames:: { WindowFrame , WindowFrameUnits } ;
2828use crate :: logical_plan:: Expr :: Alias ;
2929use crate :: logical_plan:: {
30- and, col, lit, normalize_col, union_with_alias, Column , DFSchema , Expr , LogicalPlan ,
31- LogicalPlanBuilder , Operator , PlanType , StringifiedPlan , ToDFSchema ,
30+ and, builder:: expand_wildcard, col, lit, normalize_col, union_with_alias, Column ,
31+ DFSchema , Expr , LogicalPlan , LogicalPlanBuilder , Operator , PlanType , StringifiedPlan ,
32+ ToDFSchema ,
3233} ;
3334use crate :: prelude:: JoinType ;
3435use crate :: scalar:: ScalarValue ;
@@ -56,7 +57,7 @@ use sqlparser::parser::ParserError::ParserError;
5657use super :: {
5758 parser:: DFParser ,
5859 utils:: {
59- can_columns_satisfy_exprs, expand_wildcard , expr_as_column_expr, extract_aliases,
60+ can_columns_satisfy_exprs, expr_as_column_expr, extract_aliases,
6061 find_aggregate_exprs, find_column_exprs, find_window_exprs,
6162 group_window_expr_by_sort_keys, rebase_expr, resolve_aliases_to_exprs,
6263 resolve_positions_to_exprs,
@@ -687,9 +688,17 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
687688 . iter ( )
688689 . map ( |expr| self . sql_select_to_rex ( expr, input_schema) )
689690 . collect :: < Result < Vec < Expr > > > ( ) ?
690- . iter ( )
691- . flat_map ( |expr| expand_wildcard ( expr, input_schema) )
692- . map ( |expr| normalize_col ( expr, plan) )
691+ . into_iter ( )
692+ . map ( |expr| {
693+ Ok ( match expr {
694+ Expr :: Wildcard => expand_wildcard ( input_schema, plan) ?,
695+ _ => vec ! [ normalize_col( expr, plan) ?] ,
696+ } )
697+ } )
698+ . flat_map ( |res| match res {
699+ Ok ( v) => v. into_iter ( ) . map ( Ok ) . collect ( ) ,
700+ Err ( e) => vec ! [ Err ( e) ] ,
701+ } )
693702 . collect :: < Result < Vec < Expr > > > ( )
694703 }
695704
@@ -2773,6 +2782,19 @@ mod tests {
27732782 quick_test ( sql, expected) ;
27742783 }
27752784
2785+ #[ test]
2786+ fn project_wildcard_on_join_with_using ( ) {
2787+ let sql = "SELECT * \
2788+ FROM lineitem \
2789+ JOIN lineitem as lineitem2 \
2790+ USING (l_item_id)";
2791+ let expected = "Projection: #lineitem.l_item_id, #lineitem.l_description, #lineitem.price, #lineitem2.l_description, #lineitem2.price\
2792+ \n Join: Using #lineitem.l_item_id = #lineitem2.l_item_id\
2793+ \n TableScan: lineitem projection=None\
2794+ \n TableScan: lineitem2 projection=None";
2795+ quick_test ( sql, expected) ;
2796+ }
2797+
27762798 #[ test]
27772799 fn equijoin_explicit_syntax_3_tables ( ) {
27782800 let sql = "SELECT id, order_id, l_description \
0 commit comments