@@ -27,7 +27,9 @@ use arrow::compute::kernels::zip::zip;
27
27
use arrow:: compute:: { and, and_not, is_null, not, nullif, or, prep_null_mask_filter} ;
28
28
use arrow:: datatypes:: { DataType , Schema } ;
29
29
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
+ } ;
31
33
use datafusion_expr:: ColumnarValue ;
32
34
33
35
use super :: { Column , Literal } ;
@@ -249,10 +251,9 @@ impl CaseExpr {
249
251
remainder = and_not ( & remainder, & when_match) ?;
250
252
}
251
253
252
- if let Some ( e) = & self . else_expr {
254
+ if let Some ( e) = self . else_expr ( ) {
253
255
// 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 ( ) ) ?;
256
257
// null and unmatched tuples should be assigned else value
257
258
remainder = or ( & base_nulls, & remainder) ?;
258
259
let else_ = expr
@@ -282,11 +283,8 @@ impl CaseExpr {
282
283
. 0
283
284
. evaluate_selection ( batch, & remainder) ?;
284
285
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" )
290
288
} ) ?;
291
289
// Treat 'NULL' as false value
292
290
let when_value = match when_value. null_count ( ) {
@@ -322,10 +320,9 @@ impl CaseExpr {
322
320
remainder = and_not ( & remainder, & when_value) ?;
323
321
}
324
322
325
- if let Some ( e) = & self . else_expr {
323
+ if let Some ( e) = self . else_expr ( ) {
326
324
// 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 ( ) ) ?;
329
326
let else_ = expr
330
327
. evaluate_selection ( batch, & remainder) ?
331
328
. into_array ( batch. num_rows ( ) ) ?;
@@ -376,11 +373,8 @@ impl CaseExpr {
376
373
// evaluate when expression
377
374
let when_value = self . when_then_expr [ 0 ] . 0 . evaluate ( batch) ?;
378
375
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" )
384
378
} ) ?;
385
379
386
380
// Treat 'NULL' as false value
@@ -393,12 +387,12 @@ impl CaseExpr {
393
387
let then_value = self . when_then_expr [ 0 ] . 1 . evaluate ( batch) ?;
394
388
let then_value = Scalar :: new ( then_value. into_array ( 1 ) ?) ;
395
389
390
+ let Some ( e) = self . else_expr ( ) else {
391
+ return internal_err ! ( "expression did not evaluate to an array" ) ;
392
+ } ;
396
393
// 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) ?;
400
395
let else_ = Scalar :: new ( expr. evaluate ( batch) ?. into_array ( 1 ) ?) ;
401
-
402
396
Ok ( ColumnarValue :: Array ( zip ( & when_value, & then_value, & else_) ?) )
403
397
}
404
398
0 commit comments