modify explain for MakeRecord to show index name

This commit is contained in:
pedrocarlo
2025-04-29 15:16:16 -03:00
parent 9aebfa7b5d
commit 5f2216cf8e
9 changed files with 38 additions and 23 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1444,6 +1444,7 @@ pub fn op_make_record(
start_reg,
count,
dest_reg,
..
} = insn
else {
unreachable!("unexpected Insn {:?}", insn)

View File

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

View File

@@ -373,6 +373,7 @@ pub enum Insn {
start_reg: usize, // P1
count: usize, // P2
dest_reg: usize, // P3
index_name: Option<String>,
},
/// Emit a row of results.