Skip to content

Commit 97e9fef

Browse files
committed
Fixed memory leak with register_vector and register_vector_async for Psycopg 3 - fixes #168
1 parent b5d9b70 commit 97e9fef

5 files changed

Lines changed: 53 additions & 8 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## 0.5.2 (unreleased)
22

3+
- Fixed memory leak with `register_vector` and `register_vector_async` for Psycopg 3
34
- Fixed error with `Bit` constructor and empty strings
45
- Fixed equality for `HalfVector` with signed zeros
56

‎pgvector/psycopg/bit.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from functools import cache
12
from psycopg import BaseConnection
23
from psycopg.abc import Buffer
34
from psycopg.adapt import Dumper
@@ -26,9 +27,19 @@ def register_bit_info(context: BaseConnection[Any], info: TypeInfo | None, /) ->
2627
info.register(context)
2728

2829
# add oid to anonymous class for set_types
29-
text_dumper = type('', (BitDumper,), {'oid': info.oid})
30-
binary_dumper = type('', (BitBinaryDumper,), {'oid': info.oid})
30+
text_dumper = bit_text_dumper(info.oid)
31+
binary_dumper = bit_binary_dumper(info.oid)
3132

3233
adapters = context.adapters
3334
adapters.register_dumper(Bit, text_dumper)
3435
adapters.register_dumper(Bit, binary_dumper)
36+
37+
38+
@cache
39+
def bit_text_dumper(oid: int):
40+
return type('', (BitDumper,), {'oid': oid})
41+
42+
43+
@cache
44+
def bit_binary_dumper(oid: int):
45+
return type('', (BitBinaryDumper,), {'oid': oid})

‎pgvector/psycopg/halfvec.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from functools import cache
12
from psycopg import BaseConnection
23
from psycopg.abc import Buffer
34
from psycopg.adapt import Loader, Dumper
@@ -41,11 +42,21 @@ def register_halfvec_info(context: BaseConnection[Any], info: TypeInfo, /) -> No
4142
info.register(context)
4243

4344
# add oid to anonymous class for set_types
44-
text_dumper = type('', (HalfVectorDumper,), {'oid': info.oid})
45-
binary_dumper = type('', (HalfVectorBinaryDumper,), {'oid': info.oid})
45+
text_dumper = halfvec_text_dumper(info.oid)
46+
binary_dumper = halfvec_binary_dumper(info.oid)
4647

4748
adapters = context.adapters
4849
adapters.register_dumper(HalfVector, text_dumper)
4950
adapters.register_dumper(HalfVector, binary_dumper)
5051
adapters.register_loader(info.oid, HalfVectorLoader)
5152
adapters.register_loader(info.oid, HalfVectorBinaryLoader)
53+
54+
55+
@cache
56+
def halfvec_text_dumper(oid: int):
57+
return type('', (HalfVectorDumper,), {'oid': oid})
58+
59+
60+
@cache
61+
def halfvec_binary_dumper(oid: int):
62+
return type('', (HalfVectorBinaryDumper,), {'oid': oid})

‎pgvector/psycopg/sparsevec.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from functools import cache
12
from psycopg import BaseConnection
23
from psycopg.abc import Buffer
34
from psycopg.adapt import Loader, Dumper
@@ -41,11 +42,21 @@ def register_sparsevec_info(context: BaseConnection[Any], info: TypeInfo, /) ->
4142
info.register(context)
4243

4344
# add oid to anonymous class for set_types
44-
text_dumper = type('', (SparseVectorDumper,), {'oid': info.oid})
45-
binary_dumper = type('', (SparseVectorBinaryDumper,), {'oid': info.oid})
45+
text_dumper = sparsevec_text_dumper(info.oid)
46+
binary_dumper = sparsevec_binary_dumper(info.oid)
4647

4748
adapters = context.adapters
4849
adapters.register_dumper(SparseVector, text_dumper)
4950
adapters.register_dumper(SparseVector, binary_dumper)
5051
adapters.register_loader(info.oid, SparseVectorLoader)
5152
adapters.register_loader(info.oid, SparseVectorBinaryLoader)
53+
54+
55+
@cache
56+
def sparsevec_text_dumper(oid: int):
57+
return type('', (SparseVectorDumper,), {'oid': oid})
58+
59+
60+
@cache
61+
def sparsevec_binary_dumper(oid: int):
62+
return type('', (SparseVectorBinaryDumper,), {'oid': oid})

‎pgvector/psycopg/vector.py‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from __future__ import annotations
2+
from functools import cache
23
import psycopg
34
from psycopg import BaseConnection
45
from psycopg.abc import Buffer
@@ -50,8 +51,8 @@ def register_vector_info(context: BaseConnection[Any], info: TypeInfo | None, /)
5051
info.register(context)
5152

5253
# add oid to anonymous class for set_types
53-
text_dumper = type('', (VectorDumper,), {'oid': info.oid})
54-
binary_dumper = type('', (VectorBinaryDumper,), {'oid': info.oid})
54+
text_dumper = vector_text_dumper(info.oid)
55+
binary_dumper = vector_binary_dumper(info.oid)
5556

5657
adapters = context.adapters
5758
adapters.register_dumper(Vector, text_dumper)
@@ -60,3 +61,13 @@ def register_vector_info(context: BaseConnection[Any], info: TypeInfo | None, /)
6061
adapters.register_dumper('numpy.ndarray', binary_dumper)
6162
adapters.register_loader(info.oid, VectorLoader)
6263
adapters.register_loader(info.oid, VectorBinaryLoader)
64+
65+
66+
@cache
67+
def vector_text_dumper(oid: int):
68+
return type('', (VectorDumper,), {'oid': oid})
69+
70+
71+
@cache
72+
def vector_binary_dumper(oid: int):
73+
return type('', (VectorBinaryDumper,), {'oid': oid})

0 commit comments

Comments
 (0)