# Copyright (C) 2020 The Psycopg Team
-from typing import Any, Callable, Dict, Optional, Sequence, Type
+from typing import Any, Callable, Dict, Optional, Sequence, Tuple, Type, Union
from psycopg3.pq.proto import PGresult
from psycopg3.pq.enums import DiagnosticField
def diag(self) -> "Diagnostic":
return Diagnostic(self.pgresult, encoding=self._encoding)
+ def __reduce__(self) -> Union[str, Tuple[Any, ...]]:
+ res = super().__reduce__()
+ if isinstance(res, tuple) and len(res) >= 3:
+ res[2]['pgresult'] = None
+
+ return res
+
class InterfaceError(Error):
"""
conn.close()
assert conn.closed
assert conn.status == conn.ConnStatus.BAD
+
+ cur = conn.cursor()
+
conn.close()
assert conn.closed
assert conn.status == conn.ConnStatus.BAD
+ with pytest.raises(psycopg3.InterfaceError):
+ cur.execute("select 1")
+
def test_weakref(dsn):
conn = psycopg3.connect(dsn)
await aconn.close()
assert aconn.closed
assert aconn.status == aconn.ConnStatus.BAD
+
+ cur = aconn.cursor()
+
await aconn.close()
assert aconn.closed
assert aconn.status == aconn.ConnStatus.BAD
+ with pytest.raises(psycopg3.InterfaceError):
+ await cur.execute("select 1")
+
async def test_weakref(dsn):
conn = await psycopg3.AsyncConnection.connect(dsn)
+import pickle
+
import pytest
+
from psycopg3 import pq
from psycopg3 import errors as e
with pytest.raises(KeyError):
e.lookup("XXXXX")
+
+
+def test_error_pickle(conn):
+ cur = conn.cursor()
+ with pytest.raises(e.DatabaseError) as excinfo:
+ cur.execute("select 1 from wat")
+
+ exc = pickle.loads(pickle.dumps(excinfo.value))
+ assert isinstance(exc, e.UndefinedTable)
+ assert exc.pgresult is None