mirror of
https://github.com/aljazceru/turso.git
synced 2026-01-23 01:44:33 +01:00
only emit affinity check on index seek + check if affinity is necessary at all
This commit is contained in:
@@ -27,6 +27,7 @@ use crate::{
|
||||
},
|
||||
types::SeekOp,
|
||||
vdbe::{
|
||||
affinity,
|
||||
builder::{CursorKey, CursorType, ProgramBuilder},
|
||||
insn::{CmpInsFlags, IdxInsertFlags, Insn},
|
||||
BranchOffset, CursorID,
|
||||
@@ -1376,14 +1377,23 @@ fn emit_seek(
|
||||
}
|
||||
let num_regs = seek_def.size(&seek_def.start);
|
||||
|
||||
program.emit_insn(Insn::Affinity {
|
||||
start_reg,
|
||||
count: std::num::NonZeroUsize::new(num_regs).unwrap(),
|
||||
affinities: seek_def
|
||||
if is_index {
|
||||
let affinities: String = seek_def
|
||||
.iter_affinity(&seek_def.start)
|
||||
.map(|affinity| affinity.aff_mask())
|
||||
.collect(),
|
||||
});
|
||||
.collect();
|
||||
if affinities.chars().any(|c| c != affinity::SQLITE_AFF_NONE) {
|
||||
program.emit_insn(Insn::Affinity {
|
||||
start_reg,
|
||||
count: std::num::NonZeroUsize::new(num_regs).unwrap(),
|
||||
affinities: seek_def
|
||||
.iter_affinity(&seek_def.start)
|
||||
.map(|affinity| affinity.aff_mask())
|
||||
.collect(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
match seek_def.start.op {
|
||||
SeekOp::GE { eq_only } => program.emit_insn(Insn::SeekGE {
|
||||
is_index,
|
||||
|
||||
@@ -83,9 +83,16 @@ impl Constraint {
|
||||
if op.is_comparison() {
|
||||
affinity = comparison_affinity(lhs, rhs, referenced_tables);
|
||||
}
|
||||
|
||||
if side == BinaryExprSide::Lhs {
|
||||
if affinity.expr_needs_no_affinity_change(lhs) {
|
||||
affinity = Affinity::Blob;
|
||||
}
|
||||
(self.operator, lhs.clone(), affinity)
|
||||
} else {
|
||||
if affinity.expr_needs_no_affinity_change(rhs) {
|
||||
affinity = Affinity::Blob;
|
||||
}
|
||||
(self.operator, rhs.clone(), affinity)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user