1# dialects/postgresql/pg_catalog.py
2# Copyright (C) 2005-2026 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_collation_is_visible = _pg_cat.pg_collation_is_visible
78pg_get_viewdef = _pg_cat.pg_get_viewdef
79pg_get_serial_sequence = _pg_cat.pg_get_serial_sequence
80format_type = _pg_cat.format_type
81pg_get_expr = _pg_cat.pg_get_expr
82pg_get_constraintdef = _pg_cat.pg_get_constraintdef
83pg_get_indexdef = _pg_cat.pg_get_indexdef
84
85# constants
86RELKINDS_TABLE_NO_FOREIGN = ("r", "p")
87RELKINDS_TABLE = RELKINDS_TABLE_NO_FOREIGN + ("f",)
88RELKINDS_VIEW = ("v",)
89RELKINDS_MAT_VIEW = ("m",)
90RELKINDS_ALL_TABLE_LIKE = RELKINDS_TABLE + RELKINDS_VIEW + RELKINDS_MAT_VIEW
91
92# tables
93pg_catalog_meta = MetaData(schema="pg_catalog")
94
95pg_namespace = Table(
96 "pg_namespace",
97 pg_catalog_meta,
98 Column("oid", OID),
99 Column("nspname", NAME),
100 Column("nspowner", OID),
101)
102
103pg_class = Table(
104 "pg_class",
105 pg_catalog_meta,
106 Column("oid", OID, info={"server_version": (9, 3)}),
107 Column("relname", NAME),
108 Column("relnamespace", OID),
109 Column("reltype", OID),
110 Column("reloftype", OID),
111 Column("relowner", OID),
112 Column("relam", OID),
113 Column("relfilenode", OID),
114 Column("reltablespace", OID),
115 Column("relpages", Integer),
116 Column("reltuples", Float),
117 Column("relallvisible", Integer, info={"server_version": (9, 2)}),
118 Column("reltoastrelid", OID),
119 Column("relhasindex", Boolean),
120 Column("relisshared", Boolean),
121 Column("relpersistence", CHAR, info={"server_version": (9, 1)}),
122 Column("relkind", CHAR),
123 Column("relnatts", SmallInteger),
124 Column("relchecks", SmallInteger),
125 Column("relhasrules", Boolean),
126 Column("relhastriggers", Boolean),
127 Column("relhassubclass", Boolean),
128 Column("relrowsecurity", Boolean),
129 Column("relforcerowsecurity", Boolean, info={"server_version": (9, 5)}),
130 Column("relispopulated", Boolean, info={"server_version": (9, 3)}),
131 Column("relreplident", CHAR, info={"server_version": (9, 4)}),
132 Column("relispartition", Boolean, info={"server_version": (10,)}),
133 Column("relrewrite", OID, info={"server_version": (11,)}),
134 Column("reloptions", ARRAY(Text)),
135)
136
137pg_type = Table(
138 "pg_type",
139 pg_catalog_meta,
140 Column("oid", OID, info={"server_version": (9, 3)}),
141 Column("typname", NAME),
142 Column("typnamespace", OID),
143 Column("typowner", OID),
144 Column("typlen", SmallInteger),
145 Column("typbyval", Boolean),
146 Column("typtype", CHAR),
147 Column("typcategory", CHAR),
148 Column("typispreferred", Boolean),
149 Column("typisdefined", Boolean),
150 Column("typdelim", CHAR),
151 Column("typrelid", OID),
152 Column("typelem", OID),
153 Column("typarray", OID),
154 Column("typinput", REGPROC),
155 Column("typoutput", REGPROC),
156 Column("typreceive", REGPROC),
157 Column("typsend", REGPROC),
158 Column("typmodin", REGPROC),
159 Column("typmodout", REGPROC),
160 Column("typanalyze", REGPROC),
161 Column("typalign", CHAR),
162 Column("typstorage", CHAR),
163 Column("typnotnull", Boolean),
164 Column("typbasetype", OID),
165 Column("typtypmod", Integer),
166 Column("typndims", Integer),
167 Column("typcollation", OID, info={"server_version": (9, 1)}),
168 Column("typdefault", Text),
169)
170
171pg_index = Table(
172 "pg_index",
173 pg_catalog_meta,
174 Column("indexrelid", OID),
175 Column("indrelid", OID),
176 Column("indnatts", SmallInteger),
177 Column("indnkeyatts", SmallInteger, info={"server_version": (11,)}),
178 Column("indisunique", Boolean),
179 Column("indnullsnotdistinct", Boolean, info={"server_version": (15,)}),
180 Column("indisprimary", Boolean),
181 Column("indisexclusion", Boolean, info={"server_version": (9, 1)}),
182 Column("indimmediate", Boolean),
183 Column("indisclustered", Boolean),
184 Column("indisvalid", Boolean),
185 Column("indcheckxmin", Boolean),
186 Column("indisready", Boolean),
187 Column("indislive", Boolean, info={"server_version": (9, 3)}), # 9.3
188 Column("indisreplident", Boolean),
189 Column("indkey", INT2VECTOR),
190 Column("indcollation", OIDVECTOR, info={"server_version": (9, 1)}), # 9.1
191 Column("indclass", OIDVECTOR),
192 Column("indoption", INT2VECTOR),
193 Column("indexprs", PG_NODE_TREE),
194 Column("indpred", PG_NODE_TREE),
195)
196
197pg_attribute = Table(
198 "pg_attribute",
199 pg_catalog_meta,
200 Column("attrelid", OID),
201 Column("attname", NAME),
202 Column("atttypid", OID),
203 Column("attstattarget", Integer),
204 Column("attlen", SmallInteger),
205 Column("attnum", SmallInteger),
206 Column("attndims", Integer),
207 Column("attcacheoff", Integer),
208 Column("atttypmod", Integer),
209 Column("attbyval", Boolean),
210 Column("attstorage", CHAR),
211 Column("attalign", CHAR),
212 Column("attnotnull", Boolean),
213 Column("atthasdef", Boolean),
214 Column("atthasmissing", Boolean, info={"server_version": (11,)}),
215 Column("attidentity", CHAR, info={"server_version": (10,)}),
216 Column("attgenerated", CHAR, info={"server_version": (12,)}),
217 Column("attisdropped", Boolean),
218 Column("attislocal", Boolean),
219 Column("attinhcount", Integer),
220 Column("attcollation", OID, info={"server_version": (9, 1)}),
221)
222
223pg_constraint = Table(
224 "pg_constraint",
225 pg_catalog_meta,
226 Column("oid", OID), # 9.3
227 Column("conname", NAME),
228 Column("connamespace", OID),
229 Column("contype", CHAR),
230 Column("condeferrable", Boolean),
231 Column("condeferred", Boolean),
232 Column("convalidated", Boolean, info={"server_version": (9, 1)}),
233 Column("conrelid", OID),
234 Column("contypid", OID),
235 Column("conindid", OID),
236 Column("conparentid", OID, info={"server_version": (11,)}),
237 Column("confrelid", OID),
238 Column("confupdtype", CHAR),
239 Column("confdeltype", CHAR),
240 Column("confmatchtype", CHAR),
241 Column("conislocal", Boolean),
242 Column("coninhcount", Integer),
243 Column("connoinherit", Boolean, info={"server_version": (9, 2)}),
244 Column("conkey", ARRAY(SmallInteger)),
245 Column("confkey", ARRAY(SmallInteger)),
246)
247
248pg_sequence = Table(
249 "pg_sequence",
250 pg_catalog_meta,
251 Column("seqrelid", OID),
252 Column("seqtypid", OID),
253 Column("seqstart", BigInteger),
254 Column("seqincrement", BigInteger),
255 Column("seqmax", BigInteger),
256 Column("seqmin", BigInteger),
257 Column("seqcache", BigInteger),
258 Column("seqcycle", Boolean),
259 info={"server_version": (10,)},
260)
261
262pg_attrdef = Table(
263 "pg_attrdef",
264 pg_catalog_meta,
265 Column("oid", OID, info={"server_version": (9, 3)}),
266 Column("adrelid", OID),
267 Column("adnum", SmallInteger),
268 Column("adbin", PG_NODE_TREE),
269)
270
271pg_description = Table(
272 "pg_description",
273 pg_catalog_meta,
274 Column("objoid", OID),
275 Column("classoid", OID),
276 Column("objsubid", Integer),
277 Column("description", Text(collation="C")),
278)
279
280pg_enum = Table(
281 "pg_enum",
282 pg_catalog_meta,
283 Column("oid", OID, info={"server_version": (9, 3)}),
284 Column("enumtypid", OID),
285 Column("enumsortorder", Float(), info={"server_version": (9, 1)}),
286 Column("enumlabel", NAME),
287)
288
289pg_am = Table(
290 "pg_am",
291 pg_catalog_meta,
292 Column("oid", OID, info={"server_version": (9, 3)}),
293 Column("amname", NAME),
294 Column("amhandler", REGPROC, info={"server_version": (9, 6)}),
295 Column("amtype", CHAR, info={"server_version": (9, 6)}),
296)
297
298pg_collation = Table(
299 "pg_collation",
300 pg_catalog_meta,
301 Column("oid", OID, info={"server_version": (9, 3)}),
302 Column("collname", NAME),
303 Column("collnamespace", OID),
304 Column("collowner", OID),
305 Column("collprovider", CHAR, info={"server_version": (10,)}),
306 Column("collisdeterministic", Boolean, info={"server_version": (12,)}),
307 Column("collencoding", Integer),
308 Column("collcollate", Text),
309 Column("collctype", Text),
310 Column("colliculocale", Text),
311 Column("collicurules", Text, info={"server_version": (16,)}),
312 Column("collversion", Text, info={"server_version": (10,)}),
313)
314
315pg_opclass = Table(
316 "pg_opclass",
317 pg_catalog_meta,
318 Column("oid", OID, info={"server_version": (9, 3)}),
319 Column("opcmethod", NAME),
320 Column("opcname", NAME),
321 Column("opsnamespace", OID),
322 Column("opsowner", OID),
323 Column("opcfamily", OID),
324 Column("opcintype", OID),
325 Column("opcdefault", Boolean),
326 Column("opckeytype", OID),
327)
328
329pg_inherits = Table(
330 "pg_inherits",
331 pg_catalog_meta,
332 Column("inhrelid", OID),
333 Column("inhparent", OID),
334 Column("inhseqno", Integer),
335 Column("inhdetachpending", Boolean, info={"server_version": (14,)}),
336)
337
338pg_tablespace = Table(
339 "pg_tablespace",
340 pg_catalog_meta,
341 Column("oid", OID),
342 Column("spcname", NAME),
343 Column("spcowner", OID),
344 Column("spcoptions", ARRAY(Text)),
345)