sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.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 (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,543 @@
1
+ """OracleDB adapter compiled helpers."""
2
+
3
+ import re
4
+ from collections.abc import Sized
5
+ from typing import TYPE_CHECKING, Any
6
+
7
+ from sqlspec.adapters.oracledb.type_converter import OracleOutputConverter
8
+ from sqlspec.core import (
9
+ DriverParameterProfile,
10
+ ParameterStyle,
11
+ StackResult,
12
+ StatementConfig,
13
+ build_statement_config_from_profile,
14
+ create_sql_result,
15
+ )
16
+ from sqlspec.exceptions import (
17
+ CheckViolationError,
18
+ DatabaseConnectionError,
19
+ DataError,
20
+ ForeignKeyViolationError,
21
+ IntegrityError,
22
+ NotNullViolationError,
23
+ OperationalError,
24
+ SQLParsingError,
25
+ SQLSpecError,
26
+ TransactionError,
27
+ UniqueViolationError,
28
+ )
29
+ from sqlspec.typing import NUMPY_INSTALLED
30
+ from sqlspec.utils.serializers import to_json
31
+ from sqlspec.utils.type_guards import has_rowcount, is_readable
32
+
33
+ if TYPE_CHECKING:
34
+ from collections.abc import Callable, Mapping
35
+
36
+ from sqlspec.core import SQL
37
+
38
+ __all__ = (
39
+ "apply_driver_features",
40
+ "build_insert_statement",
41
+ "build_pipeline_stack_result",
42
+ "build_profile",
43
+ "build_statement_config",
44
+ "build_truncate_statement",
45
+ "coerce_large_string_parameters_async",
46
+ "coerce_large_string_parameters_sync",
47
+ "collect_async_rows",
48
+ "collect_sync_rows",
49
+ "create_mapped_exception",
50
+ "default_statement_config",
51
+ "driver_profile",
52
+ "normalize_column_names",
53
+ "normalize_execute_many_parameters_async",
54
+ "normalize_execute_many_parameters_sync",
55
+ "requires_session_callback",
56
+ "resolve_rowcount",
57
+ )
58
+
59
+
60
+ IMPLICIT_UPPER_COLUMN_PATTERN: "re.Pattern[str]" = re.compile(r"^(?!\d)(?:[A-Z0-9_]+)$")
61
+ _VERSION_COMPONENTS: int = 3
62
+ TYPE_CONVERTER = OracleOutputConverter()
63
+
64
+ ORA_CHECK_CONSTRAINT = 2290
65
+ ORA_INTEGRITY_RANGE_START = 2200
66
+ ORA_INTEGRITY_RANGE_END = 2300
67
+ ORA_PARSING_RANGE_START = 900
68
+ ORA_PARSING_RANGE_END = 1000
69
+ ORA_TABLESPACE_FULL = 1652
70
+
71
+ _ERROR_CODE_MAPPING: "dict[int, tuple[type[SQLSpecError], str]]" = {
72
+ 1: (UniqueViolationError, "unique constraint violation"),
73
+ 2291: (ForeignKeyViolationError, "foreign key constraint violation"),
74
+ 2292: (ForeignKeyViolationError, "foreign key constraint violation"),
75
+ ORA_CHECK_CONSTRAINT: (CheckViolationError, "check constraint violation"),
76
+ 1400: (NotNullViolationError, "not-null constraint violation"),
77
+ 1407: (NotNullViolationError, "not-null constraint violation"),
78
+ 1017: (DatabaseConnectionError, "connection error"),
79
+ 12154: (DatabaseConnectionError, "connection error"),
80
+ 12541: (DatabaseConnectionError, "connection error"),
81
+ 12545: (DatabaseConnectionError, "connection error"),
82
+ 12514: (DatabaseConnectionError, "connection error"),
83
+ 12505: (DatabaseConnectionError, "connection error"),
84
+ 60: (TransactionError, "transaction error"),
85
+ 8176: (TransactionError, "transaction error"),
86
+ 1722: (DataError, "data error"),
87
+ 1858: (DataError, "data error"),
88
+ 1840: (DataError, "data error"),
89
+ ORA_TABLESPACE_FULL: (OperationalError, "operational error"),
90
+ }
91
+
92
+
93
+ def _parse_version_tuple(version: str) -> "tuple[int, int, int]":
94
+ parts = [int(part) for part in version.split(".") if part.isdigit()]
95
+ while len(parts) < _VERSION_COMPONENTS:
96
+ parts.append(0)
97
+ return parts[0], parts[1], parts[2]
98
+
99
+
100
+ def _resolve_oracledb_version() -> "tuple[int, int, int]":
101
+ try:
102
+ import oracledb
103
+ except ImportError:
104
+ return (0, 0, 0)
105
+ try:
106
+ version = oracledb.__version__
107
+ except AttributeError:
108
+ version = "0.0.0"
109
+ return _parse_version_tuple(version)
110
+
111
+
112
+ ORACLEDB_VERSION: "tuple[int, int, int]" = _resolve_oracledb_version()
113
+
114
+
115
+ def normalize_column_names(column_names: "list[str]", driver_features: "dict[str, Any]") -> "list[str]":
116
+ should_lowercase = driver_features.get("enable_lowercase_column_names", False)
117
+ if not should_lowercase:
118
+ return column_names
119
+ normalized: list[str] = []
120
+ for name in column_names:
121
+ if name and IMPLICIT_UPPER_COLUMN_PATTERN.fullmatch(name):
122
+ normalized.append(name.lower())
123
+ else:
124
+ normalized.append(name)
125
+ return normalized
126
+
127
+
128
+ def normalize_execute_many_parameters_sync(parameters: Any) -> Any:
129
+ """Normalize parameters for Oracle executemany calls.
130
+
131
+ Args:
132
+ parameters: Prepared parameters payload.
133
+
134
+ Returns:
135
+ Normalized parameters payload.
136
+
137
+ Raises:
138
+ ValueError: When parameters are missing for executemany.
139
+ """
140
+ if not parameters:
141
+ msg = "execute_many requires parameters"
142
+ raise ValueError(msg)
143
+ if isinstance(parameters, tuple):
144
+ return list(parameters)
145
+ return parameters
146
+
147
+
148
+ def normalize_execute_many_parameters_async(parameters: Any) -> Any:
149
+ """Normalize parameters for Oracle async executemany calls.
150
+
151
+ Args:
152
+ parameters: Prepared parameters payload.
153
+
154
+ Returns:
155
+ Normalized parameters payload.
156
+
157
+ Raises:
158
+ ValueError: When parameters are missing for executemany.
159
+ """
160
+ if not parameters:
161
+ msg = "execute_many requires parameters"
162
+ raise ValueError(msg)
163
+ return parameters
164
+
165
+
166
+ def coerce_large_string_parameters_sync(connection: Any, parameters: Any, *, lob_type: Any, threshold: int) -> Any:
167
+ """Coerce large string parameters into CLOBs.
168
+
169
+ Args:
170
+ connection: Oracle database connection.
171
+ parameters: Prepared parameters payload.
172
+ lob_type: Oracle CLOB type.
173
+ threshold: String length threshold for CLOB conversion.
174
+
175
+ Returns:
176
+ Parameters payload with large strings converted to CLOBs.
177
+ """
178
+ if not parameters or not isinstance(parameters, dict):
179
+ return parameters
180
+ for param_name, param_value in parameters.items():
181
+ if isinstance(param_value, str) and len(param_value) > threshold:
182
+ clob = connection.createlob(lob_type)
183
+ clob.write(param_value)
184
+ parameters[param_name] = clob
185
+ return parameters
186
+
187
+
188
+ async def coerce_large_string_parameters_async(
189
+ connection: Any, parameters: Any, *, lob_type: Any, threshold: int
190
+ ) -> Any:
191
+ """Coerce large string parameters into CLOBs for async Oracle drivers.
192
+
193
+ Args:
194
+ connection: Oracle database connection.
195
+ parameters: Prepared parameters payload.
196
+ lob_type: Oracle CLOB type.
197
+ threshold: String length threshold for CLOB conversion.
198
+
199
+ Returns:
200
+ Parameters payload with large strings converted to CLOBs.
201
+ """
202
+ if not parameters or not isinstance(parameters, dict):
203
+ return parameters
204
+ for param_name, param_value in parameters.items():
205
+ if isinstance(param_value, str) and len(param_value) > threshold:
206
+ clob = await connection.createlob(lob_type)
207
+ await clob.write(param_value)
208
+ parameters[param_name] = clob
209
+ return parameters
210
+
211
+
212
+ def build_insert_statement(table: str, columns: "list[str]") -> str:
213
+ column_list = ", ".join(columns)
214
+ placeholders = ", ".join(f":{idx + 1}" for idx in range(len(columns)))
215
+ return f"INSERT INTO {table} ({column_list}) VALUES ({placeholders})"
216
+
217
+
218
+ def build_truncate_statement(table: str) -> str:
219
+ return f"TRUNCATE TABLE {table}"
220
+
221
+
222
+ def build_pipeline_stack_result(
223
+ statement: "SQL",
224
+ method: str,
225
+ returns_rows: bool,
226
+ parameters: Any,
227
+ pipeline_result: Any,
228
+ driver_features: "dict[str, Any]",
229
+ ) -> "StackResult":
230
+ """Build StackResult from Oracle pipeline output.
231
+
232
+ Args:
233
+ statement: Statement executed in the pipeline.
234
+ method: Pipeline execution method name.
235
+ returns_rows: Whether the operation returns rows.
236
+ parameters: Prepared parameters used for execution.
237
+ pipeline_result: Raw pipeline execution result.
238
+ driver_features: Driver feature configuration for normalization.
239
+
240
+ Returns:
241
+ StackResult for the pipeline operation.
242
+ """
243
+ try:
244
+ rows = pipeline_result.rows
245
+ except AttributeError:
246
+ rows = None
247
+ try:
248
+ columns = pipeline_result.columns
249
+ except AttributeError:
250
+ columns = None
251
+
252
+ data: list[dict[str, Any]] | None = None
253
+ if returns_rows:
254
+ if not rows:
255
+ data = []
256
+ else:
257
+ if columns:
258
+ names = []
259
+ for index, column in enumerate(columns):
260
+ try:
261
+ name = column.name
262
+ except AttributeError:
263
+ name = f"column_{index}"
264
+ names.append(name)
265
+ else:
266
+ first = rows[0]
267
+ names = [f"column_{index}" for index in range(len(first) if isinstance(first, Sized) else 0)]
268
+ names = normalize_column_names(names, driver_features)
269
+ normalized_rows: list[dict[str, Any]] = []
270
+ for row in rows:
271
+ if isinstance(row, dict):
272
+ normalized_rows.append(row)
273
+ else:
274
+ normalized_rows.append(dict(zip(names, row, strict=False)))
275
+ data = normalized_rows
276
+
277
+ metadata: dict[str, Any] = {"pipeline_operation": method}
278
+ try:
279
+ warning = pipeline_result.warning
280
+ except AttributeError:
281
+ warning = None
282
+ if warning is not None:
283
+ metadata["warning"] = warning
284
+
285
+ try:
286
+ return_value = pipeline_result.return_value
287
+ except AttributeError:
288
+ return_value = None
289
+ if return_value is not None:
290
+ metadata["return_value"] = return_value
291
+
292
+ try:
293
+ rowcount = pipeline_result.rowcount
294
+ except AttributeError:
295
+ rowcount = None
296
+
297
+ if isinstance(rowcount, int) and rowcount >= 0:
298
+ rows_affected = rowcount
299
+ elif method == "execute_many":
300
+ try:
301
+ rows_affected = len(parameters or ())
302
+ except TypeError:
303
+ rows_affected = 0
304
+ elif method == "execute" and not returns_rows:
305
+ rows_affected = 1
306
+ elif returns_rows:
307
+ rows_affected = len(data or [])
308
+ else:
309
+ rows_affected = 0
310
+
311
+ sql_result = create_sql_result(statement, data=data, rows_affected=rows_affected, metadata=metadata)
312
+ return StackResult.from_sql_result(sql_result)
313
+
314
+
315
+ def resolve_rowcount(cursor: Any) -> int:
316
+ """Resolve rowcount from an Oracle cursor.
317
+
318
+ Args:
319
+ cursor: Oracle cursor with optional rowcount metadata.
320
+
321
+ Returns:
322
+ Rowcount value or 0 when unavailable.
323
+ """
324
+ if not has_rowcount(cursor):
325
+ return 0
326
+ rowcount = cursor.rowcount
327
+ if isinstance(rowcount, int):
328
+ return rowcount
329
+ return 0
330
+
331
+
332
+ def apply_driver_features(driver_features: "Mapping[str, Any] | None") -> "dict[str, Any]":
333
+ """Apply OracleDB driver feature defaults."""
334
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
335
+ features.setdefault("enable_numpy_vectors", NUMPY_INSTALLED)
336
+ features.setdefault("enable_lowercase_column_names", True)
337
+ features.setdefault("enable_uuid_binary", True)
338
+ return features
339
+
340
+
341
+ def requires_session_callback(driver_features: "dict[str, Any]") -> bool:
342
+ """Return True when the session callback should be installed."""
343
+ enable_numpy_vectors = bool(driver_features.get("enable_numpy_vectors", False))
344
+ enable_uuid_binary = bool(driver_features.get("enable_uuid_binary", False))
345
+ return enable_numpy_vectors or enable_uuid_binary
346
+
347
+
348
+ def _coerce_sync_row_values(row: "tuple[Any, ...]") -> "list[Any]":
349
+ """Coerce LOB handles to concrete values for synchronous execution.
350
+
351
+ Processes each value in the row, reading LOB objects and applying
352
+ type detection for JSON values stored in CLOBs.
353
+
354
+ Args:
355
+ row: Tuple of column values from database fetch.
356
+
357
+ Returns:
358
+ List of coerced values with LOBs read to strings/bytes.
359
+
360
+ """
361
+ coerced_values: list[Any] = []
362
+ for value in row:
363
+ if is_readable(value):
364
+ try:
365
+ processed_value = value.read()
366
+ except Exception:
367
+ coerced_values.append(value)
368
+ continue
369
+ if isinstance(processed_value, str):
370
+ processed_value = TYPE_CONVERTER.convert_if_detected(processed_value)
371
+ coerced_values.append(processed_value)
372
+ continue
373
+ coerced_values.append(value)
374
+ return coerced_values
375
+
376
+
377
+ async def _coerce_async_row_values(row: "tuple[Any, ...]") -> "list[Any]":
378
+ """Coerce LOB handles to concrete values for asynchronous execution.
379
+
380
+ Processes each value in the row, reading LOB objects asynchronously
381
+ and applying type detection for JSON values stored in CLOBs.
382
+
383
+ Args:
384
+ row: Tuple of column values from database fetch.
385
+
386
+ Returns:
387
+ List of coerced values with LOBs read to strings/bytes.
388
+
389
+ """
390
+ coerced_values: list[Any] = []
391
+ for value in row:
392
+ if is_readable(value):
393
+ try:
394
+ processed_value = await TYPE_CONVERTER.process_lob(value)
395
+ except Exception:
396
+ coerced_values.append(value)
397
+ continue
398
+ if isinstance(processed_value, str):
399
+ processed_value = TYPE_CONVERTER.convert_if_detected(processed_value)
400
+ coerced_values.append(processed_value)
401
+ else:
402
+ coerced_values.append(value)
403
+ return coerced_values
404
+
405
+
406
+ def collect_sync_rows(
407
+ fetched_data: "list[Any] | None", description: "list[Any] | None", driver_features: "dict[str, Any]"
408
+ ) -> "tuple[list[dict[str, Any]], list[str]]":
409
+ """Collect OracleDB sync rows into dictionaries with normalized column names.
410
+
411
+ Args:
412
+ fetched_data: Rows returned from cursor.fetchall().
413
+ description: Cursor description metadata.
414
+ driver_features: Driver feature configuration.
415
+
416
+ Returns:
417
+ Tuple of (rows, column_names).
418
+ """
419
+ if not description:
420
+ return [], []
421
+ column_names = [col[0] for col in description]
422
+ column_names = normalize_column_names(column_names, driver_features)
423
+ if not fetched_data:
424
+ return [], column_names
425
+ data = [dict(zip(column_names, _coerce_sync_row_values(row), strict=False)) for row in fetched_data]
426
+ return data, column_names
427
+
428
+
429
+ async def collect_async_rows(
430
+ fetched_data: "list[Any] | None", description: "list[Any] | None", driver_features: "dict[str, Any]"
431
+ ) -> "tuple[list[dict[str, Any]], list[str]]":
432
+ """Collect OracleDB async rows into dictionaries with normalized column names.
433
+
434
+ Args:
435
+ fetched_data: Rows returned from cursor.fetchall().
436
+ description: Cursor description metadata.
437
+ driver_features: Driver feature configuration.
438
+
439
+ Returns:
440
+ Tuple of (rows, column_names).
441
+ """
442
+ if not description:
443
+ return [], []
444
+ column_names = [col[0] for col in description]
445
+ column_names = normalize_column_names(column_names, driver_features)
446
+ if not fetched_data:
447
+ return [], column_names
448
+ data: list[dict[str, Any]] = []
449
+ for row in fetched_data:
450
+ coerced_row = await _coerce_async_row_values(row)
451
+ data.append(dict(zip(column_names, coerced_row, strict=False)))
452
+ return data, column_names
453
+
454
+
455
+ def _create_oracle_error(
456
+ error: Any, code: "int | None", error_class: type[SQLSpecError], description: str
457
+ ) -> SQLSpecError:
458
+ """Create a SQLSpec exception from an Oracle error.
459
+
460
+ Args:
461
+ error: The original Oracle exception
462
+ code: Oracle error code
463
+ error_class: The SQLSpec exception class to instantiate
464
+ description: Human-readable description of the error type
465
+
466
+ Returns:
467
+ A new SQLSpec exception instance with the original as its cause
468
+ """
469
+ msg = f"Oracle {description} [ORA-{code:05d}]: {error}" if code else f"Oracle {description}: {error}"
470
+ exc = error_class(msg)
471
+ exc.__cause__ = error
472
+ return exc
473
+
474
+
475
+ def create_mapped_exception(error: Any) -> SQLSpecError:
476
+ """Map Oracle exceptions to SQLSpec exceptions.
477
+
478
+ This is a factory function that returns an exception instance rather than
479
+ raising. This pattern is more robust for use in __exit__ handlers and
480
+ avoids issues with exception control flow in different Python versions.
481
+
482
+ Args:
483
+ error: The Oracle exception to map
484
+
485
+ Returns:
486
+ A SQLSpec exception that wraps the original error
487
+ """
488
+ error_obj = error.args[0] if getattr(error, "args", None) else None
489
+ if not error_obj:
490
+ return _create_oracle_error(error, None, SQLSpecError, "database error")
491
+
492
+ try:
493
+ error_code = error_obj.code
494
+ except AttributeError:
495
+ error_code = None
496
+ if not error_code:
497
+ return _create_oracle_error(error, None, SQLSpecError, "database error")
498
+
499
+ mapping = _ERROR_CODE_MAPPING.get(error_code)
500
+ if mapping:
501
+ error_class, error_desc = mapping
502
+ return _create_oracle_error(error, error_code, error_class, error_desc)
503
+
504
+ if ORA_INTEGRITY_RANGE_START <= error_code < ORA_INTEGRITY_RANGE_END:
505
+ return _create_oracle_error(error, error_code, IntegrityError, "integrity constraint violation")
506
+
507
+ if ORA_PARSING_RANGE_START <= error_code < ORA_PARSING_RANGE_END:
508
+ return _create_oracle_error(error, error_code, SQLParsingError, "SQL syntax error")
509
+
510
+ return _create_oracle_error(error, error_code, SQLSpecError, "database error")
511
+
512
+
513
+ def build_profile() -> "DriverParameterProfile":
514
+ """Create the OracleDB driver parameter profile."""
515
+ return DriverParameterProfile(
516
+ name="OracleDB",
517
+ default_style=ParameterStyle.POSITIONAL_COLON,
518
+ supported_styles={ParameterStyle.NAMED_COLON, ParameterStyle.POSITIONAL_COLON, ParameterStyle.QMARK},
519
+ default_execution_style=ParameterStyle.NAMED_COLON,
520
+ supported_execution_styles={ParameterStyle.NAMED_COLON, ParameterStyle.POSITIONAL_COLON},
521
+ has_native_list_expansion=False,
522
+ preserve_parameter_format=True,
523
+ needs_static_script_compilation=False,
524
+ allow_mixed_parameter_styles=False,
525
+ preserve_original_params_for_many=False,
526
+ json_serializer_strategy="helper",
527
+ default_dialect="oracle",
528
+ )
529
+
530
+
531
+ driver_profile = build_profile()
532
+
533
+
534
+ def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> StatementConfig:
535
+ """Construct the OracleDB statement configuration with optional JSON serializer."""
536
+ serializer = json_serializer or to_json
537
+ profile = driver_profile
538
+ return build_statement_config_from_profile(
539
+ profile, statement_overrides={"dialect": "oracle"}, json_serializer=serializer
540
+ )
541
+
542
+
543
+ default_statement_config = build_statement_config()