SQLAlchemy 2.1.0rc1__cp315-cp315-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. sqlalchemy/__init__.py +299 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +171 -0
  4. sqlalchemy/connectors/asyncio.py +476 -0
  5. sqlalchemy/connectors/pyodbc.py +248 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +29 -0
  8. sqlalchemy/dialects/mssql/__init__.py +88 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4833 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +345 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +242 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +130 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +697 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +260 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +241 -0
  21. sqlalchemy/dialects/mysql/base.py +3896 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +107 -0
  23. sqlalchemy/dialects/mysql/dml.py +279 -0
  24. sqlalchemy/dialects/mysql/enumerated.py +277 -0
  25. sqlalchemy/dialects/mysql/expression.py +146 -0
  26. sqlalchemy/dialects/mysql/json.py +92 -0
  27. sqlalchemy/dialects/mysql/mariadb.py +67 -0
  28. sqlalchemy/dialects/mysql/mariadbconnector.py +314 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +291 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +318 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +188 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +157 -0
  34. sqlalchemy/dialects/mysql/reflection.py +724 -0
  35. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  36. sqlalchemy/dialects/mysql/types.py +845 -0
  37. sqlalchemy/dialects/oracle/__init__.py +85 -0
  38. sqlalchemy/dialects/oracle/base.py +3847 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1736 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +157 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +898 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +366 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +170 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +232 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1318 -0
  50. sqlalchemy/dialects/postgresql/base.py +5935 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +599 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +422 -0
  55. sqlalchemy/dialects/postgresql/json.py +411 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +535 -0
  57. sqlalchemy/dialects/postgresql/operators.py +129 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +655 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +345 -0
  60. sqlalchemy/dialects/postgresql/provision.py +202 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +800 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +62 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +59 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +375 -0
  68. sqlalchemy/dialects/sqlite/base.py +3103 -0
  69. sqlalchemy/dialects/sqlite/dml.py +314 -0
  70. sqlalchemy/dialects/sqlite/json.py +134 -0
  71. sqlalchemy/dialects/sqlite/provision.py +237 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +166 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +959 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp315-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp315-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +711 -0
  80. sqlalchemy/engine/_row_cy.cp315-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp315-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3357 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2425 -0
  88. sqlalchemy/engine/default.py +2627 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3636 -0
  91. sqlalchemy/engine/mock.py +133 -0
  92. sqlalchemy/engine/processors.py +83 -0
  93. sqlalchemy/engine/reflection.py +2141 -0
  94. sqlalchemy/engine/result.py +2012 -0
  95. sqlalchemy/engine/row.py +397 -0
  96. sqlalchemy/engine/strategies.py +16 -0
  97. sqlalchemy/engine/url.py +922 -0
  98. sqlalchemy/engine/util.py +164 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +675 -0
  102. sqlalchemy/event/base.py +473 -0
  103. sqlalchemy/event/legacy.py +259 -0
  104. sqlalchemy/event/registry.py +391 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +939 -0
  107. sqlalchemy/ext/__init__.py +10 -0
  108. sqlalchemy/ext/associationproxy.py +2073 -0
  109. sqlalchemy/ext/asyncio/__init__.py +29 -0
  110. sqlalchemy/ext/asyncio/base.py +281 -0
  111. sqlalchemy/ext/asyncio/engine.py +1487 -0
  112. sqlalchemy/ext/asyncio/exc.py +21 -0
  113. sqlalchemy/ext/asyncio/result.py +994 -0
  114. sqlalchemy/ext/asyncio/scoping.py +1679 -0
  115. sqlalchemy/ext/asyncio/session.py +2006 -0
  116. sqlalchemy/ext/automap.py +1702 -0
  117. sqlalchemy/ext/baked.py +558 -0
  118. sqlalchemy/ext/compiler.py +601 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +561 -0
  121. sqlalchemy/ext/horizontal_shard.py +481 -0
  122. sqlalchemy/ext/hybrid.py +1877 -0
  123. sqlalchemy/ext/indexable.py +364 -0
  124. sqlalchemy/ext/instrumentation.py +450 -0
  125. sqlalchemy/ext/mutable.py +1081 -0
  126. sqlalchemy/ext/orderinglist.py +440 -0
  127. sqlalchemy/ext/serializer.py +184 -0
  128. sqlalchemy/future/__init__.py +17 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +188 -0
  131. sqlalchemy/log.py +279 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +180 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +991 -0
  137. sqlalchemy/orm/bulk_persistence.py +2168 -0
  138. sqlalchemy/orm/clsregistry.py +630 -0
  139. sqlalchemy/orm/collections.py +1569 -0
  140. sqlalchemy/orm/context.py +3475 -0
  141. sqlalchemy/orm/decl_api.py +2283 -0
  142. sqlalchemy/orm/decl_base.py +2320 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +306 -0
  146. sqlalchemy/orm/evaluator.py +378 -0
  147. sqlalchemy/orm/events.py +3387 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +749 -0
  151. sqlalchemy/orm/interfaces.py +1595 -0
  152. sqlalchemy/orm/loading.py +1712 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4465 -0
  155. sqlalchemy/orm/path_registry.py +907 -0
  156. sqlalchemy/orm/persistence.py +1790 -0
  157. sqlalchemy/orm/properties.py +972 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3608 -0
  160. sqlalchemy/orm/scoping.py +2233 -0
  161. sqlalchemy/orm/session.py +5468 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3552 -0
  165. sqlalchemy/orm/strategy_options.py +2648 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +797 -0
  168. sqlalchemy/orm/util.py +2461 -0
  169. sqlalchemy/orm/writeonly.py +701 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1540 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +583 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +75 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +402 -0
  178. sqlalchemy/sql/_cache_key_cy.cp315-win_arm64.pyd +0 -0
  179. sqlalchemy/sql/_cache_key_cy.py +363 -0
  180. sqlalchemy/sql/_dml_constructors.py +132 -0
  181. sqlalchemy/sql/_elements_constructors.py +2190 -0
  182. sqlalchemy/sql/_orm_types.py +19 -0
  183. sqlalchemy/sql/_selectable_constructors.py +840 -0
  184. sqlalchemy/sql/_typing.py +500 -0
  185. sqlalchemy/sql/_util_cy.cp315-win_arm64.pyd +0 -0
  186. sqlalchemy/sql/_util_cy.pxd +11 -0
  187. sqlalchemy/sql/_util_cy.py +127 -0
  188. sqlalchemy/sql/annotation.py +590 -0
  189. sqlalchemy/sql/base.py +2702 -0
  190. sqlalchemy/sql/cache_key.py +915 -0
  191. sqlalchemy/sql/coercions.py +1373 -0
  192. sqlalchemy/sql/compiler.py +8453 -0
  193. sqlalchemy/sql/crud.py +1816 -0
  194. sqlalchemy/sql/ddl.py +1962 -0
  195. sqlalchemy/sql/default_comparator.py +660 -0
  196. sqlalchemy/sql/dml.py +2018 -0
  197. sqlalchemy/sql/elements.py +6057 -0
  198. sqlalchemy/sql/events.py +458 -0
  199. sqlalchemy/sql/expression.py +171 -0
  200. sqlalchemy/sql/functions.py +2380 -0
  201. sqlalchemy/sql/lambdas.py +1442 -0
  202. sqlalchemy/sql/naming.py +204 -0
  203. sqlalchemy/sql/operators.py +2909 -0
  204. sqlalchemy/sql/roles.py +332 -0
  205. sqlalchemy/sql/schema.py +7075 -0
  206. sqlalchemy/sql/selectable.py +7634 -0
  207. sqlalchemy/sql/sqltypes.py +4130 -0
  208. sqlalchemy/sql/traversals.py +1041 -0
  209. sqlalchemy/sql/type_api.py +2450 -0
  210. sqlalchemy/sql/util.py +1496 -0
  211. sqlalchemy/sql/visitors.py +1153 -0
  212. sqlalchemy/testing/__init__.py +97 -0
  213. sqlalchemy/testing/assertions.py +1007 -0
  214. sqlalchemy/testing/assertsql.py +519 -0
  215. sqlalchemy/testing/asyncio.py +128 -0
  216. sqlalchemy/testing/cancellation.py +237 -0
  217. sqlalchemy/testing/config.py +440 -0
  218. sqlalchemy/testing/engines.py +482 -0
  219. sqlalchemy/testing/entities.py +117 -0
  220. sqlalchemy/testing/exclusions.py +501 -0
  221. sqlalchemy/testing/fixtures/__init__.py +30 -0
  222. sqlalchemy/testing/fixtures/base.py +426 -0
  223. sqlalchemy/testing/fixtures/mypy.py +247 -0
  224. sqlalchemy/testing/fixtures/orm.py +227 -0
  225. sqlalchemy/testing/fixtures/sql.py +538 -0
  226. sqlalchemy/testing/pickleable.py +155 -0
  227. sqlalchemy/testing/plugin/__init__.py +6 -0
  228. sqlalchemy/testing/plugin/bootstrap.py +50 -0
  229. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  230. sqlalchemy/testing/plugin/pytestplugin.py +896 -0
  231. sqlalchemy/testing/profiles_file.py +350 -0
  232. sqlalchemy/testing/profiling.py +294 -0
  233. sqlalchemy/testing/provision.py +633 -0
  234. sqlalchemy/testing/requirements.py +1971 -0
  235. sqlalchemy/testing/schema.py +198 -0
  236. sqlalchemy/testing/suite/__init__.py +19 -0
  237. sqlalchemy/testing/suite/test_cte.py +237 -0
  238. sqlalchemy/testing/suite/test_ddl.py +420 -0
  239. sqlalchemy/testing/suite/test_dialect.py +776 -0
  240. sqlalchemy/testing/suite/test_insert.py +630 -0
  241. sqlalchemy/testing/suite/test_reflection.py +3815 -0
  242. sqlalchemy/testing/suite/test_results.py +660 -0
  243. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  244. sqlalchemy/testing/suite/test_select.py +2112 -0
  245. sqlalchemy/testing/suite/test_sequence.py +317 -0
  246. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  247. sqlalchemy/testing/suite/test_types.py +2271 -0
  248. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  249. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  250. sqlalchemy/testing/util.py +575 -0
  251. sqlalchemy/testing/warnings.py +52 -0
  252. sqlalchemy/types.py +75 -0
  253. sqlalchemy/util/__init__.py +165 -0
  254. sqlalchemy/util/_collections.py +688 -0
  255. sqlalchemy/util/_collections_cy.cp315-win_arm64.pyd +0 -0
  256. sqlalchemy/util/_collections_cy.pxd +8 -0
  257. sqlalchemy/util/_collections_cy.py +516 -0
  258. sqlalchemy/util/_has_cython.py +48 -0
  259. sqlalchemy/util/_immutabledict_cy.cp315-win_arm64.pyd +0 -0
  260. sqlalchemy/util/_immutabledict_cy.py +240 -0
  261. sqlalchemy/util/compat.py +298 -0
  262. sqlalchemy/util/concurrency.py +272 -0
  263. sqlalchemy/util/cython.py +95 -0
  264. sqlalchemy/util/deprecations.py +401 -0
  265. sqlalchemy/util/langhelpers.py +2797 -0
  266. sqlalchemy/util/preloaded.py +153 -0
  267. sqlalchemy/util/queue.py +304 -0
  268. sqlalchemy/util/tool_support.py +202 -0
  269. sqlalchemy/util/topological.py +120 -0
  270. sqlalchemy/util/typing.py +709 -0
  271. sqlalchemy-2.1.0rc1.dist-info/METADATA +270 -0
  272. sqlalchemy-2.1.0rc1.dist-info/RECORD +276 -0
  273. sqlalchemy-2.1.0rc1.dist-info/WHEEL +5 -0
  274. sqlalchemy-2.1.0rc1.dist-info/licenses/AUTHORS +30 -0
  275. sqlalchemy-2.1.0rc1.dist-info/licenses/LICENSE +19 -0
  276. sqlalchemy-2.1.0rc1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,345 @@
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
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+ from typing import Optional
12
+ from typing import Sequence
13
+ from typing import TYPE_CHECKING
14
+
15
+ from .array import ARRAY
16
+ from .types import OID
17
+ from .types import REGCLASS
18
+ from ... import Column
19
+ from ... import func
20
+ from ... import MetaData
21
+ from ... import Table
22
+ from ...types import BigInteger
23
+ from ...types import Boolean
24
+ from ...types import CHAR
25
+ from ...types import Float
26
+ from ...types import Integer
27
+ from ...types import SmallInteger
28
+ from ...types import String
29
+ from ...types import Text
30
+ from ...types import TypeDecorator
31
+
32
+ if TYPE_CHECKING:
33
+ from ...engine.interfaces import Dialect
34
+ from ...sql.type_api import _ResultProcessorType
35
+
36
+
37
+ # types
38
+ class NAME(TypeDecorator[str]):
39
+ impl = String(64, collation="C")
40
+ cache_ok = True
41
+
42
+
43
+ class PG_NODE_TREE(TypeDecorator[str]):
44
+ impl = Text(collation="C")
45
+ cache_ok = True
46
+
47
+
48
+ class INT2VECTOR(TypeDecorator[Sequence[int]]):
49
+ impl = ARRAY(SmallInteger)
50
+ cache_ok = True
51
+
52
+
53
+ class OIDVECTOR(TypeDecorator[Sequence[int]]):
54
+ impl = ARRAY(OID)
55
+ cache_ok = True
56
+
57
+
58
+ class _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
+
70
+ REGPROC = REGCLASS # seems an alias
71
+
72
+ # functions
73
+ _pg_cat = func.pg_catalog
74
+ quote_ident = _pg_cat.quote_ident
75
+ pg_table_is_visible = _pg_cat.pg_table_is_visible
76
+ pg_type_is_visible = _pg_cat.pg_type_is_visible
77
+ pg_collation_is_visible = _pg_cat.pg_collation_is_visible
78
+ pg_get_viewdef = _pg_cat.pg_get_viewdef
79
+ pg_get_serial_sequence = _pg_cat.pg_get_serial_sequence
80
+ format_type = _pg_cat.format_type
81
+ pg_get_expr = _pg_cat.pg_get_expr
82
+ pg_get_constraintdef = _pg_cat.pg_get_constraintdef
83
+ pg_get_indexdef = _pg_cat.pg_get_indexdef
84
+
85
+ # constants
86
+ RELKINDS_TABLE_NO_FOREIGN = ("r", "p")
87
+ RELKINDS_TABLE = RELKINDS_TABLE_NO_FOREIGN + ("f",)
88
+ RELKINDS_VIEW = ("v",)
89
+ RELKINDS_MAT_VIEW = ("m",)
90
+ RELKINDS_ALL_TABLE_LIKE = RELKINDS_TABLE + RELKINDS_VIEW + RELKINDS_MAT_VIEW
91
+
92
+ # tables
93
+ pg_catalog_meta = MetaData(schema="pg_catalog")
94
+
95
+ pg_namespace = Table(
96
+ "pg_namespace",
97
+ pg_catalog_meta,
98
+ Column("oid", OID),
99
+ Column("nspname", NAME),
100
+ Column("nspowner", OID),
101
+ )
102
+
103
+ pg_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
+
137
+ pg_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
+
171
+ pg_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
+
197
+ pg_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
+
223
+ pg_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
+
248
+ pg_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
+
262
+ pg_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
+
271
+ pg_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
+
280
+ pg_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
+
289
+ pg_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
+
298
+ pg_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
+
315
+ pg_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
+
329
+ pg_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
+
338
+ pg_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
+ )
@@ -0,0 +1,202 @@
1
+ # dialects/postgresql/provision.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
+ # mypy: ignore-errors
8
+
9
+ import time
10
+
11
+ from ... import exc
12
+ from ... import inspect
13
+ from ... import text
14
+ from ...testing import warn_test_suite
15
+ from ...testing.provision import create_db
16
+ from ...testing.provision import drop_all_schema_objects_post_tables
17
+ from ...testing.provision import drop_all_schema_objects_pre_tables
18
+ from ...testing.provision import drop_db
19
+ from ...testing.provision import log
20
+ from ...testing.provision import post_configure_engine
21
+ from ...testing.provision import prepare_for_drop_tables
22
+ from ...testing.provision import profile_platform_tokens
23
+ from ...testing.provision import set_default_schema_on_connection
24
+ from ...testing.provision import temp_table_keyword_args
25
+ from ...testing.provision import upsert
26
+
27
+
28
+ @create_db.for_db("postgresql")
29
+ def _pg_create_db(cfg, eng, ident):
30
+ template_db = cfg.options.postgresql_templatedb
31
+
32
+ with eng.execution_options(isolation_level="AUTOCOMMIT").begin() as conn:
33
+ if not template_db:
34
+ template_db = conn.exec_driver_sql(
35
+ "select current_database()"
36
+ ).scalar()
37
+
38
+ attempt = 0
39
+ while True:
40
+ try:
41
+ conn.exec_driver_sql(
42
+ "CREATE DATABASE %s TEMPLATE %s" % (ident, template_db)
43
+ )
44
+ except exc.OperationalError as err:
45
+ attempt += 1
46
+ if attempt >= 3:
47
+ raise
48
+ if "accessed by other users" in str(err):
49
+ log.info(
50
+ "Waiting to create %s, URI %r, "
51
+ "template DB %s is in use sleeping for .5",
52
+ ident,
53
+ eng.url,
54
+ template_db,
55
+ )
56
+ time.sleep(0.5)
57
+ except:
58
+ raise
59
+ else:
60
+ break
61
+
62
+
63
+ @drop_db.for_db("postgresql")
64
+ def _pg_drop_db(cfg, eng, ident):
65
+ with eng.connect().execution_options(isolation_level="AUTOCOMMIT") as conn:
66
+ with conn.begin():
67
+ conn.execute(
68
+ text(
69
+ "select pg_terminate_backend(pid) from pg_stat_activity "
70
+ "where usename=current_user and pid != pg_backend_pid() "
71
+ "and datname=:dname"
72
+ ),
73
+ dict(dname=ident),
74
+ )
75
+ conn.exec_driver_sql("DROP DATABASE %s" % ident)
76
+
77
+
78
+ @temp_table_keyword_args.for_db("postgresql")
79
+ def _postgresql_temp_table_keyword_args(cfg, eng):
80
+ return {"prefixes": ["TEMPORARY"]}
81
+
82
+
83
+ @set_default_schema_on_connection.for_db("postgresql")
84
+ def _postgresql_set_default_schema_on_connection(
85
+ cfg, dbapi_connection, schema_name
86
+ ):
87
+ existing_autocommit = dbapi_connection.autocommit
88
+ dbapi_connection.autocommit = True
89
+ cursor = dbapi_connection.cursor()
90
+ cursor.execute("SET SESSION search_path='%s'" % schema_name)
91
+ cursor.close()
92
+ dbapi_connection.autocommit = existing_autocommit
93
+
94
+
95
+ @drop_all_schema_objects_pre_tables.for_db("postgresql")
96
+ def drop_all_schema_objects_pre_tables(cfg, eng):
97
+ with eng.connect().execution_options(isolation_level="AUTOCOMMIT") as conn:
98
+ for xid in conn.exec_driver_sql(
99
+ "SELECT gid FROM pg_prepared_xacts "
100
+ "WHERE database = current_database()"
101
+ ).scalars():
102
+ eng.dialect.do_rollback_twophase(conn, xid, recover=True)
103
+
104
+
105
+ @drop_all_schema_objects_post_tables.for_db("postgresql")
106
+ def drop_all_schema_objects_post_tables(cfg, eng):
107
+ from sqlalchemy.dialects import postgresql
108
+
109
+ inspector = inspect(eng)
110
+ with eng.begin() as conn:
111
+ for enum in inspector.get_enums("*"):
112
+ conn.execute(
113
+ postgresql.DropEnumType(
114
+ postgresql.ENUM(name=enum["name"], schema=enum["schema"])
115
+ )
116
+ )
117
+
118
+
119
+ @prepare_for_drop_tables.for_db("postgresql")
120
+ def prepare_for_drop_tables(config, connection):
121
+ """Ensure there are no locks on the current username/database."""
122
+
123
+ result = connection.exec_driver_sql(
124
+ "select pid, state, wait_event_type, query "
125
+ # "select pg_terminate_backend(pid), state, wait_event_type "
126
+ "from pg_stat_activity where "
127
+ "usename=current_user "
128
+ "and datname=current_database() and state='idle in transaction' "
129
+ "and pid != pg_backend_pid()"
130
+ )
131
+ rows = result.all() # noqa
132
+ if rows:
133
+ warn_test_suite(
134
+ "PostgreSQL may not be able to DROP tables due to "
135
+ "idle in transaction: %s"
136
+ % ("; ".join(row._mapping["query"] for row in rows))
137
+ )
138
+
139
+
140
+ @upsert.for_db("postgresql")
141
+ def _upsert(
142
+ cfg,
143
+ table,
144
+ returning,
145
+ *,
146
+ set_lambda=None,
147
+ sort_by_parameter_order=False,
148
+ index_elements=None,
149
+ ):
150
+ from sqlalchemy.dialects.postgresql import insert
151
+
152
+ stmt = insert(table)
153
+
154
+ table_pk = inspect(table).selectable
155
+
156
+ if set_lambda:
157
+ if index_elements is None:
158
+ index_elements = table_pk.primary_key
159
+ stmt = stmt.on_conflict_do_update(
160
+ index_elements=index_elements, set_=set_lambda(stmt.excluded)
161
+ )
162
+ else:
163
+ stmt = stmt.on_conflict_do_nothing()
164
+
165
+ stmt = stmt.returning(
166
+ *returning, sort_by_parameter_order=sort_by_parameter_order
167
+ )
168
+ return stmt
169
+
170
+
171
+ _extensions = [
172
+ ("citext", (13,)),
173
+ ("hstore", (13,)),
174
+ ]
175
+
176
+
177
+ @post_configure_engine.for_db("postgresql")
178
+ def _create_citext_extension(url, engine, follower_ident):
179
+ with engine.connect() as conn:
180
+ for extension, min_version in _extensions:
181
+ if conn.dialect.server_version_info >= min_version:
182
+ conn.execute(
183
+ text(f"CREATE EXTENSION IF NOT EXISTS {extension}")
184
+ )
185
+ conn.commit()
186
+
187
+
188
+ @profile_platform_tokens.for_db("postgresql")
189
+ def _postgresql_profile_platform_tokens(eng):
190
+ if eng.dialect.driver not in ("psycopg", "psycopg_async"):
191
+ # psycopg2 and pg8000 each only come one way, and asyncpg's
192
+ # accelerator isn't optional
193
+ return ()
194
+
195
+ # psycopg 3 is a pure Python package whose C speedups ship separately
196
+ # as psycopg-c / psycopg-binary and are picked up at import time when
197
+ # installed. The two compiled builds are the same code, so they share
198
+ # a token; the pure Python one costs tens of thousands of extra calls
199
+ # in the resultset suite.
200
+ return (
201
+ "pydbapi" if eng.dialect.dbapi.pq.__impl__ == "python" else "cdbapi",
202
+ )