mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-11 11:14:21 +01:00
Skip increasing n_changes for insn::Insert when it's UPDATE query
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 } => (
|
||||
|
||||
Reference in New Issue
Block a user