From ec3ae2ace63ee1e31ae5d73a892ffa4361aea94a Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Sun, 16 Feb 2025 18:07:52 +0200 Subject: [PATCH] Fix remainder panic on zero right-hand-side --- core/vdbe/insn.rs | 30 +++++++++++++++++++++++++----- testing/select.test | 7 ++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/vdbe/insn.rs b/core/vdbe/insn.rs index 1fad2c479..6b04ef462 100644 --- a/core/vdbe/insn.rs +++ b/core/vdbe/insn.rs @@ -897,17 +897,37 @@ pub fn exec_remainder(mut lhs: &OwnedValue, mut rhs: &OwnedValue) -> OwnedValue | (_, OwnedValue::Null) | (_, OwnedValue::Integer(0)) | (_, OwnedValue::Float(0.0)) => OwnedValue::Null, - (OwnedValue::Integer(lhs), OwnedValue::Integer(rhs)) => OwnedValue::Integer(lhs % rhs), + (OwnedValue::Integer(lhs), OwnedValue::Integer(rhs)) => { + if rhs == &0 { + OwnedValue::Null + } else { + OwnedValue::Integer(lhs % rhs) + } + } (OwnedValue::Float(lhs), OwnedValue::Float(rhs)) => { - OwnedValue::Float(((*lhs as i64) % (*rhs as i64)) as f64) + let rhs_int = *rhs as i64; + if rhs_int == 0 { + OwnedValue::Null + } else { + OwnedValue::Float(((*lhs as i64) % rhs_int) as f64) + } } (OwnedValue::Float(lhs), OwnedValue::Integer(rhs)) => { - OwnedValue::Float(((*lhs as i64) % rhs) as f64) + if rhs == &0 { + OwnedValue::Null + } else { + OwnedValue::Float(((*lhs as i64) % rhs) as f64) + } } (OwnedValue::Integer(lhs), OwnedValue::Float(rhs)) => { - OwnedValue::Float((lhs % *rhs as i64) as f64) + let rhs_int = *rhs as i64; + if rhs_int == 0 { + OwnedValue::Null + } else { + OwnedValue::Float((lhs % rhs_int) as f64) + } } - _ => todo!(), + other => todo!("remainder not implemented for: {:?} {:?}", lhs, other), } } diff --git a/testing/select.test b/testing/select.test index f085ffe91..f10f33b24 100755 --- a/testing/select.test +++ b/testing/select.test @@ -159,4 +159,9 @@ do_execsql_test select-like-expression { do_execsql_test select-not-like-expression { select 'bar' not like 'bar%' -} {0} \ No newline at end of file +} {0} + +# regression test for float divisor being cast to zero int and panicking +do_execsql_test select-like-expression { + select 2 % 0.5 +} {}