Skip to content

Commit 2624bdb

Browse files
committed
Fix handling of large type OIDs
This was partially fixed in #300 (as a fix for #279), however that fix missed the fact that OID arrays were still handled using the signed integer codec. Fixes: #316
1 parent 8c83add commit 2624bdb

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

asyncpg/protocol/codecs/array.pyx

+8-8
Original file line numberDiff line numberDiff line change
@@ -804,23 +804,23 @@ cdef _infer_array_dims(const Py_UCS4 *array_text,
804804
ndims[0] = 0
805805

806806

807-
cdef int4_encode_ex(ConnectionSettings settings, WriteBuffer buf, object obj,
808-
const void *arg):
809-
return int4_encode(settings, buf, obj)
807+
cdef uint4_encode_ex(ConnectionSettings settings, WriteBuffer buf, object obj,
808+
const void *arg):
809+
return uint4_encode(settings, buf, obj)
810810

811811

812-
cdef int4_decode_ex(ConnectionSettings settings, FastReadBuffer buf,
813-
const void *arg):
814-
return int4_decode(settings, buf)
812+
cdef uint4_decode_ex(ConnectionSettings settings, FastReadBuffer buf,
813+
const void *arg):
814+
return uint4_decode(settings, buf)
815815

816816

817817
cdef arrayoid_encode(ConnectionSettings settings, WriteBuffer buf, items):
818818
array_encode(settings, buf, items, OIDOID,
819-
<encode_func_ex>&int4_encode_ex, NULL)
819+
<encode_func_ex>&uint4_encode_ex, NULL)
820820

821821

822822
cdef arrayoid_decode(ConnectionSettings settings, FastReadBuffer buf):
823-
return array_decode(settings, buf, <decode_func_ex>&int4_decode_ex, NULL)
823+
return array_decode(settings, buf, <decode_func_ex>&uint4_decode_ex, NULL)
824824

825825

826826
cdef text_encode_ex(ConnectionSettings settings, WriteBuffer buf, object obj,

tests/test_codecs.py

+5
Original file line numberDiff line numberDiff line change
@@ -1610,6 +1610,11 @@ async def test_custom_codec_large_oid(self):
16101610
''')
16111611
self.assertEqual(oid, 2147483648)
16121612

1613+
# Test that introspection handles large OIDs
1614+
v = await self.con.fetchval('SELECT $1::test_domain_t', 10)
1615+
self.assertEqual(v, 10)
1616+
1617+
# Test that custom codec logic handles large OIDs
16131618
await self.con.set_type_codec(
16141619
'test_domain_t',
16151620
encoder=lambda v: str(v),

0 commit comments

Comments
 (0)