]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix(py): dumping non-None values when no NoneType dumper registered
authorDylan Young <dylanyoungmeijer@gmail.com>
Fri, 12 Jun 2026 04:57:07 +0000 (01:57 -0300)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 28 Jun 2026 09:20:26 +0000 (11:20 +0200)
- in pure python implementation (c was already correct)

psycopg/psycopg/_py_transformer.py

index 41ffbbc5b73437676a26e2d97452216214754d80..65426b20f5fb731359173d31c255b09bfd20f430 100644 (file)
@@ -65,6 +65,7 @@ class Transformer(AdaptContext):
 
     def __init__(self, context: AdaptContext | None = None):
         self._pgresult = self.types = self.formats = None
+        self._none_oid = -1
 
         # WARNING: don't store context, or you'll create a loop with the Cursor
         if context:
@@ -187,12 +188,16 @@ class Transformer(AdaptContext):
                     out[i] = self._row_dumpers[i].dump(param)
             return out
 
-        types = [self._get_none_oid()] * nparams
+        types = [-1] * nparams
         pqformats = [TEXT] * nparams
 
         for i in range(nparams):
             if (param := params[i]) is None:
+                if self._none_oid < 0:
+                    self._none_oid = self._get_none_oid()
+                types[i] = self._none_oid
                 continue
+
             dumper = self.get_dumper(param, formats[i])
             out[i] = dumper.dump(param)
             types[i] = dumper.oid
@@ -267,17 +272,10 @@ class Transformer(AdaptContext):
 
     def _get_none_oid(self) -> int:
         try:
-            return self._none_oid
-        except AttributeError:
-            pass
-
-        try:
-            rv = self._none_oid = self._adapters.get_dumper(NoneType, PY_TEXT).oid
+            return self._adapters.get_dumper(NoneType, PY_TEXT).oid
         except KeyError:
             raise e.InterfaceError("None dumper not found")
 
-        return rv
-
     def get_dumper_by_oid(self, oid: int, format: pq.Format) -> abc.Dumper:
         """
         Return a Dumper to dump an object to the type with given oid.