SQLAlchemy 2.0.47__cp313-cp313t-win_amd64.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 (274) hide show
  1. sqlalchemy/__init__.py +283 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +184 -0
  4. sqlalchemy/connectors/asyncio.py +429 -0
  5. sqlalchemy/connectors/pyodbc.py +250 -0
  6. sqlalchemy/cyextension/__init__.py +6 -0
  7. sqlalchemy/cyextension/collections.cp313t-win_amd64.pyd +0 -0
  8. sqlalchemy/cyextension/collections.pyx +409 -0
  9. sqlalchemy/cyextension/immutabledict.cp313t-win_amd64.pyd +0 -0
  10. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  11. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  12. sqlalchemy/cyextension/processors.cp313t-win_amd64.pyd +0 -0
  13. sqlalchemy/cyextension/processors.pyx +68 -0
  14. sqlalchemy/cyextension/resultproxy.cp313t-win_amd64.pyd +0 -0
  15. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  16. sqlalchemy/cyextension/util.cp313t-win_amd64.pyd +0 -0
  17. sqlalchemy/cyextension/util.pyx +90 -0
  18. sqlalchemy/dialects/__init__.py +62 -0
  19. sqlalchemy/dialects/_typing.py +30 -0
  20. sqlalchemy/dialects/mssql/__init__.py +88 -0
  21. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  22. sqlalchemy/dialects/mssql/base.py +4093 -0
  23. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  24. sqlalchemy/dialects/mssql/json.py +129 -0
  25. sqlalchemy/dialects/mssql/provision.py +185 -0
  26. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  27. sqlalchemy/dialects/mssql/pyodbc.py +760 -0
  28. sqlalchemy/dialects/mysql/__init__.py +104 -0
  29. sqlalchemy/dialects/mysql/aiomysql.py +250 -0
  30. sqlalchemy/dialects/mysql/asyncmy.py +231 -0
  31. sqlalchemy/dialects/mysql/base.py +3949 -0
  32. sqlalchemy/dialects/mysql/cymysql.py +106 -0
  33. sqlalchemy/dialects/mysql/dml.py +225 -0
  34. sqlalchemy/dialects/mysql/enumerated.py +282 -0
  35. sqlalchemy/dialects/mysql/expression.py +146 -0
  36. sqlalchemy/dialects/mysql/json.py +91 -0
  37. sqlalchemy/dialects/mysql/mariadb.py +72 -0
  38. sqlalchemy/dialects/mysql/mariadbconnector.py +322 -0
  39. sqlalchemy/dialects/mysql/mysqlconnector.py +302 -0
  40. sqlalchemy/dialects/mysql/mysqldb.py +314 -0
  41. sqlalchemy/dialects/mysql/provision.py +153 -0
  42. sqlalchemy/dialects/mysql/pymysql.py +158 -0
  43. sqlalchemy/dialects/mysql/pyodbc.py +157 -0
  44. sqlalchemy/dialects/mysql/reflection.py +727 -0
  45. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  46. sqlalchemy/dialects/mysql/types.py +835 -0
  47. sqlalchemy/dialects/oracle/__init__.py +81 -0
  48. sqlalchemy/dialects/oracle/base.py +3802 -0
  49. sqlalchemy/dialects/oracle/cx_oracle.py +1555 -0
  50. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  51. sqlalchemy/dialects/oracle/oracledb.py +941 -0
  52. sqlalchemy/dialects/oracle/provision.py +297 -0
  53. sqlalchemy/dialects/oracle/types.py +316 -0
  54. sqlalchemy/dialects/oracle/vector.py +365 -0
  55. sqlalchemy/dialects/postgresql/__init__.py +167 -0
  56. sqlalchemy/dialects/postgresql/_psycopg_common.py +189 -0
  57. sqlalchemy/dialects/postgresql/array.py +519 -0
  58. sqlalchemy/dialects/postgresql/asyncpg.py +1284 -0
  59. sqlalchemy/dialects/postgresql/base.py +5378 -0
  60. sqlalchemy/dialects/postgresql/dml.py +339 -0
  61. sqlalchemy/dialects/postgresql/ext.py +540 -0
  62. sqlalchemy/dialects/postgresql/hstore.py +406 -0
  63. sqlalchemy/dialects/postgresql/json.py +404 -0
  64. sqlalchemy/dialects/postgresql/named_types.py +524 -0
  65. sqlalchemy/dialects/postgresql/operators.py +129 -0
  66. sqlalchemy/dialects/postgresql/pg8000.py +669 -0
  67. sqlalchemy/dialects/postgresql/pg_catalog.py +326 -0
  68. sqlalchemy/dialects/postgresql/provision.py +183 -0
  69. sqlalchemy/dialects/postgresql/psycopg.py +862 -0
  70. sqlalchemy/dialects/postgresql/psycopg2.py +892 -0
  71. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  72. sqlalchemy/dialects/postgresql/ranges.py +1031 -0
  73. sqlalchemy/dialects/postgresql/types.py +313 -0
  74. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  75. sqlalchemy/dialects/sqlite/aiosqlite.py +482 -0
  76. sqlalchemy/dialects/sqlite/base.py +3056 -0
  77. sqlalchemy/dialects/sqlite/dml.py +263 -0
  78. sqlalchemy/dialects/sqlite/json.py +92 -0
  79. sqlalchemy/dialects/sqlite/provision.py +229 -0
  80. sqlalchemy/dialects/sqlite/pysqlcipher.py +157 -0
  81. sqlalchemy/dialects/sqlite/pysqlite.py +756 -0
  82. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  83. sqlalchemy/engine/__init__.py +62 -0
  84. sqlalchemy/engine/_py_processors.py +136 -0
  85. sqlalchemy/engine/_py_row.py +128 -0
  86. sqlalchemy/engine/_py_util.py +74 -0
  87. sqlalchemy/engine/base.py +3390 -0
  88. sqlalchemy/engine/characteristics.py +155 -0
  89. sqlalchemy/engine/create.py +893 -0
  90. sqlalchemy/engine/cursor.py +2298 -0
  91. sqlalchemy/engine/default.py +2394 -0
  92. sqlalchemy/engine/events.py +965 -0
  93. sqlalchemy/engine/interfaces.py +3471 -0
  94. sqlalchemy/engine/mock.py +134 -0
  95. sqlalchemy/engine/processors.py +61 -0
  96. sqlalchemy/engine/reflection.py +2102 -0
  97. sqlalchemy/engine/result.py +2399 -0
  98. sqlalchemy/engine/row.py +400 -0
  99. sqlalchemy/engine/strategies.py +16 -0
  100. sqlalchemy/engine/url.py +924 -0
  101. sqlalchemy/engine/util.py +167 -0
  102. sqlalchemy/event/__init__.py +26 -0
  103. sqlalchemy/event/api.py +220 -0
  104. sqlalchemy/event/attr.py +676 -0
  105. sqlalchemy/event/base.py +472 -0
  106. sqlalchemy/event/legacy.py +258 -0
  107. sqlalchemy/event/registry.py +390 -0
  108. sqlalchemy/events.py +17 -0
  109. sqlalchemy/exc.py +832 -0
  110. sqlalchemy/ext/__init__.py +11 -0
  111. sqlalchemy/ext/associationproxy.py +2027 -0
  112. sqlalchemy/ext/asyncio/__init__.py +25 -0
  113. sqlalchemy/ext/asyncio/base.py +281 -0
  114. sqlalchemy/ext/asyncio/engine.py +1471 -0
  115. sqlalchemy/ext/asyncio/exc.py +21 -0
  116. sqlalchemy/ext/asyncio/result.py +965 -0
  117. sqlalchemy/ext/asyncio/scoping.py +1599 -0
  118. sqlalchemy/ext/asyncio/session.py +1947 -0
  119. sqlalchemy/ext/automap.py +1701 -0
  120. sqlalchemy/ext/baked.py +570 -0
  121. sqlalchemy/ext/compiler.py +600 -0
  122. sqlalchemy/ext/declarative/__init__.py +65 -0
  123. sqlalchemy/ext/declarative/extensions.py +564 -0
  124. sqlalchemy/ext/horizontal_shard.py +478 -0
  125. sqlalchemy/ext/hybrid.py +1535 -0
  126. sqlalchemy/ext/indexable.py +364 -0
  127. sqlalchemy/ext/instrumentation.py +450 -0
  128. sqlalchemy/ext/mutable.py +1085 -0
  129. sqlalchemy/ext/mypy/__init__.py +6 -0
  130. sqlalchemy/ext/mypy/apply.py +324 -0
  131. sqlalchemy/ext/mypy/decl_class.py +515 -0
  132. sqlalchemy/ext/mypy/infer.py +590 -0
  133. sqlalchemy/ext/mypy/names.py +335 -0
  134. sqlalchemy/ext/mypy/plugin.py +303 -0
  135. sqlalchemy/ext/mypy/util.py +357 -0
  136. sqlalchemy/ext/orderinglist.py +439 -0
  137. sqlalchemy/ext/serializer.py +185 -0
  138. sqlalchemy/future/__init__.py +16 -0
  139. sqlalchemy/future/engine.py +15 -0
  140. sqlalchemy/inspection.py +174 -0
  141. sqlalchemy/log.py +288 -0
  142. sqlalchemy/orm/__init__.py +171 -0
  143. sqlalchemy/orm/_orm_constructors.py +2661 -0
  144. sqlalchemy/orm/_typing.py +179 -0
  145. sqlalchemy/orm/attributes.py +2845 -0
  146. sqlalchemy/orm/base.py +971 -0
  147. sqlalchemy/orm/bulk_persistence.py +2135 -0
  148. sqlalchemy/orm/clsregistry.py +571 -0
  149. sqlalchemy/orm/collections.py +1627 -0
  150. sqlalchemy/orm/context.py +3334 -0
  151. sqlalchemy/orm/decl_api.py +2004 -0
  152. sqlalchemy/orm/decl_base.py +2192 -0
  153. sqlalchemy/orm/dependency.py +1302 -0
  154. sqlalchemy/orm/descriptor_props.py +1092 -0
  155. sqlalchemy/orm/dynamic.py +300 -0
  156. sqlalchemy/orm/evaluator.py +379 -0
  157. sqlalchemy/orm/events.py +3252 -0
  158. sqlalchemy/orm/exc.py +237 -0
  159. sqlalchemy/orm/identity.py +302 -0
  160. sqlalchemy/orm/instrumentation.py +754 -0
  161. sqlalchemy/orm/interfaces.py +1496 -0
  162. sqlalchemy/orm/loading.py +1686 -0
  163. sqlalchemy/orm/mapped_collection.py +557 -0
  164. sqlalchemy/orm/mapper.py +4444 -0
  165. sqlalchemy/orm/path_registry.py +809 -0
  166. sqlalchemy/orm/persistence.py +1788 -0
  167. sqlalchemy/orm/properties.py +935 -0
  168. sqlalchemy/orm/query.py +3459 -0
  169. sqlalchemy/orm/relationships.py +3508 -0
  170. sqlalchemy/orm/scoping.py +2148 -0
  171. sqlalchemy/orm/session.py +5280 -0
  172. sqlalchemy/orm/state.py +1168 -0
  173. sqlalchemy/orm/state_changes.py +196 -0
  174. sqlalchemy/orm/strategies.py +3470 -0
  175. sqlalchemy/orm/strategy_options.py +2568 -0
  176. sqlalchemy/orm/sync.py +164 -0
  177. sqlalchemy/orm/unitofwork.py +796 -0
  178. sqlalchemy/orm/util.py +2403 -0
  179. sqlalchemy/orm/writeonly.py +674 -0
  180. sqlalchemy/pool/__init__.py +44 -0
  181. sqlalchemy/pool/base.py +1524 -0
  182. sqlalchemy/pool/events.py +375 -0
  183. sqlalchemy/pool/impl.py +588 -0
  184. sqlalchemy/py.typed +0 -0
  185. sqlalchemy/schema.py +69 -0
  186. sqlalchemy/sql/__init__.py +145 -0
  187. sqlalchemy/sql/_dml_constructors.py +132 -0
  188. sqlalchemy/sql/_elements_constructors.py +1872 -0
  189. sqlalchemy/sql/_orm_types.py +20 -0
  190. sqlalchemy/sql/_py_util.py +75 -0
  191. sqlalchemy/sql/_selectable_constructors.py +763 -0
  192. sqlalchemy/sql/_typing.py +482 -0
  193. sqlalchemy/sql/annotation.py +587 -0
  194. sqlalchemy/sql/base.py +2293 -0
  195. sqlalchemy/sql/cache_key.py +1057 -0
  196. sqlalchemy/sql/coercions.py +1404 -0
  197. sqlalchemy/sql/compiler.py +8081 -0
  198. sqlalchemy/sql/crud.py +1752 -0
  199. sqlalchemy/sql/ddl.py +1444 -0
  200. sqlalchemy/sql/default_comparator.py +551 -0
  201. sqlalchemy/sql/dml.py +1850 -0
  202. sqlalchemy/sql/elements.py +5589 -0
  203. sqlalchemy/sql/events.py +458 -0
  204. sqlalchemy/sql/expression.py +159 -0
  205. sqlalchemy/sql/functions.py +2158 -0
  206. sqlalchemy/sql/lambdas.py +1442 -0
  207. sqlalchemy/sql/naming.py +209 -0
  208. sqlalchemy/sql/operators.py +2623 -0
  209. sqlalchemy/sql/roles.py +323 -0
  210. sqlalchemy/sql/schema.py +6222 -0
  211. sqlalchemy/sql/selectable.py +7265 -0
  212. sqlalchemy/sql/sqltypes.py +3930 -0
  213. sqlalchemy/sql/traversals.py +1024 -0
  214. sqlalchemy/sql/type_api.py +2368 -0
  215. sqlalchemy/sql/util.py +1485 -0
  216. sqlalchemy/sql/visitors.py +1164 -0
  217. sqlalchemy/testing/__init__.py +96 -0
  218. sqlalchemy/testing/assertions.py +994 -0
  219. sqlalchemy/testing/assertsql.py +520 -0
  220. sqlalchemy/testing/asyncio.py +135 -0
  221. sqlalchemy/testing/config.py +434 -0
  222. sqlalchemy/testing/engines.py +483 -0
  223. sqlalchemy/testing/entities.py +117 -0
  224. sqlalchemy/testing/exclusions.py +476 -0
  225. sqlalchemy/testing/fixtures/__init__.py +28 -0
  226. sqlalchemy/testing/fixtures/base.py +384 -0
  227. sqlalchemy/testing/fixtures/mypy.py +332 -0
  228. sqlalchemy/testing/fixtures/orm.py +227 -0
  229. sqlalchemy/testing/fixtures/sql.py +482 -0
  230. sqlalchemy/testing/pickleable.py +155 -0
  231. sqlalchemy/testing/plugin/__init__.py +6 -0
  232. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  233. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  234. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  235. sqlalchemy/testing/profiling.py +329 -0
  236. sqlalchemy/testing/provision.py +603 -0
  237. sqlalchemy/testing/requirements.py +1945 -0
  238. sqlalchemy/testing/schema.py +198 -0
  239. sqlalchemy/testing/suite/__init__.py +19 -0
  240. sqlalchemy/testing/suite/test_cte.py +237 -0
  241. sqlalchemy/testing/suite/test_ddl.py +389 -0
  242. sqlalchemy/testing/suite/test_deprecations.py +153 -0
  243. sqlalchemy/testing/suite/test_dialect.py +776 -0
  244. sqlalchemy/testing/suite/test_insert.py +630 -0
  245. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  246. sqlalchemy/testing/suite/test_results.py +504 -0
  247. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  248. sqlalchemy/testing/suite/test_select.py +2010 -0
  249. sqlalchemy/testing/suite/test_sequence.py +317 -0
  250. sqlalchemy/testing/suite/test_types.py +2147 -0
  251. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  252. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  253. sqlalchemy/testing/util.py +535 -0
  254. sqlalchemy/testing/warnings.py +52 -0
  255. sqlalchemy/types.py +74 -0
  256. sqlalchemy/util/__init__.py +162 -0
  257. sqlalchemy/util/_collections.py +712 -0
  258. sqlalchemy/util/_concurrency_py3k.py +288 -0
  259. sqlalchemy/util/_has_cy.py +40 -0
  260. sqlalchemy/util/_py_collections.py +541 -0
  261. sqlalchemy/util/compat.py +421 -0
  262. sqlalchemy/util/concurrency.py +110 -0
  263. sqlalchemy/util/deprecations.py +401 -0
  264. sqlalchemy/util/langhelpers.py +2203 -0
  265. sqlalchemy/util/preloaded.py +150 -0
  266. sqlalchemy/util/queue.py +322 -0
  267. sqlalchemy/util/tool_support.py +201 -0
  268. sqlalchemy/util/topological.py +120 -0
  269. sqlalchemy/util/typing.py +734 -0
  270. sqlalchemy-2.0.47.dist-info/METADATA +243 -0
  271. sqlalchemy-2.0.47.dist-info/RECORD +274 -0
  272. sqlalchemy-2.0.47.dist-info/WHEEL +5 -0
  273. sqlalchemy-2.0.47.dist-info/licenses/LICENSE +19 -0
  274. sqlalchemy-2.0.47.dist-info/top_level.txt +1 -0
@@ -0,0 +1,482 @@
1
+ # sql/_typing.py
2
+ # Copyright (C) 2022-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
+ import operator
11
+ from typing import Any
12
+ from typing import Callable
13
+ from typing import Dict
14
+ from typing import Generic
15
+ from typing import Iterable
16
+ from typing import Mapping
17
+ from typing import NoReturn
18
+ from typing import Optional
19
+ from typing import overload
20
+ from typing import Set
21
+ from typing import Tuple
22
+ from typing import Type
23
+ from typing import TYPE_CHECKING
24
+ from typing import TypeVar
25
+ from typing import Union
26
+
27
+ from . import roles
28
+ from .. import exc
29
+ from .. import util
30
+ from ..inspection import Inspectable
31
+ from ..util.typing import Literal
32
+ from ..util.typing import Protocol
33
+ from ..util.typing import TypeAlias
34
+
35
+ if TYPE_CHECKING:
36
+ from datetime import date
37
+ from datetime import datetime
38
+ from datetime import time
39
+ from datetime import timedelta
40
+ from decimal import Decimal
41
+ from uuid import UUID
42
+
43
+ from .base import Executable
44
+ from .compiler import Compiled
45
+ from .compiler import DDLCompiler
46
+ from .compiler import SQLCompiler
47
+ from .dml import UpdateBase
48
+ from .dml import ValuesBase
49
+ from .elements import ClauseElement
50
+ from .elements import ColumnElement
51
+ from .elements import KeyedColumnElement
52
+ from .elements import quoted_name
53
+ from .elements import SQLCoreOperations
54
+ from .elements import TextClause
55
+ from .lambdas import LambdaElement
56
+ from .roles import FromClauseRole
57
+ from .schema import Column
58
+ from .selectable import Alias
59
+ from .selectable import CompoundSelect
60
+ from .selectable import CTE
61
+ from .selectable import FromClause
62
+ from .selectable import Join
63
+ from .selectable import NamedFromClause
64
+ from .selectable import ReturnsRows
65
+ from .selectable import Select
66
+ from .selectable import Selectable
67
+ from .selectable import SelectBase
68
+ from .selectable import Subquery
69
+ from .selectable import TableClause
70
+ from .sqltypes import TableValueType
71
+ from .sqltypes import TupleType
72
+ from .type_api import TypeEngine
73
+ from ..engine import Connection
74
+ from ..engine import Dialect
75
+ from ..engine import Engine
76
+ from ..engine.mock import MockConnection
77
+ from ..util.typing import TypeGuard
78
+
79
+ _T = TypeVar("_T", bound=Any)
80
+ _T_co = TypeVar("_T_co", bound=Any, covariant=True)
81
+
82
+
83
+ _CE = TypeVar("_CE", bound="ColumnElement[Any]")
84
+
85
+ _CLE = TypeVar("_CLE", bound="ClauseElement")
86
+
87
+
88
+ class _HasClauseElement(Protocol, Generic[_T_co]):
89
+ """indicates a class that has a __clause_element__() method"""
90
+
91
+ def __clause_element__(self) -> roles.ExpressionElementRole[_T_co]: ...
92
+
93
+
94
+ class _CoreAdapterProto(Protocol):
95
+ """protocol for the ClauseAdapter/ColumnAdapter.traverse() method."""
96
+
97
+ def __call__(self, obj: _CE) -> _CE: ...
98
+
99
+
100
+ class _HasDialect(Protocol):
101
+ """protocol for Engine/Connection-like objects that have dialect
102
+ attribute.
103
+ """
104
+
105
+ @property
106
+ def dialect(self) -> Dialect: ...
107
+
108
+
109
+ # match column types that are not ORM entities
110
+ _NOT_ENTITY = TypeVar(
111
+ "_NOT_ENTITY",
112
+ int,
113
+ str,
114
+ bool,
115
+ "datetime",
116
+ "date",
117
+ "time",
118
+ "timedelta",
119
+ "UUID",
120
+ float,
121
+ "Decimal",
122
+ )
123
+
124
+ _StarOrOne = Literal["*", 1]
125
+
126
+ _MAYBE_ENTITY = TypeVar(
127
+ "_MAYBE_ENTITY",
128
+ roles.ColumnsClauseRole,
129
+ _StarOrOne,
130
+ Type[Any],
131
+ Inspectable[_HasClauseElement[Any]],
132
+ _HasClauseElement[Any],
133
+ )
134
+
135
+
136
+ # convention:
137
+ # XYZArgument - something that the end user is passing to a public API method
138
+ # XYZElement - the internal representation that we use for the thing.
139
+ # the coercions system is responsible for converting from XYZArgument to
140
+ # XYZElement.
141
+
142
+ _TextCoercedExpressionArgument = Union[
143
+ str,
144
+ "TextClause",
145
+ "ColumnElement[_T]",
146
+ _HasClauseElement[_T],
147
+ roles.ExpressionElementRole[_T],
148
+ ]
149
+
150
+ _ColumnsClauseArgument = Union[
151
+ roles.TypedColumnsClauseRole[_T],
152
+ roles.ColumnsClauseRole,
153
+ "SQLCoreOperations[_T]",
154
+ _StarOrOne,
155
+ Type[_T],
156
+ Inspectable[_HasClauseElement[_T]],
157
+ _HasClauseElement[_T],
158
+ ]
159
+ """open-ended SELECT columns clause argument.
160
+
161
+ Includes column expressions, tables, ORM mapped entities, a few literal values.
162
+
163
+ This type is used for lists of columns / entities to be returned in result
164
+ sets; select(...), insert().returning(...), etc.
165
+
166
+
167
+ """
168
+
169
+ _TypedColumnClauseArgument = Union[
170
+ roles.TypedColumnsClauseRole[_T],
171
+ "SQLCoreOperations[_T]",
172
+ Type[_T],
173
+ ]
174
+
175
+ _TP = TypeVar("_TP", bound=Tuple[Any, ...])
176
+
177
+ _T0 = TypeVar("_T0", bound=Any)
178
+ _T1 = TypeVar("_T1", bound=Any)
179
+ _T2 = TypeVar("_T2", bound=Any)
180
+ _T3 = TypeVar("_T3", bound=Any)
181
+ _T4 = TypeVar("_T4", bound=Any)
182
+ _T5 = TypeVar("_T5", bound=Any)
183
+ _T6 = TypeVar("_T6", bound=Any)
184
+ _T7 = TypeVar("_T7", bound=Any)
185
+ _T8 = TypeVar("_T8", bound=Any)
186
+ _T9 = TypeVar("_T9", bound=Any)
187
+
188
+
189
+ _OnlyColumnArgument = Union[
190
+ "ColumnElement[_T]",
191
+ _HasClauseElement[_T],
192
+ roles.DMLColumnRole,
193
+ ]
194
+ """A narrow type that is looking for a ColumnClause (e.g. table column with a
195
+ name) or an ORM element that produces this.
196
+
197
+ This is used for constructs that need a named column to represent a
198
+ position in a selectable, like TextClause().columns() or values(...).
199
+
200
+ """
201
+
202
+ _ColumnExpressionArgument = Union[
203
+ "ColumnElement[_T]",
204
+ _HasClauseElement[_T],
205
+ "SQLCoreOperations[_T]",
206
+ roles.ExpressionElementRole[_T],
207
+ roles.TypedColumnsClauseRole[_T],
208
+ Callable[[], "ColumnElement[_T]"],
209
+ "LambdaElement",
210
+ ]
211
+ "See docs in public alias ColumnExpressionArgument."
212
+
213
+ ColumnExpressionArgument: TypeAlias = _ColumnExpressionArgument[_T]
214
+ """Narrower "column expression" argument.
215
+
216
+ This type is used for all the other "column" kinds of expressions that
217
+ typically represent a single SQL column expression, not a set of columns the
218
+ way a table or ORM entity does.
219
+
220
+ This includes ColumnElement, or ORM-mapped attributes that will have a
221
+ ``__clause_element__()`` method, it also has the ExpressionElementRole
222
+ overall which brings in the TextClause object also.
223
+
224
+ .. versionadded:: 2.0.13
225
+
226
+ """
227
+
228
+ _ColumnExpressionOrLiteralArgument = Union[Any, _ColumnExpressionArgument[_T]]
229
+
230
+ _ColumnExpressionOrStrLabelArgument = Union[str, _ColumnExpressionArgument[_T]]
231
+
232
+ _ByArgument = Union[
233
+ Iterable[_ColumnExpressionOrStrLabelArgument[Any]],
234
+ _ColumnExpressionOrStrLabelArgument[Any],
235
+ ]
236
+ """Used for keyword-based ``order_by`` and ``partition_by`` parameters."""
237
+
238
+
239
+ _InfoType = Dict[Any, Any]
240
+ """the .info dictionary accepted and used throughout Core /ORM"""
241
+
242
+ _FromClauseArgument = Union[
243
+ roles.FromClauseRole,
244
+ roles.TypedColumnsClauseRole[Any],
245
+ Type[Any],
246
+ Inspectable[_HasClauseElement[Any]],
247
+ _HasClauseElement[Any],
248
+ ]
249
+ """A FROM clause, like we would send to select().select_from().
250
+
251
+ Also accommodates ORM entities and related constructs.
252
+
253
+ """
254
+
255
+ _JoinTargetArgument = Union[_FromClauseArgument, roles.JoinTargetRole]
256
+ """target for join() builds on _FromClauseArgument to include additional
257
+ join target roles such as those which come from the ORM.
258
+
259
+ """
260
+
261
+ _OnClauseArgument = Union[_ColumnExpressionArgument[Any], roles.OnClauseRole]
262
+ """target for an ON clause, includes additional roles such as those which
263
+ come from the ORM.
264
+
265
+ """
266
+
267
+ _SelectStatementForCompoundArgument = Union[
268
+ "Select[_TP]",
269
+ "CompoundSelect[_TP]",
270
+ roles.CompoundElementRole,
271
+ ]
272
+ """SELECT statement acceptable by ``union()`` and other SQL set operations"""
273
+
274
+ _DMLColumnArgument = Union[
275
+ str,
276
+ _HasClauseElement[Any],
277
+ roles.DMLColumnRole,
278
+ "SQLCoreOperations[Any]",
279
+ ]
280
+ """A DML column expression. This is a "key" inside of insert().values(),
281
+ update().values(), and related.
282
+
283
+ These are usually strings or SQL table columns.
284
+
285
+ There's also edge cases like JSON expression assignment, which we would want
286
+ the DMLColumnRole to be able to accommodate.
287
+
288
+ """
289
+
290
+ _DMLKey = TypeVar("_DMLKey", bound=_DMLColumnArgument)
291
+ _DMLColumnKeyMapping = Mapping[_DMLKey, Any]
292
+
293
+
294
+ _DDLColumnArgument = Union[str, "Column[Any]", roles.DDLConstraintColumnRole]
295
+ """DDL column.
296
+
297
+ used for :class:`.PrimaryKeyConstraint`, :class:`.UniqueConstraint`, etc.
298
+
299
+ """
300
+
301
+ _DMLTableArgument = Union[
302
+ "TableClause",
303
+ "Join",
304
+ "Alias",
305
+ "CTE",
306
+ Type[Any],
307
+ Inspectable[_HasClauseElement[Any]],
308
+ _HasClauseElement[Any],
309
+ ]
310
+
311
+ _PropagateAttrsType = util.immutabledict[str, Any]
312
+
313
+ _TypeEngineArgument = Union[Type["TypeEngine[_T]"], "TypeEngine[_T]"]
314
+
315
+ _EquivalentColumnMap = Dict["ColumnElement[Any]", Set["ColumnElement[Any]"]]
316
+
317
+ _LimitOffsetType = Union[int, _ColumnExpressionArgument[int], None]
318
+
319
+ _AutoIncrementType = Union[bool, Literal["auto", "ignore_fk"]]
320
+
321
+ _CreateDropBind = Union["Engine", "Connection", "MockConnection"]
322
+
323
+ if TYPE_CHECKING:
324
+
325
+ def is_sql_compiler(c: Compiled) -> TypeGuard[SQLCompiler]: ...
326
+
327
+ def is_ddl_compiler(c: Compiled) -> TypeGuard[DDLCompiler]: ...
328
+
329
+ def is_named_from_clause(
330
+ t: FromClauseRole,
331
+ ) -> TypeGuard[NamedFromClause]: ...
332
+
333
+ def is_column_element(
334
+ c: ClauseElement,
335
+ ) -> TypeGuard[ColumnElement[Any]]: ...
336
+
337
+ def is_keyed_column_element(
338
+ c: ClauseElement,
339
+ ) -> TypeGuard[KeyedColumnElement[Any]]: ...
340
+
341
+ def is_text_clause(c: ClauseElement) -> TypeGuard[TextClause]: ...
342
+
343
+ def is_from_clause(c: ClauseElement) -> TypeGuard[FromClause]: ...
344
+
345
+ def is_tuple_type(t: TypeEngine[Any]) -> TypeGuard[TupleType]: ...
346
+
347
+ def is_table_value_type(
348
+ t: TypeEngine[Any],
349
+ ) -> TypeGuard[TableValueType]: ...
350
+
351
+ def is_selectable(t: Any) -> TypeGuard[Selectable]: ...
352
+
353
+ def is_select_base(
354
+ t: Union[Executable, ReturnsRows],
355
+ ) -> TypeGuard[SelectBase]: ...
356
+
357
+ def is_select_statement(
358
+ t: Union[Executable, ReturnsRows],
359
+ ) -> TypeGuard[Select[Any]]: ...
360
+
361
+ def is_table(t: FromClause) -> TypeGuard[TableClause]: ...
362
+
363
+ def is_subquery(t: FromClause) -> TypeGuard[Subquery]: ...
364
+
365
+ def is_dml(c: ClauseElement) -> TypeGuard[UpdateBase]: ...
366
+
367
+ else:
368
+ is_sql_compiler = operator.attrgetter("is_sql")
369
+ is_ddl_compiler = operator.attrgetter("is_ddl")
370
+ is_named_from_clause = operator.attrgetter("named_with_column")
371
+ is_column_element = operator.attrgetter("_is_column_element")
372
+ is_keyed_column_element = operator.attrgetter("_is_keyed_column_element")
373
+ is_text_clause = operator.attrgetter("_is_text_clause")
374
+ is_from_clause = operator.attrgetter("_is_from_clause")
375
+ is_tuple_type = operator.attrgetter("_is_tuple_type")
376
+ is_table_value_type = operator.attrgetter("_is_table_value")
377
+ is_selectable = operator.attrgetter("is_selectable")
378
+ is_select_base = operator.attrgetter("_is_select_base")
379
+ is_select_statement = operator.attrgetter("_is_select_statement")
380
+ is_table = operator.attrgetter("_is_table")
381
+ is_subquery = operator.attrgetter("_is_subquery")
382
+ is_dml = operator.attrgetter("is_dml")
383
+
384
+
385
+ def has_schema_attr(t: FromClauseRole) -> TypeGuard[TableClause]:
386
+ return hasattr(t, "schema")
387
+
388
+
389
+ def is_quoted_name(s: str) -> TypeGuard[quoted_name]:
390
+ return hasattr(s, "quote")
391
+
392
+
393
+ def is_has_clause_element(s: object) -> TypeGuard[_HasClauseElement[Any]]:
394
+ return hasattr(s, "__clause_element__")
395
+
396
+
397
+ def is_insert_update(c: ClauseElement) -> TypeGuard[ValuesBase]:
398
+ return c.is_dml and (c.is_insert or c.is_update) # type: ignore
399
+
400
+
401
+ def _no_kw() -> exc.ArgumentError:
402
+ return exc.ArgumentError(
403
+ "Additional keyword arguments are not accepted by this "
404
+ "function/method. The presence of **kw is for pep-484 typing purposes"
405
+ )
406
+
407
+
408
+ def _unexpected_kw(methname: str, kw: Dict[str, Any]) -> NoReturn:
409
+ k = list(kw)[0]
410
+ raise TypeError(f"{methname} got an unexpected keyword argument '{k}'")
411
+
412
+
413
+ @overload
414
+ def Nullable(
415
+ val: "SQLCoreOperations[_T]",
416
+ ) -> "SQLCoreOperations[Optional[_T]]": ...
417
+
418
+
419
+ @overload
420
+ def Nullable(
421
+ val: roles.ExpressionElementRole[_T],
422
+ ) -> roles.ExpressionElementRole[Optional[_T]]: ...
423
+
424
+
425
+ @overload
426
+ def Nullable(val: Type[_T]) -> Type[Optional[_T]]: ...
427
+
428
+
429
+ def Nullable(
430
+ val: _TypedColumnClauseArgument[_T],
431
+ ) -> _TypedColumnClauseArgument[Optional[_T]]:
432
+ """Types a column or ORM class as nullable.
433
+
434
+ This can be used in select and other contexts to express that the value of
435
+ a column can be null, for example due to an outer join::
436
+
437
+ stmt1 = select(A, Nullable(B)).outerjoin(A.bs)
438
+ stmt2 = select(A.data, Nullable(B.data)).outerjoin(A.bs)
439
+
440
+ At runtime this method returns the input unchanged.
441
+
442
+ .. versionadded:: 2.0.20
443
+ """
444
+ return val
445
+
446
+
447
+ @overload
448
+ def NotNullable(
449
+ val: "SQLCoreOperations[Optional[_T]]",
450
+ ) -> "SQLCoreOperations[_T]": ...
451
+
452
+
453
+ @overload
454
+ def NotNullable(
455
+ val: roles.ExpressionElementRole[Optional[_T]],
456
+ ) -> roles.ExpressionElementRole[_T]: ...
457
+
458
+
459
+ @overload
460
+ def NotNullable(val: Type[Optional[_T]]) -> Type[_T]: ...
461
+
462
+
463
+ @overload
464
+ def NotNullable(val: Optional[Type[_T]]) -> Type[_T]: ...
465
+
466
+
467
+ def NotNullable(
468
+ val: Union[_TypedColumnClauseArgument[Optional[_T]], Optional[Type[_T]]],
469
+ ) -> _TypedColumnClauseArgument[_T]:
470
+ """Types a column or ORM class as not nullable.
471
+
472
+ This can be used in select and other contexts to express that the value of
473
+ a column cannot be null, for example due to a where condition on a
474
+ nullable column::
475
+
476
+ stmt = select(NotNullable(A.value)).where(A.value.is_not(None))
477
+
478
+ At runtime this method returns the input unchanged.
479
+
480
+ .. versionadded:: 2.0.20
481
+ """
482
+ return val # type: ignore