Skip to content

Commit c62d671

Browse files
authored
fix: lazy case else expression evaluation (apache#17311)
1 parent 1756692 commit c62d671

File tree

2 files changed

+18
-6
lines changed
  • datafusion

2 files changed

+18
-6
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,14 @@ impl CaseExpr {
323323
}
324324

325325
if let Some(e) = self.else_expr() {
326-
// keep `else_expr`'s data type and return type consistent
327-
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
328-
let else_ = expr
329-
.evaluate_selection(batch, &remainder)?
330-
.into_array(batch.num_rows())?;
331-
current_value = zip(&remainder, &else_, &current_value)?;
326+
if remainder.true_count() > 0 {
327+
// keep `else_expr`'s data type and return type consistent
328+
let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
329+
let else_ = expr
330+
.evaluate_selection(batch, &remainder)?
331+
.into_array(batch.num_rows())?;
332+
current_value = zip(&remainder, &else_, &current_value)?;
333+
}
332334
}
333335

334336
Ok(ColumnarValue::Array(current_value))

datafusion/sqllogictest/test_files/case.slt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,3 +482,13 @@ SELECT v, CASE WHEN v < 0 THEN 10/0 ELSE 1 END FROM (VALUES (1), (2)) t(v)
482482

483483
statement ok
484484
drop table t
485+
486+
query I
487+
SELECT case when true then 1 / 1 else 1 / 0 end;
488+
----
489+
1
490+
491+
query I
492+
SELECT case when false then 1 / 0 else 1 / 1 end;
493+
----
494+
1

0 commit comments

Comments
 (0)