from enum import Enum
from typing import Type, Any, Dict, Generic, Optional, TypeVar, cast
-from ..adapt import Dumper, Loader
from .. import postgres
-from .._encodings import pgconn_encoding
-from .._typeinfo import EnumInfo as EnumInfo # exported here
-from ..abc import AdaptContext
-from ..adapt import Buffer
+from .. import errors as e
from ..pq import Format
+from ..abc import AdaptContext
+from ..adapt import Buffer, Dumper, Loader
+from .._typeinfo import EnumInfo as EnumInfo # exported here
+from .._encodings import pgconn_encoding
E = TypeVar("E", bound=Enum)
else:
label = data.decode(self._encoding)
- return self.enum[label]
+ try:
+ return self.enum[label]
+ except KeyError:
+ raise e.DataError(
+ f"bad memeber for enum {self.enum.__qualname__}: {label!r}"
+ )
class EnumBinaryLoader(EnumLoader[E]):
import pytest
-from psycopg import pq, sql
+from psycopg import pq, sql, errors as e
from psycopg.adapt import PyFormat
from psycopg.types import TypeInfo
from psycopg.types.enum import EnumInfo, register_enum
cur = await cur.execute(f"select %{fmt_in}", [list(enum)])
assert (await cur.fetchone())[0] == list(enum)
+
+
+@pytest.mark.parametrize("fmt_in", PyFormat)
+@pytest.mark.parametrize("fmt_out", pq.Format)
+def test_enum_error(conn, fmt_in, fmt_out):
+ conn.autocommit = True
+
+ info = EnumInfo.fetch(conn, "puretestenum")
+ register_enum(info, conn, StrTestEnum)
+
+ with pytest.raises(e.DataError):
+ conn.execute("select %s::text", [StrTestEnum.ONE]).fetchone()
+ with pytest.raises(e.DataError):
+ conn.execute("select 'BAR'::puretestenum").fetchone()