mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-05 01:04:22 +01:00
```bash
Prepare `SELECT 1`/Limbo/SELECT 1
time: [765.94 ns 768.26 ns 771.03 ns]
change: [-7.8340% -7.4887% -7.1406%] (p = 0.00 < 0.05)
Performance has improved.
Prepare `SELECT * FROM users LIMIT 1`/Limbo/SELECT * FROM users LIMIT 1
time: [1.5673 µs 1.5699 µs 1.5731 µs]
change: [-10.810% -9.7122% -8.4951%] (p = 0.00 < 0.05)
Performance has improved.
Prepare `SELECT first_name, count(1) FROM users GROUP BY first_name HAVING count(1) > 1 ORDER BY cou...
time: [4.1331 µs 4.1421 µs 4.1513 µs]
change: [-9.3157% -9.0255% -8.7372%] (p = 0.00 < 0.05)
Performance has improved.
```
flamegraph for prepare `SELECT 1`:
<img width="1718" alt="Screenshot 2025-02-03 at 10 34 14"
src="https://github.com/user-
attachments/assets/ba67fe2f-78b2-4796-9a09-837d8e79fe62" />
Closes #872
63 lines
1.9 KiB
Rust
63 lines
1.9 KiB
Rust
use crate::schema::Table;
|
|
use crate::translate::emitter::emit_program;
|
|
use crate::translate::optimizer::optimize_plan;
|
|
use crate::translate::plan::{DeletePlan, Operation, Plan};
|
|
use crate::translate::planner::{parse_limit, parse_where};
|
|
use crate::vdbe::builder::ProgramBuilder;
|
|
use crate::{schema::Schema, Result, SymbolTable};
|
|
use sqlite3_parser::ast::{Expr, Limit, QualifiedName};
|
|
|
|
use super::plan::TableReference;
|
|
|
|
pub fn translate_delete(
|
|
program: &mut ProgramBuilder,
|
|
schema: &Schema,
|
|
tbl_name: &QualifiedName,
|
|
where_clause: Option<Expr>,
|
|
limit: Option<Box<Limit>>,
|
|
syms: &SymbolTable,
|
|
) -> Result<()> {
|
|
let mut delete_plan = prepare_delete_plan(schema, tbl_name, where_clause, limit)?;
|
|
optimize_plan(&mut delete_plan, schema)?;
|
|
emit_program(program, delete_plan, syms)
|
|
}
|
|
|
|
pub fn prepare_delete_plan(
|
|
schema: &Schema,
|
|
tbl_name: &QualifiedName,
|
|
where_clause: Option<Expr>,
|
|
limit: Option<Box<Limit>>,
|
|
) -> Result<Plan> {
|
|
let table = match schema.get_table(tbl_name.name.0.as_str()) {
|
|
Some(table) => table,
|
|
None => crate::bail_corrupt_error!("Parse error: no such table: {}", tbl_name),
|
|
};
|
|
|
|
let table_references = vec![TableReference {
|
|
table: Table::BTree(table.clone()),
|
|
identifier: table.name.clone(),
|
|
op: Operation::Scan { iter_dir: None },
|
|
join_info: None,
|
|
}];
|
|
|
|
let mut where_predicates = vec![];
|
|
|
|
// Parse the WHERE clause
|
|
parse_where(where_clause, &table_references, None, &mut where_predicates)?;
|
|
|
|
// Parse the LIMIT/OFFSET clause
|
|
let (resolved_limit, resolved_offset) = limit.map_or(Ok((None, None)), |l| parse_limit(*l))?;
|
|
|
|
let plan = DeletePlan {
|
|
table_references,
|
|
result_columns: vec![],
|
|
where_clause: where_predicates,
|
|
order_by: None,
|
|
limit: resolved_limit,
|
|
offset: resolved_offset,
|
|
contains_constant_false_condition: false,
|
|
};
|
|
|
|
Ok(Plan::Delete(plan))
|
|
}
|