Skip to content

Commit bd101da

Browse files
committed
Box wildcard options
1 parent aae9eba commit bd101da

File tree

8 files changed

+21
-48
lines changed

8 files changed

+21
-48
lines changed

datafusion/expr/src/expr.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,6 @@ use sqlparser::ast::{
222222
/// // to 42 = 5 AND b = 6
223223
/// assert_eq!(rewritten.data, lit(42).eq(lit(5)).and(col("b").eq(lit(6))));
224224
#[derive(Clone, PartialEq, Eq, PartialOrd, Hash, Debug)]
225-
// TODO make the enum smaller with more boxing (looks like Wildcard is now bigger)
226-
#[allow(clippy::large_enum_variant)]
227225
pub enum Expr {
228226
/// An expression with a specific name.
229227
Alias(Alias),
@@ -315,7 +313,7 @@ pub enum Expr {
315313
/// plan into physical plan.
316314
Wildcard {
317315
qualifier: Option<TableReference>,
318-
options: WildcardOptions,
316+
options: Box<WildcardOptions>,
319317
},
320318
/// List of grouping set expressions. Only valid in the context of an aggregate
321319
/// GROUP BY expression list

datafusion/expr/src/expr_fn.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@ pub fn placeholder(id: impl Into<String>) -> Expr {
123123
pub fn wildcard() -> Expr {
124124
Expr::Wildcard {
125125
qualifier: None,
126-
options: WildcardOptions::default(),
126+
options: Box::new(WildcardOptions::default()),
127127
}
128128
}
129129

130130
/// Create an '*' [`Expr::Wildcard`] expression with the wildcard options
131131
pub fn wildcard_with_options(options: WildcardOptions) -> Expr {
132132
Expr::Wildcard {
133133
qualifier: None,
134-
options,
134+
options: Box::new(options),
135135
}
136136
}
137137

@@ -148,7 +148,7 @@ pub fn wildcard_with_options(options: WildcardOptions) -> Expr {
148148
pub fn qualified_wildcard(qualifier: impl Into<TableReference>) -> Expr {
149149
Expr::Wildcard {
150150
qualifier: Some(qualifier.into()),
151-
options: WildcardOptions::default(),
151+
options: Box::new(WildcardOptions::default()),
152152
}
153153
}
154154

@@ -159,7 +159,7 @@ pub fn qualified_wildcard_with_options(
159159
) -> Expr {
160160
Expr::Wildcard {
161161
qualifier: Some(qualifier.into()),
162-
options,
162+
options: Box::new(options),
163163
}
164164
}
165165

datafusion/optimizer/src/analyzer/inline_table_scan.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ use crate::analyzer::AnalyzerRule;
2323
use datafusion_common::config::ConfigOptions;
2424
use datafusion_common::tree_node::{Transformed, TransformedResult, TreeNode};
2525
use datafusion_common::{Column, Result};
26-
use datafusion_expr::expr::WildcardOptions;
27-
use datafusion_expr::{logical_plan::LogicalPlan, Expr, LogicalPlanBuilder};
26+
use datafusion_expr::{logical_plan::LogicalPlan, wildcard, Expr, LogicalPlanBuilder};
2827

2928
/// Analyzed rule that inlines TableScan that provide a [`LogicalPlan`]
3029
/// (DataFrame / ViewTable)
@@ -93,10 +92,7 @@ fn generate_projection_expr(
9392
)));
9493
}
9594
} else {
96-
exprs.push(Expr::Wildcard {
97-
qualifier: None,
98-
options: WildcardOptions::default(),
99-
});
95+
exprs.push(wildcard());
10096
}
10197
Ok(exprs)
10298
}

datafusion/proto/src/logical_plan/from_proto.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ pub fn parse_expr(
513513
let qualifier = qualifier.to_owned().map(|x| x.try_into()).transpose()?;
514514
Ok(Expr::Wildcard {
515515
qualifier,
516-
options: WildcardOptions::default(),
516+
options: Box::new(WildcardOptions::default()),
517517
})
518518
}
519519
ExprType::ScalarUdfExpr(protobuf::ScalarUdfExprNode {

datafusion/proto/tests/cases/roundtrip_logical_plan.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use datafusion_common::{
6767
use datafusion_expr::dml::CopyTo;
6868
use datafusion_expr::expr::{
6969
self, Between, BinaryExpr, Case, Cast, GroupingSet, InList, Like, ScalarFunction,
70-
Unnest, WildcardOptions,
70+
Unnest,
7171
};
7272
use datafusion_expr::logical_plan::{Extension, UserDefinedLogicalNodeCore};
7373
use datafusion_expr::{
@@ -2061,21 +2061,15 @@ fn roundtrip_unnest() {
20612061

20622062
#[test]
20632063
fn roundtrip_wildcard() {
2064-
let test_expr = Expr::Wildcard {
2065-
qualifier: None,
2066-
options: WildcardOptions::default(),
2067-
};
2064+
let test_expr = wildcard();
20682065

20692066
let ctx = SessionContext::new();
20702067
roundtrip_expr_test(test_expr, ctx);
20712068
}
20722069

20732070
#[test]
20742071
fn roundtrip_qualified_wildcard() {
2075-
let test_expr = Expr::Wildcard {
2076-
qualifier: Some("foo".into()),
2077-
options: WildcardOptions::default(),
2078-
};
2072+
let test_expr = qualified_wildcard("foo");
20792073

20802074
let ctx = SessionContext::new();
20812075
roundtrip_expr_test(test_expr, ctx);

datafusion/sql/src/expr/function.rs

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ use datafusion_common::{
2222
internal_datafusion_err, internal_err, not_impl_err, plan_datafusion_err, plan_err,
2323
DFSchema, Dependency, Result,
2424
};
25-
use datafusion_expr::expr::WildcardOptions;
2625
use datafusion_expr::expr::{ScalarFunction, Unnest};
2726
use datafusion_expr::planner::PlannerResult;
2827
use datafusion_expr::{
29-
expr, Expr, ExprFunctionExt, ExprSchemable, WindowFrame, WindowFunctionDefinition,
28+
expr, qualified_wildcard, wildcard, Expr, ExprFunctionExt, ExprSchemable,
29+
WindowFrame, WindowFunctionDefinition,
3030
};
3131
use sqlparser::ast::{
3232
DuplicateTreatment, Expr as SQLExpr, Function as SQLFunction, FunctionArg,
@@ -418,28 +418,19 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
418418
name: _,
419419
arg: FunctionArgExpr::Wildcard,
420420
operator: _,
421-
} => Ok(Expr::Wildcard {
422-
qualifier: None,
423-
options: WildcardOptions::default(),
424-
}),
421+
} => Ok(wildcard()),
425422
FunctionArg::Unnamed(FunctionArgExpr::Expr(arg)) => {
426423
self.sql_expr_to_logical_expr(arg, schema, planner_context)
427424
}
428-
FunctionArg::Unnamed(FunctionArgExpr::Wildcard) => Ok(Expr::Wildcard {
429-
qualifier: None,
430-
options: WildcardOptions::default(),
431-
}),
425+
FunctionArg::Unnamed(FunctionArgExpr::Wildcard) => Ok(wildcard()),
432426
FunctionArg::Unnamed(FunctionArgExpr::QualifiedWildcard(object_name)) => {
433427
let qualifier = self.object_name_to_table_reference(object_name)?;
434428
// Sanity check on qualifier with schema
435429
let qualified_indices = schema.fields_indices_with_qualified(&qualifier);
436430
if qualified_indices.is_empty() {
437431
return plan_err!("Invalid qualifier {qualifier}");
438432
}
439-
Ok(Expr::Wildcard {
440-
qualifier: Some(qualifier),
441-
options: WildcardOptions::default(),
442-
})
433+
Ok(qualified_wildcard(qualifier))
443434
}
444435
_ => not_impl_err!("Unsupported qualified wildcard argument: {sql:?}"),
445436
}

datafusion/sql/src/expr/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,11 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
595595
}
596596
SQLExpr::Wildcard(_token) => Ok(Expr::Wildcard {
597597
qualifier: None,
598-
options: WildcardOptions::default(),
598+
options: Box::new(WildcardOptions::default()),
599599
}),
600600
SQLExpr::QualifiedWildcard(object_name, _token) => Ok(Expr::Wildcard {
601601
qualifier: Some(self.object_name_to_table_reference(object_name)?),
602-
options: WildcardOptions::default(),
602+
options: Box::new(WildcardOptions::default()),
603603
}),
604604
SQLExpr::Tuple(values) => self.parse_tuple(schema, planner_context, values),
605605
_ => not_impl_err!("Unsupported ast node in sqltorel: {sql:?}"),

datafusion/sql/src/unparser/expr.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,7 @@ mod tests {
16881688
let dummy_logical_plan = table_scan(Some("t"), &dummy_schema, None)?
16891689
.project(vec![Expr::Wildcard {
16901690
qualifier: None,
1691-
options: WildcardOptions::default(),
1691+
options: Box::new(WildcardOptions::default()),
16921692
}])?
16931693
.filter(col("a").eq(lit(1)))?
16941694
.build()?;
@@ -1880,21 +1880,15 @@ mod tests {
18801880
(sum(col("a")), r#"sum(a)"#),
18811881
(
18821882
count_udaf()
1883-
.call(vec![Expr::Wildcard {
1884-
qualifier: None,
1885-
options: WildcardOptions::default(),
1886-
}])
1883+
.call(vec![wildcard()])
18871884
.distinct()
18881885
.build()
18891886
.unwrap(),
18901887
"count(DISTINCT *)",
18911888
),
18921889
(
18931890
count_udaf()
1894-
.call(vec![Expr::Wildcard {
1895-
qualifier: None,
1896-
options: WildcardOptions::default(),
1897-
}])
1891+
.call(vec![wildcard()])
18981892
.filter(lit(true))
18991893
.build()
19001894
.unwrap(),

0 commit comments

Comments
 (0)