Arawoof06 opened a new issue, #50544:
URL: https://github.com/apache/arrow/issues/50544

   Describe the bug, including details regarding any error messages, version, 
and platform.
   
   `round_int32_int32` and `round_int64_int32` in 
`cpp/src/gandiva/precompiled/extended_math_ops.cc` negate the caller-supplied 
precision into `abs_precision` and only then apply the range check 
(`abs_precision > 9` and `abs_precision > 18` respectively).
   
   For `precision == INT32_MIN` the negation leaves the value unchanged and 
still negative, so both range checks evaluate false. The negative value is then 
passed to `get_power_of_10`, which indexes a 19-element static table guarded 
only by `DCHECK_GE`/`DCHECK_LE`. Those compile out in release builds, so the 
read lands far outside the table.
   
   Reachable from SQL as `round(int_col, -2147483648)`; both overloads are 
registered in `function_registry_arithmetic.cc`.
   
   In a debug build the DCHECK fires:
   
   ```
   extended_math_ops.cc:372:  Check failed: (exp) >= (0)
   ```
   
   In a release build there is no check and the indexed load faults or yields 
arbitrary memory as the rounding multiplier.
   
   `truncate_int64_int32` in the same file already compares the signed scale 
directly (`out_scale < -38`) and is not affected.
   
   Component(s)
   
   C++ - Gandiva


-- 
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