Skip to content

Commit 9f56ca4

Browse files
committed
sec index on without rowid tables shall have prim key cols fully..
1 parent 3ad7f74 commit 9f56ca4

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
@@ -2454,7 +2454,33 @@ impl Index {
24542454
..
24552455
})) => {
24562456
let index_name = normalize_ident(idx_name.name.as_str());
2457-
let index_columns = resolve_sorted_columns(table, &columns)?;
2457+
let mut index_columns = resolve_sorted_columns(table, &columns)?;
2458+
2459+
if !table.has_rowid {
2460+
let existing_index_cols: HashSet<String> =
2461+
index_columns.iter().map(|c| c.name.clone()).collect();
2462+
2463+
for (pk_col_name, _order) in &table.primary_key_columns {
2464+
if !existing_index_cols.contains(pk_col_name.as_str()) {
2465+
let (pos_in_table, column) =
2466+
table.get_column(pk_col_name).ok_or_else(|| {
2467+
LimboError::InternalError(format!(
2468+
"Could not find PK column '{}' in table '{}'",
2469+
pk_col_name, table.name
2470+
))
2471+
})?;
2472+
2473+
index_columns.push(IndexColumn {
2474+
name: pk_col_name.clone(),
2475+
order: SortOrder::Asc,
2476+
pos_in_table,
2477+
collation: column.collation_opt(),
2478+
default: column.default.clone(),
2479+
});
2480+
}
2481+
}
2482+
}
2483+
24582484
if let Some(using) = using {
24592485
if where_clause.is_some() {
24602486
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
@@ -2937,24 +2937,29 @@ fn translate_without_rowid_insert(
29372937

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

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

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

29542959
let record_reg = program.alloc_register();
29552960
program.emit_insn(Insn::MakeRecord {
29562961
start_reg: key_start_reg,
2957-
count: num_key_cols,
2962+
count: num_total_cols,
29582963
dest_reg: record_reg,
29592964
index_name: Some(index.name.clone()),
29602965
affinity_str: None,
@@ -2969,7 +2974,7 @@ fn translate_without_rowid_insert(
29692974
cursor_id: idx_cursor_id,
29702975
record_reg,
29712976
unpacked_start: Some(key_start_reg),
2972-
unpacked_count: Some(num_key_cols as u16),
2977+
unpacked_count: Some(num_total_cols as u16),
29732978
flags: IdxInsertFlags::new().nchange(true),
29742979
});
29752980
tracing::debug!("Emitted OP_IdxInsert for secondary index '{}'", index.name);

0 commit comments

Comments
 (0)