]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Fixed registration scope of composite array adapters
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 8 Apr 2020 09:55:37 +0000 (21:55 +1200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 8 Apr 2020 09:55:37 +0000 (21:55 +1200)
psycopg3/types/composite.py
tests/types/test_composite.py

index a40498cba05855e79b7eef4fc97fd522660afaa2..f5d67db6f559ddd5f39f4b94231f0f05a516752b 100644 (file)
@@ -86,7 +86,9 @@ def register(
     )
 
     if info.array_oid:
-        register_array(info.array_oid, info.oid)
+        register_array(
+            info.array_oid, info.oid, context=context, name=info.name
+        )
 
 
 _type_info_query = """\
index cf04e38e759d6cf6ccae393243940e7ebfc03a60..32e3248e4937705dfc2b69fdb1cda9dd846a631d 100644 (file)
@@ -1,8 +1,7 @@
 import pytest
 
-from psycopg3.adapt import Format
-from psycopg3.types import builtins
-from psycopg3.types import composite
+from psycopg3.adapt import Format, TypeCaster
+from psycopg3.types import builtins, composite
 
 
 @pytest.mark.parametrize(
@@ -105,7 +104,7 @@ def test_fetch_info(conn, testcomp):
 def test_cast_composite(conn, testcomp, fmt_out):
     cur = conn.cursor(binary=fmt_out == Format.BINARY)
     info = composite.fetch_info(conn, "testcomp")
-    composite.register(info)
+    composite.register(info, conn)
 
     res = cur.execute("select row('hello', 10, 20)::testcomp").fetchone()[0]
     assert res.foo == "hello"
@@ -130,7 +129,7 @@ def test_cast_composite_factory(conn, testcomp, fmt_out):
         def __init__(self, *args):
             self.foo, self.bar, self.baz = args
 
-    composite.register(info, factory=MyThing)
+    composite.register(info, conn, factory=MyThing)
 
     res = cur.execute("select row('hello', 10, 20)::testcomp").fetchone()[0]
     assert isinstance(res, MyThing)
@@ -143,3 +142,28 @@ def test_cast_composite_factory(conn, testcomp, fmt_out):
     assert len(res) == 1
     assert res[0].baz == 30.0
     assert isinstance(res[0].baz, float)
+
+
+def test_register_scope(conn):
+    info = composite.fetch_info(conn, "testcomp")
+
+    composite.register(info)
+    for fmt in (Format.TEXT, Format.BINARY):
+        for oid in (info.oid, info.array_oid):
+            assert TypeCaster.globals.pop((oid, fmt))
+
+    cur = conn.cursor()
+    composite.register(info, cur)
+    for fmt in (Format.TEXT, Format.BINARY):
+        for oid in (info.oid, info.array_oid):
+            key = oid, fmt
+            assert key not in TypeCaster.globals
+            assert key not in conn.casters
+            assert key in cur.casters
+
+    composite.register(info, conn)
+    for fmt in (Format.TEXT, Format.BINARY):
+        for oid in (info.oid, info.array_oid):
+            key = oid, fmt
+            assert key not in TypeCaster.globals
+            assert key in conn.casters