]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Don't register any TypeInfo on oid 0
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 23 Jul 2021 20:59:44 +0000 (22:59 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 23 Jul 2021 21:50:11 +0000 (23:50 +0200)
Someone may conceivably register info of an array only. Let's not
clobber INVALID_OID, I wouldn't know the side effects...

psycopg/psycopg/_typeinfo.py
tests/test_typeinfo.py

index fa91032299f0218a391077d72e6296aade6939af..b8db917574b9b5ab193c65056c6a91657ce2d739 100644 (file)
@@ -259,7 +259,8 @@ class TypesRegistry:
 
     def add(self, info: TypeInfo) -> None:
         self._ensure_own_state()
-        self._by_oid[info.oid] = info
+        if info.oid:
+            self._by_oid[info.oid] = info
         if info.array_oid:
             self._by_oid[info.array_oid] = info
         self._by_name[info.name] = info
index ed792c372d6f01b08fcf666a82c9b83710edca50..8a209d1289e579811d7fcbbf9a664eef58cfd07d 100644 (file)
@@ -104,3 +104,40 @@ def test_registry_by_builtin_name(conn, name):
     info = psycopg.adapters.types[name]
     assert info.name == "text"
     assert info.oid == 25
+
+
+def test_registry_empty():
+    r = psycopg.types.TypesRegistry()
+    assert r.get("text") is None
+    with pytest.raises(KeyError):
+        r["text"]
+
+
+@pytest.mark.parametrize("oid, aoid", [(1, 2), (1, 0), (0, 2), (0, 0)])
+def test_registry_invalid_oid(oid, aoid):
+    r = psycopg.types.TypesRegistry()
+    ti = psycopg.types.TypeInfo("test", oid, aoid)
+    r.add(ti)
+    assert r["test"] is ti
+    if oid:
+        assert r[oid] is ti
+    if aoid:
+        assert r[aoid] is ti
+    with pytest.raises(KeyError):
+        r[0]
+
+
+def test_registry_copy():
+    r = psycopg.types.TypesRegistry(psycopg.postgres.types)
+    assert r.get("text") is r["text"] is r[25]
+    assert r["text"].oid == 25
+
+
+def test_registry_isolated():
+    orig = psycopg.postgres.types
+    tinfo = orig["text"]
+    r = psycopg.types.TypesRegistry(orig)
+    tdummy = psycopg.types.TypeInfo("dummy", tinfo.oid, tinfo.array_oid)
+    r.add(tdummy)
+    assert r[25] is r["dummy"] is tdummy
+    assert orig[25] is r["text"] is tinfo