mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-23 00:45:37 +01:00
emit constant where terms in init_loop
This commit is contained in:
@@ -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 };
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user