SQLAlchemy 2.0.47__cp313-cp313t-win32.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-win32.pyd +0 -0
  8. sqlalchemy/cyextension/collections.pyx +409 -0
  9. sqlalchemy/cyextension/immutabledict.cp313t-win32.pyd +0 -0
  10. sqlalchemy/cyextension/immutabledict.pxd +8 -0
  11. sqlalchemy/cyextension/immutabledict.pyx +133 -0
  12. sqlalchemy/cyextension/processors.cp313t-win32.pyd +0 -0
  13. sqlalchemy/cyextension/processors.pyx +68 -0
  14. sqlalchemy/cyextension/resultproxy.cp313t-win32.pyd +0 -0
  15. sqlalchemy/cyextension/resultproxy.pyx +102 -0
  16. sqlalchemy/cyextension/util.cp313t-win32.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,365 @@
1
+ # dialects/oracle/vector.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 __future__ import annotations
11
+
12
+ import array
13
+ from dataclasses import dataclass
14
+ from enum import Enum
15
+ from typing import Optional
16
+ from typing import Union
17
+
18
+ from ... import types
19
+ from ...types import Float
20
+
21
+
22
+ class VectorIndexType(Enum):
23
+ """Enum representing different types of VECTOR index structures.
24
+
25
+ See :ref:`oracle_vector_datatype` for background.
26
+
27
+ .. versionadded:: 2.0.41
28
+
29
+ """
30
+
31
+ HNSW = "HNSW"
32
+ """
33
+ The HNSW (Hierarchical Navigable Small World) index type.
34
+ """
35
+ IVF = "IVF"
36
+ """
37
+ The IVF (Inverted File Index) index type
38
+ """
39
+
40
+
41
+ class VectorDistanceType(Enum):
42
+ """Enum representing different types of vector distance metrics.
43
+
44
+ See :ref:`oracle_vector_datatype` for background.
45
+
46
+ .. versionadded:: 2.0.41
47
+
48
+ """
49
+
50
+ EUCLIDEAN = "EUCLIDEAN"
51
+ """Euclidean distance (L2 norm).
52
+
53
+ Measures the straight-line distance between two vectors in space.
54
+ """
55
+ DOT = "DOT"
56
+ """Dot product similarity.
57
+
58
+ Measures the algebraic similarity between two vectors.
59
+ """
60
+ COSINE = "COSINE"
61
+ """Cosine similarity.
62
+
63
+ Measures the cosine of the angle between two vectors.
64
+ """
65
+ MANHATTAN = "MANHATTAN"
66
+ """Manhattan distance (L1 norm).
67
+
68
+ Calculates the sum of absolute differences across dimensions.
69
+ """
70
+
71
+
72
+ class VectorStorageFormat(Enum):
73
+ """Enum representing the data format used to store vector components.
74
+
75
+ See :ref:`oracle_vector_datatype` for background.
76
+
77
+ .. versionadded:: 2.0.41
78
+
79
+ """
80
+
81
+ INT8 = "INT8"
82
+ """
83
+ 8-bit integer format.
84
+ """
85
+ BINARY = "BINARY"
86
+ """
87
+ Binary format.
88
+ """
89
+ FLOAT32 = "FLOAT32"
90
+ """
91
+ 32-bit floating-point format.
92
+ """
93
+ FLOAT64 = "FLOAT64"
94
+ """
95
+ 64-bit floating-point format.
96
+ """
97
+
98
+
99
+ class VectorStorageType(Enum):
100
+ """Enum representing the vector type,
101
+
102
+ See :ref:`oracle_vector_datatype` for background.
103
+
104
+ .. versionadded:: 2.0.43
105
+
106
+ """
107
+
108
+ SPARSE = "SPARSE"
109
+ """
110
+ A Sparse vector is a vector which has zero value for
111
+ most of its dimensions.
112
+ """
113
+ DENSE = "DENSE"
114
+ """
115
+ A Dense vector is a vector where most, if not all, elements
116
+ hold meaningful values.
117
+ """
118
+
119
+
120
+ @dataclass
121
+ class VectorIndexConfig:
122
+ """Define the configuration for Oracle VECTOR Index.
123
+
124
+ See :ref:`oracle_vector_datatype` for background.
125
+
126
+ .. versionadded:: 2.0.41
127
+
128
+ :param index_type: Enum value from :class:`.VectorIndexType`
129
+ Specifies the indexing method. For HNSW, this must be
130
+ :attr:`.VectorIndexType.HNSW`.
131
+
132
+ :param distance: Enum value from :class:`.VectorDistanceType`
133
+ specifies the metric for calculating distance between VECTORS.
134
+
135
+ :param accuracy: integer. Should be in the range 0 to 100
136
+ Specifies the accuracy of the nearest neighbor search during
137
+ query execution.
138
+
139
+ :param parallel: integer. Specifies degree of parallelism.
140
+
141
+ :param hnsw_neighbors: integer. Should be in the range 0 to
142
+ 2048. Specifies the number of nearest neighbors considered
143
+ during the search. The attribute :attr:`.VectorIndexConfig.hnsw_neighbors`
144
+ is HNSW index specific.
145
+
146
+ :param hnsw_efconstruction: integer. Should be in the range 0
147
+ to 65535. Controls the trade-off between indexing speed and
148
+ recall quality during index construction. The attribute
149
+ :attr:`.VectorIndexConfig.hnsw_efconstruction` is HNSW index
150
+ specific.
151
+
152
+ :param ivf_neighbor_partitions: integer. Should be in the range
153
+ 0 to 10,000,000. Specifies the number of partitions used to
154
+ divide the dataset. The attribute
155
+ :attr:`.VectorIndexConfig.ivf_neighbor_partitions` is IVF index
156
+ specific.
157
+
158
+ :param ivf_sample_per_partition: integer. Should be between 1
159
+ and ``num_vectors / neighbor partitions``. Specifies the
160
+ number of samples used per partition. The attribute
161
+ :attr:`.VectorIndexConfig.ivf_sample_per_partition` is IVF index
162
+ specific.
163
+
164
+ :param ivf_min_vectors_per_partition: integer. From 0 (no trimming)
165
+ to the total number of vectors (results in 1 partition). Specifies
166
+ the minimum number of vectors per partition. The attribute
167
+ :attr:`.VectorIndexConfig.ivf_min_vectors_per_partition`
168
+ is IVF index specific.
169
+
170
+ """
171
+
172
+ index_type: VectorIndexType = VectorIndexType.HNSW
173
+ distance: Optional[VectorDistanceType] = None
174
+ accuracy: Optional[int] = None
175
+ hnsw_neighbors: Optional[int] = None
176
+ hnsw_efconstruction: Optional[int] = None
177
+ ivf_neighbor_partitions: Optional[int] = None
178
+ ivf_sample_per_partition: Optional[int] = None
179
+ ivf_min_vectors_per_partition: Optional[int] = None
180
+ parallel: Optional[int] = None
181
+
182
+ def __post_init__(self):
183
+ self.index_type = VectorIndexType(self.index_type)
184
+ for field in [
185
+ "hnsw_neighbors",
186
+ "hnsw_efconstruction",
187
+ "ivf_neighbor_partitions",
188
+ "ivf_sample_per_partition",
189
+ "ivf_min_vectors_per_partition",
190
+ "parallel",
191
+ "accuracy",
192
+ ]:
193
+ value = getattr(self, field)
194
+ if value is not None and not isinstance(value, int):
195
+ raise TypeError(
196
+ f"{field} must be an integer if"
197
+ f"provided, got {type(value).__name__}"
198
+ )
199
+
200
+
201
+ class SparseVector:
202
+ """
203
+ Lightweight SQLAlchemy-side version of SparseVector.
204
+ This mimics oracledb.SparseVector.
205
+
206
+ .. versionadded:: 2.0.43
207
+
208
+ """
209
+
210
+ def __init__(
211
+ self,
212
+ num_dimensions: int,
213
+ indices: Union[list, array.array],
214
+ values: Union[list, array.array],
215
+ ):
216
+ if not isinstance(indices, array.array) or indices.typecode != "I":
217
+ indices = array.array("I", indices)
218
+ if not isinstance(values, array.array):
219
+ values = array.array("d", values)
220
+ if len(indices) != len(values):
221
+ raise TypeError("indices and values must be of the same length!")
222
+
223
+ self.num_dimensions = num_dimensions
224
+ self.indices = indices
225
+ self.values = values
226
+
227
+ def __str__(self):
228
+ return (
229
+ f"SparseVector(num_dimensions={self.num_dimensions}, "
230
+ f"size={len(self.indices)}, typecode={self.values.typecode})"
231
+ )
232
+
233
+
234
+ class VECTOR(types.TypeEngine):
235
+ """Oracle VECTOR datatype.
236
+
237
+ For complete background on using this type, see
238
+ :ref:`oracle_vector_datatype`.
239
+
240
+ .. versionadded:: 2.0.41
241
+
242
+ """
243
+
244
+ cache_ok = True
245
+
246
+ __visit_name__ = "VECTOR"
247
+
248
+ _typecode_map = {
249
+ VectorStorageFormat.INT8: "b", # Signed int
250
+ VectorStorageFormat.BINARY: "B", # Unsigned int
251
+ VectorStorageFormat.FLOAT32: "f", # Float
252
+ VectorStorageFormat.FLOAT64: "d", # Double
253
+ }
254
+
255
+ def __init__(self, dim=None, storage_format=None, storage_type=None):
256
+ """Construct a VECTOR.
257
+
258
+ :param dim: integer. The dimension of the VECTOR datatype. This
259
+ should be an integer value.
260
+
261
+ :param storage_format: VectorStorageFormat. The VECTOR storage
262
+ type format. This should be Enum values form
263
+ :class:`.VectorStorageFormat` INT8, BINARY, FLOAT32, or FLOAT64.
264
+
265
+ :param storage_type: VectorStorageType. The Vector storage type. This
266
+ should be Enum values from :class:`.VectorStorageType` SPARSE or
267
+ DENSE.
268
+
269
+ """
270
+
271
+ if dim is not None and not isinstance(dim, int):
272
+ raise TypeError("dim must be an integer")
273
+ if storage_format is not None and not isinstance(
274
+ storage_format, VectorStorageFormat
275
+ ):
276
+ raise TypeError(
277
+ "storage_format must be an enum of type VectorStorageFormat"
278
+ )
279
+ if storage_type is not None and not isinstance(
280
+ storage_type, VectorStorageType
281
+ ):
282
+ raise TypeError(
283
+ "storage_type must be an enum of type VectorStorageType"
284
+ )
285
+
286
+ self.dim = dim
287
+ self.storage_format = storage_format
288
+ self.storage_type = storage_type
289
+
290
+ def _cached_bind_processor(self, dialect):
291
+ """
292
+ Converts a Python-side SparseVector instance into an
293
+ oracledb.SparseVectormor a compatible array format before
294
+ binding it to the database.
295
+ """
296
+
297
+ def process(value):
298
+ if value is None or isinstance(value, array.array):
299
+ return value
300
+
301
+ # Convert list to a array.array
302
+ elif isinstance(value, list):
303
+ typecode = self._array_typecode(self.storage_format)
304
+ value = array.array(typecode, value)
305
+ return value
306
+
307
+ # Convert SqlAlchemy SparseVector to oracledb SparseVector object
308
+ elif isinstance(value, SparseVector):
309
+ return dialect.dbapi.SparseVector(
310
+ value.num_dimensions,
311
+ value.indices,
312
+ value.values,
313
+ )
314
+
315
+ else:
316
+ raise TypeError(
317
+ """
318
+ Invalid input for VECTOR: expected a list, an array.array,
319
+ or a SparseVector object.
320
+ """
321
+ )
322
+
323
+ return process
324
+
325
+ def _cached_result_processor(self, dialect, coltype):
326
+ """
327
+ Converts database-returned values into Python-native representations.
328
+ If the value is an oracledb.SparseVector, it is converted into the
329
+ SQLAlchemy-side SparseVector class.
330
+ If the value is a array.array, it is converted to a plain Python list.
331
+
332
+ """
333
+
334
+ def process(value):
335
+ if value is None:
336
+ return None
337
+
338
+ elif isinstance(value, array.array):
339
+ return list(value)
340
+
341
+ # Convert Oracledb SparseVector to SqlAlchemy SparseVector object
342
+ elif isinstance(value, dialect.dbapi.SparseVector):
343
+ return SparseVector(
344
+ num_dimensions=value.num_dimensions,
345
+ indices=value.indices,
346
+ values=value.values,
347
+ )
348
+
349
+ return process
350
+
351
+ def _array_typecode(self, typecode):
352
+ """
353
+ Map storage format to array typecode.
354
+ """
355
+ return self._typecode_map.get(typecode, "d")
356
+
357
+ class comparator_factory(types.TypeEngine.Comparator):
358
+ def l2_distance(self, other):
359
+ return self.op("<->", return_type=Float)(other)
360
+
361
+ def inner_product(self, other):
362
+ return self.op("<#>", return_type=Float)(other)
363
+
364
+ def cosine_distance(self, other):
365
+ return self.op("<=>", return_type=Float)(other)
@@ -0,0 +1,167 @@
1
+ # dialects/postgresql/__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
+ from types import ModuleType
10
+
11
+ from . import array as arraylib # noqa # keep above base and other dialects
12
+ from . import asyncpg # noqa
13
+ from . import base
14
+ from . import pg8000 # noqa
15
+ from . import psycopg # noqa
16
+ from . import psycopg2 # noqa
17
+ from . import psycopg2cffi # noqa
18
+ from .array import All
19
+ from .array import Any
20
+ from .array import ARRAY
21
+ from .array import array
22
+ from .base import BIGINT
23
+ from .base import BOOLEAN
24
+ from .base import CHAR
25
+ from .base import DATE
26
+ from .base import DOMAIN
27
+ from .base import DOUBLE_PRECISION
28
+ from .base import FLOAT
29
+ from .base import INTEGER
30
+ from .base import NUMERIC
31
+ from .base import REAL
32
+ from .base import SMALLINT
33
+ from .base import TEXT
34
+ from .base import UUID
35
+ from .base import VARCHAR
36
+ from .dml import Insert
37
+ from .dml import insert
38
+ from .ext import aggregate_order_by
39
+ from .ext import array_agg
40
+ from .ext import ExcludeConstraint
41
+ from .ext import phraseto_tsquery
42
+ from .ext import plainto_tsquery
43
+ from .ext import to_tsquery
44
+ from .ext import to_tsvector
45
+ from .ext import ts_headline
46
+ from .ext import websearch_to_tsquery
47
+ from .hstore import HSTORE
48
+ from .hstore import hstore
49
+ from .json import JSON
50
+ from .json import JSONB
51
+ from .json import JSONPATH
52
+ from .named_types import CreateDomainType
53
+ from .named_types import CreateEnumType
54
+ from .named_types import DropDomainType
55
+ from .named_types import DropEnumType
56
+ from .named_types import ENUM
57
+ from .named_types import NamedType
58
+ from .ranges import AbstractMultiRange
59
+ from .ranges import AbstractRange
60
+ from .ranges import AbstractSingleRange
61
+ from .ranges import DATEMULTIRANGE
62
+ from .ranges import DATERANGE
63
+ from .ranges import INT4MULTIRANGE
64
+ from .ranges import INT4RANGE
65
+ from .ranges import INT8MULTIRANGE
66
+ from .ranges import INT8RANGE
67
+ from .ranges import MultiRange
68
+ from .ranges import NUMMULTIRANGE
69
+ from .ranges import NUMRANGE
70
+ from .ranges import Range
71
+ from .ranges import TSMULTIRANGE
72
+ from .ranges import TSRANGE
73
+ from .ranges import TSTZMULTIRANGE
74
+ from .ranges import TSTZRANGE
75
+ from .types import BIT
76
+ from .types import BYTEA
77
+ from .types import CIDR
78
+ from .types import CITEXT
79
+ from .types import INET
80
+ from .types import INTERVAL
81
+ from .types import MACADDR
82
+ from .types import MACADDR8
83
+ from .types import MONEY
84
+ from .types import OID
85
+ from .types import REGCLASS
86
+ from .types import REGCONFIG
87
+ from .types import TIME
88
+ from .types import TIMESTAMP
89
+ from .types import TSQUERY
90
+ from .types import TSVECTOR
91
+
92
+
93
+ # Alias psycopg also as psycopg_async
94
+ psycopg_async = type(
95
+ "psycopg_async", (ModuleType,), {"dialect": psycopg.dialect_async}
96
+ )
97
+
98
+ base.dialect = dialect = psycopg2.dialect
99
+
100
+
101
+ __all__ = (
102
+ "INTEGER",
103
+ "BIGINT",
104
+ "SMALLINT",
105
+ "VARCHAR",
106
+ "CHAR",
107
+ "TEXT",
108
+ "NUMERIC",
109
+ "FLOAT",
110
+ "REAL",
111
+ "INET",
112
+ "CIDR",
113
+ "CITEXT",
114
+ "UUID",
115
+ "BIT",
116
+ "MACADDR",
117
+ "MACADDR8",
118
+ "MONEY",
119
+ "OID",
120
+ "REGCLASS",
121
+ "REGCONFIG",
122
+ "TSQUERY",
123
+ "TSVECTOR",
124
+ "DOUBLE_PRECISION",
125
+ "TIMESTAMP",
126
+ "TIME",
127
+ "DATE",
128
+ "BYTEA",
129
+ "BOOLEAN",
130
+ "INTERVAL",
131
+ "ARRAY",
132
+ "ENUM",
133
+ "DOMAIN",
134
+ "dialect",
135
+ "array",
136
+ "HSTORE",
137
+ "hstore",
138
+ "INT4RANGE",
139
+ "INT8RANGE",
140
+ "NUMRANGE",
141
+ "DATERANGE",
142
+ "INT4MULTIRANGE",
143
+ "INT8MULTIRANGE",
144
+ "NUMMULTIRANGE",
145
+ "DATEMULTIRANGE",
146
+ "TSVECTOR",
147
+ "TSRANGE",
148
+ "TSTZRANGE",
149
+ "TSMULTIRANGE",
150
+ "TSTZMULTIRANGE",
151
+ "JSON",
152
+ "JSONB",
153
+ "JSONPATH",
154
+ "Any",
155
+ "All",
156
+ "DropEnumType",
157
+ "DropDomainType",
158
+ "CreateDomainType",
159
+ "NamedType",
160
+ "CreateEnumType",
161
+ "ExcludeConstraint",
162
+ "Range",
163
+ "aggregate_order_by",
164
+ "array_agg",
165
+ "insert",
166
+ "Insert",
167
+ )