You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by ad...@apache.org on 2025/08/26 15:32:15 UTC
(datafusion) branch main updated: fix: lazy case else expression evaluation (#17311)
This is an automated email from the ASF dual-hosted git repository.
adriangb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new c62d67186f fix: lazy case else expression evaluation (#17311)
c62d67186f is described below
commit c62d67186fd034eca461304bedda5d2313ca62d3
Author: Chen Chongchen <ch...@qq.com>
AuthorDate: Tue Aug 26 23:32:10 2025 +0800
fix: lazy case else expression evaluation (#17311)
---
datafusion/physical-expr/src/expressions/case.rs | 14 ++++++++------
datafusion/sqllogictest/test_files/case.slt | 10 ++++++++++
2 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/datafusion/physical-expr/src/expressions/case.rs b/datafusion/physical-expr/src/expressions/case.rs
index 1a74e78f10..5fa5144ecd 100644
--- a/datafusion/physical-expr/src/expressions/case.rs
+++ b/datafusion/physical-expr/src/expressions/case.rs
@@ -323,12 +323,14 @@ impl CaseExpr {
}
if let Some(e) = self.else_expr() {
- // keep `else_expr`'s data type and return type consistent
- let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
- let else_ = expr
- .evaluate_selection(batch, &remainder)?
- .into_array(batch.num_rows())?;
- current_value = zip(&remainder, &else_, ¤t_value)?;
+ if remainder.true_count() > 0 {
+ // keep `else_expr`'s data type and return type consistent
+ let expr = try_cast(Arc::clone(e), &batch.schema(), return_type.clone())?;
+ let else_ = expr
+ .evaluate_selection(batch, &remainder)?
+ .into_array(batch.num_rows())?;
+ current_value = zip(&remainder, &else_, ¤t_value)?;
+ }
}
Ok(ColumnarValue::Array(current_value))
diff --git a/datafusion/sqllogictest/test_files/case.slt b/datafusion/sqllogictest/test_files/case.slt
index 21913005e2..69f80f4593 100644
--- a/datafusion/sqllogictest/test_files/case.slt
+++ b/datafusion/sqllogictest/test_files/case.slt
@@ -482,3 +482,13 @@ SELECT v, CASE WHEN v < 0 THEN 10/0 ELSE 1 END FROM (VALUES (1), (2)) t(v)
statement ok
drop table t
+
+query I
+SELECT case when true then 1 / 1 else 1 / 0 end;
+----
+1
+
+query I
+SELECT case when false then 1 / 0 else 1 / 1 end;
+----
+1
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org