diff --git a/cozo-core/src/data/functions.rs b/cozo-core/src/data/functions.rs index aca38beb..5aa07a38 100644 --- a/cozo-core/src/data/functions.rs +++ b/cozo-core/src/data/functions.rs @@ -1069,6 +1069,9 @@ define_op!(OP_MOD, 2, false); pub(crate) fn op_mod(args: &[DataValue]) -> Result { Ok(match (&args[0], &args[1]) { (DataValue::Num(Num::Int(a)), DataValue::Num(Num::Int(b))) => { + if *b == 0 { + bail!("'mod' requires non-zero divisor") + } DataValue::Num(Num::Int(a.rem(b))) } (DataValue::Num(Num::Float(a)), DataValue::Num(Num::Float(b))) => { diff --git a/cozo-core/src/data/tests/functions.rs b/cozo-core/src/data/tests/functions.rs index 13a55f4b..1d0e5b13 100644 --- a/cozo-core/src/data/tests/functions.rs +++ b/cozo-core/src/data/tests/functions.rs @@ -80,6 +80,7 @@ fn test_div() { op_div(&[DataValue::from(7.0), DataValue::from(0.5)]).unwrap(), DataValue::from(14.0) ); + assert!(op_div(&[DataValue::from(1), DataValue::from(0)]).is_ok()); } #[test] @@ -538,6 +539,10 @@ fn test_mod() { op_mod(&[DataValue::from(-10), DataValue::from(7)]).unwrap(), DataValue::from(-3) ); + assert!(op_mod(&[DataValue::from(5), DataValue::from(0.)]).is_ok()); + assert!(op_mod(&[DataValue::from(5.), DataValue::from(0.)]).is_ok()); + assert!(op_mod(&[DataValue::from(5.), DataValue::from(0)]).is_ok()); + assert!(op_mod(&[DataValue::from(5), DataValue::from(0)]).is_err()); } #[test] @@ -1476,4 +1481,4 @@ fn test_range() { .unwrap() .into_json(); assert_eq!(res["rows"][0][0], json!([15, 13, 11, 9, 7, 5])); -} \ No newline at end of file +}