mirror of
https://github.com/tursodatabase/limbo.git
synced 2025-08-04 10:08:20 +00:00
push translate_ctx creation outside of prologue
This commit is contained in:
parent
fc08f786fc
commit
3090dd91fa
3 changed files with 57 additions and 39 deletions
|
@ -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()),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue