]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Set Error.sqlcode when unknown codes are received
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 11 Feb 2022 19:27:40 +0000 (20:27 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 11 Feb 2022 20:33:48 +0000 (21:33 +0100)
Close #225.

docs/news.rst
psycopg/psycopg/errors.py
tests/test_errors.py

index 1a2ae4eab8b28aebb462ee83e871084c5b84a516..790c3a3ffeeccbeb11e3231223efb217b856f539 100644 (file)
@@ -13,6 +13,7 @@ Future releases
 Psycopg 3.0.9
 ^^^^^^^^^^^^^
 
+- Set `Error.sqlstate` when an unknown code is received (:ticket:`#225`).
 - Add the `!tzdata` package as a dependency on Windows in order to handle time
   zones (:ticket:`#223`).
 
index 0e0db5204ab5270facc91f17cd5fbfc4d57ad76d..66ded14eeed0a4a4e009e304792b3cfb3966ade1 100644 (file)
@@ -59,6 +59,10 @@ class Error(Exception):
         self._info = info
         self._encoding = encoding
 
+        # Handle sqlstate codes for which we don't have a class.
+        if not self.sqlstate and info:
+            self.sqlstate = self.diag.sqlstate
+
     @property
     def diag(self) -> "Diagnostic":
         """
index aa61546aea997e1d77bf22d15ca185fb71cbdae1..5ae3b51b9d3f448052b59aee27ed5ffe6dec0c61 100644 (file)
@@ -239,3 +239,24 @@ def test_query_context(conn):
     assert exc.value.diag.message_primary in s
     assert "ERROR" not in s
     assert not s.endswith("\n")
+
+
+def test_unknown_sqlstate(conn):
+    code = "PXX99"
+    with pytest.raises(KeyError):
+        e.lookup(code)
+
+    with pytest.raises(e.ProgrammingError) as excinfo:
+        conn.execute(
+            f"""
+            do $$begin
+            raise exception 'made up code' using errcode = '{code}';
+            end$$ language plpgsql
+            """
+        )
+    exc = excinfo.value
+    assert exc.diag.sqlstate == code
+    assert exc.sqlstate == code
+    # Survives pickling too
+    pexc = pickle.loads(pickle.dumps(exc))
+    assert pexc.sqlstate == code