# Copyright (C) 2022 The Psycopg Team
import re
+from enum import Enum
from typing import Any, Optional, Union, TYPE_CHECKING
from . import errors as e
from .abc import AdaptContext
-from .postgres import adapters as pg_adapters
-from ._adapters_map import AdaptersMap
+from .postgres import adapters as pg_adapters, TEXT_OID
from .conninfo import ConnectionInfo
+from ._adapters_map import AdaptersMap
+from .types.enum import EnumDumper, EnumBinaryDumper
adapters = AdaptersMap(pg_adapters)
return int(m.group(1)) * 10000 + int(m.group(2)) * 100 + int(m.group(3))
+class CrdbEnumDumper(EnumDumper):
+ oid = TEXT_OID
+
+
+class CrdbEnumBinaryDumper(EnumBinaryDumper):
+ oid = TEXT_OID
+
+
def register_crdb_adapters(context: AdaptContext) -> None:
from .types import string
# Dump strings with text oid instead of unknown.
# Unlike PostgreSQL, CRDB seems able to cast text to most types.
adapters.register_dumper(str, string.StrDumper)
+ adapters.register_dumper(Enum, CrdbEnumBinaryDumper)
+ adapters.register_dumper(Enum, CrdbEnumDumper)
register_crdb_adapters(adapters)
from psycopg.types import TypeInfo
from psycopg.types.enum import EnumInfo, register_enum
+from ..fix_crdb import crdb_encoding
+
class PureTestEnum(Enum):
FOO = auto()
enum_cases = [PureTestEnum, StrTestEnum, IntTestEnum]
-encodings = ["utf8", "latin1"]
+encodings = ["utf8", crdb_encoding("latin1")]
@pytest.fixture(scope="session", autouse=True)
conn.execute(
sql.SQL(
"""
- drop type if exists {name} cascade;
+ drop type if exists {name};
create type {name} as enum ({labels});
"""
).format(name=sql.Identifier(name), labels=sql.SQL(",").join(labels))
assert cur.fetchone()[0] == enum[label]
+@pytest.mark.crdb("skip", reason="encoding")
@pytest.mark.parametrize("enum", enum_cases)
@pytest.mark.parametrize("fmt_in", PyFormat)
@pytest.mark.parametrize("fmt_out", pq.Format)
assert cur.fetchone()[0] == item
+@pytest.mark.crdb("skip", reason="encoding")
@pytest.mark.parametrize("enum", enum_cases)
@pytest.mark.parametrize("fmt_in", PyFormat)
@pytest.mark.parametrize("fmt_out", pq.Format)