From: Daniele Varrazzo Date: Fri, 23 Dec 2022 18:04:14 +0000 (+0000) Subject: fix: raise OperationalError instead of MemoryError on several operations X-Git-Tag: pool-3.2.0~150 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=63be42aeab01cb578f152aa998c88372f8db0f62;p=thirdparty%2Fpsycopg.git fix: raise OperationalError instead of MemoryError on several operations Failure is related to the operation executed, not to memory not available to store the result. --- diff --git a/psycopg/psycopg/pq/pq_ctypes.py b/psycopg/psycopg/pq/pq_ctypes.py index 8b87c19f4..204e38484 100644 --- a/psycopg/psycopg/pq/pq_ctypes.py +++ b/psycopg/psycopg/pq/pq_ctypes.py @@ -262,7 +262,7 @@ class PGconn: self._ensure_pgconn() rv = impl.PQexec(self._pgconn_ptr, command) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"executing query failed: {error_message(self)}") return PGresult(rv) def send_query(self, command: bytes) -> None: @@ -286,7 +286,7 @@ class PGconn: self._ensure_pgconn() rv = impl.PQexecParams(*args) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"executing query failed: {error_message(self)}") return PGresult(rv) def send_query_params( @@ -427,7 +427,7 @@ class PGconn: self._ensure_pgconn() rv = impl.PQprepare(self._pgconn_ptr, name, command, nparams, atypes) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"preparing query failed: {error_message(self)}") return PGresult(rv) def exec_prepared( @@ -477,7 +477,9 @@ class PGconn: result_format, ) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError( + f"executing prepared query failed: {error_message(self)}" + ) return PGresult(rv) def describe_prepared(self, name: bytes) -> "PGresult": @@ -486,7 +488,7 @@ class PGconn: self._ensure_pgconn() rv = impl.PQdescribePrepared(self._pgconn_ptr, name) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"describe prepared failed: {error_message(self)}") return PGresult(rv) def send_describe_prepared(self, name: bytes) -> None: @@ -504,7 +506,7 @@ class PGconn: self._ensure_pgconn() rv = impl.PQdescribePortal(self._pgconn_ptr, name) if not rv: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"describe portal failed: {error_message(self)}") return PGresult(rv) def send_describe_portal(self, name: bytes) -> None: diff --git a/psycopg_c/psycopg_c/pq/pgconn.pyx b/psycopg_c/psycopg_c/pq/pgconn.pyx index 4a60530a2..5c5a91129 100644 --- a/psycopg_c/psycopg_c/pq/pgconn.pyx +++ b/psycopg_c/psycopg_c/pq/pgconn.pyx @@ -207,7 +207,7 @@ cdef class PGconn: with nogil: pgresult = libpq.PQexec(self._pgconn_ptr, command) if pgresult is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"executing query failed: {error_message(self)}") return PGresult._from_ptr(pgresult) @@ -244,7 +244,7 @@ cdef class PGconn: cvalues, clengths, cformats, result_format) _clear_query_params(ctypes, cvalues, clengths, cformats) if pgresult is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"executing query failed: {error_message(self)}") return PGresult._from_ptr(pgresult) def send_query_params( @@ -353,7 +353,7 @@ cdef class PGconn: self._pgconn_ptr, name, command, nparams, atypes) PyMem_Free(atypes) if rv is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError(f"preparing query failed: {error_message(self)}") return PGresult._from_ptr(rv) def exec_prepared( @@ -382,14 +382,18 @@ cdef class PGconn: _clear_query_params(ctypes, cvalues, clengths, cformats) if rv is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError( + f"executing prepared query failed: {error_message(self)}" + ) return PGresult._from_ptr(rv) def describe_prepared(self, const char *name) -> PGresult: _ensure_pgconn(self) cdef libpq.PGresult *rv = libpq.PQdescribePrepared(self._pgconn_ptr, name) if rv is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError( + f"describe prepared failed: {error_message(self)}" + ) return PGresult._from_ptr(rv) def send_describe_prepared(self, const char *name) -> None: @@ -404,7 +408,9 @@ cdef class PGconn: _ensure_pgconn(self) cdef libpq.PGresult *rv = libpq.PQdescribePortal(self._pgconn_ptr, name) if rv is NULL: - raise MemoryError("couldn't allocate PGresult") + raise e.OperationalError( + f"describe prepared failed: {error_message(self)}" + ) return PGresult._from_ptr(rv) def send_describe_portal(self, const char *name) -> None: