]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix windowing increment
authorJörg Breitbart <jerch@rockborn.de>
Wed, 10 Sep 2025 01:30:36 +0000 (03:30 +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 c88fcf1fab573603d0bc38d5bdfee0605ac5287d..22cab1348ebe7a5cba883aba51f54361fc2a42aa 100644 (file)
@@ -26,8 +26,15 @@ from psycopg.rows import Row, RowMaker
 from psycopg._encodings import conn_encoding
 
 
-cdef extern from "alloca.h":
-    void *alloca(Py_ssize_t size)
+cdef extern from *:
+    """
+    #ifdef _WIN32
+    #include <malloc.h>
+    #else
+    #include <alloca.h>
+    #endif
+    """
+    void* alloca(size_t size)
 
 
 NoneType = type(None)
@@ -453,17 +460,17 @@ cdef class Transformer:
         cdef int advance
         row_loaders = self._row_loaders  # avoid an incref/decref per item
 
-        while row0 < row1:
-            # TODO: make advance configurable
-            advance = 100 if row1 - row0 > 100 else row1 - row0
-            for row in range(advance):
+        cdef int window = 100
+        for pr0 in range(row0, row1, window):
+            pr1 = min(pr0 + window, row1)
+            for row in range(pr0, pr1):
                 record = PyTuple_New(self._nfields)
                 Py_INCREF(record)
                 PyList_SET_ITEM(records, row, record)
             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, row0+advance):
+                    for row in range(pr0, pr1):
                         brecord = PyList_GET_ITEM(records, row - row0)
                         attval = &(ires.tuples[row][col])
                         if attval.len == -1:  # NULL_LEN
@@ -476,7 +483,7 @@ cdef class Transformer:
                         PyTuple_SET_ITEM(<object>brecord, col, pyval)
 
                 else:
-                    for row in range(row0, row0+advance):
+                    for row in range(pr0, pr1):
                         brecord = PyList_GET_ITEM(records, row - row0)
                         attval = &(ires.tuples[row][col])
                         if attval.len == -1:  # NULL_LEN
@@ -491,7 +498,6 @@ cdef class Transformer:
 
                         Py_INCREF(pyval)
                         PyTuple_SET_ITEM(<object>brecord, col, pyval)
-            row0 += advance
 
         if make_row is not tuple:
             for i in range(rowcount):