diff --git a/core/translate/emitter.rs b/core/translate/emitter.rs index 19d018689..0a3b71fdf 100644 --- a/core/translate/emitter.rs +++ b/core/translate/emitter.rs @@ -880,6 +880,7 @@ fn emit_update_insns( start_reg: start, count: table_ref.columns().len(), dest_reg: record_reg, + index_name: None, }); program.emit_insn(Insn::Insert { cursor: cursor_id, diff --git a/core/translate/index.rs b/core/translate/index.rs index 34a28db25..f104120a0 100644 --- a/core/translate/index.rs +++ b/core/translate/index.rs @@ -165,6 +165,7 @@ pub fn translate_create_index( start_reg, count: columns.len() + 1, dest_reg: record_reg, + index_name: Some(idx_name.clone()), }); program.emit_insn(Insn::SorterInsert { cursor_id: sorter_cursor_id, @@ -182,7 +183,7 @@ pub fn translate_create_index( program.emit_insn(Insn::OpenWrite { cursor_id: btree_cursor_id, root_page: RegisterOrLiteral::Register(root_page_reg), - name: idx_name.clone() + name: idx_name.clone(), }); let sorted_loop_start = program.allocate_label(); diff --git a/core/translate/insert.rs b/core/translate/insert.rs index b6daba4c2..1c3169b4c 100644 --- a/core/translate/insert.rs +++ b/core/translate/insert.rs @@ -292,7 +292,7 @@ pub fn translate_insert( _ => (), } - for index_col_mapping in index_col_mappings.iter() { + for index_col_mapping in index_col_mappings { // find which cursor we opened earlier for this index let idx_cursor_id = idx_cursors .iter() @@ -321,17 +321,18 @@ pub fn translate_insert( amount: 0, }); + let index = schema + .get_index(&table_name.0, &index_col_mapping.idx_name) + .expect("index should be present"); + let record_reg = program.alloc_register(); program.emit_insn(Insn::MakeRecord { start_reg: idx_start_reg, count: num_cols + 1, dest_reg: record_reg, + index_name: Some(index_col_mapping.idx_name), }); - let index = schema - .get_index(&table_name.0, &index_col_mapping.idx_name) - .expect("index should be present"); - if index.unique { let label_idx_insert = program.allocate_label(); program.emit_insn(Insn::NoConflict { @@ -387,6 +388,7 @@ pub fn translate_insert( start_reg: column_registers_start, count: num_cols, dest_reg: record_register, + index_name: None, }); program.emit_insn(Insn::Insert { diff --git a/core/translate/main_loop.rs b/core/translate/main_loop.rs index 9e10e05b7..f10523f16 100644 --- a/core/translate/main_loop.rs +++ b/core/translate/main_loop.rs @@ -1227,6 +1227,7 @@ fn emit_autoindex( start_reg: ephemeral_cols_start_reg, count: num_regs_to_reserve, dest_reg: record_reg, + index_name: Some(index.name.clone()), }); program.emit_insn(Insn::IdxInsert { cursor_id: index_cursor_id, diff --git a/core/translate/order_by.rs b/core/translate/order_by.rs index 6c8f4d90a..488a8cd82 100644 --- a/core/translate/order_by.rs +++ b/core/translate/order_by.rs @@ -247,6 +247,7 @@ pub fn sorter_insert( start_reg, count: column_count, dest_reg: record_reg, + index_name: None, }); program.emit_insn(Insn::SorterInsert { cursor_id, diff --git a/core/translate/schema.rs b/core/translate/schema.rs index 96d4aced8..7c0b3d7cc 100644 --- a/core/translate/schema.rs +++ b/core/translate/schema.rs @@ -120,7 +120,7 @@ pub fn translate_create_table( program.emit_insn(Insn::OpenWrite { cursor_id: sqlite_schema_cursor_id, root_page: 1usize.into(), - name: tbl_name.name.0.clone() + name: tbl_name.name.0.clone(), }); // Add the table entry to sqlite_schema @@ -237,6 +237,7 @@ pub fn emit_schema_entry( start_reg: type_reg, count: 5, dest_reg: record_reg, + index_name: None, }); program.emit_insn(Insn::Insert { @@ -564,6 +565,7 @@ pub fn translate_create_virtual_table( start_reg: args_start, count: args_vec.len(), dest_reg: args_record_reg, + index_name: None, }); Some(args_record_reg) } else { @@ -583,7 +585,7 @@ pub fn translate_create_virtual_table( program.emit_insn(Insn::OpenWrite { cursor_id: sqlite_schema_cursor_id, root_page: 1usize.into(), - name: table_name.clone() + name: table_name.clone(), }); let sql = create_vtable_body_to_str(&vtab, vtab_module.clone()); @@ -663,7 +665,7 @@ pub fn translate_drop_table( program.emit_insn(Insn::OpenWrite { cursor_id: sqlite_schema_cursor_id, root_page: 1usize.into(), - name: tbl_name.name.0.clone() + name: tbl_name.name.0.clone(), }); // 1. Remove all entries from the schema table related to the table we are dropping, except for triggers diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index d6ab6ba4d..62e953813 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -1444,6 +1444,7 @@ pub fn op_make_record( start_reg, count, dest_reg, + .. } = insn else { unreachable!("unexpected Insn {:?}", insn) diff --git a/core/vdbe/explain.rs b/core/vdbe/explain.rs index ed16adc2c..28e48f2cc 100644 --- a/core/vdbe/explain.rs +++ b/core/vdbe/explain.rs @@ -529,20 +529,25 @@ pub fn insn_to_str( start_reg, count, dest_reg, - } => ( - "MakeRecord", - *start_reg as i32, - *count as i32, - *dest_reg as i32, - OwnedValue::build_text(""), - 0, - format!( - "r[{}]=mkrec(r[{}..{}])", - dest_reg, - start_reg, - start_reg + count - 1, - ), - ), + index_name, + } => { + let for_index = index_name.as_ref().map(|name| format!(" ;for {}", name)); + ( + "MakeRecord", + *start_reg as i32, + *count as i32, + *dest_reg as i32, + OwnedValue::build_text(""), + 0, + format!( + "r[{}]=mkrec(r[{}..{}]){}", + dest_reg, + start_reg, + start_reg + count - 1, + for_index.unwrap_or("".to_string()) + ), + ) + } Insn::ResultRow { start_reg, count } => ( "ResultRow", *start_reg as i32, diff --git a/core/vdbe/insn.rs b/core/vdbe/insn.rs index 5cdcee287..876ab7930 100644 --- a/core/vdbe/insn.rs +++ b/core/vdbe/insn.rs @@ -373,6 +373,7 @@ pub enum Insn { start_reg: usize, // P1 count: usize, // P2 dest_reg: usize, // P3 + index_name: Option, }, /// Emit a row of results.