From a447ea0f499e6114e8de16f7016b4bd8b6f2950c Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 29 Mar 2024 09:26:18 +0200 Subject: [PATCH] Dynamic cursor ID allocation With sorter, for example, we need more cursors per program. --- core/translate.rs | 4 ++-- core/vdbe.rs | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/translate.rs b/core/translate.rs index 644d3c2ef..727dc17e2 100644 --- a/core/translate.rs +++ b/core/translate.rs @@ -21,7 +21,7 @@ fn translate_select(schema: &Schema, select: Select) -> Result { from: Some(from), .. } => { - let cursor_id = 0; + let cursor_id = program.alloc_cursor_id(); let table_name = match from.select { Some(select_table) => match *select_table { sqlite3_parser::ast::SelectTable::Table(name, ..) => name.name, @@ -47,7 +47,7 @@ fn translate_select(schema: &Schema, select: Select) -> Result { None }; program.emit_insn(Insn::OpenReadAsync { - cursor_id: 0, + cursor_id, root_page, }); program.emit_insn(Insn::OpenReadAwait); diff --git a/core/vdbe.rs b/core/vdbe.rs index fe3497b30..7c85361f6 100644 --- a/core/vdbe.rs +++ b/core/vdbe.rs @@ -97,6 +97,7 @@ pub enum Insn { pub struct ProgramBuilder { next_free_register: usize, + next_free_cursor_id: usize, insns: Vec, } @@ -104,6 +105,7 @@ impl ProgramBuilder { pub fn new() -> Self { Self { next_free_register: 0, + next_free_cursor_id: 0, insns: Vec::new(), } } @@ -118,6 +120,12 @@ impl ProgramBuilder { self.next_free_register } + pub fn alloc_cursor_id(&mut self) -> usize { + let cursor = self.next_free_cursor_id; + self.next_free_cursor_id += 1; + cursor + } + pub fn emit_placeholder(&mut self) -> usize { let offset = self.insns.len(); self.insns.push(Insn::Halt);