emit constant where terms in init_loop

This commit is contained in:
pedrocarlo
2025-06-19 13:44:33 -03:00
parent b1706ae849
commit fcff306f98
2 changed files with 20 additions and 86 deletions

View File

@@ -7,7 +7,7 @@ use limbo_sqlite3_parser::ast::{self};
use tracing::{instrument, Level};
use super::aggregation::emit_ungrouped_aggregation;
use super::expr::{translate_condition_expr, translate_expr, ConditionMetadata};
use super::expr::translate_expr;
use super::group_by::{
group_by_agg_phase, group_by_emit_row_phase, init_group_by, GroupByMetadata, GroupByRowSource,
};
@@ -295,6 +295,7 @@ pub fn emit_query<'a>(
&mut plan.aggregates,
plan.group_by.as_ref(),
OperationMode::SELECT,
&plan.where_clause,
)?;
if plan.is_simple_count() {
@@ -302,27 +303,6 @@ pub fn emit_query<'a>(
return Ok(t_ctx.reg_result_cols_start.unwrap());
}
for where_term in plan
.where_clause
.iter()
.filter(|wt| wt.should_eval_before_loop(&plan.join_order))
{
let jump_target_when_true = program.allocate_label();
let condition_metadata = ConditionMetadata {
jump_if_condition_is_true: false,
jump_target_when_false: after_main_loop_label,
jump_target_when_true,
};
translate_condition_expr(
program,
&plan.table_references,
&where_term.expr,
condition_metadata,
&t_ctx.resolver,
)?;
program.preassign_label_to_next_insn(jump_target_when_true);
}
// Set up main query execution loop
open_loop(
program,
@@ -411,29 +391,9 @@ fn emit_program_for_delete(
&mut [],
None,
OperationMode::DELETE,
&plan.where_clause,
)?;
for cond in plan
.where_clause
.iter()
.filter(|c| c.should_eval_before_loop(&[JoinOrderMember::default()]))
{
let jump_target = program.allocate_label();
let meta = ConditionMetadata {
jump_if_condition_is_true: false,
jump_target_when_true: jump_target,
jump_target_when_false: t_ctx.label_main_loop_end.unwrap(),
};
translate_condition_expr(
program,
&plan.table_references,
&cond.expr,
meta,
&t_ctx.resolver,
)?;
program.preassign_label_to_next_insn(jump_target);
}
// Set up main query execution loop
open_loop(
program,
@@ -443,7 +403,7 @@ fn emit_program_for_delete(
&mut plan.where_clause,
)?;
emit_delete_insns(program, &mut t_ctx, &plan.table_references, &plan)?;
emit_delete_insns(program, &mut t_ctx, &plan.table_references)?;
// Clean up and close the main execution loop
close_loop(
@@ -465,7 +425,6 @@ fn emit_delete_insns(
program: &mut ProgramBuilder,
t_ctx: &mut TranslateCtx,
table_references: &TableReferences,
plan: &DeletePlan,
) -> Result<()> {
let table_reference = table_references.joined_tables().first().unwrap();
let cursor_id = match &table_reference.op {
@@ -613,6 +572,7 @@ fn emit_program_for_update(
&mut [],
None,
OperationMode::UPDATE,
&plan.where_clause,
)?;
// Open indexes for update.
let mut index_cursors = Vec::with_capacity(plan.indexes_to_update.len());
@@ -707,26 +667,6 @@ fn emit_update_insns(
},
};
for cond in plan
.where_clause
.iter()
.filter(|c| c.should_eval_before_loop(&[JoinOrderMember::default()]))
{
let jump_target = program.allocate_label();
let meta = ConditionMetadata {
jump_if_condition_is_true: false,
jump_target_when_true: jump_target,
jump_target_when_false: t_ctx.label_main_loop_end.unwrap(),
};
translate_condition_expr(
program,
&plan.table_references,
&cond.expr,
meta,
&t_ctx.resolver,
)?;
program.preassign_label_to_next_insn(jump_target);
}
let beg = program.alloc_registers(
table_ref.table.columns().len()
+ if is_virtual {
@@ -793,27 +733,6 @@ fn emit_update_insns(
});
}
for cond in plan
.where_clause
.iter()
.filter(|c| c.should_eval_before_loop(&[JoinOrderMember::default()]))
{
let jump_target = program.allocate_label();
let meta = ConditionMetadata {
jump_if_condition_is_true: false,
jump_target_when_true: jump_target,
jump_target_when_false: loop_labels.next,
};
translate_condition_expr(
program,
&plan.table_references,
&cond.expr,
meta,
&t_ctx.resolver,
)?;
program.preassign_label_to_next_insn(jump_target);
}
// we scan a column at a time, loading either the column's values, or the new value
// from the Set expression, into registers so we can emit a MakeRecord and update the row.
let start = if is_virtual { beg + 2 } else { beg + 1 };

View File

@@ -115,6 +115,7 @@ pub fn init_loop(
aggregates: &mut [Aggregate],
group_by: Option<&GroupBy>,
mode: OperationMode,
where_clause: &[WhereTerm],
) -> Result<()> {
assert!(
t_ctx.meta_left_joins.len() == tables.joined_tables().len(),
@@ -334,6 +335,20 @@ pub fn init_loop(
}
}
for cond in where_clause
.iter()
.filter(|c| c.should_eval_before_loop(&[JoinOrderMember::default()]))
{
let jump_target = program.allocate_label();
let meta = ConditionMetadata {
jump_if_condition_is_true: false,
jump_target_when_true: jump_target,
jump_target_when_false: t_ctx.label_main_loop_end.unwrap(),
};
translate_condition_expr(program, &tables, &cond.expr, meta, &t_ctx.resolver)?;
program.preassign_label_to_next_insn(jump_target);
}
Ok(())
}