diff --git a/crates/calc/src/tests.rs b/crates/calc/src/tests.rs index 3c1330dbe..d29dc9653 100644 --- a/crates/calc/src/tests.rs +++ b/crates/calc/src/tests.rs @@ -1845,6 +1845,11 @@ fn lookup_of_an_empty_cell_stays_blank() { // A blank lookup given as an argument is still given, not omitted. ("D10", "=FILTER(1,FALSE,VLOOKUP(\"k\",A1:B2,2,FALSE))", Value::Number(0.0)), ("D11", "=XLOOKUP(\"z\",A1:A2,B1:B2,VLOOKUP(\"k\",A1:B2,2,0))", Value::Number(0.0)), + // The same holds per element when the call is lifted over an array of blank lookups. + ("D12", "=CEILING.MATH(6.7,VLOOKUP(\"k\",A1:B2,2,0))", Value::Number(0.0)), + ("D13", "=SUM(CEILING.MATH(6.7,VLOOKUP({\"k\",\"k\"},A1:B2,2,0)))", Value::Number(0.0)), + ("D14", "=FLOOR.MATH(6.7,VLOOKUP(\"k\",A1:B2,2,0))", Value::Number(0.0)), + ("D15", "=SUM(FLOOR.MATH(6.7,VLOOKUP({\"k\",\"k\"},A1:B2,2,0)))", Value::Number(0.0)), ] { t.set(at, f); assert_eq!(t.get(at), want, "{f}"); diff --git a/crates/functions/src/lift.rs b/crates/functions/src/lift.rs index 6d2e3fbc4..d474bf12d 100644 --- a/crates/functions/src/lift.rs +++ b/crates/functions/src/lift.rs @@ -115,6 +115,8 @@ pub(crate) fn call_lifted(spec: &FnSpec, args: &[Arg], ctx: &mut dyn Ctx) -> Val { let v = arr.get_broadcast(r, c); slot.value = if let Value::Array(inner) = &v { inner.data.first().cloned().unwrap_or(Value::Empty) } else { v }; + // A blank element of a written array argument is given, as a scalar blank is. + slot.blank_value = !slot.from_ref && matches!(slot.value, Value::Empty); } } let out = (spec.imp)(&cell_args, ctx);