From 8942c38bda724a75f6be217b50188eb63bed9504 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Sun, 26 Jan 2025 10:52:58 +0200 Subject: [PATCH] core: Fix Statement::reset() The first rule of writing fast programs: don't use dynamic memory allocation! Brings back some performance for the `SELECT 1` micro-benchmark, although we're still not where we need to be. --- core/lib.rs | 3 +-- core/vdbe/mod.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/lib.rs b/core/lib.rs index f03c73e00..628d21150 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -486,8 +486,7 @@ impl Statement { } pub fn reset(&mut self) { - let state = vdbe::ProgramState::new(self.program.max_registers); - self.state = state + self.state.reset(); } } diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index dae7f8806..a06412aa3 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -258,6 +258,19 @@ impl ProgramState { } pub fn reset(&mut self) { + self.pc = 0; + self.btree_table_cursors.borrow_mut().clear(); + self.btree_index_cursors.borrow_mut().clear(); + self.pseudo_cursors.borrow_mut().clear(); + self.sorter_cursors.borrow_mut().clear(); + let max_registers = self.registers.len(); + self.registers.clear(); + self.registers.resize(max_registers, OwnedValue::Null); + self.last_compare = None; + self.deferred_seek = None; + self.ended_coroutine.clear(); + self.regex_cache.like.clear(); + self.interrupted = false; self.parameters.clear(); } }