Remove 'cursor_hint': it is never needed

This commit is contained in:
jussisaurio
2024-11-23 20:00:58 +02:00
parent 008be10cfd
commit 885b6ecd76
4 changed files with 28 additions and 171 deletions

View File

@@ -503,7 +503,6 @@ fn open_loop(
program,
referenced_tables,
predicate,
None,
condition_metadata,
None,
)?;
@@ -531,7 +530,7 @@ fn open_loop(
predicates,
iter_dir,
} => {
let cursor_id = program.resolve_cursor_id(&table_reference.table_identifier, None);
let cursor_id = program.resolve_cursor_id(&table_reference.table_identifier);
if iter_dir
.as_ref()
.is_some_and(|dir| *dir == IterationDirection::Backwards)
@@ -575,7 +574,6 @@ fn open_loop(
program,
referenced_tables,
expr,
None,
condition_metadata,
None,
)?;
@@ -592,14 +590,13 @@ fn open_loop(
predicates,
..
} => {
let table_cursor_id =
program.resolve_cursor_id(&table_reference.table_identifier, None);
let table_cursor_id = program.resolve_cursor_id(&table_reference.table_identifier);
// Open the loop for the index search.
// Primary key equality search is handled with a SeekRowid instruction which does not loop, since it is a single row lookup.
if !matches!(search, Search::PrimaryKeyEq { .. }) {
let index_cursor_id = if let Search::IndexSearch { index, .. } = search {
Some(program.resolve_cursor_id(&index.name, None))
Some(program.resolve_cursor_id(&index.name))
} else {
None
};
@@ -617,14 +614,7 @@ fn open_loop(
ast::Operator::Equals
| ast::Operator::Greater
| ast::Operator::GreaterEquals => {
translate_expr(
program,
Some(referenced_tables),
cmp_expr,
cmp_reg,
None,
None,
)?;
translate_expr(program, Some(referenced_tables), cmp_expr, cmp_reg, None)?;
}
ast::Operator::Less | ast::Operator::LessEquals => {
program.emit_insn(Insn::Null {
@@ -657,14 +647,7 @@ fn open_loop(
*m.termination_label_stack.last().unwrap(),
);
if *cmp_op == ast::Operator::Less || *cmp_op == ast::Operator::LessEquals {
translate_expr(
program,
Some(referenced_tables),
cmp_expr,
cmp_reg,
None,
None,
)?;
translate_expr(program, Some(referenced_tables), cmp_expr, cmp_reg, None)?;
}
program.defer_label_resolution(scan_loop_body_label, program.offset() as usize);
@@ -755,14 +738,7 @@ fn open_loop(
if let Search::PrimaryKeyEq { cmp_expr } = search {
let src_reg = program.alloc_register();
translate_expr(
program,
Some(referenced_tables),
cmp_expr,
src_reg,
None,
None,
)?;
translate_expr(program, Some(referenced_tables), cmp_expr, src_reg, None)?;
program.emit_insn_with_label_dependency(
Insn::SeekRowid {
cursor_id: table_cursor_id,
@@ -784,7 +760,6 @@ fn open_loop(
program,
referenced_tables,
predicate,
None,
condition_metadata,
None,
)?;
@@ -909,7 +884,7 @@ fn inner_loop_source_emit(
for expr in group_by.iter() {
let key_reg = cur_reg;
cur_reg += 1;
translate_expr(program, Some(referenced_tables), expr, key_reg, None, None)?;
translate_expr(program, Some(referenced_tables), expr, key_reg, None)?;
}
for agg in aggregates.iter() {
// Here we are collecting scalars for the group by sorter, which will include
@@ -921,7 +896,7 @@ fn inner_loop_source_emit(
for expr in agg.args.iter() {
let agg_reg = cur_reg;
cur_reg += 1;
translate_expr(program, Some(referenced_tables), expr, agg_reg, None, None)?;
translate_expr(program, Some(referenced_tables), expr, agg_reg, None)?;
}
}
@@ -991,7 +966,7 @@ fn inner_loop_source_emit(
let start_reg = program.alloc_registers(orderby_sorter_column_count);
for (i, (expr, _)) in order_by.iter().enumerate() {
let key_reg = start_reg + i;
translate_expr(program, Some(referenced_tables), expr, key_reg, None, None)?;
translate_expr(program, Some(referenced_tables), expr, key_reg, None)?;
}
let mut cur_reg = start_reg + order_by_len;
let mut cur_idx_in_orderby_sorter = order_by_len;
@@ -1007,14 +982,7 @@ fn inner_loop_source_emit(
contains_aggregates,
} => {
assert!(!*contains_aggregates);
translate_expr(
program,
Some(referenced_tables),
expr,
cur_reg,
None,
None,
)?;
translate_expr(program, Some(referenced_tables), expr, cur_reg, None)?;
}
other => unreachable!("{:?}", other),
}
@@ -1044,7 +1012,7 @@ fn inner_loop_source_emit(
m.aggregation_start_register = Some(start_reg);
for (i, agg) in aggregates.iter().enumerate() {
let reg = start_reg + i;
translate_aggregation(program, referenced_tables, agg, reg, None)?;
translate_aggregation(program, referenced_tables, agg, reg)?;
}
for (i, expr) in result_columns.iter().enumerate() {
match expr {
@@ -1058,7 +1026,7 @@ fn inner_loop_source_emit(
continue;
}
let reg = start_reg + num_aggs + i;
translate_expr(program, Some(referenced_tables), expr, reg, None, None)?;
translate_expr(program, Some(referenced_tables), expr, reg, None)?;
}
ResultSetColumn::Agg(_) => { /* do nothing, aggregates are computed above */ }
}
@@ -1076,7 +1044,7 @@ fn inner_loop_source_emit(
} => {
assert!(!*contains_aggregates);
let reg = start_reg + i;
translate_expr(program, Some(referenced_tables), expr, reg, None, None)?;
translate_expr(program, Some(referenced_tables), expr, reg, None)?;
}
other => unreachable!(
"Unexpected non-scalar result column in inner loop: {:?}",
@@ -1131,10 +1099,10 @@ fn close_loop(
let right_cursor_id = match right.as_ref() {
SourceOperator::Scan {
table_reference, ..
} => program.resolve_cursor_id(&table_reference.table_identifier, None),
} => program.resolve_cursor_id(&table_reference.table_identifier),
SourceOperator::Search {
table_reference, ..
} => program.resolve_cursor_id(&table_reference.table_identifier, None),
} => program.resolve_cursor_id(&table_reference.table_identifier),
_ => unreachable!(),
};
program.emit_insn(Insn::NullRow {
@@ -1165,7 +1133,7 @@ fn close_loop(
iter_dir,
..
} => {
let cursor_id = program.resolve_cursor_id(&table_reference.table_identifier, None);
let cursor_id = program.resolve_cursor_id(&table_reference.table_identifier);
program.resolve_label(*m.next_row_labels.get(id).unwrap(), program.offset());
if iter_dir
.as_ref()
@@ -1210,9 +1178,9 @@ fn close_loop(
return Ok(());
}
let cursor_id = match search {
Search::IndexSearch { index, .. } => program.resolve_cursor_id(&index.name, None),
Search::IndexSearch { index, .. } => program.resolve_cursor_id(&index.name),
Search::PrimaryKeySearch { .. } => {
program.resolve_cursor_id(&table_reference.table_identifier, None)
program.resolve_cursor_id(&table_reference.table_identifier)
}
Search::PrimaryKeyEq { .. } => unreachable!(),
};
@@ -1562,7 +1530,6 @@ fn group_by_emit(
Some(referenced_tables),
expr,
cur_reg,
None,
Some(&precomputed_exprs_to_register),
)?;
cur_reg += 1;
@@ -1582,7 +1549,6 @@ fn group_by_emit(
Some(referenced_tables),
expr,
cur_reg,
None,
Some(&precomputed_exprs_to_register),
)?;
}
@@ -1688,7 +1654,6 @@ fn agg_without_group_by_emit(
Some(referenced_tables),
expr,
output_reg + i,
None,
Some(&precomputed_exprs_to_register),
)?;
}

View File

@@ -21,7 +21,6 @@ pub fn translate_condition_expr(
program: &mut ProgramBuilder,
referenced_tables: &[BTreeTableReference],
expr: &ast::Expr,
cursor_hint: Option<usize>,
condition_metadata: ConditionMetadata,
precomputed_exprs_to_registers: Option<&Vec<(&ast::Expr, usize)>>,
) -> Result<()> {
@@ -34,7 +33,6 @@ pub fn translate_condition_expr(
program,
referenced_tables,
lhs,
cursor_hint,
ConditionMetadata {
jump_if_condition_is_true: false,
..condition_metadata
@@ -45,7 +43,6 @@ pub fn translate_condition_expr(
program,
referenced_tables,
rhs,
cursor_hint,
condition_metadata,
precomputed_exprs_to_registers,
);
@@ -56,7 +53,6 @@ pub fn translate_condition_expr(
program,
referenced_tables,
lhs,
cursor_hint,
ConditionMetadata {
// If the first condition is true, we don't need to evaluate the second condition.
jump_if_condition_is_true: true,
@@ -70,7 +66,6 @@ pub fn translate_condition_expr(
program,
referenced_tables,
rhs,
cursor_hint,
condition_metadata,
precomputed_exprs_to_registers,
);
@@ -82,7 +77,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
lhs,
lhs_reg,
cursor_hint,
precomputed_exprs_to_registers,
);
if let ast::Expr::Literal(_) = lhs.as_ref() {
@@ -94,7 +88,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
rhs,
rhs_reg,
cursor_hint,
precomputed_exprs_to_registers,
);
if let ast::Expr::Literal(_) = rhs.as_ref() {
@@ -343,7 +336,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
lhs,
lhs_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
@@ -373,7 +365,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
expr,
rhs_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
// If this is not the last condition, we need to jump to the 'jump_target_when_true' label if the condition is true.
@@ -417,7 +408,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
expr,
rhs_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn_with_label_dependency(
@@ -463,7 +453,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
lhs,
column_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = lhs.as_ref() {
@@ -474,7 +463,6 @@ pub fn translate_condition_expr(
Some(referenced_tables),
rhs,
pattern_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = rhs.as_ref() {
@@ -547,7 +535,6 @@ pub fn translate_condition_expr(
program,
referenced_tables,
expr,
cursor_hint,
condition_metadata,
precomputed_exprs_to_registers,
);
@@ -563,7 +550,6 @@ pub fn translate_expr(
referenced_tables: Option<&[BTreeTableReference]>,
expr: &ast::Expr,
target_register: usize,
cursor_hint: Option<usize>,
precomputed_exprs_to_registers: Option<&Vec<(&ast::Expr, usize)>>,
) -> Result<usize> {
if let Some(precomputed_exprs_to_registers) = precomputed_exprs_to_registers {
@@ -590,7 +576,6 @@ pub fn translate_expr(
referenced_tables,
e1,
e1_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
let e2_reg = program.alloc_register();
@@ -599,7 +584,6 @@ pub fn translate_expr(
referenced_tables,
e2,
e2_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
@@ -723,7 +707,6 @@ pub fn translate_expr(
referenced_tables,
expr,
reg_expr,
cursor_hint,
precomputed_exprs_to_registers,
)?;
let reg_type = program.alloc_register();
@@ -796,7 +779,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
regs,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::Function {
@@ -823,7 +805,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -861,7 +842,6 @@ pub fn translate_expr(
referenced_tables,
arg,
target_register,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if index < args.len() - 1 {
@@ -897,7 +877,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -930,7 +909,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -967,7 +945,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
temp_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::NotNull {
@@ -980,7 +957,6 @@ pub fn translate_expr(
referenced_tables,
&args[1],
temp_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::Copy {
@@ -1013,7 +989,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = arg {
@@ -1061,7 +1036,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
regs,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::Function {
@@ -1098,7 +1072,6 @@ pub fn translate_expr(
referenced_tables,
arg,
target_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -1136,7 +1109,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
str_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
translate_expr(
@@ -1144,7 +1116,6 @@ pub fn translate_expr(
referenced_tables,
&args[1],
start_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if args.len() == 3 {
@@ -1153,7 +1124,6 @@ pub fn translate_expr(
referenced_tables,
&args[2],
length_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -1183,7 +1153,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
regs,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::Function {
@@ -1207,7 +1176,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
arg_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
start_reg = arg_reg;
@@ -1232,7 +1200,6 @@ pub fn translate_expr(
referenced_tables,
arg,
target_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
}
@@ -1272,7 +1239,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = arg {
@@ -1305,7 +1271,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = arg {
@@ -1339,7 +1304,6 @@ pub fn translate_expr(
referenced_tables,
arg,
reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
if let ast::Expr::Literal(_) = arg {
@@ -1377,7 +1341,6 @@ pub fn translate_expr(
referenced_tables,
&args[0],
first_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
let second_reg = program.alloc_register();
@@ -1386,7 +1349,6 @@ pub fn translate_expr(
referenced_tables,
&args[1],
second_reg,
cursor_hint,
precomputed_exprs_to_registers,
)?;
program.emit_insn(Insn::Function {
@@ -1431,7 +1393,7 @@ pub fn translate_expr(
is_rowid_alias: is_primary_key,
} => {
let tbl_ref = referenced_tables.as_ref().unwrap().get(*table).unwrap();
let cursor_id = program.resolve_cursor_id(&tbl_ref.table_identifier, cursor_hint);
let cursor_id = program.resolve_cursor_id(&tbl_ref.table_identifier);
if *is_primary_key {
program.emit_insn(Insn::RowId {
cursor_id,
@@ -1518,7 +1480,6 @@ pub fn translate_expr(
referenced_tables,
&exprs[0],
target_register,
cursor_hint,
precomputed_exprs_to_registers,
)?;
} else {
@@ -1586,7 +1547,6 @@ pub fn translate_aggregation(
referenced_tables: &[BTreeTableReference],
agg: &Aggregate,
target_register: usize,
cursor_hint: Option<usize>,
) -> Result<usize> {
let dest = match agg.func {
AggFunc::Avg => {
@@ -1595,14 +1555,7 @@ pub fn translate_aggregation(
}
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,
col: expr_reg,
@@ -1617,14 +1570,7 @@ pub fn translate_aggregation(
} else {
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
);
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None);
expr_reg
};
program.emit_insn(Insn::AggStep {
@@ -1660,20 +1606,12 @@ pub fn translate_aggregation(
delimiter_expr = ast::Expr::Literal(ast::Literal::String(String::from("\",\"")));
}
translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
translate_expr(
program,
Some(referenced_tables),
&delimiter_expr,
delimiter_reg,
cursor_hint,
None,
)?;
@@ -1692,14 +1630,7 @@ pub fn translate_aggregation(
}
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,
col: expr_reg,
@@ -1714,14 +1645,7 @@ pub fn translate_aggregation(
}
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,
col: expr_reg,
@@ -1751,20 +1675,12 @@ pub fn translate_aggregation(
_ => crate::bail_parse_error!("Incorrect delimiter parameter"),
};
translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
translate_expr(
program,
Some(referenced_tables),
&delimiter_expr,
delimiter_reg,
cursor_hint,
None,
)?;
@@ -1783,14 +1699,7 @@ pub fn translate_aggregation(
}
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,
col: expr_reg,
@@ -1805,14 +1714,7 @@ pub fn translate_aggregation(
}
let expr = &agg.args[0];
let expr_reg = program.alloc_register();
let _ = translate_expr(
program,
Some(referenced_tables),
expr,
expr_reg,
cursor_hint,
None,
)?;
let _ = translate_expr(program, Some(referenced_tables), expr, expr_reg, None)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,
col: expr_reg,
@@ -1897,7 +1799,6 @@ pub fn translate_aggregation_groupby(
&delimiter_expr,
delimiter_reg,
None,
None,
)?;
program.emit_insn(Insn::AggStep {
@@ -1964,7 +1865,6 @@ pub fn translate_aggregation_groupby(
&delimiter_expr,
delimiter_reg,
None,
None,
)?;
program.emit_insn(Insn::AggStep {

View File

@@ -98,7 +98,6 @@ pub fn translate_insert(
expr,
column_registers_start + col,
None,
None,
)?;
}
program.emit_insn(Insn::Yield {

View File

@@ -343,14 +343,7 @@ impl ProgramBuilder {
}
// translate table to cursor id
pub fn resolve_cursor_id(
&self,
table_identifier: &str,
cursor_hint: Option<CursorID>,
) -> CursorID {
if let Some(cursor_hint) = cursor_hint {
return cursor_hint;
}
pub fn resolve_cursor_id(&self, table_identifier: &str) -> CursorID {
self.cursor_ref
.iter()
.position(|(t_ident, _)| {