From fc08f786fcb648f26edcdbd06579ef23925a830b Mon Sep 17 00:00:00 2001 From: pedrocarlo Date: Wed, 21 May 2025 01:54:01 -0300 Subject: [PATCH] use prologue and epilogue in insert --- core/translate/insert.rs | 55 +++++++++++++--------------------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/core/translate/insert.rs b/core/translate/insert.rs index 842326df4..7af5aa65d 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -32,7 +32,7 @@ pub fn translate_insert( tbl_name: &QualifiedName, columns: &Option, body: &mut InsertBody, - _returning: &Option>, + returning: &Option>, syms: &SymbolTable, program: Option, ) -> Result { @@ -60,7 +60,10 @@ pub fn translate_insert( Some(table) => table, None => crate::bail_corrupt_error!("Parse error: no such table: {}", table_name), }; - let resolver = Resolver::new(syms); + // TODO: see if table_count for prologue should be 0 + let (t_ctx, init_label, start_offset) = + program.prologue(syms, 0, returning.as_ref().map_or(0, |r| r.len())); + if let Some(virtual_table) = &table.virtual_table() { translate_virtual_table_insert( &mut program, @@ -68,15 +71,15 @@ pub fn translate_insert( columns, body, on_conflict, - &resolver, + &t_ctx.resolver, )?; + program.epilogue( + init_label, + start_offset, + super::emitter::TransactionMode::Write, + ); return Ok(program); } - let init_label = program.allocate_label(); - program.emit_insn(Insn::Init { - target_pc: init_label, - }); - let start_offset = program.offset(); let Some(btree_table) = table.btree() else { crate::bail_corrupt_error!("Parse error: no such table: {}", table_name); @@ -171,7 +174,7 @@ pub fn translate_insert( column_registers_start, true, rowid_reg, - &resolver, + &t_ctx.resolver, )?; program.emit_insn(Insn::Yield { yield_reg, @@ -210,7 +213,7 @@ pub fn translate_insert( column_registers_start, false, rowid_reg, - &resolver, + &t_ctx.resolver, )?; } // Open all the index btrees for writing @@ -414,17 +417,11 @@ pub fn translate_insert( } program.resolve_label(halt_label, program.offset()); - program.emit_insn(Insn::Halt { - err_code: 0, - description: String::new(), - }); - program.preassign_label_to_next_insn(init_label); - - program.emit_insn(Insn::Transaction { write: true }); - program.emit_constant_insns(); - program.emit_insn(Insn::Goto { - target_pc: start_offset, - }); + program.epilogue( + init_label, + start_offset, + super::emitter::TransactionMode::Write, + ); Ok(program) } @@ -670,12 +667,6 @@ fn translate_virtual_table_insert( on_conflict: &Option, resolver: &Resolver, ) -> Result<()> { - let init_label = program.allocate_label(); - program.emit_insn(Insn::Init { - target_pc: init_label, - }); - let start_offset = program.offset(); - let values = match body { InsertBody::Select(select, None) => match &select.body.select.deref() { OneSelect::Values(values) => values, @@ -727,16 +718,6 @@ fn translate_virtual_table_insert( let halt_label = program.allocate_label(); program.resolve_label(halt_label, program.offset()); - program.emit_insn(Insn::Halt { - err_code: 0, - description: String::new(), - }); - - program.resolve_label(init_label, program.offset()); - - program.emit_insn(Insn::Goto { - target_pc: start_offset, - }); Ok(()) }