From 51949719d6843d2d315fa44566f8d7e34e77235c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Fri, 6 Jan 2023 14:03:12 +0000 Subject: [PATCH] feat: add _oid module to know OIDs at import time --- psycopg/psycopg/_oids.py | 96 +++++++++++++++++++++++++++ psycopg/psycopg/postgres.py | 2 +- psycopg_c/psycopg_c/_psycopg/oids.pxd | 2 +- tools/update_oids.py | 33 ++++++++- 4 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 psycopg/psycopg/_oids.py diff --git a/psycopg/psycopg/_oids.py b/psycopg/psycopg/_oids.py new file mode 100644 index 000000000..f8aeeaa39 --- /dev/null +++ b/psycopg/psycopg/_oids.py @@ -0,0 +1,96 @@ +""" +PostgreSQL known type OIDs + +This is an internal module. Types are publicly exposed by +`psycopg.postgres.types`. This module is only used to know the OIDs at import +time and avoid circular import problems. +""" + +# Copyright (C) 2020 The Psycopg Team + +# A couple of special cases used a bit everywhere. +INVALID_OID = 0 +TEXT_ARRAY_OID = 1009 + +# Use tools/update_oids.py to update this data. +# autogenerated: start + +# Generated from PostgreSQL 15.1 + +ACLITEM_OID = 1033 +BIT_OID = 1560 +BOOL_OID = 16 +BOX_OID = 603 +BPCHAR_OID = 1042 +BYTEA_OID = 17 +CHAR_OID = 18 +CID_OID = 29 +CIDR_OID = 650 +CIRCLE_OID = 718 +DATE_OID = 1082 +DATEMULTIRANGE_OID = 4535 +DATERANGE_OID = 3912 +FLOAT4_OID = 700 +FLOAT8_OID = 701 +GTSVECTOR_OID = 3642 +INET_OID = 869 +INT2_OID = 21 +INT2VECTOR_OID = 22 +INT4_OID = 23 +INT4MULTIRANGE_OID = 4451 +INT4RANGE_OID = 3904 +INT8_OID = 20 +INT8MULTIRANGE_OID = 4536 +INT8RANGE_OID = 3926 +INTERVAL_OID = 1186 +JSON_OID = 114 +JSONB_OID = 3802 +JSONPATH_OID = 4072 +LINE_OID = 628 +LSEG_OID = 601 +MACADDR_OID = 829 +MACADDR8_OID = 774 +MONEY_OID = 790 +NAME_OID = 19 +NUMERIC_OID = 1700 +NUMMULTIRANGE_OID = 4532 +NUMRANGE_OID = 3906 +OID_OID = 26 +OIDVECTOR_OID = 30 +PATH_OID = 602 +PG_LSN_OID = 3220 +POINT_OID = 600 +POLYGON_OID = 604 +RECORD_OID = 2249 +REFCURSOR_OID = 1790 +REGCLASS_OID = 2205 +REGCOLLATION_OID = 4191 +REGCONFIG_OID = 3734 +REGDICTIONARY_OID = 3769 +REGNAMESPACE_OID = 4089 +REGOPER_OID = 2203 +REGOPERATOR_OID = 2204 +REGPROC_OID = 24 +REGPROCEDURE_OID = 2202 +REGROLE_OID = 4096 +REGTYPE_OID = 2206 +TEXT_OID = 25 +TID_OID = 27 +TIME_OID = 1083 +TIMESTAMP_OID = 1114 +TIMESTAMPTZ_OID = 1184 +TIMETZ_OID = 1266 +TSMULTIRANGE_OID = 4533 +TSQUERY_OID = 3615 +TSRANGE_OID = 3908 +TSTZMULTIRANGE_OID = 4534 +TSTZRANGE_OID = 3910 +TSVECTOR_OID = 3614 +TXID_SNAPSHOT_OID = 2970 +UUID_OID = 2950 +VARBIT_OID = 1562 +VARCHAR_OID = 1043 +XID_OID = 28 +XID8_OID = 5069 +XML_OID = 142 +# autogenerated: end diff --git a/psycopg/psycopg/postgres.py b/psycopg/psycopg/postgres.py index 792a9c8dc..35aa68d63 100644 --- a/psycopg/psycopg/postgres.py +++ b/psycopg/psycopg/postgres.py @@ -18,7 +18,7 @@ adapters = AdaptersMap(types=types) for t in [ TypeInfo('"char"', 18, 1002), # autogenerated: start - # Generated from PostgreSQL 15.0 + # Generated from PostgreSQL 15.1 TypeInfo("aclitem", 1033, 1034), TypeInfo("bit", 1560, 1561), TypeInfo("bool", 16, 1000, regtype="boolean"), diff --git a/psycopg_c/psycopg_c/_psycopg/oids.pxd b/psycopg_c/psycopg_c/_psycopg/oids.pxd index 2a864c4a1..a958dcada 100644 --- a/psycopg_c/psycopg_c/_psycopg/oids.pxd +++ b/psycopg_c/psycopg_c/_psycopg/oids.pxd @@ -11,7 +11,7 @@ cdef enum: # autogenerated: start - # Generated from PostgreSQL 15.0 + # Generated from PostgreSQL 15.1 ACLITEM_OID = 1033 BIT_OID = 1560 diff --git a/tools/update_oids.py b/tools/update_oids.py index df4f969c7..942d2ac57 100755 --- a/tools/update_oids.py +++ b/tools/update_oids.py @@ -39,10 +39,11 @@ def main() -> None: update_crdb_python_oids(conn) else: update_python_oids(conn) + update_python_types(conn) update_cython_oids(conn) -def update_python_oids(conn: Connection) -> None: +def update_python_types(conn: Connection) -> None: fn = ROOT / "psycopg/psycopg/postgres.py" lines = [] @@ -55,6 +56,17 @@ def update_python_oids(conn: Connection) -> None: sp.check_call(["black", "-q", fn]) +def update_python_oids(conn: Connection) -> None: + fn = ROOT / "psycopg/psycopg/_oids.py" + + lines = [] + lines.extend(get_version_comment(conn)) + lines.extend(get_py_oids(conn)) + + update_file(fn, lines) + sp.check_call(["black", "-q", fn]) + + def update_cython_oids(conn: Connection) -> None: fn = ROOT / "psycopg_c/psycopg_c/_psycopg/oids.pxd" @@ -90,6 +102,25 @@ def get_version_comment(conn: Connection) -> List[str]: return ["", f" # Generated from {conn.info.vendor} {version}", ""] +def get_py_oids(conn: Connection) -> List[str]: + lines = [] + for (typname, oid) in conn.execute( + """ +select typname, oid +from pg_type +where + oid < 10000 + and (typtype = any('{b,r,m}') or typname = 'record') + and (typname !~ '^(_|pg_)' or typname = 'pg_lsn') +order by typname +""" + ): + const_name = typname.upper() + "_OID" + lines.append(f"{const_name} = {oid}") + + return lines + + def get_py_types(conn: Connection) -> List[str]: # Note: "record" is a pseudotype but still a useful one to have. # "pg_lsn" is a documented public type and useful in streaming replication -- 2.47.2