diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 099a0825e..0ae41e388 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -8010,11 +8010,9 @@ fn create_result_from_significand( } // For pure integers without exponent, try to return as integer - if !has_decimal && !has_exponent && exponent == 0 { + if !has_decimal && !has_exponent && exponent == 0 && significand <= i64::MAX as u64 { let signed_val = (significand as i64).wrapping_mul(sign); - if (significand as i64) * sign == signed_val { - return (parse_result, ParsedNumber::Integer(signed_val)); - } + return (parse_result, ParsedNumber::Integer(signed_val)); } // Convert to float @@ -8111,6 +8109,12 @@ pub fn apply_numeric_affinity(register: &mut Register, try_for_int: bool) -> boo if let Some(int_val) = parsed_value.as_integer() { *register = Register::Value(Value::Integer(int_val)); true + } else if let Some(float_val) = parsed_value.as_float() { + *register = Register::Value(Value::Float(float_val)); + if try_for_int { + apply_integer_affinity(register); + } + true } else { false } diff --git a/testing/scalar-functions.test b/testing/scalar-functions.test index 8ab2ce2b6..9ef2f74b3 100755 --- a/testing/scalar-functions.test +++ b/testing/scalar-functions.test @@ -930,6 +930,15 @@ do_execsql_test cast-in-where { select age from users where age = cast('45' as integer) limit 1; } {45} +#Parsing test for large numeric strings in logical operations with numeric operands +do_execsql_test parse-large-integral-numeric-string-as-number { + SELECT (104614899632619 || 45597) > CAST(0 AS NUMERIC); +} {1} + +do_execsql_test parse-large-integral-numeric-string-as-number { + SELECT (-104614899632619 || 45597) > CAST(0 AS NUMERIC); +} {0} + # TODO: sqlite seems not enable soundex() by default unless build it with SQLITE_SOUNDEX enabled. # do_execsql_test soundex-text { # select soundex('Pfister'), soundex('husobee'), soundex('Tymczak'), soundex('Ashcraft'), soundex('Robert'), soundex('Rupert'), soundex('Rubin'), soundex('Kant'), soundex('Knuth'), soundex('x'), soundex('');