From 32535ef4ed56a8841471579341abd3f19399fc6d Mon Sep 17 00:00:00 2001 From: pedrocarlo Date: Thu, 6 Nov 2025 17:30:15 -0300 Subject: [PATCH] only emit affinity check on index seek + check if affinity is necessary at all --- core/translate/main_loop.rs | 22 ++++++++++++++++------ core/translate/optimizer/constraints.rs | 7 +++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/core/translate/main_loop.rs b/core/translate/main_loop.rs index fd943a18f..14424ea7f 100644 --- a/core/translate/main_loop.rs +++ b/core/translate/main_loop.rs @@ -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, diff --git a/core/translate/optimizer/constraints.rs b/core/translate/optimizer/constraints.rs index 80afeac68..4e6b6bbd0 100644 --- a/core/translate/optimizer/constraints.rs +++ b/core/translate/optimizer/constraints.rs @@ -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) } }