Skip to content

Commit 723a595

Browse files
authored
Minor: avoid a clone in type coercion (#11530)
* Minor: avoid a clone in type coercion * Fix test
1 parent 4dd8532 commit 723a595

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

datafusion/optimizer/src/analyzer/type_coercion.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ impl AnalyzerRule for TypeCoercion {
8484
/// Assumes that children have already been optimized
8585
fn analyze_internal(
8686
external_schema: &DFSchema,
87-
mut plan: LogicalPlan,
87+
plan: LogicalPlan,
8888
) -> Result<Transformed<LogicalPlan>> {
8989
// get schema representing all available input fields. This is used for data type
9090
// resolution only, so order does not matter here
@@ -103,15 +103,13 @@ fn analyze_internal(
103103
// select t2.c2 from t1 where t1.c1 in (select t2.c1 from t2 where t2.c2=t1.c3)
104104
schema.merge(external_schema);
105105

106-
if let LogicalPlan::Filter(filter) = &mut plan {
107-
if let Ok(new_predicate) = filter
108-
.predicate
109-
.clone()
110-
.cast_to(&DataType::Boolean, filter.input.schema())
111-
{
112-
filter.predicate = new_predicate;
113-
}
114-
}
106+
// Coerce filter predicates to boolean (handles `WHERE NULL`)
107+
let plan = if let LogicalPlan::Filter(mut filter) = plan {
108+
filter.predicate = filter.predicate.cast_to(&DataType::Boolean, &schema)?;
109+
LogicalPlan::Filter(filter)
110+
} else {
111+
plan
112+
};
115113

116114
let mut expr_rewrite = TypeCoercionRewriter::new(&schema);
117115

datafusion/sqllogictest/test_files/misc.slt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ query I
3030
select 1 where NULL
3131
----
3232

33+
# Where clause does not accept non boolean and has nice error message
34+
query error Cannot create filter with non\-boolean predicate 'Utf8\("foo"\)' returning Utf8
35+
select 1 where 'foo'
36+
3337
query I
3438
select 1 where NULL and 1 = 1
3539
----

0 commit comments

Comments
 (0)