SQLAlchemy 2.1.0b2__cp313-cp313t-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 (270) hide show
  1. sqlalchemy/__init__.py +298 -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 +250 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +30 -0
  8. sqlalchemy/dialects/mssql/__init__.py +89 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4166 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +698 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +226 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +214 -0
  21. sqlalchemy/dialects/mysql/base.py +3877 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +106 -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 +330 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +312 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +157 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +156 -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 +3977 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +158 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +909 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +368 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +171 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
  50. sqlalchemy/dialects/postgresql/base.py +5789 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +593 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +423 -0
  55. sqlalchemy/dialects/postgresql/json.py +408 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +521 -0
  57. sqlalchemy/dialects/postgresql/operators.py +130 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +670 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
  60. sqlalchemy/dialects/postgresql/provision.py +184 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +799 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
  68. sqlalchemy/dialects/sqlite/base.py +3063 -0
  69. sqlalchemy/dialects/sqlite/dml.py +279 -0
  70. sqlalchemy/dialects/sqlite/json.py +100 -0
  71. sqlalchemy/dialects/sqlite/provision.py +229 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +633 -0
  80. sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3354 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2421 -0
  88. sqlalchemy/engine/default.py +2402 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3495 -0
  91. sqlalchemy/engine/mock.py +134 -0
  92. sqlalchemy/engine/processors.py +82 -0
  93. sqlalchemy/engine/reflection.py +2100 -0
  94. sqlalchemy/engine/result.py +1966 -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 +156 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +674 -0
  102. sqlalchemy/event/base.py +472 -0
  103. sqlalchemy/event/legacy.py +258 -0
  104. sqlalchemy/event/registry.py +390 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +922 -0
  107. sqlalchemy/ext/__init__.py +11 -0
  108. sqlalchemy/ext/associationproxy.py +2072 -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 +2007 -0
  116. sqlalchemy/ext/automap.py +1701 -0
  117. sqlalchemy/ext/baked.py +559 -0
  118. sqlalchemy/ext/compiler.py +600 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +560 -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 +439 -0
  127. sqlalchemy/ext/serializer.py +185 -0
  128. sqlalchemy/future/__init__.py +16 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +174 -0
  131. sqlalchemy/log.py +283 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +179 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +976 -0
  137. sqlalchemy/orm/bulk_persistence.py +2152 -0
  138. sqlalchemy/orm/clsregistry.py +582 -0
  139. sqlalchemy/orm/collections.py +1568 -0
  140. sqlalchemy/orm/context.py +3471 -0
  141. sqlalchemy/orm/decl_api.py +2280 -0
  142. sqlalchemy/orm/decl_base.py +2309 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +307 -0
  146. sqlalchemy/orm/evaluator.py +379 -0
  147. sqlalchemy/orm/events.py +3386 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +746 -0
  151. sqlalchemy/orm/interfaces.py +1589 -0
  152. sqlalchemy/orm/loading.py +1684 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4411 -0
  155. sqlalchemy/orm/path_registry.py +829 -0
  156. sqlalchemy/orm/persistence.py +1789 -0
  157. sqlalchemy/orm/properties.py +973 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3570 -0
  160. sqlalchemy/orm/scoping.py +2232 -0
  161. sqlalchemy/orm/session.py +5403 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3492 -0
  165. sqlalchemy/orm/strategy_options.py +2562 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +798 -0
  168. sqlalchemy/orm/util.py +2438 -0
  169. sqlalchemy/orm/writeonly.py +694 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1522 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +582 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +74 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +397 -0
  178. sqlalchemy/sql/_dml_constructors.py +132 -0
  179. sqlalchemy/sql/_elements_constructors.py +2164 -0
  180. sqlalchemy/sql/_orm_types.py +20 -0
  181. sqlalchemy/sql/_selectable_constructors.py +840 -0
  182. sqlalchemy/sql/_typing.py +487 -0
  183. sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
  184. sqlalchemy/sql/_util_cy.py +127 -0
  185. sqlalchemy/sql/annotation.py +590 -0
  186. sqlalchemy/sql/base.py +2699 -0
  187. sqlalchemy/sql/cache_key.py +1066 -0
  188. sqlalchemy/sql/coercions.py +1373 -0
  189. sqlalchemy/sql/compiler.py +8327 -0
  190. sqlalchemy/sql/crud.py +1815 -0
  191. sqlalchemy/sql/ddl.py +1928 -0
  192. sqlalchemy/sql/default_comparator.py +654 -0
  193. sqlalchemy/sql/dml.py +1977 -0
  194. sqlalchemy/sql/elements.py +6033 -0
  195. sqlalchemy/sql/events.py +458 -0
  196. sqlalchemy/sql/expression.py +172 -0
  197. sqlalchemy/sql/functions.py +2305 -0
  198. sqlalchemy/sql/lambdas.py +1443 -0
  199. sqlalchemy/sql/naming.py +209 -0
  200. sqlalchemy/sql/operators.py +2897 -0
  201. sqlalchemy/sql/roles.py +332 -0
  202. sqlalchemy/sql/schema.py +6703 -0
  203. sqlalchemy/sql/selectable.py +7553 -0
  204. sqlalchemy/sql/sqltypes.py +4093 -0
  205. sqlalchemy/sql/traversals.py +1042 -0
  206. sqlalchemy/sql/type_api.py +2446 -0
  207. sqlalchemy/sql/util.py +1495 -0
  208. sqlalchemy/sql/visitors.py +1157 -0
  209. sqlalchemy/testing/__init__.py +96 -0
  210. sqlalchemy/testing/assertions.py +1007 -0
  211. sqlalchemy/testing/assertsql.py +519 -0
  212. sqlalchemy/testing/asyncio.py +128 -0
  213. sqlalchemy/testing/config.py +440 -0
  214. sqlalchemy/testing/engines.py +483 -0
  215. sqlalchemy/testing/entities.py +117 -0
  216. sqlalchemy/testing/exclusions.py +476 -0
  217. sqlalchemy/testing/fixtures/__init__.py +30 -0
  218. sqlalchemy/testing/fixtures/base.py +384 -0
  219. sqlalchemy/testing/fixtures/mypy.py +247 -0
  220. sqlalchemy/testing/fixtures/orm.py +227 -0
  221. sqlalchemy/testing/fixtures/sql.py +538 -0
  222. sqlalchemy/testing/pickleable.py +155 -0
  223. sqlalchemy/testing/plugin/__init__.py +6 -0
  224. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  225. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  226. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  227. sqlalchemy/testing/profiling.py +329 -0
  228. sqlalchemy/testing/provision.py +613 -0
  229. sqlalchemy/testing/requirements.py +1978 -0
  230. sqlalchemy/testing/schema.py +198 -0
  231. sqlalchemy/testing/suite/__init__.py +19 -0
  232. sqlalchemy/testing/suite/test_cte.py +237 -0
  233. sqlalchemy/testing/suite/test_ddl.py +420 -0
  234. sqlalchemy/testing/suite/test_dialect.py +776 -0
  235. sqlalchemy/testing/suite/test_insert.py +630 -0
  236. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  237. sqlalchemy/testing/suite/test_results.py +660 -0
  238. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  239. sqlalchemy/testing/suite/test_select.py +2112 -0
  240. sqlalchemy/testing/suite/test_sequence.py +317 -0
  241. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  242. sqlalchemy/testing/suite/test_types.py +2271 -0
  243. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  244. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  245. sqlalchemy/testing/util.py +535 -0
  246. sqlalchemy/testing/warnings.py +52 -0
  247. sqlalchemy/types.py +76 -0
  248. sqlalchemy/util/__init__.py +158 -0
  249. sqlalchemy/util/_collections.py +688 -0
  250. sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
  251. sqlalchemy/util/_collections_cy.pxd +8 -0
  252. sqlalchemy/util/_collections_cy.py +516 -0
  253. sqlalchemy/util/_has_cython.py +46 -0
  254. sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
  255. sqlalchemy/util/_immutabledict_cy.py +240 -0
  256. sqlalchemy/util/compat.py +299 -0
  257. sqlalchemy/util/concurrency.py +322 -0
  258. sqlalchemy/util/cython.py +79 -0
  259. sqlalchemy/util/deprecations.py +401 -0
  260. sqlalchemy/util/langhelpers.py +2320 -0
  261. sqlalchemy/util/preloaded.py +152 -0
  262. sqlalchemy/util/queue.py +304 -0
  263. sqlalchemy/util/tool_support.py +201 -0
  264. sqlalchemy/util/topological.py +120 -0
  265. sqlalchemy/util/typing.py +711 -0
  266. sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
  267. sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
  268. sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
  269. sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
  270. sqlalchemy-2.1.0b2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,388 @@
1
+ # dialects/postgresql/types.py
2
+ # Copyright (C) 2013-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
+ from __future__ import annotations
8
+
9
+ import datetime as dt
10
+ from typing import Any
11
+ from typing import Literal
12
+ from typing import Optional
13
+ from typing import overload
14
+ from typing import Type
15
+ from typing import TYPE_CHECKING
16
+ from uuid import UUID as _python_UUID
17
+
18
+ from .bitstring import BitString
19
+ from ...sql import sqltypes
20
+ from ...sql import type_api
21
+ from ...sql.type_api import TypeEngine
22
+ from ...types import OperatorClass
23
+
24
+ if TYPE_CHECKING:
25
+ from ...engine.interfaces import Dialect
26
+ from ...sql.operators import ColumnOperators
27
+ from ...sql.operators import OperatorType
28
+ from ...sql.type_api import _BindProcessorType
29
+ from ...sql.type_api import _LiteralProcessorType
30
+ from ...sql.type_api import _ResultProcessorType
31
+
32
+ _DECIMAL_TYPES = (1231, 1700)
33
+ _FLOAT_TYPES = (700, 701, 1021, 1022)
34
+ _INT_TYPES = (20, 21, 23, 26, 1005, 1007, 1016)
35
+
36
+
37
+ class PGUuid(sqltypes.UUID[sqltypes._UUID_RETURN]):
38
+ render_bind_cast = True
39
+ render_literal_cast = True
40
+
41
+ if TYPE_CHECKING:
42
+
43
+ @overload
44
+ def __init__(
45
+ self: PGUuid[_python_UUID], as_uuid: Literal[True] = ...
46
+ ) -> None: ...
47
+
48
+ @overload
49
+ def __init__(
50
+ self: PGUuid[str], as_uuid: Literal[False] = ...
51
+ ) -> None: ...
52
+
53
+ def __init__(self, as_uuid: bool = True) -> None: ...
54
+
55
+
56
+ class BYTEA(sqltypes.LargeBinary):
57
+ __visit_name__ = "BYTEA"
58
+
59
+
60
+ class _NetworkAddressTypeMixin:
61
+ operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
62
+
63
+ def coerce_compared_value(
64
+ self, op: Optional[OperatorType], value: Any
65
+ ) -> TypeEngine[Any]:
66
+ if TYPE_CHECKING:
67
+ assert isinstance(self, TypeEngine)
68
+ return self
69
+
70
+
71
+ class INET(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
72
+ __visit_name__ = "INET"
73
+
74
+
75
+ PGInet = INET
76
+
77
+
78
+ class CIDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
79
+ __visit_name__ = "CIDR"
80
+
81
+
82
+ PGCidr = CIDR
83
+
84
+
85
+ class MACADDR(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
86
+ __visit_name__ = "MACADDR"
87
+
88
+
89
+ PGMacAddr = MACADDR
90
+
91
+
92
+ class MACADDR8(_NetworkAddressTypeMixin, sqltypes.TypeEngine[str]):
93
+ __visit_name__ = "MACADDR8"
94
+
95
+
96
+ PGMacAddr8 = MACADDR8
97
+
98
+
99
+ class MONEY(sqltypes.TypeEngine[str]):
100
+ r"""Provide the PostgreSQL MONEY type.
101
+
102
+ Depending on driver, result rows using this type may return a
103
+ string value which includes currency symbols.
104
+
105
+ For this reason, it may be preferable to provide conversion to a
106
+ numerically-based currency datatype using :class:`_types.TypeDecorator`::
107
+
108
+ import re
109
+ import decimal
110
+ from sqlalchemy import Dialect
111
+ from sqlalchemy import TypeDecorator
112
+
113
+
114
+ class NumericMoney(TypeDecorator):
115
+ impl = MONEY
116
+
117
+ def process_result_value(self, value: Any, dialect: Dialect) -> None:
118
+ if value is not None:
119
+ # adjust this for the currency and numeric
120
+ m = re.match(r"\$([\d.]+)", value)
121
+ if m:
122
+ value = decimal.Decimal(m.group(1))
123
+ return value
124
+
125
+ Alternatively, the conversion may be applied as a CAST using
126
+ the :meth:`_types.TypeDecorator.column_expression` method as follows::
127
+
128
+ import decimal
129
+ from sqlalchemy import cast
130
+ from sqlalchemy import TypeDecorator
131
+
132
+
133
+ class NumericMoney(TypeDecorator):
134
+ impl = MONEY
135
+
136
+ def column_expression(self, column: Any):
137
+ return cast(column, Numeric())
138
+
139
+ """ # noqa: E501
140
+
141
+ __visit_name__ = "MONEY"
142
+
143
+
144
+ class OID(sqltypes.TypeEngine[int]):
145
+ """Provide the PostgreSQL OID type."""
146
+
147
+ __visit_name__ = "OID"
148
+
149
+ operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
150
+
151
+
152
+ class REGCONFIG(sqltypes.TypeEngine[str]):
153
+ """Provide the PostgreSQL REGCONFIG type.
154
+
155
+ .. versionadded:: 2.0.0rc1
156
+
157
+ """
158
+
159
+ __visit_name__ = "REGCONFIG"
160
+
161
+ operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
162
+
163
+
164
+ class TSQUERY(sqltypes.TypeEngine[str]):
165
+ """Provide the PostgreSQL TSQUERY type.
166
+
167
+ .. versionadded:: 2.0.0rc1
168
+
169
+ """
170
+
171
+ __visit_name__ = "TSQUERY"
172
+
173
+ operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
174
+
175
+
176
+ class REGCLASS(sqltypes.TypeEngine[str]):
177
+ """Provide the PostgreSQL REGCLASS type."""
178
+
179
+ __visit_name__ = "REGCLASS"
180
+
181
+ operator_classes = OperatorClass.BASE | OperatorClass.COMPARISON
182
+
183
+
184
+ class TIMESTAMP(sqltypes.TIMESTAMP):
185
+ """Provide the PostgreSQL TIMESTAMP type."""
186
+
187
+ __visit_name__ = "TIMESTAMP"
188
+
189
+ def __init__(
190
+ self, timezone: bool = False, precision: Optional[int] = None
191
+ ) -> None:
192
+ """Construct a TIMESTAMP.
193
+
194
+ :param timezone: boolean value if timezone present, default False
195
+ :param precision: optional integer precision value
196
+
197
+ .. versionadded:: 1.4
198
+
199
+ """
200
+ super().__init__(timezone=timezone)
201
+ self.precision = precision
202
+
203
+
204
+ class TIME(sqltypes.TIME):
205
+ """PostgreSQL TIME type."""
206
+
207
+ __visit_name__ = "TIME"
208
+
209
+ def __init__(
210
+ self, timezone: bool = False, precision: Optional[int] = None
211
+ ) -> None:
212
+ """Construct a TIME.
213
+
214
+ :param timezone: boolean value if timezone present, default False
215
+ :param precision: optional integer precision value
216
+
217
+ .. versionadded:: 1.4
218
+
219
+ """
220
+ super().__init__(timezone=timezone)
221
+ self.precision = precision
222
+
223
+
224
+ class INTERVAL(type_api.NativeForEmulated, sqltypes._AbstractInterval):
225
+ """PostgreSQL INTERVAL type."""
226
+
227
+ __visit_name__ = "INTERVAL"
228
+ native = True
229
+
230
+ def __init__(
231
+ self, precision: Optional[int] = None, fields: Optional[str] = None
232
+ ) -> None:
233
+ """Construct an INTERVAL.
234
+
235
+ :param precision: optional integer precision value
236
+ :param fields: string fields specifier. allows storage of fields
237
+ to be limited, such as ``"YEAR"``, ``"MONTH"``, ``"DAY TO HOUR"``,
238
+ etc.
239
+
240
+ """
241
+ self.precision = precision
242
+ self.fields = fields
243
+
244
+ @classmethod
245
+ def adapt_emulated_to_native(
246
+ cls, interval: sqltypes.Interval, **kw: Any # type: ignore[override]
247
+ ) -> INTERVAL:
248
+ return INTERVAL(precision=interval.second_precision)
249
+
250
+ @property
251
+ def _type_affinity(self) -> Type[sqltypes.Interval]:
252
+ return sqltypes.Interval
253
+
254
+ def as_generic(self, allow_nulltype: bool = False) -> sqltypes.Interval:
255
+ return sqltypes.Interval(native=True, second_precision=self.precision)
256
+
257
+ @property
258
+ def python_type(self) -> Type[dt.timedelta]:
259
+ return dt.timedelta
260
+
261
+ def literal_processor(
262
+ self, dialect: Dialect
263
+ ) -> Optional[_LiteralProcessorType[dt.timedelta]]:
264
+ def process(value: dt.timedelta) -> str:
265
+ return f"make_interval(secs=>{value.total_seconds()})"
266
+
267
+ return process
268
+
269
+
270
+ PGInterval = INTERVAL
271
+
272
+
273
+ class BIT(sqltypes.TypeEngine[BitString]):
274
+ """Represent the PostgreSQL BIT type.
275
+
276
+ The :class:`_postgresql.BIT` type yields values in the form of the
277
+ :class:`_postgresql.BitString` Python value type.
278
+
279
+ .. versionchanged:: 2.1 The :class:`_postgresql.BIT` type now works
280
+ with :class:`_postgresql.BitString` values rather than plain strings.
281
+
282
+ """
283
+
284
+ render_bind_cast = True
285
+ __visit_name__ = "BIT"
286
+
287
+ operator_classes = (
288
+ OperatorClass.BASE | OperatorClass.COMPARISON | OperatorClass.BITWISE
289
+ )
290
+
291
+ def __init__(
292
+ self, length: Optional[int] = None, varying: bool = False
293
+ ) -> None:
294
+ if varying:
295
+ # BIT VARYING can be unlimited-length, so no default
296
+ self.length = length
297
+ else:
298
+ # BIT without VARYING defaults to length 1
299
+ self.length = length or 1
300
+ self.varying = varying
301
+
302
+ def bind_processor(
303
+ self, dialect: Dialect
304
+ ) -> _BindProcessorType[BitString]:
305
+ def bound_value(value: Any) -> Any:
306
+ if isinstance(value, BitString):
307
+ return str(value)
308
+ return value
309
+
310
+ return bound_value
311
+
312
+ def result_processor(
313
+ self, dialect: Dialect, coltype: object
314
+ ) -> _ResultProcessorType[BitString]:
315
+ def from_result_value(value: Any) -> Any:
316
+ if value is not None:
317
+ value = BitString(value)
318
+ return value
319
+
320
+ return from_result_value
321
+
322
+ def coerce_compared_value(
323
+ self, op: OperatorType | None, value: Any
324
+ ) -> TypeEngine[Any]:
325
+ if isinstance(value, str):
326
+ return self
327
+ return super().coerce_compared_value(op, value)
328
+
329
+ @property
330
+ def python_type(self) -> type[Any]:
331
+ return BitString
332
+
333
+ class comparator_factory(TypeEngine.Comparator[BitString]):
334
+ def __lshift__(self, other: Any) -> ColumnOperators:
335
+ return self.bitwise_lshift(other)
336
+
337
+ def __rshift__(self, other: Any) -> ColumnOperators:
338
+ return self.bitwise_rshift(other)
339
+
340
+ def __and__(self, other: Any) -> ColumnOperators:
341
+ return self.bitwise_and(other)
342
+
343
+ def __or__(self, other: Any) -> ColumnOperators:
344
+ return self.bitwise_or(other)
345
+
346
+ # NOTE: __xor__ is not defined on sql.operators.ColumnOperators.
347
+ # Use `bitwise_xor` directly instead.
348
+ # def __xor__(self, other: Any) -> ColumnOperators:
349
+ # return self.bitwise_xor(other)
350
+
351
+ def __invert__(self) -> ColumnOperators:
352
+ return self.bitwise_not()
353
+
354
+
355
+ PGBit = BIT
356
+
357
+
358
+ class TSVECTOR(sqltypes.TypeEngine[str]):
359
+ """The :class:`_postgresql.TSVECTOR` type implements the PostgreSQL
360
+ text search type TSVECTOR.
361
+
362
+ It can be used to do full text queries on natural language
363
+ documents.
364
+
365
+ .. seealso::
366
+
367
+ :ref:`postgresql_match`
368
+
369
+ """
370
+
371
+ __visit_name__ = "TSVECTOR"
372
+
373
+ operator_classes = OperatorClass.STRING
374
+
375
+
376
+ class CITEXT(sqltypes.TEXT):
377
+ """Provide the PostgreSQL CITEXT type.
378
+
379
+ .. versionadded:: 2.0.7
380
+
381
+ """
382
+
383
+ __visit_name__ = "CITEXT"
384
+
385
+ def coerce_compared_value(
386
+ self, op: Optional[OperatorType], value: Any
387
+ ) -> TypeEngine[Any]:
388
+ return self
@@ -0,0 +1,57 @@
1
+ # dialects/sqlite/__init__.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
+
10
+ from . import aiosqlite # noqa
11
+ from . import base # noqa
12
+ from . import pysqlcipher # noqa
13
+ from . import pysqlite # noqa
14
+ from .base import BLOB
15
+ from .base import BOOLEAN
16
+ from .base import CHAR
17
+ from .base import DATE
18
+ from .base import DATETIME
19
+ from .base import DECIMAL
20
+ from .base import FLOAT
21
+ from .base import INTEGER
22
+ from .base import JSON
23
+ from .base import NUMERIC
24
+ from .base import REAL
25
+ from .base import SMALLINT
26
+ from .base import TEXT
27
+ from .base import TIME
28
+ from .base import TIMESTAMP
29
+ from .base import VARCHAR
30
+ from .dml import Insert
31
+ from .dml import insert
32
+
33
+ # default dialect
34
+ base.dialect = dialect = pysqlite.dialect
35
+
36
+
37
+ __all__ = (
38
+ "BLOB",
39
+ "BOOLEAN",
40
+ "CHAR",
41
+ "DATE",
42
+ "DATETIME",
43
+ "DECIMAL",
44
+ "FLOAT",
45
+ "INTEGER",
46
+ "JSON",
47
+ "NUMERIC",
48
+ "SMALLINT",
49
+ "TEXT",
50
+ "TIME",
51
+ "TIMESTAMP",
52
+ "VARCHAR",
53
+ "REAL",
54
+ "Insert",
55
+ "insert",
56
+ "dialect",
57
+ )