]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix: raise OperationalError instead of MemoryError on several operations
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 23 Dec 2022 18:04:14 +0000 (18:04 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 29 Dec 2022 04:06:02 +0000 (04:06 +0000)
Failure is related to the operation executed, not to memory not
available to store the result.

psycopg/psycopg/pq/pq_ctypes.py
psycopg_c/psycopg_c/pq/pgconn.pyx

index 8b87c19f41f313ed851786367a9495c6732a7501..204e384847567d36c2904517a2fa8f38822f5f3f 100644 (file)
@@ -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:
index 4a60530a277b9b1b655240454b80dafd8a191c62..5c5a9112909b98506a26f038cbbbafe527f1b8eb 100644 (file)
@@ -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:
                 <const char *const *>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, <int>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: