@@ -27,7 +27,9 @@ use arrow::compute::kernels::zip::zip;
2727use arrow:: compute:: { and, and_not, is_null, not, nullif, or, prep_null_mask_filter} ;
2828use arrow:: datatypes:: { DataType , Schema } ;
2929use 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+ } ;
3133use datafusion_expr:: ColumnarValue ;
3234
3335use 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