Skip increasing n_changes for insn::Insert when it's UPDATE query

This commit is contained in:
김선우
2025-06-07 17:23:23 +09:00
parent 762b61ce55
commit a9c096bb01
6 changed files with 24 additions and 14 deletions

View File

@@ -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() {

View File

@@ -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(),
});

View File

@@ -66,7 +66,10 @@ pub fn translate(
) -> Result<Program> {
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

View File

@@ -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(),
});

View File

@@ -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;

View File

@@ -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 } => (