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,484 @@
1
+ """CockroachDB configuration using psycopg."""
2
+
3
+ from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
4
+
5
+ from psycopg import crdb as psycopg_crdb
6
+ from psycopg.rows import dict_row
7
+ from psycopg_pool import AsyncConnectionPool, ConnectionPool
8
+ from typing_extensions import NotRequired
9
+
10
+ from sqlspec.adapters.cockroach_psycopg._typing import (
11
+ CockroachAsyncConnection,
12
+ CockroachPsycopgAsyncSessionContext,
13
+ CockroachPsycopgSyncSessionContext,
14
+ CockroachSyncConnection,
15
+ )
16
+ from sqlspec.adapters.cockroach_psycopg.core import (
17
+ CockroachPsycopgRetryConfig,
18
+ apply_driver_features,
19
+ build_statement_config,
20
+ )
21
+ from sqlspec.adapters.cockroach_psycopg.driver import (
22
+ CockroachPsycopgAsyncDriver,
23
+ CockroachPsycopgAsyncExceptionHandler,
24
+ CockroachPsycopgSyncDriver,
25
+ CockroachPsycopgSyncExceptionHandler,
26
+ )
27
+ from sqlspec.config import AsyncDatabaseConfig, ExtensionConfigs, SyncDatabaseConfig
28
+ from sqlspec.exceptions import ImproperConfigurationError
29
+ from sqlspec.extensions.events import EventRuntimeHints
30
+ from sqlspec.utils.config_tools import normalize_connection_config, reject_pool_aliases
31
+
32
+ if TYPE_CHECKING:
33
+ from collections.abc import Callable
34
+
35
+ from sqlspec.core import StatementConfig
36
+ from sqlspec.observability import ObservabilityConfig
37
+
38
+ __all__ = (
39
+ "CockroachPsycopgAsyncConfig",
40
+ "CockroachPsycopgConnectionConfig",
41
+ "CockroachPsycopgDriverFeatures",
42
+ "CockroachPsycopgPoolConfig",
43
+ "CockroachPsycopgSyncConfig",
44
+ )
45
+
46
+
47
+ class CockroachPsycopgConnectionConfig(TypedDict):
48
+ """CockroachDB connection parameters."""
49
+
50
+ conninfo: NotRequired[str]
51
+ host: NotRequired[str]
52
+ port: NotRequired[int]
53
+ user: NotRequired[str]
54
+ password: NotRequired[str]
55
+ dbname: NotRequired[str]
56
+ connect_timeout: NotRequired[int]
57
+ options: NotRequired[str]
58
+ application_name: NotRequired[str]
59
+ sslmode: NotRequired[str]
60
+ sslcert: NotRequired[str]
61
+ sslkey: NotRequired[str]
62
+ sslrootcert: NotRequired[str]
63
+ autocommit: NotRequired[bool]
64
+ cluster: NotRequired[str]
65
+ extra: NotRequired["dict[str, Any]"]
66
+
67
+
68
+ class CockroachPsycopgPoolConfig(CockroachPsycopgConnectionConfig):
69
+ """CockroachDB pool parameters."""
70
+
71
+ min_size: NotRequired[int]
72
+ max_size: NotRequired[int]
73
+ name: NotRequired[str]
74
+ timeout: NotRequired[float]
75
+ max_waiting: NotRequired[int]
76
+ max_lifetime: NotRequired[float]
77
+ max_idle: NotRequired[float]
78
+ reconnect_timeout: NotRequired[float]
79
+ num_workers: NotRequired[int]
80
+ configure: NotRequired["Callable[..., Any]"]
81
+ kwargs: NotRequired["dict[str, Any]"]
82
+
83
+
84
+ class CockroachPsycopgDriverFeatures(TypedDict):
85
+ """CockroachDB driver feature configuration."""
86
+
87
+ enable_auto_retry: NotRequired[bool]
88
+ max_retries: NotRequired[int]
89
+ retry_delay_base_ms: NotRequired[float]
90
+ retry_delay_max_ms: NotRequired[float]
91
+ enable_retry_logging: NotRequired[bool]
92
+ enable_follower_reads: NotRequired[bool]
93
+ default_staleness: NotRequired[str]
94
+ prefer_uuid_keys: NotRequired[bool]
95
+ json_serializer: NotRequired["Callable[[Any], str]"]
96
+ json_deserializer: NotRequired["Callable[[str], Any]"]
97
+ enable_events: NotRequired[bool]
98
+ events_backend: NotRequired[str]
99
+
100
+
101
+ class CockroachPsycopgSyncConnectionContext:
102
+ """Context manager for CockroachDB psycopg connections."""
103
+
104
+ __slots__ = ("_config", "_ctx")
105
+
106
+ def __init__(self, config: "CockroachPsycopgSyncConfig") -> None:
107
+ self._config = config
108
+ self._ctx: Any = None
109
+
110
+ def __enter__(self) -> "CockroachSyncConnection":
111
+ if self._config.connection_instance:
112
+ self._ctx = self._config.connection_instance.connection()
113
+ return cast("CockroachSyncConnection", self._ctx.__enter__())
114
+ self._ctx = self._config.create_connection()
115
+ return cast("CockroachSyncConnection", self._ctx)
116
+
117
+ def __exit__(
118
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
119
+ ) -> bool | None:
120
+ if self._config.connection_instance and self._ctx:
121
+ return cast("bool | None", self._ctx.__exit__(exc_type, exc_val, exc_tb))
122
+ if self._ctx:
123
+ self._ctx.close()
124
+ return None
125
+
126
+
127
+ class _CockroachPsycopgSyncSessionConnectionHandler:
128
+ __slots__ = ("_config", "_conn", "_ctx")
129
+
130
+ def __init__(self, config: "CockroachPsycopgSyncConfig") -> None:
131
+ self._config = config
132
+ self._ctx: Any = None
133
+ self._conn: CockroachSyncConnection | None = None
134
+
135
+ def acquire_connection(self) -> "CockroachSyncConnection":
136
+ if self._config.connection_instance:
137
+ self._ctx = self._config.connection_instance.connection()
138
+ return cast("CockroachSyncConnection", self._ctx.__enter__())
139
+ self._conn = self._config.create_connection()
140
+ return self._conn
141
+
142
+ def release_connection(self, _conn: "CockroachSyncConnection") -> None:
143
+ if self._ctx is not None:
144
+ self._ctx.__exit__(None, None, None)
145
+ self._ctx = None
146
+ return
147
+ if self._conn is not None:
148
+ self._conn.close()
149
+ self._conn = None
150
+
151
+
152
+ class CockroachPsycopgSyncConfig(
153
+ SyncDatabaseConfig[CockroachSyncConnection, ConnectionPool, CockroachPsycopgSyncDriver]
154
+ ):
155
+ """Configuration for CockroachDB synchronous connections using psycopg."""
156
+
157
+ driver_type: "ClassVar[type[CockroachPsycopgSyncDriver]]" = CockroachPsycopgSyncDriver
158
+ connection_type: "ClassVar[type[CockroachSyncConnection]]" = CockroachSyncConnection
159
+ supports_transactional_ddl: "ClassVar[bool]" = True
160
+ supports_native_arrow_export: "ClassVar[bool]" = True
161
+ supports_native_arrow_import: "ClassVar[bool]" = True
162
+ supports_native_parquet_export: "ClassVar[bool]" = True
163
+ supports_native_parquet_import: "ClassVar[bool]" = True
164
+
165
+ def __init__(
166
+ self,
167
+ *,
168
+ connection_config: "CockroachPsycopgPoolConfig | dict[str, Any] | None" = None,
169
+ connection_instance: "ConnectionPool | None" = None,
170
+ migration_config: "dict[str, Any] | None" = None,
171
+ statement_config: "StatementConfig | None" = None,
172
+ driver_features: "CockroachPsycopgDriverFeatures | dict[str, Any] | None" = None,
173
+ bind_key: "str | None" = None,
174
+ extension_config: "ExtensionConfigs | None" = None,
175
+ observability_config: "ObservabilityConfig | None" = None,
176
+ **kwargs: Any,
177
+ ) -> None:
178
+ reject_pool_aliases(kwargs)
179
+
180
+ connection_config = normalize_connection_config(connection_config)
181
+ statement_config = statement_config or build_statement_config()
182
+ statement_config, driver_features = apply_driver_features(statement_config, driver_features)
183
+
184
+ driver_features.setdefault("enable_auto_retry", True)
185
+ _ = CockroachPsycopgRetryConfig.from_features(driver_features)
186
+
187
+ super().__init__(
188
+ connection_config=connection_config,
189
+ connection_instance=connection_instance,
190
+ migration_config=migration_config,
191
+ statement_config=statement_config,
192
+ driver_features=driver_features,
193
+ bind_key=bind_key,
194
+ extension_config=extension_config,
195
+ observability_config=observability_config,
196
+ **kwargs,
197
+ )
198
+
199
+ def _create_pool(self) -> "ConnectionPool":
200
+ all_config = dict(self.connection_config)
201
+
202
+ pool_parameters = {
203
+ "min_size": all_config.pop("min_size", 4),
204
+ "max_size": all_config.pop("max_size", None),
205
+ "name": all_config.pop("name", None),
206
+ "timeout": all_config.pop("timeout", 30.0),
207
+ "max_waiting": all_config.pop("max_waiting", 0),
208
+ "max_lifetime": all_config.pop("max_lifetime", 3600.0),
209
+ "max_idle": all_config.pop("max_idle", 600.0),
210
+ "reconnect_timeout": all_config.pop("reconnect_timeout", 300.0),
211
+ "num_workers": all_config.pop("num_workers", 3),
212
+ }
213
+
214
+ pool_parameters["configure"] = all_config.pop("configure", self._configure_connection)
215
+ pool_parameters = {k: v for k, v in pool_parameters.items() if v is not None}
216
+
217
+ conninfo = all_config.pop("conninfo", None)
218
+ if conninfo:
219
+ return ConnectionPool(conninfo, open=True, connection_class=psycopg_crdb.CrdbConnection, **pool_parameters)
220
+
221
+ kwargs = all_config.pop("kwargs", {})
222
+ all_config.update(kwargs)
223
+ return ConnectionPool(
224
+ "", kwargs=all_config, open=True, connection_class=psycopg_crdb.CrdbConnection, **pool_parameters
225
+ )
226
+
227
+ def _configure_connection(self, conn: "CockroachSyncConnection") -> None:
228
+ conn.row_factory = dict_row
229
+ autocommit_setting = self.connection_config.get("autocommit")
230
+ if autocommit_setting is not None:
231
+ conn.autocommit = autocommit_setting
232
+
233
+ def _close_pool(self) -> None:
234
+ if not self.connection_instance:
235
+ return
236
+ try:
237
+ self.connection_instance.close()
238
+ finally:
239
+ self.connection_instance = None
240
+
241
+ def create_connection(self) -> "CockroachSyncConnection":
242
+ if self.connection_instance is None:
243
+ self.connection_instance = self.create_pool()
244
+ return cast("CockroachSyncConnection", self.connection_instance.getconn())
245
+
246
+ def provide_connection(self, *args: Any, **kwargs: Any) -> "CockroachPsycopgSyncConnectionContext":
247
+ return CockroachPsycopgSyncConnectionContext(self)
248
+
249
+ def provide_session(
250
+ self,
251
+ *_args: Any,
252
+ statement_config: "StatementConfig | None" = None,
253
+ follower_reads: bool | None = None,
254
+ staleness: str | None = None,
255
+ **_kwargs: Any,
256
+ ) -> "CockroachPsycopgSyncSessionContext":
257
+ handler = _CockroachPsycopgSyncSessionConnectionHandler(self)
258
+ driver_features = dict(self.driver_features)
259
+ if follower_reads is not None:
260
+ driver_features["enable_follower_reads"] = follower_reads
261
+ if staleness is not None:
262
+ driver_features["default_staleness"] = staleness
263
+
264
+ return CockroachPsycopgSyncSessionContext(
265
+ acquire_connection=handler.acquire_connection,
266
+ release_connection=handler.release_connection,
267
+ statement_config=statement_config or self.statement_config or build_statement_config(),
268
+ driver_features=driver_features,
269
+ prepare_driver=self._prepare_driver,
270
+ )
271
+
272
+ def provide_pool(self, *args: Any, **kwargs: Any) -> "ConnectionPool":
273
+ if not self.connection_instance:
274
+ self.connection_instance = self.create_pool()
275
+ return self.connection_instance
276
+
277
+ def get_signature_namespace(self) -> "dict[str, Any]":
278
+ namespace = super().get_signature_namespace()
279
+ namespace.update({
280
+ "CockroachPsycopgConnectionConfig": CockroachPsycopgConnectionConfig,
281
+ "CockroachPsycopgPoolConfig": CockroachPsycopgPoolConfig,
282
+ "CockroachSyncConnection": CockroachSyncConnection,
283
+ "CockroachPsycopgSyncDriver": CockroachPsycopgSyncDriver,
284
+ "CockroachPsycopgSyncExceptionHandler": CockroachPsycopgSyncExceptionHandler,
285
+ "CockroachPsycopgSyncSessionContext": CockroachPsycopgSyncSessionContext,
286
+ })
287
+ return namespace
288
+
289
+ def get_event_runtime_hints(self) -> "EventRuntimeHints":
290
+ return EventRuntimeHints(poll_interval=0.5, select_for_update=True, skip_locked=True)
291
+
292
+
293
+ class CockroachPsycopgAsyncConnectionContext:
294
+ """Async context manager for CockroachDB psycopg connections."""
295
+
296
+ __slots__ = ("_config", "_ctx")
297
+
298
+ def __init__(self, config: "CockroachPsycopgAsyncConfig") -> None:
299
+ self._config = config
300
+ self._ctx: Any = None
301
+
302
+ async def __aenter__(self) -> "CockroachAsyncConnection":
303
+ if self._config.connection_instance is None:
304
+ self._config.connection_instance = await self._config.create_pool()
305
+ if self._config.connection_instance:
306
+ self._ctx = self._config.connection_instance.connection()
307
+ return cast("CockroachAsyncConnection", await self._ctx.__aenter__())
308
+ msg = "Connection pool is not initialized"
309
+ raise ImproperConfigurationError(msg)
310
+
311
+ async def __aexit__(
312
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
313
+ ) -> bool | None:
314
+ if self._ctx:
315
+ return cast("bool | None", await self._ctx.__aexit__(exc_type, exc_val, exc_tb))
316
+ return None
317
+
318
+
319
+ class _CockroachPsycopgAsyncSessionConnectionHandler:
320
+ __slots__ = ("_config", "_ctx")
321
+
322
+ def __init__(self, config: "CockroachPsycopgAsyncConfig") -> None:
323
+ self._config = config
324
+ self._ctx: Any = None
325
+
326
+ async def acquire_connection(self) -> "CockroachAsyncConnection":
327
+ pool = self._config.connection_instance
328
+ if pool is None:
329
+ pool = await self._config.create_pool()
330
+ self._config.connection_instance = pool
331
+ ctx = pool.connection()
332
+ self._ctx = ctx
333
+ return cast("CockroachAsyncConnection", await ctx.__aenter__())
334
+
335
+ async def release_connection(self, _conn: "CockroachAsyncConnection") -> None:
336
+ if self._ctx is not None:
337
+ await self._ctx.__aexit__(None, None, None)
338
+ self._ctx = None
339
+
340
+
341
+ class CockroachPsycopgAsyncConfig(
342
+ AsyncDatabaseConfig[CockroachAsyncConnection, AsyncConnectionPool, CockroachPsycopgAsyncDriver]
343
+ ):
344
+ """Configuration for CockroachDB async connections using psycopg."""
345
+
346
+ driver_type: "ClassVar[type[CockroachPsycopgAsyncDriver]]" = CockroachPsycopgAsyncDriver
347
+ connection_type: "ClassVar[type[CockroachAsyncConnection]]" = CockroachAsyncConnection
348
+ supports_transactional_ddl: "ClassVar[bool]" = True
349
+ supports_native_arrow_export: "ClassVar[bool]" = True
350
+ supports_native_arrow_import: "ClassVar[bool]" = True
351
+ supports_native_parquet_export: "ClassVar[bool]" = True
352
+ supports_native_parquet_import: "ClassVar[bool]" = True
353
+
354
+ def __init__(
355
+ self,
356
+ *,
357
+ connection_config: "CockroachPsycopgPoolConfig | dict[str, Any] | None" = None,
358
+ connection_instance: "AsyncConnectionPool | None" = None,
359
+ migration_config: "dict[str, Any] | None" = None,
360
+ statement_config: "StatementConfig | None" = None,
361
+ driver_features: "CockroachPsycopgDriverFeatures | dict[str, Any] | None" = None,
362
+ bind_key: "str | None" = None,
363
+ extension_config: "ExtensionConfigs | None" = None,
364
+ observability_config: "ObservabilityConfig | None" = None,
365
+ **kwargs: Any,
366
+ ) -> None:
367
+ reject_pool_aliases(kwargs)
368
+
369
+ connection_config = normalize_connection_config(connection_config)
370
+ statement_config = statement_config or build_statement_config()
371
+ statement_config, driver_features = apply_driver_features(statement_config, driver_features)
372
+
373
+ driver_features.setdefault("enable_auto_retry", True)
374
+ _ = CockroachPsycopgRetryConfig.from_features(driver_features)
375
+
376
+ super().__init__(
377
+ connection_config=connection_config,
378
+ connection_instance=connection_instance,
379
+ migration_config=migration_config,
380
+ statement_config=statement_config,
381
+ driver_features=driver_features,
382
+ bind_key=bind_key,
383
+ extension_config=extension_config,
384
+ observability_config=observability_config,
385
+ **kwargs,
386
+ )
387
+
388
+ async def _create_pool(self) -> "AsyncConnectionPool":
389
+ all_config = dict(self.connection_config)
390
+
391
+ pool_parameters = {
392
+ "min_size": all_config.pop("min_size", 4),
393
+ "max_size": all_config.pop("max_size", None),
394
+ "name": all_config.pop("name", None),
395
+ "timeout": all_config.pop("timeout", 30.0),
396
+ "max_waiting": all_config.pop("max_waiting", 0),
397
+ "max_lifetime": all_config.pop("max_lifetime", 3600.0),
398
+ "max_idle": all_config.pop("max_idle", 600.0),
399
+ "reconnect_timeout": all_config.pop("reconnect_timeout", 300.0),
400
+ "num_workers": all_config.pop("num_workers", 3),
401
+ }
402
+
403
+ pool_parameters["configure"] = all_config.pop("configure", self._configure_async_connection)
404
+ pool_parameters = {k: v for k, v in pool_parameters.items() if v is not None}
405
+
406
+ conninfo = all_config.pop("conninfo", None)
407
+ if conninfo:
408
+ pool = AsyncConnectionPool(
409
+ conninfo, open=False, connection_class=psycopg_crdb.AsyncCrdbConnection, **pool_parameters
410
+ )
411
+ else:
412
+ kwargs = all_config.pop("kwargs", {})
413
+ all_config.update(kwargs)
414
+ pool = AsyncConnectionPool(
415
+ "", kwargs=all_config, open=False, connection_class=psycopg_crdb.AsyncCrdbConnection, **pool_parameters
416
+ )
417
+
418
+ await pool.open()
419
+ return cast("AsyncConnectionPool", pool)
420
+
421
+ async def _configure_async_connection(self, conn: "CockroachAsyncConnection") -> None:
422
+ conn.row_factory = dict_row
423
+ autocommit_setting = self.connection_config.get("autocommit")
424
+ if autocommit_setting is not None:
425
+ await conn.set_autocommit(autocommit_setting)
426
+
427
+ async def _close_pool(self) -> None:
428
+ if not self.connection_instance:
429
+ return
430
+ try:
431
+ await self.connection_instance.close()
432
+ finally:
433
+ self.connection_instance = None
434
+
435
+ async def create_connection(self) -> "CockroachAsyncConnection":
436
+ if self.connection_instance is None:
437
+ self.connection_instance = await self.create_pool()
438
+ return cast("CockroachAsyncConnection", await self.connection_instance.getconn())
439
+
440
+ def provide_connection(self, *args: Any, **kwargs: Any) -> "CockroachPsycopgAsyncConnectionContext":
441
+ return CockroachPsycopgAsyncConnectionContext(self)
442
+
443
+ def provide_session(
444
+ self,
445
+ *_args: Any,
446
+ statement_config: "StatementConfig | None" = None,
447
+ follower_reads: bool | None = None,
448
+ staleness: str | None = None,
449
+ **_kwargs: Any,
450
+ ) -> "CockroachPsycopgAsyncSessionContext":
451
+ handler = _CockroachPsycopgAsyncSessionConnectionHandler(self)
452
+ driver_features = dict(self.driver_features)
453
+ if follower_reads is not None:
454
+ driver_features["enable_follower_reads"] = follower_reads
455
+ if staleness is not None:
456
+ driver_features["default_staleness"] = staleness
457
+
458
+ return CockroachPsycopgAsyncSessionContext(
459
+ acquire_connection=handler.acquire_connection,
460
+ release_connection=handler.release_connection,
461
+ statement_config=statement_config or self.statement_config or build_statement_config(),
462
+ driver_features=driver_features,
463
+ prepare_driver=self._prepare_driver,
464
+ )
465
+
466
+ async def provide_pool(self, *args: Any, **kwargs: Any) -> "AsyncConnectionPool":
467
+ if not self.connection_instance:
468
+ self.connection_instance = await self.create_pool()
469
+ return self.connection_instance
470
+
471
+ def get_signature_namespace(self) -> "dict[str, Any]":
472
+ namespace = super().get_signature_namespace()
473
+ namespace.update({
474
+ "CockroachAsyncConnection": CockroachAsyncConnection,
475
+ "CockroachPsycopgAsyncDriver": CockroachPsycopgAsyncDriver,
476
+ "CockroachPsycopgAsyncExceptionHandler": CockroachPsycopgAsyncExceptionHandler,
477
+ "CockroachPsycopgAsyncSessionContext": CockroachPsycopgAsyncSessionContext,
478
+ "CockroachPsycopgConnectionConfig": CockroachPsycopgConnectionConfig,
479
+ "CockroachPsycopgPoolConfig": CockroachPsycopgPoolConfig,
480
+ })
481
+ return namespace
482
+
483
+ def get_event_runtime_hints(self) -> "EventRuntimeHints":
484
+ return EventRuntimeHints(poll_interval=0.5, select_for_update=True, skip_locked=True)
@@ -0,0 +1,63 @@
1
+ """CockroachDB psycopg adapter compiled helpers."""
2
+
3
+ import secrets
4
+ from dataclasses import dataclass
5
+ from typing import TYPE_CHECKING, Any, Final
6
+
7
+ from sqlspec.adapters.psycopg.core import apply_driver_features, build_statement_config, driver_profile
8
+ from sqlspec.utils.type_guards import has_sqlstate
9
+
10
+ if TYPE_CHECKING:
11
+ from collections.abc import Mapping
12
+
13
+ __all__ = (
14
+ "CockroachPsycopgRetryConfig",
15
+ "apply_driver_features",
16
+ "build_statement_config",
17
+ "calculate_backoff_seconds",
18
+ "driver_profile",
19
+ "is_retryable_error",
20
+ )
21
+
22
+ # Retry configuration defaults (module-level for mypyc compatibility)
23
+ _DEFAULT_MAX_RETRIES: Final[int] = 10
24
+ _DEFAULT_BASE_DELAY_MS: Final[float] = 50.0
25
+ _DEFAULT_MAX_DELAY_MS: Final[float] = 5000.0
26
+ _DEFAULT_ENABLE_LOGGING: Final[bool] = True
27
+
28
+
29
+ @dataclass(frozen=True)
30
+ class CockroachPsycopgRetryConfig:
31
+ """CockroachDB psycopg transaction retry configuration."""
32
+
33
+ max_retries: int = _DEFAULT_MAX_RETRIES
34
+ base_delay_ms: float = _DEFAULT_BASE_DELAY_MS
35
+ max_delay_ms: float = _DEFAULT_MAX_DELAY_MS
36
+ enable_logging: bool = _DEFAULT_ENABLE_LOGGING
37
+
38
+ @classmethod
39
+ def from_features(cls, driver_features: "Mapping[str, Any]") -> "CockroachPsycopgRetryConfig":
40
+ """Build retry config from driver feature mappings."""
41
+ return cls(
42
+ max_retries=int(driver_features.get("max_retries", _DEFAULT_MAX_RETRIES)),
43
+ base_delay_ms=float(driver_features.get("retry_delay_base_ms", _DEFAULT_BASE_DELAY_MS)),
44
+ max_delay_ms=float(driver_features.get("retry_delay_max_ms", _DEFAULT_MAX_DELAY_MS)),
45
+ enable_logging=bool(driver_features.get("enable_retry_logging", _DEFAULT_ENABLE_LOGGING)),
46
+ )
47
+
48
+
49
+ def is_retryable_error(error: BaseException) -> bool:
50
+ """Return True when the error should trigger a CockroachDB retry."""
51
+ if has_sqlstate(error):
52
+ return str(error.sqlstate) == "40001"
53
+ return False
54
+
55
+
56
+ def calculate_backoff_seconds(attempt: int, config: "CockroachPsycopgRetryConfig") -> float:
57
+ """Calculate exponential backoff delay in seconds."""
58
+ base: float = config.base_delay_ms * (2**attempt)
59
+ scale: int = 1000
60
+ max_jitter: int = max(int(base * scale), 0)
61
+ jitter: float = secrets.randbelow(max_jitter + 1) / scale if max_jitter else 0.0
62
+ delay_ms: float = min(base + jitter, config.max_delay_ms)
63
+ return delay_ms / 1000.0