Skip to content

Commit bad451e

Browse files
committed
sec index on without rowid tables shall have prim key cols fully..
1 parent e31c165 commit bad451e

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

core/schema.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2620,7 +2620,33 @@ impl Index {
26202620
..
26212621
})) => {
26222622
let index_name = normalize_ident(idx_name.name.as_str());
2623-
let index_columns = resolve_sorted_columns(table, &columns)?;
2623+
let mut index_columns = resolve_sorted_columns(table, &columns)?;
2624+
2625+
if !table.has_rowid {
2626+
let existing_index_cols: HashSet<String> =
2627+
index_columns.iter().map(|c| c.name.clone()).collect();
2628+
2629+
for (pk_col_name, _order) in &table.primary_key_columns {
2630+
if !existing_index_cols.contains(pk_col_name.as_str()) {
2631+
let (pos_in_table, column) =
2632+
table.get_column(pk_col_name).ok_or_else(|| {
2633+
LimboError::InternalError(format!(
2634+
"Could not find PK column '{}' in table '{}'",
2635+
pk_col_name, table.name
2636+
))
2637+
})?;
2638+
2639+
index_columns.push(IndexColumn {
2640+
name: pk_col_name.clone(),
2641+
order: SortOrder::Asc,
2642+
pos_in_table,
2643+
collation: column.collation_opt(),
2644+
default: column.default.clone(),
2645+
});
2646+
}
2647+
}
2648+
}
2649+
26242650
if let Some(using) = using {
26252651
if where_clause.is_some() {
26262652
bail_parse_error!("custom index module do not support partial indices");

core/translate/insert.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2936,24 +2936,29 @@ fn translate_without_rowid_insert(
29362936

29372937
tracing::debug!("Processing secondary index '{}'", index.name);
29382938

2939-
let num_key_cols = index.n_key_col;
2940-
let key_start_reg = program.alloc_registers(num_key_cols);
2939+
let num_total_cols = index.columns.len();
2940+
let key_start_reg = program.alloc_registers(num_total_cols);
29412941

2942-
let mut current_reg = key_start_reg;
2943-
for idx_col in index.columns.iter().take(num_key_cols) {
2944-
let mapping = insertion.get_col_mapping_by_name(&idx_col.name).unwrap();
2942+
for (i, idx_col) in index.columns.iter().enumerate() {
2943+
let mapping = insertion
2944+
.get_col_mapping_by_name(&idx_col.name)
2945+
.unwrap_or_else(|| {
2946+
panic!(
2947+
"Could not find column mapping for '{}' in index '{}'",
2948+
idx_col.name, index.name
2949+
)
2950+
});
29452951
program.emit_insn(Insn::Copy {
29462952
src_reg: mapping.register,
2947-
dst_reg: current_reg,
2953+
dst_reg: key_start_reg + i,
29482954
extra_amount: 0,
29492955
});
2950-
current_reg += 1;
29512956
}
29522957

29532958
let record_reg = program.alloc_register();
29542959
program.emit_insn(Insn::MakeRecord {
29552960
start_reg: key_start_reg,
2956-
count: num_key_cols,
2961+
count: num_total_cols,
29572962
dest_reg: record_reg,
29582963
index_name: Some(index.name.clone()),
29592964
affinity_str: None,
@@ -2968,7 +2973,7 @@ fn translate_without_rowid_insert(
29682973
cursor_id: idx_cursor_id,
29692974
record_reg,
29702975
unpacked_start: Some(key_start_reg),
2971-
unpacked_count: Some(num_key_cols as u16),
2976+
unpacked_count: Some(num_total_cols as u16),
29722977
flags: IdxInsertFlags::new().nchange(true),
29732978
});
29742979
tracing::debug!("Emitted OP_IdxInsert for secondary index '{}'", index.name);

0 commit comments

Comments
 (0)