From a6a92d6de39b3359604202388d6d4e3983ecd142 Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Sun, 16 Feb 2025 19:58:11 +0200 Subject: [PATCH] Fix incorrect implementation of cast_text_to_numerical() --- core/vdbe/insn.rs | 12 +++++------- core/vdbe/mod.rs | 12 ++++-------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/core/vdbe/insn.rs b/core/vdbe/insn.rs index 50f573671..5cfc17216 100644 --- a/core/vdbe/insn.rs +++ b/core/vdbe/insn.rs @@ -1,6 +1,6 @@ use std::num::NonZero; -use super::{AggFunc, BranchOffset, CursorID, FuncCtx, PageIdx}; +use super::{cast_text_to_integer, AggFunc, BranchOffset, CursorID, FuncCtx, PageIdx}; use crate::storage::wal::CheckpointMode; use crate::types::{OwnedValue, Record}; use crate::vdbe::cast_text_to_real; @@ -689,13 +689,11 @@ pub enum Cookie { UserVersion = 6, } -fn cast_text_to_numerical(value: &str) -> OwnedValue { - if let Ok(x) = value.parse::() { - OwnedValue::Integer(x) - } else if let Ok(x) = value.parse::() { - OwnedValue::Float(x) +pub fn cast_text_to_numerical(value: &str) -> OwnedValue { + if value.contains('.') || value.contains('e') || value.contains('E') { + cast_text_to_real(value) } else { - OwnedValue::Integer(0) + cast_text_to_integer(value) } } diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index ac9f5f00f..eacb37632 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -53,9 +53,9 @@ use crate::{ }; use crate::{resolve_ext_path, Connection, Result, TransactionState, DATABASE_VERSION}; use insn::{ - exec_add, exec_and, exec_bit_and, exec_bit_not, exec_bit_or, exec_boolean_not, exec_concat, - exec_divide, exec_multiply, exec_or, exec_remainder, exec_shift_left, exec_shift_right, - exec_subtract, Cookie, + cast_text_to_numerical, exec_add, exec_and, exec_bit_and, exec_bit_not, exec_bit_or, + exec_boolean_not, exec_concat, exec_divide, exec_multiply, exec_or, exec_remainder, + exec_shift_left, exec_shift_right, exec_subtract, Cookie, }; use likeop::{construct_like_escape_arg, exec_glob, exec_like_with_escape}; use rand::distributions::{Distribution, Uniform}; @@ -3583,11 +3583,7 @@ fn exec_cast(value: &OwnedValue, datatype: &str) -> OwnedValue { OwnedValue::Text(t) => { let text = t.as_str(); // Looks like a float - if text.contains('.') || text.contains('e') || text.contains('E') { - cast_text_to_real(text) - } else { - cast_text_to_integer(text) - } + cast_text_to_numerical(text) } OwnedValue::Integer(i) => OwnedValue::Integer(*i), OwnedValue::Float(f) => OwnedValue::Float(*f),