Copilot commented on code in PR #51169:
URL: https://github.com/apache/arrow/pull/51169#discussion_r4334935090


##########
cpp/src/gandiva/gdv_function_stubs.cc:
##########
@@ -204,11 +207,59 @@ CRC_FUNCTION(utf8)
 CRC_FUNCTION(binary)
 
 int32_t gdv_fn_dec_from_string(int64_t context, const char* in, int32_t 
in_length,
-                               int32_t* precision_from_str, int32_t* 
scale_from_str,
-                               int64_t* dec_high_from_str, uint64_t* 
dec_low_from_str) {
+                               int32_t out_scale, int32_t* precision_from_str,
+                               int32_t* scale_from_str, int64_t* 
dec_high_from_str,
+                               uint64_t* dec_low_from_str) {
   arrow::Decimal128 dec;
-  auto status = arrow::Decimal128::FromString(std::string(in, in_length), &dec,
-                                              precision_from_str, 
scale_from_str);
+  const std::string_view input(in, in_length);
+  auto status =
+      arrow::Decimal128::FromString(input, &dec, precision_from_str, 
scale_from_str);
+  if (!status.ok() ||
+      static_cast<int64_t>(*scale_from_str) - out_scale > 
arrow::Decimal128::kMaxScale) {
+    arrow::internal::DecimalComponents components;
+    int32_t input_scale = 0;
+    if (arrow::internal::ParseDecimalComponents(input.data(), input.size(),
+                                                &components) &&
+        !arrow::internal::SubtractWithOverflow(
+            static_cast<int32_t>(components.fractional_digits.size()),
+            components.exponent, &input_scale) &&
+        input_scale > out_scale) {
+      std::string digits(components.whole_digits);
+      digits.append(components.fractional_digits);
+      digits.erase(0, digits.find_first_not_of('0'));

Review Comment:
   When the input is an exactly-zero value with more fractional digits than 
`out_scale` (for example, `0.` followed by 100 zeros cast to DECIMAL(38,0)), 
`find_first_not_of` returns `npos`. Calling `erase(0, npos)` throws 
`std::out_of_range`, so the Gandiva projector can abort instead of returning 
zero. Handle the all-zero case explicitly before erasing leading zeros.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to