Skip to content

Commit e41b129

Browse files
committed
store/order row acc to pkey
1 parent 2c712af commit e41b129

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
@@ -2581,7 +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,
2584+
pub n_key_col: usize,
25852585
}
25862586

25872587
#[allow(dead_code)]
@@ -2650,7 +2650,7 @@ impl Index {
26502650
where_clause: None,
26512651
is_primary_key: false,
26522652
index_method: Some(descriptor),
2653-
n_key_col: columns.len(),
2653+
n_key_col: columns.len(),
26542654
})
26552655
} else {
26562656
Ok(Index {
@@ -2664,7 +2664,7 @@ impl Index {
26642664
where_clause,
26652665
index_method: None,
26662666
is_primary_key: false,
2667-
n_key_col: columns.len(),
2667+
n_key_col: columns.len(),
26682668
})
26692669
}
26702670
}
@@ -2770,7 +2770,7 @@ impl Index {
27702770
})
27712771
.collect::<Vec<_>>();
27722772

2773-
let n_key_col = unique_cols.len();
2773+
let n_key_col = unique_cols.len();
27742774
Ok(Index {
27752775
name: normalize_ident(index_name.as_str()),
27762776
table_name: table.name.clone(),
@@ -2782,7 +2782,7 @@ impl Index {
27822782
where_clause: None,
27832783
index_method: None,
27842784
is_primary_key: false,
2785-
n_key_col,
2785+
n_key_col,
27862786
})
27872787
}
27882788

core/translate/compound_select.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ fn create_dedupe_index(
437437
};
438438
column.collation = collation;
439439
}
440-
let n_key_col = dedupe_columns.len();
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,7 +449,7 @@ fn create_dedupe_index(
449449
where_clause: None,
450450
index_method: None,
451451
is_primary_key: false,
452-
n_key_col,
452+
n_key_col,
453453
});
454454
let cursor_id = program.alloc_cursor_id(CursorType::BTreeIndex(dedupe_index.clone()));
455455
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
@@ -2841,32 +2841,82 @@ fn translate_without_rowid_insert(
28412841
description: format_unique_violation_desc(&table.name, pk_index),
28422842
});
28432843

2844+
28442845
program.preassign_label_to_next_insn(ok_to_insert_label);
28452846
tracing::debug!("Uniqueness check passed. Continuing with insertion.");
28462847

2848+
2849+
let physically_ordered_cols: Vec<&Column> = {
2850+
let mut ordered = Vec::with_capacity(table.columns.len());
2851+
let mut pk_cols_added = std::collections::HashSet::new();
2852+
2853+
for pk_col_def in pk_index.columns.iter().take(pk_index.n_key_col) {
2854+
let (_, col) = table.get_column(&pk_col_def.name).unwrap();
2855+
ordered.push(col);
2856+
pk_cols_added.insert(col.name.as_ref().unwrap().as_str());
2857+
tracing::trace!(
2858+
" Physical col {}: {}",
2859+
ordered.len() - 1,
2860+
col.name.as_ref().unwrap()
2861+
);
2862+
}
2863+
2864+
for col in table.columns.iter() {
2865+
if !pk_cols_added.contains(col.name.as_ref().unwrap().as_str()) {
2866+
ordered.push(col);
2867+
tracing::trace!(
2868+
" Physical col {}: {}",
2869+
ordered.len() - 1,
2870+
col.name.as_ref().unwrap()
2871+
);
2872+
}
2873+
}
2874+
assert_eq!(
2875+
ordered.len(),
2876+
table.columns.len(),
2877+
"Physical column ordering failed: count mismatch."
2878+
);
2879+
ordered
2880+
};
2881+
2882+
let reordered_start_reg = program.alloc_registers(insertion.col_mappings.len());
2883+
tracing::debug!(
2884+
"Reordering columns into physical order. New registers start at {}",
2885+
reordered_start_reg
2886+
);
2887+
2888+
for (i, physical_col) in physically_ordered_cols.iter().enumerate() {
2889+
let logical_mapping = insertion
2890+
.get_col_mapping_by_name(physical_col.name.as_ref().unwrap())
2891+
.unwrap();
2892+
program.emit_insn(Insn::Copy {
2893+
src_reg: logical_mapping.register,
2894+
dst_reg: reordered_start_reg + i,
2895+
extra_amount: 0,
2896+
});
2897+
}
2898+
28472899
let full_record_reg = program.alloc_register();
2848-
let affinity_str = insertion
2849-
.col_mappings
2900+
let affinity_str = physically_ordered_cols
28502901
.iter()
2851-
.map(|col_mapping| col_mapping.column.affinity().aff_mask())
2902+
.map(|col| col.affinity().aff_mask())
28522903
.collect::<String>();
28532904

2905+
28542906
program.emit_insn(Insn::MakeRecord {
2855-
start_reg: insertion.first_col_register(),
2907+
start_reg: reordered_start_reg,
28562908
count: insertion.col_mappings.len(),
28572909
dest_reg: full_record_reg,
28582910
index_name: Some(pk_index.name.clone()),
28592911
affinity_str: Some(affinity_str),
28602912
});
2861-
tracing::debug!(
2862-
"Emitted OP_MakeRecord for full row into register {}",
2863-
full_record_reg
2864-
);
2913+
2914+
28652915

28662916
program.emit_insn(Insn::IdxInsert {
28672917
cursor_id: pk_cursor_id,
28682918
record_reg: full_record_reg,
2869-
unpacked_start: Some(insertion.first_col_register()),
2919+
unpacked_start: Some(reordered_start_reg),
28702920
unpacked_count: Some(insertion.col_mappings.len() as u16),
28712921
flags: IdxInsertFlags::new().nchange(true),
28722922
});
@@ -2891,7 +2941,6 @@ fn translate_without_rowid_insert(
28912941

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

2894-
28952944
let num_key_cols = index.n_key_col;
28962945
let key_start_reg = program.alloc_registers(num_key_cols);
28972946

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
@@ -1278,7 +1278,7 @@ fn ephemeral_index_build(
12781278
(None, None) => Ordering::Equal,
12791279
}
12801280
});
1281-
let n_key_col = ephemeral_columns.len();
1281+
let n_key_col = ephemeral_columns.len();
12821282
let ephemeral_index = Index {
12831283
name: format!(
12841284
"ephemeral_{}_{}",
@@ -1297,7 +1297,7 @@ fn ephemeral_index_build(
12971297
.is_some_and(|btree| btree.has_rowid),
12981298
index_method: None,
12991299
is_primary_key: false,
1300-
n_key_col,
1300+
n_key_col,
13011301
};
13021302

13031303
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)