Skip to content

Commit cc36a6a

Browse files
committed
store/order row acc to pkey
1 parent 3795ab6 commit cc36a6a

File tree

9 files changed

+75
-27
lines changed

9 files changed

+75
-27
lines changed

core/incremental/operator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +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,
75+
n_key_col: 3,
7676
}
7777
}
7878

core/schema.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,7 +2446,7 @@ pub struct Index {
24462446
pub where_clause: Option<Box<Expr>>,
24472447
pub index_method: Option<Arc<dyn IndexMethodAttachment>>,
24482448
pub is_primary_key: bool,
2449-
pub n_key_col: usize,
2449+
pub n_key_col: usize,
24502450
}
24512451

24522452
#[allow(dead_code)]
@@ -2515,7 +2515,7 @@ impl Index {
25152515
where_clause: None,
25162516
is_primary_key: false,
25172517
index_method: Some(descriptor),
2518-
n_key_col: columns.len(),
2518+
n_key_col: columns.len(),
25192519
})
25202520
} else {
25212521
Ok(Index {
@@ -2529,7 +2529,7 @@ impl Index {
25292529
where_clause,
25302530
index_method: None,
25312531
is_primary_key: false,
2532-
n_key_col: columns.len(),
2532+
n_key_col: columns.len(),
25332533
})
25342534
}
25352535
}
@@ -2635,7 +2635,7 @@ impl Index {
26352635
})
26362636
.collect::<Vec<_>>();
26372637

2638-
let n_key_col = unique_cols.len();
2638+
let n_key_col = unique_cols.len();
26392639
Ok(Index {
26402640
name: normalize_ident(index_name.as_str()),
26412641
table_name: table.name.clone(),
@@ -2647,7 +2647,7 @@ impl Index {
26472647
where_clause: None,
26482648
index_method: None,
26492649
is_primary_key: false,
2650-
n_key_col,
2650+
n_key_col,
26512651
})
26522652
}
26532653

core/translate/compound_select.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ fn create_dedupe_index(
422422
column.collation =
423423
get_collseq_from_expr(&select.result_columns[i].expr, &select.table_references)?;
424424
}
425-
let n_key_col = dedupe_columns.len();
425+
let n_key_col = dedupe_columns.len();
426426
let dedupe_index = Arc::new(Index {
427427
columns: dedupe_columns,
428428
name: "compound_dedupe".to_string(),
@@ -434,7 +434,7 @@ fn create_dedupe_index(
434434
where_clause: None,
435435
index_method: None,
436436
is_primary_key: false,
437-
n_key_col,
437+
n_key_col,
438438
});
439439
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(dedupe_index.clone()));
440440
program.emit_insn(Insn::OpenEphemeral {

core/translate/index.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +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(),
153+
n_key_col: columns.len(),
154154
});
155155

156156
if !idx.validate_where_expr(table) {

core/translate/insert.rs

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,32 +2821,82 @@ fn translate_without_rowid_insert(
28212821
description: format_unique_violation_desc(&table.name, pk_index),
28222822
});
28232823

2824+
28242825
program.preassign_label_to_next_insn(ok_to_insert_label);
28252826
tracing::debug!("Uniqueness check passed. Continuing with insertion.");
28262827

2828+
2829+
let physically_ordered_cols: Vec<&Column> = {
2830+
let mut ordered = Vec::with_capacity(table.columns.len());
2831+
let mut pk_cols_added = std::collections::HashSet::new();
2832+
2833+
for pk_col_def in pk_index.columns.iter().take(pk_index.n_key_col) {
2834+
let (_, col) = table.get_column(&pk_col_def.name).unwrap();
2835+
ordered.push(col);
2836+
pk_cols_added.insert(col.name.as_ref().unwrap().as_str());
2837+
tracing::trace!(
2838+
" Physical col {}: {}",
2839+
ordered.len() - 1,
2840+
col.name.as_ref().unwrap()
2841+
);
2842+
}
2843+
2844+
for col in table.columns.iter() {
2845+
if !pk_cols_added.contains(col.name.as_ref().unwrap().as_str()) {
2846+
ordered.push(col);
2847+
tracing::trace!(
2848+
" Physical col {}: {}",
2849+
ordered.len() - 1,
2850+
col.name.as_ref().unwrap()
2851+
);
2852+
}
2853+
}
2854+
assert_eq!(
2855+
ordered.len(),
2856+
table.columns.len(),
2857+
"Physical column ordering failed: count mismatch."
2858+
);
2859+
ordered
2860+
};
2861+
2862+
let reordered_start_reg = program.alloc_registers(insertion.col_mappings.len());
2863+
tracing::debug!(
2864+
"Reordering columns into physical order. New registers start at {}",
2865+
reordered_start_reg
2866+
);
2867+
2868+
for (i, physical_col) in physically_ordered_cols.iter().enumerate() {
2869+
let logical_mapping = insertion
2870+
.get_col_mapping_by_name(physical_col.name.as_ref().unwrap())
2871+
.unwrap();
2872+
program.emit_insn(Insn::Copy {
2873+
src_reg: logical_mapping.register,
2874+
dst_reg: reordered_start_reg + i,
2875+
extra_amount: 0,
2876+
});
2877+
}
2878+
28272879
let full_record_reg = program.alloc_register();
2828-
let affinity_str = insertion
2829-
.col_mappings
2880+
let affinity_str = physically_ordered_cols
28302881
.iter()
2831-
.map(|col_mapping| col_mapping.column.affinity().aff_mask())
2882+
.map(|col| col.affinity().aff_mask())
28322883
.collect::<String>();
28332884

2885+
28342886
program.emit_insn(Insn::MakeRecord {
2835-
start_reg: insertion.first_col_register(),
2887+
start_reg: reordered_start_reg,
28362888
count: insertion.col_mappings.len(),
28372889
dest_reg: full_record_reg,
28382890
index_name: Some(pk_index.name.clone()),
28392891
affinity_str: Some(affinity_str),
28402892
});
2841-
tracing::debug!(
2842-
"Emitted OP_MakeRecord for full row into register {}",
2843-
full_record_reg
2844-
);
2893+
2894+
28452895

28462896
program.emit_insn(Insn::IdxInsert {
28472897
cursor_id: pk_cursor_id,
28482898
record_reg: full_record_reg,
2849-
unpacked_start: Some(insertion.first_col_register()),
2899+
unpacked_start: Some(reordered_start_reg),
28502900
unpacked_count: Some(insertion.col_mappings.len() as u16),
28512901
flags: IdxInsertFlags::new().nchange(true),
28522902
});
@@ -2871,7 +2921,6 @@ fn translate_without_rowid_insert(
28712921

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

2874-
28752924
let num_key_cols = index.n_key_col;
28762925
let key_start_reg = program.alloc_registers(num_key_cols);
28772926

core/translate/main_loop.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,7 @@ pub fn init_loop(
185185
where_clause: None,
186186
index_method: None,
187187
is_primary_key: false,
188-
n_key_col: group_by.as_ref().unwrap().exprs.len(),
189-
188+
n_key_col: group_by.as_ref().unwrap().exprs.len(),
190189
});
191190
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(index.clone()));
192191
if group_by.is_none() {

core/translate/optimizer/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,7 @@ fn ephemeral_index_build(
12881288
(None, None) => Ordering::Equal,
12891289
}
12901290
});
1291-
let n_key_col = ephemeral_columns.len();
1291+
let n_key_col = ephemeral_columns.len();
12921292
let ephemeral_index = Index {
12931293
name: format!(
12941294
"ephemeral_{}_{}",
@@ -1307,7 +1307,7 @@ fn ephemeral_index_build(
13071307
.is_some_and(|btree| btree.has_rowid),
13081308
index_method: None,
13091309
is_primary_key: false,
1310-
n_key_col,
1310+
n_key_col,
13111311
};
13121312

13131313
ephemeral_index

core/translate/order_by.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ pub fn init_order_by(
100100
default: None,
101101
})
102102
}
103-
let n_key_col = index_columns.len();
103+
let n_key_col = index_columns.len();
104104
let index = Arc::new(Index {
105105
name: index_name.clone(),
106106
table_name: String::new(),
@@ -112,7 +112,7 @@ pub fn init_order_by(
112112
where_clause: None,
113113
index_method: None,
114114
is_primary_key: false,
115-
n_key_col,
115+
n_key_col,
116116
});
117117
program.alloc_cursor_id(CursorType::BTreeIndex(index))
118118
} else {

core/translate/subquery.rs

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

385-
let n_key_col=columns.len();
385+
let n_key_col = columns.len();
386386
let ephemeral_index = Arc::new(Index {
387387
columns,
388388
name: format!("ephemeral_index_where_sub_{subquery_id}"),
@@ -394,7 +394,7 @@ fn get_subquery_parser<'a>(
394394
where_clause: None,
395395
index_method: None,
396396
is_primary_key: false,
397-
n_key_col,
397+
n_key_col,
398398
});
399399

400400
let cursor_id =

0 commit comments

Comments
 (0)