From a6f4b40f8ca6e1aa4109b1b79da0233cc4ed74b9 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sat, 26 Dec 2020 19:07:38 +0100 Subject: [PATCH] Added guard for negative numbers in load_row Also added a reminder to review the C implementation for performance. --- psycopg3/psycopg3/_transform.py | 2 +- psycopg3_c/psycopg3_c/transform.pyx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/psycopg3/psycopg3/_transform.py b/psycopg3/psycopg3/_transform.py index 55e6c187c..6e1ce6f6f 100644 --- a/psycopg3/psycopg3/_transform.py +++ b/psycopg3/psycopg3/_transform.py @@ -131,7 +131,7 @@ class Transformer(AdaptContext): if not res: return None - if row >= self._ntuples: + if not 0 <= row < self._ntuples: return None rv: List[Any] = [None] * self._nfields diff --git a/psycopg3_c/psycopg3_c/transform.pyx b/psycopg3_c/psycopg3_c/transform.pyx index d1947edcd..e0b4b7d38 100644 --- a/psycopg3_c/psycopg3_c/transform.pyx +++ b/psycopg3_c/psycopg3_c/transform.pyx @@ -151,7 +151,7 @@ cdef class Transformer: return None cdef int crow = row - if crow >= self._ntuples: + if not 0 <= crow < self._ntuples: return None cdef libpq.PGresult *res = self._pgresult.pgresult_ptr @@ -170,6 +170,9 @@ cdef class Transformer: continue val = libpq.PQgetvalue(res, crow, col) + # TODO: the is some visible python churn around this lookup. + # replace with a C array of borrowed references pointing to + # the cloader.cload function pointer loader = self._row_loaders[col] if loader.cloader is not None: pyval = loader.cloader.cload(val, length) -- 2.47.2