reprepare optimization using reset()

This commit is contained in:
pedrocarlo
2025-09-11 12:50:42 -03:00
parent c04cf535b0
commit dbb7d6f532
2 changed files with 22 additions and 4 deletions

View File

@@ -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<usize>, max_cursors: Option<usize>) {
self.state.reset(max_registers, max_cursors);
self.busy = false;
}

View File

@@ -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<usize>, max_cursors: Option<usize>) {
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()