Skip to content

Commit 02b9eaf

Browse files
Use int64 for BOOLEAN encode/decode to match Go reference
Go's putNamedValues uses putInt64/getInt64 for boolean values. The Python implementation was using uint64, which produces identical wire bytes for 0 and 1 but diverged from the reference implementation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 65fc7a5 commit 02b9eaf

2 files changed

Lines changed: 10 additions & 10 deletions

File tree

src/dqlitewire/types.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def encode_value(value: Any, value_type: ValueType | None = None) -> tuple[bytes
191191
if value_type == ValueType.BOOLEAN:
192192
if not isinstance(value, (bool, int)):
193193
raise EncodeError(f"Expected bool or int for BOOLEAN, got {type(value).__name__}")
194-
return encode_uint64(1 if value else 0), value_type
194+
return encode_int64(1 if value else 0), value_type
195195
elif value_type in (ValueType.INTEGER, ValueType.UNIXTIME):
196196
if isinstance(value, bool):
197197
value = 1 if value else 0
@@ -247,7 +247,7 @@ def decode_value(data: bytes, value_type: ValueType) -> tuple[Any, int]:
247247
Returns (value, bytes_consumed).
248248
"""
249249
if value_type == ValueType.BOOLEAN:
250-
return bool(decode_uint64(data)), 8
250+
return bool(decode_int64(data)), 8
251251
elif value_type == ValueType.INTEGER:
252252
return decode_int64(data), 8
253253
elif value_type == ValueType.UNIXTIME:

tests/test_types.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -303,20 +303,20 @@ def test_encode_none(self) -> None:
303303
def test_encode_bool_true(self) -> None:
304304
encoded, vtype = encode_value(True)
305305
assert vtype == ValueType.BOOLEAN
306-
assert decode_uint64(encoded) == 1
306+
assert decode_int64(encoded) == 1
307307

308308
def test_encode_bool_false(self) -> None:
309309
encoded, vtype = encode_value(False)
310310
assert vtype == ValueType.BOOLEAN
311-
assert decode_uint64(encoded) == 0
311+
assert decode_int64(encoded) == 0
312312

313-
def test_boolean_uses_uint64_encoding(self) -> None:
314-
"""Go reference encodes BOOLEAN as uint64, not int64."""
313+
def test_boolean_uses_int64_encoding(self) -> None:
314+
"""Go reference encodes BOOLEAN as int64 (putInt64/getInt64)."""
315315
encoded_true, _ = encode_value(True, ValueType.BOOLEAN)
316316
encoded_false, _ = encode_value(False, ValueType.BOOLEAN)
317-
# Must be decodable as uint64 (unsigned)
318-
assert decode_uint64(encoded_true) == 1
319-
assert decode_uint64(encoded_false) == 0
317+
# Must be decodable as int64 (signed), matching Go's putInt64
318+
assert decode_int64(encoded_true) == 1
319+
assert decode_int64(encoded_false) == 0
320320

321321
def test_boolean_explicit_rejects_non_bool_non_int(self) -> None:
322322
"""encode_value with explicit BOOLEAN should reject non-bool/int types."""
@@ -335,7 +335,7 @@ def test_decode_integer(self) -> None:
335335
assert consumed == 8
336336

337337
def test_decode_boolean(self) -> None:
338-
value, consumed = decode_value(encode_uint64(1), ValueType.BOOLEAN)
338+
value, consumed = decode_value(encode_int64(1), ValueType.BOOLEAN)
339339
assert value is True
340340
assert consumed == 8
341341

0 commit comments

Comments
 (0)