]> 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:02:30 +0000 (21:02 +0100)
Close #225.

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

index 1e6cd9437ecbf6541df948d64cdcc2e666907f44..c09133611fae0f3cef94cf42457de6492877603f 100644 (file)
@@ -24,6 +24,7 @@ Psycopg 3.1 (unreleased)
 Psycopg 3.0.9 (unreleased)
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+- 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