[ 
https://issues.apache.org/jira/browse/TINKERPOP-3275?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18097997#comment-18097997
 ] 

ASF GitHub Bot commented on TINKERPOP-3275:
-------------------------------------------

GumpacG opened a new pull request, #3539:
URL: https://github.com/apache/tinkerpop/pull/3539

   ## Summary
   
   `gremlin-python`'s GraphBinary `BigIntIO` writer computed the byte length 
from the
   value's magnitude bit-length but encoded the bytes as signed 
two's-complement. Negative
   boundary values (e.g. `-129`, `-255`) raised `OverflowError`, and 
positive/zero values
   produced non-canonical bytes that diverge from the Java reference 
(`BigInteger.toByteArray()`).
   
   The fix computes the minimal signed two's-complement length, unifying the 
positive, negative,
   and zero paths. `BigDecimal` is fixed transitively (its unscaled value is 
serialized as a
   `BigInteger`).
   
   ## Before vs After
   
   | Value | Before | After |
   |---|---|---|
   | `BigInteger(-129)` | `OverflowError` | `00 00 00 02 ff 7f` |
   | `BigDecimal(-2.55)` (unscaled `-255`) | `OverflowError` | `00 00 00 02 ff 
01` |
   | `BigInteger(127)` | `00 00 00 02 00 7f` (non-minimal) | `00 00 00 01 7f` |
   | `BigInteger(0)` | `00 00 00 00` (Java rejects) | `00 00 00 01 00` |
   
   ## Changes
   
   - `gremlin-python/.../structure/io/graphbinaryV1.py` - rewrote 
`BigIntIO.write_bigint`.
   - `gremlin-python/.../tests/unit/io/test_graphbinaryV1.py` - added boundary 
round-trip tests
     and exact wire-byte assertions.
   
   
   Assisted-by: Kiro:claude-opus-4.8




> gremlin-python graphbinary BigInt serializer incorrect for negative boundary 
> values
> -----------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-3275
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3275
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: python
>    Affects Versions: 3.7.6, 3.8.1
>            Reporter: Ken Hu
>            Priority: Major
>
> Caveat: I haven't fully verified this, just something AI told me when I was 
> updating the "model" tests for gremlin-python. Just putting here so it can be 
> checked later.
> gremlin-python can't serialize BigInt signed boundary values like -129.
> {code:java}
>  The failure path is:
>   GraphBinaryWriter.write_object()
>   BigIntIO.dictify()
>   BigIntIO.write_bigint()
>   obj.to_bytes(length, byteorder='big', signed=True)
> {code}
> For -129, Python reports:
> (-129).bit_length() == 8
> The current writer computes:
>   length = (obj.bit_length() + 7) // 8  # 1
> But one signed byte only represents -128 through 127, so -129 needs two bytes 
> in two’s complement form. The serializer is using magnitude bit length as if 
> it were signed encoded length.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to