From 42e25d23ddc7283be9ff338404d149ac59a737dc Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Sun, 30 Mar 2025 22:59:59 +0300 Subject: [PATCH] Fix IdxCmp insn comparisons --- core/vdbe/mod.rs | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index ce9346c14..ccab9e5ad 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -40,8 +40,8 @@ use crate::storage::wal::CheckpointResult; use crate::storage::{btree::BTreeCursor, pager::Pager}; use crate::translate::plan::{ResultSetColumn, TableReference}; use crate::types::{ - compare_immutable, AggContext, Cursor, CursorResult, ExternalAggState, ImmutableRecord, - OwnedValue, SeekKey, SeekOp, + AggContext, Cursor, CursorResult, ExternalAggState, ImmutableRecord, OwnedValue, SeekKey, + SeekOp, }; use crate::util::{ cast_real_to_integer, cast_text_to_integer, cast_text_to_numeric, cast_text_to_real, @@ -1700,10 +1700,9 @@ impl Program { let record_from_regs = make_record(&state.registers, start_reg, num_regs); let pc = if let Some(ref idx_record) = *cursor.record() { // Compare against the same number of values - let ord = compare_immutable( - &idx_record.get_values()[..record_from_regs.len()], - &record_from_regs.get_values(), - ); + let ord = idx_record.get_values()[..record_from_regs.len()] + .partial_cmp(&record_from_regs.get_values()[..]) + .unwrap(); if ord.is_ge() { target_pc.to_offset_int() } else { @@ -1729,11 +1728,10 @@ impl Program { let record_from_regs = make_record(&state.registers, start_reg, num_regs); let pc = if let Some(ref idx_record) = *cursor.record() { // Compare against the same number of values - if idx_record.get_values()[..record_from_regs.len()] - .iter() - .zip(&record_from_regs.get_values()[..]) - .all(|(a, b)| a <= b) - { + let ord = idx_record.get_values()[..record_from_regs.len()] + .partial_cmp(&record_from_regs.get_values()[..]) + .unwrap(); + if ord.is_le() { target_pc.to_offset_int() } else { state.pc + 1 @@ -1758,11 +1756,10 @@ impl Program { let record_from_regs = make_record(&state.registers, start_reg, num_regs); let pc = if let Some(ref idx_record) = *cursor.record() { // Compare against the same number of values - if idx_record.get_values()[..record_from_regs.len()] - .iter() - .zip(&record_from_regs.get_values()[..]) - .all(|(a, b)| a > b) - { + let ord = idx_record.get_values()[..record_from_regs.len()] + .partial_cmp(&record_from_regs.get_values()[..]) + .unwrap(); + if ord.is_gt() { target_pc.to_offset_int() } else { state.pc + 1 @@ -1787,11 +1784,10 @@ impl Program { let record_from_regs = make_record(&state.registers, start_reg, num_regs); let pc = if let Some(ref idx_record) = *cursor.record() { // Compare against the same number of values - if idx_record.get_values()[..record_from_regs.len()] - .iter() - .zip(&record_from_regs.get_values()[..]) - .all(|(a, b)| a < b) - { + let ord = idx_record.get_values()[..record_from_regs.len()] + .partial_cmp(&record_from_regs.get_values()[..]) + .unwrap(); + if ord.is_lt() { target_pc.to_offset_int() } else { state.pc + 1