@@ -2348,12 +2348,7 @@ fn parse_string_to_decimal(input_str: &str, precision: u8, scale: i8) -> SparkRe
23482348 }
23492349
23502350 // validate and parse mantissa and exponent or bubble up the error
2351- let ( mantissa, exponent) = parse_decimal_str (
2352- trimmed,
2353- input_str,
2354- "STRING" ,
2355- & format ! ( "DECIMAL({},{})" , precision, scale) ,
2356- ) ?;
2351+ let ( mantissa, exponent) = parse_decimal_str ( trimmed, input_str, precision, scale) ?;
23572352
23582353 // Early return mantissa 0, Spark checks if it fits digits and throw error in ansi
23592354 if mantissa == 0 {
@@ -2429,16 +2424,20 @@ fn parse_string_to_decimal(input_str: &str, precision: u8, scale: i8) -> SparkRe
24292424 }
24302425}
24312426
2427+ fn invalid_decimal_cast ( value : & str , precision : u8 , scale : i8 ) -> SparkError {
2428+ invalid_value ( value, "STRING" , & format ! ( "DECIMAL({},{})" , precision, scale) )
2429+ }
2430+
24322431/// Parse a decimal string into mantissa and scale
24332432/// e.g., "123.45" -> (12345, 2), "-0.001" -> (-1, 3) , 0e50 -> (0,50) etc
24342433fn parse_decimal_str (
24352434 s : & str ,
24362435 original_str : & str ,
2437- from_type : & str ,
2438- to_type : & str ,
2436+ precision : u8 ,
2437+ scale : i8 ,
24392438) -> SparkResult < ( i128 , i32 ) > {
24402439 if s. is_empty ( ) {
2441- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2440+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24422441 }
24432442
24442443 let ( mantissa_str, exponent) = if let Some ( e_pos) = s. find ( |c| [ 'e' , 'E' ] . contains ( & c) ) {
@@ -2447,7 +2446,7 @@ fn parse_decimal_str(
24472446 // Parse exponent
24482447 let exp: i32 = exponent_part
24492448 . parse ( )
2450- . map_err ( |_| invalid_value ( original_str, from_type , to_type ) ) ?;
2449+ . map_err ( |_| invalid_decimal_cast ( original_str, precision , scale ) ) ?;
24512450
24522451 ( mantissa_part, exp)
24532452 } else {
@@ -2462,29 +2461,29 @@ fn parse_decimal_str(
24622461 } ;
24632462
24642463 if mantissa_str. starts_with ( '+' ) || mantissa_str. starts_with ( '-' ) {
2465- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2464+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24662465 }
24672466
24682467 let ( integral_part, fractional_part) = match mantissa_str. find ( '.' ) {
24692468 Some ( dot_pos) => {
24702469 if mantissa_str[ dot_pos + 1 ..] . contains ( '.' ) {
2471- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2470+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24722471 }
24732472 ( & mantissa_str[ ..dot_pos] , & mantissa_str[ dot_pos + 1 ..] )
24742473 }
24752474 None => ( mantissa_str, "" ) ,
24762475 } ;
24772476
24782477 if integral_part. is_empty ( ) && fractional_part. is_empty ( ) {
2479- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2478+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24802479 }
24812480
24822481 if !integral_part. is_empty ( ) && !integral_part. bytes ( ) . all ( |b| b. is_ascii_digit ( ) ) {
2483- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2482+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24842483 }
24852484
24862485 if !fractional_part. is_empty ( ) && !fractional_part. bytes ( ) . all ( |b| b. is_ascii_digit ( ) ) {
2487- return Err ( invalid_value ( original_str, from_type , to_type ) ) ;
2486+ return Err ( invalid_decimal_cast ( original_str, precision , scale ) ) ;
24882487 }
24892488
24902489 // Parse integral part
@@ -2494,7 +2493,7 @@ fn parse_decimal_str(
24942493 } else {
24952494 integral_part
24962495 . parse ( )
2497- . map_err ( |_| invalid_value ( original_str, from_type , to_type ) ) ?
2496+ . map_err ( |_| invalid_decimal_cast ( original_str, precision , scale ) ) ?
24982497 } ;
24992498
25002499 // Parse fractional part
@@ -2504,14 +2503,14 @@ fn parse_decimal_str(
25042503 } else {
25052504 fractional_part
25062505 . parse ( )
2507- . map_err ( |_| invalid_value ( original_str, from_type , to_type ) ) ?
2506+ . map_err ( |_| invalid_decimal_cast ( original_str, precision , scale ) ) ?
25082507 } ;
25092508
25102509 // Combine: value = integral * 10^fractional_scale + fractional
25112510 let mantissa = integral_value
25122511 . checked_mul ( 10_i128 . pow ( fractional_scale as u32 ) )
25132512 . and_then ( |v| v. checked_add ( fractional_value) )
2514- . ok_or_else ( || invalid_value ( original_str, from_type , to_type ) ) ?;
2513+ . ok_or_else ( || invalid_decimal_cast ( original_str, precision , scale ) ) ?;
25152514
25162515 let final_mantissa = if negative { -mantissa } else { mantissa } ;
25172516 // final scale = fractional_scale - exponent
0 commit comments