From 7e8414888378d04f102e5d4269356188f1bb6e9c Mon Sep 17 00:00:00 2001 From: rajajisai Date: Fri, 1 Aug 2025 10:10:02 -0700 Subject: [PATCH 1/4] Fix integer overflow check in number parser --- core/vdbe/execute.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 4d0a55231..8c1e839d0 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -7921,11 +7921,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 From 30c059483e0584de14f077e71c85980e9c325fc1 Mon Sep 17 00:00:00 2001 From: rajajisai Date: Fri, 1 Aug 2025 10:49:40 -0700 Subject: [PATCH 2/4] Parse value as float if it cannot be parsed as integer(when the value cannot fit in i64) --- core/vdbe/execute.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 8c1e839d0..96b5b767c 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -8020,7 +8020,13 @@ 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 { + } 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 } } From d09dd4170b7bb60f7a0dff67994f5446ae4a832c Mon Sep 17 00:00:00 2001 From: rajajisai Date: Fri, 1 Aug 2025 11:59:57 -0700 Subject: [PATCH 3/4] Format code --- core/vdbe/execute.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 96b5b767c..fa784de1b 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -8026,7 +8026,7 @@ pub fn apply_numeric_affinity(register: &mut Register, try_for_int: bool) -> boo apply_integer_affinity(register); } true - }else{ + } else { false } } From d2d7adff9e7010625c9de53549674f97c4e736a5 Mon Sep 17 00:00:00 2001 From: rajajisai Date: Fri, 1 Aug 2025 16:30:32 -0700 Subject: [PATCH 4/4] Including test for parsing large numeric strings as number when an operand is numerican when doing logical comparision --- testing/scalar-functions.test | 9 +++++++++ 1 file changed, 9 insertions(+) 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('');