Skip to content

Commit ac9584e

Browse files
cj-zhukovSergey Zhukovalamb
authored
Simplify error handling in case.rs (#13990) (#14033)
* Simplify error handling in case.rs (#13990) * Fix issues causing GitHub checks to fail * Update datafusion/physical-expr/src/expressions/case.rs Co-authored-by: Andrew Lamb <[email protected]> --------- Co-authored-by: Sergey Zhukov <[email protected]> Co-authored-by: Andrew Lamb <[email protected]>
1 parent 61afb0d commit ac9584e

File tree

1 file changed

+15
-21
lines changed
  • datafusion/physical-expr/src/expressions

1 file changed

+15
-21
lines changed

datafusion/physical-expr/src/expressions/case.rs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ use arrow::compute::kernels::zip::zip;
2727
use arrow::compute::{and, and_not, is_null, not, nullif, or, prep_null_mask_filter};
2828
use arrow::datatypes::{DataType, Schema};
2929
use datafusion_common::cast::as_boolean_array;
30-
use datafusion_common::{exec_err, internal_err, DataFusionError, Result, ScalarValue};
30+
use datafusion_common::{
31+
exec_err, internal_datafusion_err, internal_err, DataFusionError, Result, ScalarValue,
32+
};
3133
use datafusion_expr::ColumnarValue;
3234

3335
use super::{Column, Literal};
@@ -249,10 +251,9 @@ impl CaseExpr {
249251
remainder = and_not(&remainder, &when_match)?;
250252
}
251253

252-
if let Some(e) = &self.else_expr {
254+
if let Some(e) = self.else_expr() {
253255
// keep `else_expr`'s data type and return type consistent
254-
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())
255-
.unwrap_or_else(|_| Arc::clone(e));
256+
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
256257
// null and unmatched tuples should be assigned else value
257258
remainder = or(&base_nulls, &remainder)?;
258259
let else_ = expr
@@ -282,11 +283,8 @@ impl CaseExpr {
282283
.0
283284
.evaluate_selection(batch, &remainder)?;
284285
let when_value = when_value.into_array(batch.num_rows())?;
285-
let when_value = as_boolean_array(&when_value).map_err(|e| {
286-
DataFusionError::Context(
287-
"WHEN expression did not return a BooleanArray".to_string(),
288-
Box::new(e),
289-
)
286+
let when_value = as_boolean_array(&when_value).map_err(|_| {
287+
internal_datafusion_err!("WHEN expression did not return a BooleanArray")
290288
})?;
291289
// Treat 'NULL' as false value
292290
let when_value = match when_value.null_count() {
@@ -322,10 +320,9 @@ impl CaseExpr {
322320
remainder = and_not(&remainder, &when_value)?;
323321
}
324322

325-
if let Some(e) = &self.else_expr {
323+
if let Some(e) = self.else_expr() {
326324
// keep `else_expr`'s data type and return type consistent
327-
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())
328-
.unwrap_or_else(|_| Arc::clone(e));
325+
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
329326
let else_ = expr
330327
.evaluate_selection(batch, &remainder)?
331328
.into_array(batch.num_rows())?;
@@ -376,11 +373,8 @@ impl CaseExpr {
376373
// evaluate when expression
377374
let when_value = self.when_then_expr[0].0.evaluate(batch)?;
378375
let when_value = when_value.into_array(batch.num_rows())?;
379-
let when_value = as_boolean_array(&when_value).map_err(|e| {
380-
DataFusionError::Context(
381-
"WHEN expression did not return a BooleanArray".to_string(),
382-
Box::new(e),
383-
)
376+
let when_value = as_boolean_array(&when_value).map_err(|_| {
377+
internal_datafusion_err!("WHEN expression did not return a BooleanArray")
384378
})?;
385379

386380
// Treat 'NULL' as false value
@@ -393,12 +387,12 @@ impl CaseExpr {
393387
let then_value = self.when_then_expr[0].1.evaluate(batch)?;
394388
let then_value = Scalar::new(then_value.into_array(1)?);
395389

390+
let Some(e) = self.else_expr() else {
391+
return internal_err!("expression did not evaluate to an array");
392+
};
396393
// keep `else_expr`'s data type and return type consistent
397-
let e = self.else_expr.as_ref().unwrap();
398-
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type)
399-
.unwrap_or_else(|_| Arc::clone(e));
394+
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type)?;
400395
let else_ = Scalar::new(expr.evaluate(batch)?.into_array(1)?);
401-
402396
Ok(ColumnarValue::Array(zip(&when_value, &then_value, &else_)?))
403397
}
404398

0 commit comments

Comments
 (0)