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