Skip to content

Commit 2c712af

Browse files
committed
add nkeycol to index, use for withoutrowid tables
1 parent 3ea3616 commit 2c712af

File tree

9 files changed

+28
-17
lines changed

9 files changed

+28
-17
lines changed

core/incremental/operator.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub fn create_dbsp_state_index(root_page: i64) -> Index {
7272
where_clause: None,
7373
index_method: None,
7474
is_primary_key: false,
75+
n_key_col: 3,
7576
}
7677
}
7778

core/schema.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2581,6 +2581,7 @@ pub struct Index {
25812581
pub where_clause: Option<Box<Expr>>,
25822582
pub index_method: Option<Arc<dyn IndexMethodAttachment>>,
25832583
pub is_primary_key: bool,
2584+
pub n_key_col: usize,
25842585
}
25852586

25862587
#[allow(dead_code)]
@@ -2649,6 +2650,7 @@ impl Index {
26492650
where_clause: None,
26502651
is_primary_key: false,
26512652
index_method: Some(descriptor),
2653+
n_key_col: columns.len(),
26522654
})
26532655
} else {
26542656
Ok(Index {
@@ -2662,6 +2664,7 @@ impl Index {
26622664
where_clause,
26632665
index_method: None,
26642666
is_primary_key: false,
2667+
n_key_col: columns.len(),
26652668
})
26662669
}
26672670
}
@@ -2738,6 +2741,7 @@ impl Index {
27382741
where_clause: None,
27392742
index_method: None,
27402743
is_primary_key: true,
2744+
n_key_col: column_count,
27412745
})
27422746
}
27432747

@@ -2766,6 +2770,7 @@ impl Index {
27662770
})
27672771
.collect::<Vec<_>>();
27682772

2773+
let n_key_col = unique_cols.len();
27692774
Ok(Index {
27702775
name: normalize_ident(index_name.as_str()),
27712776
table_name: table.name.clone(),
@@ -2777,6 +2782,7 @@ impl Index {
27772782
where_clause: None,
27782783
index_method: None,
27792784
is_primary_key: false,
2785+
n_key_col,
27802786
})
27812787
}
27822788

core/translate/compound_select.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ fn create_dedupe_index(
437437
};
438438
column.collation = collation;
439439
}
440-
440+
let n_key_col = dedupe_columns.len();
441441
let dedupe_index = Arc::new(Index {
442442
columns: dedupe_columns,
443443
name: "compound_dedupe".to_string(),
@@ -449,6 +449,7 @@ fn create_dedupe_index(
449449
where_clause: None,
450450
index_method: None,
451451
is_primary_key: false,
452+
n_key_col,
452453
});
453454
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(dedupe_index.clone()));
454455
program.emit_insn(Insn::OpenEphemeral {

core/translate/index.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ pub fn translate_create_index(
150150
where_clause: where_clause.clone(),
151151
index_method: index_method.clone(),
152152
is_primary_key: false,
153+
n_key_col: columns.len(),
153154
});
154155

155156
if !idx.validate_where_expr(table) {

core/translate/insert.rs

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2764,9 +2764,10 @@ fn translate_without_rowid_insert(
27642764
})?;
27652765

27662766
tracing::debug!(
2767-
"Found primary key index '{}' with root page {}",
2767+
"Found WITHOUT ROWID primary key index '{}' with root page {} and {} key columns.",
27682768
pk_index.name,
2769-
pk_index.root_page
2769+
pk_index.root_page,
2770+
pk_index.n_key_col
27702771
);
27712772

27722773
let pk_cursor_id = program.alloc_cursor_index(None, pk_index)?;
@@ -2806,16 +2807,15 @@ fn translate_without_rowid_insert(
28062807

28072808
emit_notnulls(&mut program, &ctx, &insertion);
28082809

2809-
let pk_columns = &pk_index.columns;
2810-
let num_pk_cols = pk_columns.len();
2810+
let num_pk_cols = pk_index.n_key_col;
28112811
let pk_registers_start = program.alloc_registers(num_pk_cols);
28122812
tracing::debug!(
28132813
"Allocated registers {}-{} for PK uniqueness check",
28142814
pk_registers_start,
28152815
pk_registers_start + num_pk_cols - 1
28162816
);
28172817

2818-
for (i, pk_col) in pk_columns.iter().enumerate() {
2818+
for (i, pk_col) in pk_index.columns.iter().take(num_pk_cols).enumerate() {
28192819
let mapping = insertion.get_col_mapping_by_name(&pk_col.name).unwrap();
28202820
program.emit_insn(Insn::Copy {
28212821
src_reg: mapping.register,
@@ -2878,13 +2878,7 @@ fn translate_without_rowid_insert(
28782878

28792879
tracing::debug!("Beginning update of secondary indices.");
28802880
for index in resolver.schema.get_indices(table.name.as_str()) {
2881-
let is_pk = index.columns.len() == pk_index.columns.len()
2882-
&& index
2883-
.columns
2884-
.iter()
2885-
.zip(pk_index.columns.iter())
2886-
.all(|(a, b)| a.name == b.name);
2887-
if is_pk {
2881+
if index.is_primary_key {
28882882
continue;
28892883
}
28902884

@@ -2897,13 +2891,12 @@ fn translate_without_rowid_insert(
28972891

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

2900-
let secondary_key_cols = &index.columns;
2901-
let num_key_cols = secondary_key_cols.len();
2894+
2895+
let num_key_cols = index.n_key_col;
29022896
let key_start_reg = program.alloc_registers(num_key_cols);
29032897

29042898
let mut current_reg = key_start_reg;
2905-
2906-
for idx_col in secondary_key_cols {
2899+
for idx_col in index.columns.iter().take(num_key_cols) {
29072900
let mapping = insertion.get_col_mapping_by_name(&idx_col.name).unwrap();
29082901
program.emit_insn(Insn::Copy {
29092902
src_reg: mapping.register,

core/translate/main_loop.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ pub fn init_distinct(program: &mut ProgramBuilder, plan: &SelectPlan) -> Result<
105105
where_clause: None,
106106
index_method: None,
107107
is_primary_key: false,
108+
n_key_col: plan.result_columns.len(),
108109
});
109110
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(index.clone()));
110111
let ctx = DistinctCtx {
@@ -184,6 +185,8 @@ pub fn init_loop(
184185
where_clause: None,
185186
index_method: None,
186187
is_primary_key: false,
188+
n_key_col: group_by.as_ref().unwrap().exprs.len(),
189+
187190
});
188191
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(index.clone()));
189192
if group_by.is_none() {

core/translate/optimizer/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,7 @@ fn ephemeral_index_build(
12781278
(None, None) => Ordering::Equal,
12791279
}
12801280
});
1281+
let n_key_col = ephemeral_columns.len();
12811282
let ephemeral_index = Index {
12821283
name: format!(
12831284
"ephemeral_{}_{}",
@@ -1296,6 +1297,7 @@ fn ephemeral_index_build(
12961297
.is_some_and(|btree| btree.has_rowid),
12971298
index_method: None,
12981299
is_primary_key: false,
1300+
n_key_col,
12991301
};
13001302

13011303
ephemeral_index

core/translate/order_by.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ pub fn init_order_by(
100100
default: None,
101101
})
102102
}
103+
let n_key_col = index_columns.len();
103104
let index = Arc::new(Index {
104105
name: index_name.clone(),
105106
table_name: String::new(),
@@ -111,6 +112,7 @@ pub fn init_order_by(
111112
where_clause: None,
112113
index_method: None,
113114
is_primary_key: false,
115+
n_key_col,
114116
});
115117
program.alloc_cursor_id(CursorType::BTreeIndex(index))
116118
} else {

core/translate/subquery.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ fn get_subquery_parser<'a>(
382382
)?;
383383
}
384384

385+
let n_key_col=columns.len();
385386
let ephemeral_index = Arc::new(Index {
386387
columns,
387388
name: format!("ephemeral_index_where_sub_{subquery_id}"),
@@ -393,6 +394,7 @@ fn get_subquery_parser<'a>(
393394
where_clause: None,
394395
index_method: None,
395396
is_primary_key: false,
397+
n_key_col,
396398
});
397399

398400
let cursor_id =

0 commit comments

Comments
 (0)