push translate_ctx creation outside of prologue

This commit is contained in:
pedrocarlo 2025-05-21 13:06:25 -03:00
parent fc08f786fc
commit 3090dd91fa
3 changed files with 57 additions and 39 deletions

View file

@ -100,6 +100,32 @@ pub struct TranslateCtx<'a> {
pub resolver: Resolver<'a>,
}
impl<'a> TranslateCtx<'a> {
pub fn new(
program: &mut ProgramBuilder,
syms: &'a SymbolTable,
table_count: usize,
result_column_count: usize,
) -> Self {
TranslateCtx {
labels_main_loop: (0..table_count).map(|_| LoopLabels::new(program)).collect(),
label_main_loop_end: None,
reg_agg_start: None,
reg_nonagg_emit_once_flag: None,
reg_limit: None,
reg_offset: None,
reg_limit_offset_sum: None,
reg_result_cols_start: None,
meta_group_by: None,
meta_left_joins: (0..table_count).map(|_| None).collect(),
meta_sort: None,
result_column_indexes_in_orderby_sorter: (0..result_column_count).collect(),
result_columns_to_skip_in_orderby_sorter: None,
resolver: Resolver::new(syms),
}
}
}
/// Used to distinguish database operations
#[allow(clippy::upper_case_acronyms, dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -132,8 +158,14 @@ fn emit_program_for_select(
mut plan: SelectPlan,
syms: &SymbolTable,
) -> Result<()> {
let (mut t_ctx, init_label, start_offset) =
program.prologue(syms, plan.table_references.len(), plan.result_columns.len());
let (init_label, start_offset) = program.prologue();
let mut t_ctx = TranslateCtx::new(
program,
syms,
plan.table_references.len(),
plan.result_columns.len(),
);
// Trivial exit on LIMIT 0
if let Some(limit) = plan.limit {
@ -299,8 +331,14 @@ fn emit_program_for_delete(
mut plan: DeletePlan,
syms: &SymbolTable,
) -> Result<()> {
let (mut t_ctx, init_label, start_offset) =
program.prologue(syms, plan.table_references.len(), plan.result_columns.len());
let (init_label, start_offset) = program.prologue();
let mut t_ctx = TranslateCtx::new(
program,
syms,
plan.table_references.len(),
plan.result_columns.len(),
);
// exit early if LIMIT 0
if let Some(0) = plan.limit {
@ -466,7 +504,10 @@ fn emit_program_for_update(
mut plan: UpdatePlan,
syms: &SymbolTable,
) -> Result<()> {
let (mut t_ctx, init_label, start_offset) = program.prologue(
let (init_label, start_offset) = program.prologue();
let mut t_ctx = TranslateCtx::new(
program,
syms,
plan.table_references.len(),
plan.returning.as_ref().map_or(0, |r| r.len()),

View file

@ -32,7 +32,7 @@ pub fn translate_insert(
tbl_name: &QualifiedName,
columns: &Option<DistinctNames>,
body: &mut InsertBody,
returning: &Option<Vec<ResultColumn>>,
_returning: &Option<Vec<ResultColumn>>,
syms: &SymbolTable,
program: Option<ProgramBuilder>,
) -> Result<ProgramBuilder> {
@ -60,9 +60,9 @@ pub fn translate_insert(
Some(table) => table,
None => crate::bail_corrupt_error!("Parse error: no such table: {}", table_name),
};
// TODO: see if table_count for prologue should be 0
let (t_ctx, init_label, start_offset) =
program.prologue(syms, 0, returning.as_ref().map_or(0, |r| r.len()));
let (init_label, start_offset) = program.prologue();
let resolver = Resolver::new(syms);
if let Some(virtual_table) = &table.virtual_table() {
translate_virtual_table_insert(
@ -71,7 +71,7 @@ pub fn translate_insert(
columns,
body,
on_conflict,
&t_ctx.resolver,
&resolver,
)?;
program.epilogue(
init_label,
@ -174,7 +174,7 @@ pub fn translate_insert(
column_registers_start,
true,
rowid_reg,
&t_ctx.resolver,
&resolver,
)?;
program.emit_insn(Insn::Yield {
yield_reg,
@ -213,7 +213,7 @@ pub fn translate_insert(
column_registers_start,
false,
rowid_reg,
&t_ctx.resolver,
&resolver,
)?;
}
// Open all the index btrees for writing

View file

@ -14,11 +14,10 @@ use crate::{
storage::sqlite3_ondisk::DatabaseHeader,
translate::{
collate::CollationSeq,
emitter::{Resolver, TransactionMode, TranslateCtx},
main_loop::LoopLabels,
emitter::TransactionMode,
plan::{ResultSetColumn, TableReference},
},
Connection, SymbolTable, VirtualTable,
Connection, VirtualTable,
};
use super::{BranchOffset, CursorID, Insn, InsnFunction, InsnReference, JumpTarget, Program};
@ -640,12 +639,7 @@ impl ProgramBuilder {
}
/// Initialize the program with basic setup and return initial metadata and labels
pub fn prologue<'a>(
&mut self,
syms: &'a SymbolTable,
table_count: usize,
result_column_count: usize,
) -> (TranslateCtx<'a>, BranchOffset, BranchOffset) {
pub fn prologue<'a>(&mut self) -> (BranchOffset, BranchOffset) {
let init_label = self.allocate_label();
if self.nested_level == 0 {
@ -656,24 +650,7 @@ impl ProgramBuilder {
let start_offset = self.offset();
let t_ctx = TranslateCtx {
labels_main_loop: (0..table_count).map(|_| LoopLabels::new(self)).collect(),
label_main_loop_end: None,
reg_agg_start: None,
reg_nonagg_emit_once_flag: None,
reg_limit: None,
reg_offset: None,
reg_limit_offset_sum: None,
reg_result_cols_start: None,
meta_group_by: None,
meta_left_joins: (0..table_count).map(|_| None).collect(),
meta_sort: None,
result_column_indexes_in_orderby_sorter: (0..result_column_count).collect(),
result_columns_to_skip_in_orderby_sorter: None,
resolver: Resolver::new(syms),
};
(t_ctx, init_label, start_offset)
(init_label, start_offset)
}
/// Clean up and finalize the program, resolving any remaining labels