From 70c4d6b36088557e6c7d2d88a876e4e201399eb9 Mon Sep 17 00:00:00 2001 From: Lauri Virtanen Date: Sun, 24 Nov 2024 14:51:59 +0200 Subject: [PATCH] Support multiplying combinations of different types --- COMPAT.md | 2 +- core/vdbe/mod.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/COMPAT.md b/COMPAT.md index 040f14b3b..e909c794e 100644 --- a/COMPAT.md +++ b/COMPAT.md @@ -286,7 +286,7 @@ This document describes the SQLite compatibility status of Limbo: | MaxPgcnt | No | | MemMax | No | | Move | No | -| Multiply | No | +| Multiply | Yes | | MustBeInt | Yes | | Ne | Yes | | NewRowid | Yes | diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 0c1a979ea..ef8fd6146 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -835,6 +835,10 @@ impl Program { (OwnedValue::Float(lhs), OwnedValue::Float(rhs)) => { state.registers[dest] = OwnedValue::Float(lhs * rhs); } + (OwnedValue::Integer(i), OwnedValue::Float(f)) + | (OwnedValue::Float(f), OwnedValue::Integer(i)) => { + state.registers[dest] = OwnedValue::Float(*i as f64 * *f as f64); + } (OwnedValue::Null, _) | (_, OwnedValue::Null) => { state.registers[dest] = OwnedValue::Null; } @@ -865,6 +869,29 @@ impl Program { todo!("{:?}", aggctx); } }, + OwnedValue::Agg(aggctx2) => { + let acc = aggctx.final_value(); + let acc2 = aggctx2.final_value(); + match (acc, acc2) { + (OwnedValue::Integer(acc), OwnedValue::Integer(acc2)) => { + state.registers[dest] = OwnedValue::Integer(acc * acc2); + } + (OwnedValue::Float(acc), OwnedValue::Float(acc2)) => { + state.registers[dest] = OwnedValue::Float(acc * acc2); + } + (OwnedValue::Integer(acc), OwnedValue::Float(acc2)) => { + state.registers[dest] = + OwnedValue::Float(*acc as f64 * acc2); + } + (OwnedValue::Float(acc), OwnedValue::Integer(acc2)) => { + state.registers[dest] = + OwnedValue::Float(acc * *acc2 as f64); + } + _ => { + todo!("{:?} {:?}", acc, acc2); + } + } + } rest => unimplemented!("{:?}", rest), } }