1# dialects/postgresql/pg_catalog.py
2# Copyright (C) 2005-2025 the SQLAlchemy authors and contributors
3# <see AUTHORS file>
4#
5# This module is part of SQLAlchemy and is released under
6# the MIT License: https://www.opensource.org/licenses/mit-license.php
7
8from __future__ import annotations
9
10from typing import Any
11from typing import Optional
12from typing import Sequence
13from typing import TYPE_CHECKING
14
15from .array import ARRAY
16from .types import OID
17from .types import REGCLASS
18from ... import Column
19from ... import func
20from ... import MetaData
21from ... import Table
22from ...types import BigInteger
23from ...types import Boolean
24from ...types import CHAR
25from ...types import Float
26from ...types import Integer
27from ...types import SmallInteger
28from ...types import String
29from ...types import Text
30from ...types import TypeDecorator
31
32if TYPE_CHECKING:
33 from ...engine.interfaces import Dialect
34 from ...sql.type_api import _ResultProcessorType
35
36
37# types
38class NAME(TypeDecorator[str]):
39 impl = String(64, collation="C")
40 cache_ok = True
41
42
43class PG_NODE_TREE(TypeDecorator[str]):
44 impl = Text(collation="C")
45 cache_ok = True
46
47
48class INT2VECTOR(TypeDecorator[Sequence[int]]):
49 impl = ARRAY(SmallInteger)
50 cache_ok = True
51
52
53class OIDVECTOR(TypeDecorator[Sequence[int]]):
54 impl = ARRAY(OID)
55 cache_ok = True
56
57
58class _SpaceVector:
59 def result_processor(
60 self, dialect: Dialect, coltype: object
61 ) -> _ResultProcessorType[list[int]]:
62 def process(value: Any) -> Optional[list[int]]:
63 if value is None:
64 return value
65 return [int(p) for p in value.split(" ")]
66
67 return process
68
69
70REGPROC = REGCLASS # seems an alias
71
72# functions
73_pg_cat = func.pg_catalog
74quote_ident = _pg_cat.quote_ident
75pg_table_is_visible = _pg_cat.pg_table_is_visible
76pg_type_is_visible = _pg_cat.pg_type_is_visible
77pg_get_viewdef = _pg_cat.pg_get_viewdef
78pg_get_serial_sequence = _pg_cat.pg_get_serial_sequence
79format_type = _pg_cat.format_type
80pg_get_expr = _pg_cat.pg_get_expr
81pg_get_constraintdef = _pg_cat.pg_get_constraintdef
82pg_get_indexdef = _pg_cat.pg_get_indexdef
83
84# constants
85RELKINDS_TABLE_NO_FOREIGN = ("r", "p")
86RELKINDS_TABLE = RELKINDS_TABLE_NO_FOREIGN + ("f",)
87RELKINDS_VIEW = ("v",)
88RELKINDS_MAT_VIEW = ("m",)
89RELKINDS_ALL_TABLE_LIKE = RELKINDS_TABLE + RELKINDS_VIEW + RELKINDS_MAT_VIEW
90
91# tables
92pg_catalog_meta = MetaData(schema="pg_catalog")
93
94pg_namespace = Table(
95 "pg_namespace",
96 pg_catalog_meta,
97 Column("oid", OID),
98 Column("nspname", NAME),
99 Column("nspowner", OID),
100)
101
102pg_class = Table(
103 "pg_class",
104 pg_catalog_meta,
105 Column("oid", OID, info={"server_version": (9, 3)}),
106 Column("relname", NAME),
107 Column("relnamespace", OID),
108 Column("reltype", OID),
109 Column("reloftype", OID),
110 Column("relowner", OID),
111 Column("relam", OID),
112 Column("relfilenode", OID),
113 Column("reltablespace", OID),
114 Column("relpages", Integer),
115 Column("reltuples", Float),
116 Column("relallvisible", Integer, info={"server_version": (9, 2)}),
117 Column("reltoastrelid", OID),
118 Column("relhasindex", Boolean),
119 Column("relisshared", Boolean),
120 Column("relpersistence", CHAR, info={"server_version": (9, 1)}),
121 Column("relkind", CHAR),
122 Column("relnatts", SmallInteger),
123 Column("relchecks", SmallInteger),
124 Column("relhasrules", Boolean),
125 Column("relhastriggers", Boolean),
126 Column("relhassubclass", Boolean),
127 Column("relrowsecurity", Boolean),
128 Column("relforcerowsecurity", Boolean, info={"server_version": (9, 5)}),
129 Column("relispopulated", Boolean, info={"server_version": (9, 3)}),
130 Column("relreplident", CHAR, info={"server_version": (9, 4)}),
131 Column("relispartition", Boolean, info={"server_version": (10,)}),
132 Column("relrewrite", OID, info={"server_version": (11,)}),
133 Column("reloptions", ARRAY(Text)),
134)
135
136pg_type = Table(
137 "pg_type",
138 pg_catalog_meta,
139 Column("oid", OID, info={"server_version": (9, 3)}),
140 Column("typname", NAME),
141 Column("typnamespace", OID),
142 Column("typowner", OID),
143 Column("typlen", SmallInteger),
144 Column("typbyval", Boolean),
145 Column("typtype", CHAR),
146 Column("typcategory", CHAR),
147 Column("typispreferred", Boolean),
148 Column("typisdefined", Boolean),
149 Column("typdelim", CHAR),
150 Column("typrelid", OID),
151 Column("typelem", OID),
152 Column("typarray", OID),
153 Column("typinput", REGPROC),
154 Column("typoutput", REGPROC),
155 Column("typreceive", REGPROC),
156 Column("typsend", REGPROC),
157 Column("typmodin", REGPROC),
158 Column("typmodout", REGPROC),
159 Column("typanalyze", REGPROC),
160 Column("typalign", CHAR),
161 Column("typstorage", CHAR),
162 Column("typnotnull", Boolean),
163 Column("typbasetype", OID),
164 Column("typtypmod", Integer),
165 Column("typndims", Integer),
166 Column("typcollation", OID, info={"server_version": (9, 1)}),
167 Column("typdefault", Text),
168)
169
170pg_index = Table(
171 "pg_index",
172 pg_catalog_meta,
173 Column("indexrelid", OID),
174 Column("indrelid", OID),
175 Column("indnatts", SmallInteger),
176 Column("indnkeyatts", SmallInteger, info={"server_version": (11,)}),
177 Column("indisunique", Boolean),
178 Column("indnullsnotdistinct", Boolean, info={"server_version": (15,)}),
179 Column("indisprimary", Boolean),
180 Column("indisexclusion", Boolean, info={"server_version": (9, 1)}),
181 Column("indimmediate", Boolean),
182 Column("indisclustered", Boolean),
183 Column("indisvalid", Boolean),
184 Column("indcheckxmin", Boolean),
185 Column("indisready", Boolean),
186 Column("indislive", Boolean, info={"server_version": (9, 3)}), # 9.3
187 Column("indisreplident", Boolean),
188 Column("indkey", INT2VECTOR),
189 Column("indcollation", OIDVECTOR, info={"server_version": (9, 1)}), # 9.1
190 Column("indclass", OIDVECTOR),
191 Column("indoption", INT2VECTOR),
192 Column("indexprs", PG_NODE_TREE),
193 Column("indpred", PG_NODE_TREE),
194)
195
196pg_attribute = Table(
197 "pg_attribute",
198 pg_catalog_meta,
199 Column("attrelid", OID),
200 Column("attname", NAME),
201 Column("atttypid", OID),
202 Column("attstattarget", Integer),
203 Column("attlen", SmallInteger),
204 Column("attnum", SmallInteger),
205 Column("attndims", Integer),
206 Column("attcacheoff", Integer),
207 Column("atttypmod", Integer),
208 Column("attbyval", Boolean),
209 Column("attstorage", CHAR),
210 Column("attalign", CHAR),
211 Column("attnotnull", Boolean),
212 Column("atthasdef", Boolean),
213 Column("atthasmissing", Boolean, info={"server_version": (11,)}),
214 Column("attidentity", CHAR, info={"server_version": (10,)}),
215 Column("attgenerated", CHAR, info={"server_version": (12,)}),
216 Column("attisdropped", Boolean),
217 Column("attislocal", Boolean),
218 Column("attinhcount", Integer),
219 Column("attcollation", OID, info={"server_version": (9, 1)}),
220)
221
222pg_constraint = Table(
223 "pg_constraint",
224 pg_catalog_meta,
225 Column("oid", OID), # 9.3
226 Column("conname", NAME),
227 Column("connamespace", OID),
228 Column("contype", CHAR),
229 Column("condeferrable", Boolean),
230 Column("condeferred", Boolean),
231 Column("convalidated", Boolean, info={"server_version": (9, 1)}),
232 Column("conrelid", OID),
233 Column("contypid", OID),
234 Column("conindid", OID),
235 Column("conparentid", OID, info={"server_version": (11,)}),
236 Column("confrelid", OID),
237 Column("confupdtype", CHAR),
238 Column("confdeltype", CHAR),
239 Column("confmatchtype", CHAR),
240 Column("conislocal", Boolean),
241 Column("coninhcount", Integer),
242 Column("connoinherit", Boolean, info={"server_version": (9, 2)}),
243 Column("conkey", ARRAY(SmallInteger)),
244 Column("confkey", ARRAY(SmallInteger)),
245)
246
247pg_sequence = Table(
248 "pg_sequence",
249 pg_catalog_meta,
250 Column("seqrelid", OID),
251 Column("seqtypid", OID),
252 Column("seqstart", BigInteger),
253 Column("seqincrement", BigInteger),
254 Column("seqmax", BigInteger),
255 Column("seqmin", BigInteger),
256 Column("seqcache", BigInteger),
257 Column("seqcycle", Boolean),
258 info={"server_version": (10,)},
259)
260
261pg_attrdef = Table(
262 "pg_attrdef",
263 pg_catalog_meta,
264 Column("oid", OID, info={"server_version": (9, 3)}),
265 Column("adrelid", OID),
266 Column("adnum", SmallInteger),
267 Column("adbin", PG_NODE_TREE),
268)
269
270pg_description = Table(
271 "pg_description",
272 pg_catalog_meta,
273 Column("objoid", OID),
274 Column("classoid", OID),
275 Column("objsubid", Integer),
276 Column("description", Text(collation="C")),
277)
278
279pg_enum = Table(
280 "pg_enum",
281 pg_catalog_meta,
282 Column("oid", OID, info={"server_version": (9, 3)}),
283 Column("enumtypid", OID),
284 Column("enumsortorder", Float(), info={"server_version": (9, 1)}),
285 Column("enumlabel", NAME),
286)
287
288pg_am = Table(
289 "pg_am",
290 pg_catalog_meta,
291 Column("oid", OID, info={"server_version": (9, 3)}),
292 Column("amname", NAME),
293 Column("amhandler", REGPROC, info={"server_version": (9, 6)}),
294 Column("amtype", CHAR, info={"server_version": (9, 6)}),
295)
296
297pg_collation = Table(
298 "pg_collation",
299 pg_catalog_meta,
300 Column("oid", OID, info={"server_version": (9, 3)}),
301 Column("collname", NAME),
302 Column("collnamespace", OID),
303 Column("collowner", OID),
304 Column("collprovider", CHAR, info={"server_version": (10,)}),
305 Column("collisdeterministic", Boolean, info={"server_version": (12,)}),
306 Column("collencoding", Integer),
307 Column("collcollate", Text),
308 Column("collctype", Text),
309 Column("colliculocale", Text),
310 Column("collicurules", Text, info={"server_version": (16,)}),
311 Column("collversion", Text, info={"server_version": (10,)}),
312)