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,55 @@
1
+ """CockroachDB AsyncPG adapter helpers."""
2
+
3
+ import secrets
4
+ from dataclasses import dataclass
5
+ from typing import TYPE_CHECKING, Any, Final
6
+
7
+ from sqlspec.utils.type_guards import has_sqlstate
8
+
9
+ if TYPE_CHECKING:
10
+ from collections.abc import Mapping
11
+
12
+ __all__ = ("CockroachAsyncpgRetryConfig", "calculate_backoff_seconds", "is_retryable_error")
13
+
14
+ # Retry configuration defaults (module-level for mypyc compatibility)
15
+ _DEFAULT_MAX_RETRIES: Final[int] = 10
16
+ _DEFAULT_BASE_DELAY_MS: Final[float] = 50.0
17
+ _DEFAULT_MAX_DELAY_MS: Final[float] = 5000.0
18
+ _DEFAULT_ENABLE_LOGGING: Final[bool] = True
19
+
20
+
21
+ @dataclass(frozen=True)
22
+ class CockroachAsyncpgRetryConfig:
23
+ """CockroachDB asyncpg transaction retry configuration."""
24
+
25
+ max_retries: int = _DEFAULT_MAX_RETRIES
26
+ base_delay_ms: float = _DEFAULT_BASE_DELAY_MS
27
+ max_delay_ms: float = _DEFAULT_MAX_DELAY_MS
28
+ enable_logging: bool = _DEFAULT_ENABLE_LOGGING
29
+
30
+ @classmethod
31
+ def from_features(cls, driver_features: "Mapping[str, Any]") -> "CockroachAsyncpgRetryConfig":
32
+ """Build retry config from driver feature mappings."""
33
+ return cls(
34
+ max_retries=int(driver_features.get("max_retries", _DEFAULT_MAX_RETRIES)),
35
+ base_delay_ms=float(driver_features.get("retry_delay_base_ms", _DEFAULT_BASE_DELAY_MS)),
36
+ max_delay_ms=float(driver_features.get("retry_delay_max_ms", _DEFAULT_MAX_DELAY_MS)),
37
+ enable_logging=bool(driver_features.get("enable_retry_logging", _DEFAULT_ENABLE_LOGGING)),
38
+ )
39
+
40
+
41
+ def is_retryable_error(error: BaseException) -> bool:
42
+ """Return True when the error should trigger a CockroachDB retry."""
43
+ if has_sqlstate(error):
44
+ return str(error.sqlstate) == "40001"
45
+ return False
46
+
47
+
48
+ def calculate_backoff_seconds(attempt: int, config: "CockroachAsyncpgRetryConfig") -> float:
49
+ """Calculate exponential backoff delay in seconds."""
50
+ base: float = config.base_delay_ms * (2**attempt)
51
+ scale: int = 1000
52
+ max_jitter: int = max(int(base * scale), 0)
53
+ jitter: float = secrets.randbelow(max_jitter + 1) / scale if max_jitter else 0.0
54
+ delay_ms: float = min(base + jitter, config.max_delay_ms)
55
+ return delay_ms / 1000.0
@@ -0,0 +1,107 @@
1
+ """CockroachDB AsyncPG data dictionary."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from mypy_extensions import mypyc_attr
6
+
7
+ from sqlspec.driver import AsyncDataDictionaryBase
8
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
9
+
10
+ if TYPE_CHECKING:
11
+ from sqlspec.adapters.cockroach_asyncpg.driver import CockroachAsyncpgDriver
12
+
13
+ __all__ = ("CockroachAsyncpgDataDictionary",)
14
+
15
+
16
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
17
+ class CockroachAsyncpgDataDictionary(AsyncDataDictionaryBase):
18
+ """CockroachDB async data dictionary (AsyncPG)."""
19
+
20
+ dialect: ClassVar[str] = "cockroachdb"
21
+
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+
25
+ async def get_version(self, driver: "CockroachAsyncpgDriver") -> "VersionInfo | None":
26
+ driver_id = id(driver)
27
+ if driver_id in self._version_fetch_attempted:
28
+ return self._version_cache.get(driver_id)
29
+
30
+ version_value = await driver.select_value_or_none(self.get_query("version"))
31
+ if not version_value:
32
+ self._log_version_unavailable(type(self).dialect, "missing")
33
+ self.cache_version(driver_id, None)
34
+ return None
35
+
36
+ version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
37
+ if version_info is None:
38
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
39
+ self.cache_version(driver_id, None)
40
+ return None
41
+
42
+ self._log_version_detected(type(self).dialect, version_info)
43
+ self.cache_version(driver_id, version_info)
44
+ return version_info
45
+
46
+ async def get_feature_flag(self, driver: "CockroachAsyncpgDriver", feature: str) -> bool:
47
+ version_info = await self.get_version(driver)
48
+ return self.resolve_feature_flag(feature, version_info)
49
+
50
+ async def get_optimal_type(self, driver: "CockroachAsyncpgDriver", type_category: str) -> str:
51
+ config = self.get_dialect_config()
52
+ return config.get_optimal_type(type_category)
53
+
54
+ async def get_tables(self, driver: "CockroachAsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
55
+ schema_name = self.resolve_schema(schema)
56
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
57
+ return await driver.select(
58
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
59
+ )
60
+
61
+ async def get_columns(
62
+ self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
63
+ ) -> "list[ColumnMetadata]":
64
+ schema_name = self.resolve_schema(schema)
65
+ if table is None:
66
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
67
+ return await driver.select(
68
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
69
+ )
70
+
71
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
72
+ return await driver.select(
73
+ self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
74
+ )
75
+
76
+ async def get_indexes(
77
+ self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
78
+ ) -> "list[IndexMetadata]":
79
+ schema_name = self.resolve_schema(schema)
80
+ if table is None:
81
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
82
+ return await driver.select(
83
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
84
+ )
85
+
86
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
87
+ return await driver.select(
88
+ self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
89
+ )
90
+
91
+ async def get_foreign_keys(
92
+ self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
93
+ ) -> "list[ForeignKeyMetadata]":
94
+ schema_name = self.resolve_schema(schema)
95
+ if table is None:
96
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
97
+ return await driver.select(
98
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
99
+ )
100
+
101
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
102
+ return await driver.select(
103
+ self.get_query("foreign_keys_by_table"),
104
+ table_name=table,
105
+ schema_name=schema_name,
106
+ schema_type=ForeignKeyMetadata,
107
+ )
@@ -0,0 +1,144 @@
1
+ """CockroachDB AsyncPG driver implementation."""
2
+
3
+ import asyncio
4
+ import contextlib
5
+ from typing import TYPE_CHECKING, Any, cast
6
+
7
+ import asyncpg
8
+
9
+ from sqlspec.adapters.asyncpg.core import create_mapped_exception, driver_profile
10
+ from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
11
+ from sqlspec.adapters.cockroach_asyncpg._typing import CockroachAsyncpgSessionContext
12
+ from sqlspec.adapters.cockroach_asyncpg.core import (
13
+ CockroachAsyncpgRetryConfig,
14
+ calculate_backoff_seconds,
15
+ is_retryable_error,
16
+ )
17
+ from sqlspec.adapters.cockroach_asyncpg.data_dictionary import CockroachAsyncpgDataDictionary
18
+ from sqlspec.core import SQL, register_driver_profile
19
+ from sqlspec.exceptions import SerializationConflictError, TransactionRetryError
20
+ from sqlspec.utils.logging import get_logger
21
+ from sqlspec.utils.type_guards import has_sqlstate
22
+
23
+ if TYPE_CHECKING:
24
+ from collections.abc import Callable
25
+
26
+ from sqlspec.adapters.cockroach_asyncpg._typing import CockroachAsyncpgConnection
27
+ from sqlspec.core import StatementConfig
28
+ from sqlspec.driver import ExecutionResult
29
+
30
+ __all__ = ("CockroachAsyncpgDriver", "CockroachAsyncpgExceptionHandler", "CockroachAsyncpgSessionContext")
31
+
32
+ logger = get_logger("sqlspec.adapters.cockroach_asyncpg")
33
+
34
+
35
+ class CockroachAsyncpgExceptionHandler:
36
+ """Async context manager for CockroachDB AsyncPG exceptions."""
37
+
38
+ __slots__ = ("pending_exception",)
39
+
40
+ def __init__(self) -> None:
41
+ self.pending_exception: Exception | None = None
42
+
43
+ async def __aenter__(self) -> "CockroachAsyncpgExceptionHandler":
44
+ return self
45
+
46
+ async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
47
+ if exc_val is None:
48
+ return False
49
+ if isinstance(exc_val, asyncpg.PostgresError) or has_sqlstate(exc_val):
50
+ if has_sqlstate(exc_val) and str(exc_val.sqlstate) == "40001":
51
+ self.pending_exception = SerializationConflictError(str(exc_val))
52
+ return True
53
+ self.pending_exception = create_mapped_exception(exc_val)
54
+ return True
55
+ return False
56
+
57
+
58
+ class CockroachAsyncpgDriver(AsyncpgDriver):
59
+ """CockroachDB AsyncPG driver with retry support."""
60
+
61
+ __slots__ = ("_enable_retry", "_follower_staleness", "_retry_config")
62
+ dialect = "postgres"
63
+
64
+ def __init__(
65
+ self,
66
+ connection: "CockroachAsyncpgConnection",
67
+ statement_config: "StatementConfig | None" = None,
68
+ driver_features: "dict[str, Any] | None" = None,
69
+ ) -> None:
70
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
71
+ self._retry_config = CockroachAsyncpgRetryConfig.from_features(self.driver_features)
72
+ self._enable_retry = bool(self.driver_features.get("enable_auto_retry", True))
73
+ self._follower_staleness = cast("str | None", self.driver_features.get("default_staleness"))
74
+ # Data dictionary is lazily initialized in property; use parent slot
75
+ self._data_dictionary = None
76
+
77
+ async def _execute_with_retry(self, operation: "Callable[[], Any]") -> "ExecutionResult":
78
+ if not self._enable_retry:
79
+ return cast("ExecutionResult", await operation())
80
+
81
+ last_error: Exception | None = None
82
+
83
+ async def attempt_operation() -> "tuple[ExecutionResult | None, Exception | None]":
84
+ try:
85
+ return await operation(), None
86
+ except Exception as exc:
87
+ return None, exc
88
+
89
+ for attempt in range(self._retry_config.max_retries + 1):
90
+ result, exc = await attempt_operation()
91
+ if exc is None:
92
+ return cast("ExecutionResult", result)
93
+ last_error = exc
94
+ if not is_retryable_error(exc) or attempt >= self._retry_config.max_retries:
95
+ raise exc
96
+ with contextlib.suppress(Exception):
97
+ await self.connection.execute("ROLLBACK")
98
+ delay = calculate_backoff_seconds(attempt, self._retry_config)
99
+ if self._retry_config.enable_logging:
100
+ logger.debug("CockroachDB retry %s/%s after %.3fs", attempt + 1, self._retry_config.max_retries, delay)
101
+ await asyncio.sleep(delay)
102
+
103
+ msg = "CockroachDB transaction retry limit exceeded"
104
+ raise TransactionRetryError(msg) from last_error
105
+
106
+ async def _apply_follower_reads(self, cursor: "CockroachAsyncpgConnection") -> None:
107
+ if not self.driver_features.get("enable_follower_reads", False):
108
+ return
109
+ if not self._follower_staleness:
110
+ return
111
+ await cursor.execute(f"SET TRANSACTION AS OF SYSTEM TIME {self._follower_staleness}")
112
+
113
+ async def dispatch_execute(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
114
+ async def operation() -> "ExecutionResult":
115
+ if statement.returns_rows():
116
+ await self._apply_follower_reads(cursor)
117
+ return await super(CockroachAsyncpgDriver, self).dispatch_execute(cursor, statement)
118
+
119
+ return await self._execute_with_retry(operation)
120
+
121
+ async def dispatch_execute_many(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
122
+ async def operation() -> "ExecutionResult":
123
+ return await super(CockroachAsyncpgDriver, self).dispatch_execute_many(cursor, statement)
124
+
125
+ return await self._execute_with_retry(operation)
126
+
127
+ async def dispatch_execute_script(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
128
+ async def operation() -> "ExecutionResult":
129
+ return await super(CockroachAsyncpgDriver, self).dispatch_execute_script(cursor, statement)
130
+
131
+ return await self._execute_with_retry(operation)
132
+
133
+ def handle_database_exceptions(self) -> "CockroachAsyncpgExceptionHandler": # type: ignore[override]
134
+ return CockroachAsyncpgExceptionHandler()
135
+
136
+ @property
137
+ def data_dictionary(self) -> "CockroachAsyncpgDataDictionary": # type: ignore[override]
138
+ if self._data_dictionary is None:
139
+ # Intentionally assign CockroachDB-specific data dictionary to parent slot
140
+ object.__setattr__(self, "_data_dictionary", CockroachAsyncpgDataDictionary())
141
+ return cast("CockroachAsyncpgDataDictionary", self._data_dictionary)
142
+
143
+
144
+ register_driver_profile("cockroach_asyncpg", driver_profile)
@@ -0,0 +1,3 @@
1
+ from sqlspec.adapters.cockroach_asyncpg.events.store import CockroachAsyncpgEventQueueStore
2
+
3
+ __all__ = ("CockroachAsyncpgEventQueueStore",)
@@ -0,0 +1,20 @@
1
+ """CockroachDB event queue store for asyncpg driver."""
2
+
3
+ from sqlspec.adapters.cockroach_asyncpg.config import CockroachAsyncpgConfig
4
+ from sqlspec.extensions.events import BaseEventQueueStore
5
+
6
+ __all__ = ("CockroachAsyncpgEventQueueStore",)
7
+
8
+
9
+ class CockroachAsyncpgEventQueueStore(BaseEventQueueStore[CockroachAsyncpgConfig]):
10
+ """Queue DDL for CockroachDB asyncpg configs.
11
+
12
+ CockroachDB uses JSONB for efficient JSON storage and TIMESTAMPTZ for
13
+ timezone-aware timestamps.
14
+ """
15
+
16
+ __slots__ = ()
17
+
18
+ def _column_types(self) -> "tuple[str, str, str]":
19
+ """Return CockroachDB-optimized column types for the event queue."""
20
+ return "JSONB", "JSONB", "TIMESTAMPTZ"
@@ -0,0 +1,3 @@
1
+ from sqlspec.adapters.cockroach_asyncpg.litestar.store import CockroachAsyncpgStore
2
+
3
+ __all__ = ("CockroachAsyncpgStore",)
@@ -0,0 +1,142 @@
1
+ """CockroachDB session store for Litestar integration using asyncpg."""
2
+
3
+ from datetime import datetime, timedelta, timezone
4
+ from typing import TYPE_CHECKING
5
+
6
+ from sqlspec.extensions.litestar.store import BaseSQLSpecStore
7
+
8
+ if TYPE_CHECKING:
9
+ from sqlspec.adapters.cockroach_asyncpg.config import CockroachAsyncpgConfig
10
+
11
+
12
+ __all__ = ("CockroachAsyncpgStore",)
13
+
14
+
15
+ class CockroachAsyncpgStore(BaseSQLSpecStore["CockroachAsyncpgConfig"]):
16
+ """CockroachDB session store using asyncpg driver."""
17
+
18
+ __slots__ = ()
19
+
20
+ def __init__(self, config: "CockroachAsyncpgConfig") -> None:
21
+ super().__init__(config)
22
+
23
+ def _get_create_table_sql(self) -> str:
24
+ """Get CockroachDB CREATE TABLE SQL with optimized schema."""
25
+ return f"""
26
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
27
+ session_id TEXT PRIMARY KEY,
28
+ data BYTEA NOT NULL,
29
+ expires_at TIMESTAMPTZ,
30
+ created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
31
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
32
+ );
33
+
34
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
35
+ ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
36
+ """
37
+
38
+ def _get_drop_table_sql(self) -> "list[str]":
39
+ return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
40
+
41
+ async def create_table(self) -> None:
42
+ sql = self._get_create_table_sql()
43
+ async with self._config.provide_session() as driver:
44
+ await driver.execute_script(sql)
45
+ self._log_table_created()
46
+
47
+ async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
48
+ sql = f"""
49
+ SELECT data, expires_at FROM {self._table_name}
50
+ WHERE session_id = $1
51
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
52
+ """
53
+
54
+ async with self._config.provide_connection() as conn:
55
+ row = await conn.fetchrow(sql, key)
56
+
57
+ if row is None:
58
+ return None
59
+
60
+ if renew_for is not None and row["expires_at"] is not None:
61
+ new_expires_at = self._calculate_expires_at(renew_for)
62
+ if new_expires_at is not None:
63
+ update_sql = f"""
64
+ UPDATE {self._table_name}
65
+ SET expires_at = $1, updated_at = CURRENT_TIMESTAMP
66
+ WHERE session_id = $2
67
+ """
68
+ await conn.execute(update_sql, new_expires_at, key)
69
+
70
+ return bytes(row["data"])
71
+
72
+ async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
73
+ data = self._value_to_bytes(value)
74
+ expires_at = self._calculate_expires_at(expires_in)
75
+
76
+ sql = f"""
77
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
78
+ VALUES ($1, $2, $3)
79
+ ON CONFLICT (session_id)
80
+ DO UPDATE SET
81
+ data = EXCLUDED.data,
82
+ expires_at = EXCLUDED.expires_at,
83
+ updated_at = CURRENT_TIMESTAMP
84
+ """
85
+
86
+ async with self._config.provide_connection() as conn:
87
+ await conn.execute(sql, key, data, expires_at)
88
+
89
+ async def delete(self, key: str) -> None:
90
+ sql = f"DELETE FROM {self._table_name} WHERE session_id = $1"
91
+
92
+ async with self._config.provide_connection() as conn:
93
+ await conn.execute(sql, key)
94
+
95
+ async def delete_all(self) -> None:
96
+ sql = f"DELETE FROM {self._table_name}"
97
+
98
+ async with self._config.provide_connection() as conn:
99
+ await conn.execute(sql)
100
+ self._log_delete_all()
101
+
102
+ async def exists(self, key: str) -> bool:
103
+ sql = f"""
104
+ SELECT 1 FROM {self._table_name}
105
+ WHERE session_id = $1
106
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
107
+ """
108
+
109
+ async with self._config.provide_connection() as conn:
110
+ row = await conn.fetchrow(sql, key)
111
+ return row is not None
112
+
113
+ async def expires_in(self, key: str) -> "int | None":
114
+ sql = f"""
115
+ SELECT expires_at FROM {self._table_name}
116
+ WHERE session_id = $1
117
+ """
118
+
119
+ async with self._config.provide_connection() as conn:
120
+ row = await conn.fetchrow(sql, key)
121
+
122
+ if row is None or row["expires_at"] is None:
123
+ return None
124
+
125
+ expires_at = row["expires_at"]
126
+ now = datetime.now(timezone.utc)
127
+
128
+ if expires_at <= now:
129
+ return 0
130
+
131
+ delta = expires_at - now
132
+ return int(delta.total_seconds())
133
+
134
+ async def delete_expired(self) -> int:
135
+ sql = f"DELETE FROM {self._table_name} WHERE expires_at <= CURRENT_TIMESTAMP"
136
+
137
+ async with self._config.provide_connection() as conn:
138
+ result = await conn.execute(sql)
139
+ count = int(result.split()[-1]) if result else 0
140
+ if count > 0:
141
+ self._log_delete_expired(count)
142
+ return count
@@ -0,0 +1,38 @@
1
+ from sqlspec.adapters.cockroach_psycopg._typing import (
2
+ CockroachAsyncConnection,
3
+ CockroachPsycopgAsyncSessionContext,
4
+ CockroachPsycopgSyncSessionContext,
5
+ CockroachSyncConnection,
6
+ )
7
+ from sqlspec.adapters.cockroach_psycopg.config import (
8
+ CockroachPsycopgAsyncConfig,
9
+ CockroachPsycopgConnectionConfig,
10
+ CockroachPsycopgDriverFeatures,
11
+ CockroachPsycopgPoolConfig,
12
+ CockroachPsycopgSyncConfig,
13
+ )
14
+ from sqlspec.adapters.cockroach_psycopg.core import build_statement_config, driver_profile
15
+ from sqlspec.adapters.cockroach_psycopg.driver import (
16
+ CockroachPsycopgAsyncDriver,
17
+ CockroachPsycopgAsyncExceptionHandler,
18
+ CockroachPsycopgSyncDriver,
19
+ CockroachPsycopgSyncExceptionHandler,
20
+ )
21
+
22
+ __all__ = (
23
+ "CockroachAsyncConnection",
24
+ "CockroachPsycopgAsyncConfig",
25
+ "CockroachPsycopgAsyncDriver",
26
+ "CockroachPsycopgAsyncExceptionHandler",
27
+ "CockroachPsycopgAsyncSessionContext",
28
+ "CockroachPsycopgConnectionConfig",
29
+ "CockroachPsycopgDriverFeatures",
30
+ "CockroachPsycopgPoolConfig",
31
+ "CockroachPsycopgSyncConfig",
32
+ "CockroachPsycopgSyncDriver",
33
+ "CockroachPsycopgSyncExceptionHandler",
34
+ "CockroachPsycopgSyncSessionContext",
35
+ "CockroachSyncConnection",
36
+ "build_statement_config",
37
+ "driver_profile",
38
+ )
@@ -0,0 +1,129 @@
1
+ """CockroachDB psycopg adapter type definitions.
2
+
3
+ This module contains type aliases and classes that are excluded from mypyc
4
+ compilation to avoid ABI boundary issues.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ from psycopg import crdb as psycopg_crdb
10
+ from psycopg.rows import DictRow as PsycopgDictRow
11
+
12
+ if TYPE_CHECKING:
13
+ from collections.abc import Callable
14
+ from typing import TypeAlias
15
+
16
+ from psycopg.crdb import AsyncCrdbConnection, CrdbConnection
17
+
18
+ from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgAsyncDriver, CockroachPsycopgSyncDriver
19
+ from sqlspec.core import StatementConfig
20
+
21
+ # Parametrize with DictRow so type system knows rows are dict-like
22
+ CockroachSyncConnection: TypeAlias = CrdbConnection[PsycopgDictRow]
23
+ CockroachAsyncConnection: TypeAlias = AsyncCrdbConnection[PsycopgDictRow]
24
+ else:
25
+ CockroachSyncConnection = psycopg_crdb.CrdbConnection
26
+ CockroachAsyncConnection = psycopg_crdb.AsyncCrdbConnection
27
+
28
+
29
+ class CockroachPsycopgSyncSessionContext:
30
+ """Sync context manager for CockroachDB psycopg sessions."""
31
+
32
+ __slots__ = (
33
+ "_acquire_connection",
34
+ "_connection",
35
+ "_driver",
36
+ "_driver_features",
37
+ "_prepare_driver",
38
+ "_release_connection",
39
+ "_statement_config",
40
+ )
41
+
42
+ def __init__(
43
+ self,
44
+ acquire_connection: "Callable[[], Any]",
45
+ release_connection: "Callable[[Any], Any]",
46
+ statement_config: "StatementConfig",
47
+ driver_features: "dict[str, Any]",
48
+ prepare_driver: "Callable[[CockroachPsycopgSyncDriver], CockroachPsycopgSyncDriver]",
49
+ ) -> None:
50
+ self._acquire_connection = acquire_connection
51
+ self._release_connection = release_connection
52
+ self._statement_config = statement_config
53
+ self._driver_features = driver_features
54
+ self._prepare_driver = prepare_driver
55
+ self._connection: Any = None
56
+ self._driver: CockroachPsycopgSyncDriver | None = None
57
+
58
+ def __enter__(self) -> "CockroachPsycopgSyncDriver":
59
+ from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgSyncDriver
60
+
61
+ self._connection = self._acquire_connection()
62
+ self._driver = CockroachPsycopgSyncDriver(
63
+ connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
64
+ )
65
+ return self._prepare_driver(self._driver)
66
+
67
+ def __exit__(
68
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
69
+ ) -> "bool | None":
70
+ if self._connection is not None:
71
+ self._release_connection(self._connection)
72
+ self._connection = None
73
+ return None
74
+
75
+
76
+ class CockroachPsycopgAsyncSessionContext:
77
+ """Async context manager for CockroachDB psycopg sessions."""
78
+
79
+ __slots__ = (
80
+ "_acquire_connection",
81
+ "_connection",
82
+ "_driver",
83
+ "_driver_features",
84
+ "_prepare_driver",
85
+ "_release_connection",
86
+ "_statement_config",
87
+ )
88
+
89
+ def __init__(
90
+ self,
91
+ acquire_connection: "Callable[[], Any]",
92
+ release_connection: "Callable[[Any], Any]",
93
+ statement_config: "StatementConfig",
94
+ driver_features: "dict[str, Any]",
95
+ prepare_driver: "Callable[[CockroachPsycopgAsyncDriver], CockroachPsycopgAsyncDriver]",
96
+ ) -> None:
97
+ self._acquire_connection = acquire_connection
98
+ self._release_connection = release_connection
99
+ self._statement_config = statement_config
100
+ self._driver_features = driver_features
101
+ self._prepare_driver = prepare_driver
102
+ self._connection: Any = None
103
+ self._driver: CockroachPsycopgAsyncDriver | None = None
104
+
105
+ async def __aenter__(self) -> "CockroachPsycopgAsyncDriver":
106
+ from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgAsyncDriver
107
+
108
+ self._connection = await self._acquire_connection()
109
+ self._driver = CockroachPsycopgAsyncDriver(
110
+ connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
111
+ )
112
+ return self._prepare_driver(self._driver)
113
+
114
+ async def __aexit__(
115
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
116
+ ) -> "bool | None":
117
+ if self._connection is not None:
118
+ await self._release_connection(self._connection)
119
+ self._connection = None
120
+ return None
121
+
122
+
123
+ __all__ = (
124
+ "CockroachAsyncConnection",
125
+ "CockroachPsycopgAsyncSessionContext",
126
+ "CockroachPsycopgSyncSessionContext",
127
+ "CockroachSyncConnection",
128
+ "PsycopgDictRow",
129
+ )
@@ -0,0 +1,13 @@
1
+ from sqlspec.adapters.cockroach_psycopg.adk.store import (
2
+ CockroachPsycopgAsyncADKMemoryStore,
3
+ CockroachPsycopgAsyncADKStore,
4
+ CockroachPsycopgSyncADKMemoryStore,
5
+ CockroachPsycopgSyncADKStore,
6
+ )
7
+
8
+ __all__ = (
9
+ "CockroachPsycopgAsyncADKMemoryStore",
10
+ "CockroachPsycopgAsyncADKStore",
11
+ "CockroachPsycopgSyncADKMemoryStore",
12
+ "CockroachPsycopgSyncADKStore",
13
+ )