diff --git a/core/translate/emitter.rs b/core/translate/emitter.rs index 9754ebc63..80279ef85 100644 --- a/core/translate/emitter.rs +++ b/core/translate/emitter.rs @@ -29,7 +29,7 @@ use crate::translate::plan::{DeletePlan, Plan, Search}; use crate::translate::values::emit_values; use crate::util::exprs_are_equivalent; use crate::vdbe::builder::{CursorKey, CursorType, ProgramBuilder}; -use crate::vdbe::insn::{CmpInsFlags, IdxInsertFlags, RegisterOrLiteral}; +use crate::vdbe::insn::{CmpInsFlags, IdxInsertFlags, InsertFlags, RegisterOrLiteral}; use crate::vdbe::{insn::Insn, BranchOffset}; use crate::{Result, SymbolTable}; @@ -1319,7 +1319,7 @@ fn emit_update_insns( cursor: cursor_id, key_reg: rowid_set_clause_reg.unwrap_or(beg), record_reg, - flag: 0, + flag: InsertFlags::new().update(true), table_name: table_ref.identifier.clone(), }); } else if let Some(_) = table_ref.virtual_table() { diff --git a/core/translate/insert.rs b/core/translate/insert.rs index d664aca6c..b852a3344 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -8,7 +8,7 @@ use crate::error::SQLITE_CONSTRAINT_PRIMARYKEY; use crate::schema::{IndexColumn, Table}; use crate::util::normalize_ident; use crate::vdbe::builder::{ProgramBuilderOpts, QueryMode}; -use crate::vdbe::insn::{IdxInsertFlags, RegisterOrLiteral}; +use crate::vdbe::insn::{IdxInsertFlags, InsertFlags, RegisterOrLiteral}; use crate::vdbe::BranchOffset; use crate::{ schema::{Column, Schema}, @@ -212,7 +212,7 @@ pub fn translate_insert( cursor: temp_cursor_id, key_reg: rowid_reg, record_reg, - flag: 0, + flag: InsertFlags::new(), table_name: "".to_string(), }); @@ -520,7 +520,7 @@ pub fn translate_insert( cursor: cursor_id, key_reg: rowid_reg, record_reg: record_register, - flag: 0, + flag: InsertFlags::new(), table_name: table_name.to_string(), }); diff --git a/core/translate/mod.rs b/core/translate/mod.rs index c796ec8ba..a357e869d 100644 --- a/core/translate/mod.rs +++ b/core/translate/mod.rs @@ -66,7 +66,10 @@ pub fn translate( ) -> Result { let change_cnt_on = matches!( stmt, - ast::Stmt::CreateIndex { .. } | ast::Stmt::Delete(..) | ast::Stmt::Insert(..) + ast::Stmt::CreateIndex { .. } + | ast::Stmt::Delete(..) + | ast::Stmt::Insert(..) + | ast::Stmt::Update(..) ); // These options will be extended whithin each translate program diff --git a/core/translate/schema.rs b/core/translate/schema.rs index 1b1f6c040..7f6a623e0 100644 --- a/core/translate/schema.rs +++ b/core/translate/schema.rs @@ -16,7 +16,7 @@ use crate::translate::ProgramBuilderOpts; use crate::translate::QueryMode; use crate::util::PRIMARY_KEY_AUTOMATIC_INDEX_NAME_PREFIX; use crate::vdbe::builder::CursorType; -use crate::vdbe::insn::{CmpInsFlags, Insn}; +use crate::vdbe::insn::{CmpInsFlags, InsertFlags, Insn}; use crate::LimboError; use crate::SymbolTable; use crate::{bail_parse_error, Result}; @@ -234,7 +234,7 @@ pub fn emit_schema_entry( cursor: sqlite_schema_cursor_id, key_reg: rowid_reg, record_reg, - flag: 0, + flag: InsertFlags::new(), table_name: tbl_name.to_string(), }); } @@ -843,7 +843,7 @@ pub fn translate_drop_table( cursor: ephemeral_cursor_id, key_reg: schema_row_id_register, record_reg: schema_data_register, - flag: 0, + flag: InsertFlags::new(), table_name: "scratch_table".to_string(), }); @@ -925,7 +925,7 @@ pub fn translate_drop_table( cursor: sqlite_schema_cursor_id_1, key_reg: schema_row_id_register, record_reg: new_record_register, - flag: 0, + flag: InsertFlags::new(), table_name: SQLITE_TABLEID.to_string(), }); diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 0db530c5e..35a9170f3 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -74,6 +74,7 @@ use crate::{ }; use super::{get_new_rowid, make_record, Program, ProgramState, Register}; +use crate::vdbe::insn::InsertFlags; use crate::{ bail_constraint_error, must_be_btree_cursor, resolve_ext_path, MvStore, Pager, Result, DATABASE_VERSION, @@ -3809,7 +3810,7 @@ pub fn op_insert( cursor, key_reg, record_reg, - flag: _, + flag, table_name: _, } = insn else { @@ -3836,8 +3837,12 @@ pub fn op_insert( if let Some(conn) = program.connection.upgrade() { conn.update_last_rowid(rowid); } - let prev_changes = program.n_change.get(); - program.n_change.set(prev_changes + 1); + + // n_changes is increased when Insn::Delete is executed, so we can skip for Insn::Insert + if !flag.has(InsertFlags::UPDATE) { + let prev_changes = program.n_change.get(); + program.n_change.set(prev_changes + 1); + } } } } @@ -3866,6 +3871,7 @@ pub fn op_delete( return_if_io!(cursor.delete()); } let prev_changes = program.n_change.get(); + println!("[Insn::Delete] set n_changes to {}", prev_changes + 1); program.n_change.set(prev_changes + 1); state.pc += 1; Ok(InsnFunctionStepResult::Step) @@ -3925,6 +3931,7 @@ pub fn op_idx_delete( return_if_io!(cursor.delete()); } let n_change = program.n_change.get(); + println!("[Insn::IdxDelete] set n_changes to {}", n_change + 1); program.n_change.set(n_change + 1); state.pc += 1; state.op_idx_delete_state = None; diff --git a/core/vdbe/explain.rs b/core/vdbe/explain.rs index 69bb886c1..1200d9dc3 100644 --- a/core/vdbe/explain.rs +++ b/core/vdbe/explain.rs @@ -1091,7 +1091,7 @@ pub fn insn_to_str( *record_reg as i32, *key_reg as i32, Value::build_text(&table_name), - *flag as u16, + flag.0 as u16, format!("intkey=r[{}] data=r[{}]", key_reg, record_reg), ), Insn::Delete { cursor_id } => (