From f99a92ccaf0e50d50e11e73c04992fd8375f84fb Mon Sep 17 00:00:00 2001 From: itchyny Date: Sun, 25 Feb 2024 21:42:16 +0900 Subject: [PATCH] Fix modulo operator on NaN to emit NaN --- src/intrinsic/binary.rs | 3 +++ tests/hand_written/mod.rs | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/intrinsic/binary.rs b/src/intrinsic/binary.rs index 307c66a..ae76d83 100644 --- a/src/intrinsic/binary.rs +++ b/src/intrinsic/binary.rs @@ -142,6 +142,9 @@ fn modulo(lhs: Value, rhs: Value) -> Result { use Value::*; Ok(match (lhs, rhs) { (Number(lhs), Number(rhs)) => { + if lhs.is_nan() || rhs.is_nan() { + return Ok(Value::number(f64::NAN)); + } let rhs = number_to_i64(rhs); if rhs == 0 { return Err(QueryExecutionError::DivModByZero); diff --git a/tests/hand_written/mod.rs b/tests/hand_written/mod.rs index c26b79b..06368c2 100644 --- a/tests/hand_written/mod.rs +++ b/tests/hand_written/mod.rs @@ -639,6 +639,22 @@ test!( "# ); +test!( + modulo_nan, + r#" + (1, nan) % (1, nan) | isnan + "#, + r#" + null + "#, + r#" + false + true + true + true + "# +); + test!( delete1, r#"