This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 5a24ec909b fix: make sure CASE WHEN pick first true branch when WHEN
clause is true (#8477)
5a24ec909b is described below
commit 5a24ec909b0433c4b297eeae3fed0265283d7b66
Author: Huaijin <[email protected]>
AuthorDate: Fri Dec 15 08:21:37 2023 +0800
fix: make sure CASE WHEN pick first true branch when WHEN clause is true
(#8477)
* fix: make case when pick first true branch when when clause is true
* add more test
---
datafusion/physical-expr/src/expressions/case.rs | 4 ++++
datafusion/sqllogictest/test_files/scalar.slt | 10 ++++++++++
2 files changed, 14 insertions(+)
diff --git a/datafusion/physical-expr/src/expressions/case.rs
b/datafusion/physical-expr/src/expressions/case.rs
index 5fcfd61d90..52fb85657f 100644
--- a/datafusion/physical-expr/src/expressions/case.rs
+++ b/datafusion/physical-expr/src/expressions/case.rs
@@ -145,6 +145,8 @@ impl CaseExpr {
0 => Cow::Borrowed(&when_match),
_ => Cow::Owned(prep_null_mask_filter(&when_match)),
};
+ // Make sure we only consider rows that have not been matched yet
+ let when_match = and(&when_match, &remainder)?;
let then_value = self.when_then_expr[i]
.1
@@ -206,6 +208,8 @@ impl CaseExpr {
0 => Cow::Borrowed(when_value),
_ => Cow::Owned(prep_null_mask_filter(when_value)),
};
+ // Make sure we only consider rows that have not been matched yet
+ let when_value = and(&when_value, &remainder)?;
let then_value = self.when_then_expr[i]
.1
diff --git a/datafusion/sqllogictest/test_files/scalar.slt
b/datafusion/sqllogictest/test_files/scalar.slt
index b3597c664f..9b30699e3f 100644
--- a/datafusion/sqllogictest/test_files/scalar.slt
+++ b/datafusion/sqllogictest/test_files/scalar.slt
@@ -1943,3 +1943,13 @@ select
;
----
true true true true true true true true true true
+
+query I
+SELECT ALL - CASE WHEN NOT - AVG ( - 41 ) IS NULL THEN 47 WHEN NULL IS NULL
THEN COUNT ( * ) END + 93 + - - 44 * 91 + CASE + 44 WHEN - - 21 * 69 - 12 THEN
58 ELSE - 3 END * + + 23 * + 84 * - - 59
+----
+-337914
+
+query T
+SELECT CASE 3 WHEN 1+2 THEN 'first' WHEN 1+1+1 THEN 'second' END
+----
+first