diff --git a/core/lib.rs b/core/lib.rs index fa40aab08..1f28ecf3b 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -2225,8 +2225,14 @@ impl Statement { }; // Save parameters before they are reset let parameters = std::mem::take(&mut self.state.parameters); - self.state = - vdbe::ProgramState::new(self.program.max_registers, self.program.cursor_ref.len()); + self._reset( + Some(match self.query_mode { + QueryMode::Normal => self.program.max_registers, + QueryMode::Explain => EXPLAIN_COLUMNS.len(), + QueryMode::ExplainQueryPlan => EXPLAIN_QUERY_PLAN_COLUMNS.len(), + }), + Some(self.program.cursor_ref.len()), + ); // Load the parameters back into the state self.state.parameters = parameters; Ok(()) @@ -2326,7 +2332,11 @@ impl Statement { } pub fn reset(&mut self) { - self.state.reset(); + self._reset(None, None); + } + + pub fn _reset(&mut self, max_registers: Option, max_cursors: Option) { + self.state.reset(max_registers, max_cursors); self.busy = false; } diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 2546a951d..db7995303 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -373,8 +373,16 @@ impl ProgramState { self.parameters.get(&index).cloned().unwrap_or(Value::Null) } - pub fn reset(&mut self) { + pub fn reset(&mut self, max_registers: Option, max_cursors: Option) { self.pc = 0; + + if let Some(max_cursors) = max_cursors { + self.cursors.resize_with(max_cursors, || None); + } + if let Some(max_resgisters) = max_registers { + self.registers + .resize_with(max_resgisters, || Register::Value(Value::Null)); + } self.cursors.iter_mut().for_each(|c| *c = None); self.registers .iter_mut()