]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
resort back to col-row iteration
authorJörg Breitbart <jerch@rockborn.de>
Tue, 9 Sep 2025 17:08:32 +0000 (19:08 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sat, 13 Sep 2025 18:10:43 +0000 (20:10 +0200)
psycopg_c/psycopg_c/_psycopg/transform.pyx

index f699fdc6218b9d47f2c6de3dd0145d8cc26cb3fd..78b1579e4a493f827d896b7da7b00026c8f8aa8e 100644 (file)
@@ -441,50 +441,36 @@ cdef class Transformer:
         cdef object record  # not 'tuple' as it would check on assignment
 
         cdef object records = PyList_New(row1 - row0)
-        for row in range(row0, row1):
-            record = PyTuple_New(self._nfields)
-            Py_INCREF(record)
-            PyList_SET_ITEM(records, row - row0, record)
 
         cdef PyObject *loader  # borrowed RowLoader
-        cdef PyObject *brecord  # borrowed
+        cdef tuple brecord
         row_loaders = self._row_loaders  # avoid an incref/decref per item
 
-        for col in range(self._nfields):
-            loader = PyList_GET_ITEM(row_loaders, col)
-            if (<RowLoader>loader).cloader is not None:
-                for row in range(row0, row1):
-                    brecord = PyList_GET_ITEM(records, row - row0)
-                    attval = &(ires.tuples[row][col])
-                    if attval.len == -1:  # NULL_LEN
-                        pyval = None
-                    else:
-                        pyval = (<RowLoader>loader).cloader.cload(
-                            attval.value, attval.len)
-
-                    Py_INCREF(pyval)
-                    PyTuple_SET_ITEM(<object>brecord, col, pyval)
-
-            else:
-                for row in range(row0, row1):
-                    brecord = PyList_GET_ITEM(records, row - row0)
-                    attval = &(ires.tuples[row][col])
-                    if attval.len == -1:  # NULL_LEN
-                        pyval = None
-                    else:
-                        b = PyMemoryView_FromObject(
-                            ViewBuffer._from_buffer(
-                                self._pgresult,
-                                <unsigned char *>attval.value, attval.len))
-                        pyval = PyObject_CallFunctionObjArgs(
-                            (<RowLoader>loader).loadfunc, <PyObject *>b, NULL)
-
-                    Py_INCREF(pyval)
-                    PyTuple_SET_ITEM(<object>brecord, col, pyval)
+        for row in range(row0, row1):
+            brecord = PyTuple_New(self._nfields)
+            for col in range(self._nfields):
+                loader = PyList_GET_ITEM(row_loaders, col)
+                attval = &(ires.tuples[row][col])
+                if attval.len == -1:  # NULL_LEN
+                    pyval = None
+                elif (<RowLoader>loader).cloader is not None:
+                    pyval = (<RowLoader>loader).cloader.cload(
+                        attval.value, attval.len)
+                else:
+                    b = PyMemoryView_FromObject(
+                        ViewBuffer._from_buffer(
+                            self._pgresult,
+                            <unsigned char *>attval.value, attval.len))
+                    pyval = PyObject_CallFunctionObjArgs(
+                        (<RowLoader>loader).loadfunc, <PyObject *>b, NULL)
+                Py_INCREF(pyval)
+                PyTuple_SET_ITEM(<object>brecord, col, pyval)
+            Py_INCREF(brecord)
+            PyList_SET_ITEM(records, row - row0, brecord)
 
         if make_row is not tuple:
             for i in range(row1 - row0):
-                brecord = PyList_GET_ITEM(records, i)
+                brecord = <tuple>PyList_GET_ITEM(records, i)
                 record = PyObject_CallFunctionObjArgs(
                     make_row, <PyObject *>brecord, NULL)
                 Py_INCREF(record)