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,430 @@
1
+ """DuckDB driver implementation."""
2
+
3
+ import contextlib
4
+ from typing import TYPE_CHECKING, Any, cast
5
+ from uuid import uuid4
6
+
7
+ import duckdb
8
+
9
+ from sqlspec.adapters.duckdb.core import (
10
+ apply_driver_features,
11
+ collect_rows,
12
+ create_mapped_exception,
13
+ default_statement_config,
14
+ driver_profile,
15
+ normalize_execute_parameters,
16
+ resolve_rowcount,
17
+ )
18
+ from sqlspec.adapters.duckdb.data_dictionary import DuckDBDataDictionary
19
+ from sqlspec.adapters.duckdb.type_converter import DuckDBOutputConverter
20
+ from sqlspec.core import SQL, StatementConfig, build_arrow_result_from_table, get_cache_config, register_driver_profile
21
+ from sqlspec.driver import SyncDriverAdapterBase
22
+ from sqlspec.exceptions import DatabaseConnectionError, SQLSpecError
23
+ from sqlspec.utils.logging import get_logger
24
+ from sqlspec.utils.module_loader import ensure_pyarrow
25
+
26
+ if TYPE_CHECKING:
27
+ from sqlspec.adapters.duckdb._typing import DuckDBConnection
28
+ from sqlspec.builder import QueryBuilder
29
+ from sqlspec.core import ArrowResult, Statement, StatementFilter
30
+ from sqlspec.driver import ExecutionResult
31
+ from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
32
+ from sqlspec.typing import ArrowReturnFormat, StatementParameters
33
+
34
+ from sqlspec.adapters.duckdb._typing import DuckDBSessionContext
35
+
36
+ __all__ = ("DuckDBCursor", "DuckDBDriver", "DuckDBExceptionHandler", "DuckDBSessionContext")
37
+
38
+ logger = get_logger("sqlspec.adapters.duckdb")
39
+
40
+ _type_converter = DuckDBOutputConverter()
41
+
42
+
43
+ class DuckDBCursor:
44
+ """Context manager for DuckDB cursor management."""
45
+
46
+ __slots__ = ("connection", "cursor")
47
+
48
+ def __init__(self, connection: "DuckDBConnection") -> None:
49
+ self.connection = connection
50
+ self.cursor: Any | None = None
51
+
52
+ def __enter__(self) -> Any:
53
+ self.cursor = self.connection.cursor()
54
+ return self.cursor
55
+
56
+ def __exit__(self, *_: Any) -> None:
57
+ if self.cursor is not None:
58
+ self.cursor.close()
59
+
60
+
61
+ class DuckDBExceptionHandler:
62
+ """Context manager for handling DuckDB database exceptions.
63
+
64
+ Uses exception type and message-based detection to map DuckDB errors
65
+ to specific SQLSpec exceptions for better error handling.
66
+
67
+ Uses deferred exception pattern for mypyc compatibility: exceptions
68
+ are stored in pending_exception rather than raised from __exit__
69
+ to avoid ABI boundary violations with compiled code.
70
+ """
71
+
72
+ __slots__ = ("pending_exception",)
73
+
74
+ def __init__(self) -> None:
75
+ self.pending_exception: Exception | None = None
76
+
77
+ def __enter__(self) -> "DuckDBExceptionHandler":
78
+ return self
79
+
80
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
81
+ _ = exc_tb
82
+ if exc_type is None:
83
+ return False
84
+ self.pending_exception = create_mapped_exception(exc_type, exc_val)
85
+ return True
86
+
87
+
88
+ class DuckDBDriver(SyncDriverAdapterBase):
89
+ """Synchronous DuckDB database driver.
90
+
91
+ Provides SQL statement execution, transaction management, and result handling
92
+ for DuckDB databases. Supports multiple parameter styles including QMARK,
93
+ NUMERIC, and NAMED_DOLLAR formats.
94
+
95
+ The driver handles script execution, batch operations, and integrates with
96
+ the sqlspec.core modules for statement processing and caching.
97
+ """
98
+
99
+ __slots__ = ("_data_dictionary",)
100
+ dialect = "duckdb"
101
+
102
+ def __init__(
103
+ self,
104
+ connection: "DuckDBConnection",
105
+ statement_config: "StatementConfig | None" = None,
106
+ driver_features: "dict[str, Any] | None" = None,
107
+ ) -> None:
108
+ if statement_config is None:
109
+ statement_config = default_statement_config.replace(
110
+ enable_caching=get_cache_config().compiled_cache_enabled
111
+ )
112
+
113
+ statement_config = apply_driver_features(statement_config, driver_features)
114
+
115
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
116
+ self._data_dictionary: DuckDBDataDictionary | None = None
117
+
118
+ # ─────────────────────────────────────────────────────────────────────────────
119
+ # CORE DISPATCH METHODS
120
+ # ─────────────────────────────────────────────────────────────────────────────
121
+
122
+ def dispatch_execute(self, cursor: Any, statement: SQL) -> "ExecutionResult":
123
+ """Execute single SQL statement with data handling.
124
+
125
+ Executes a SQL statement with parameter binding and processes the results.
126
+ Handles both data-returning queries and data modification operations.
127
+
128
+ Args:
129
+ cursor: DuckDB cursor object
130
+ statement: SQL statement to execute
131
+
132
+ Returns:
133
+ ExecutionResult with execution metadata
134
+ """
135
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
136
+ cursor.execute(sql, normalize_execute_parameters(prepared_parameters))
137
+
138
+ is_select_like = statement.returns_rows() or self._should_force_select(statement, cursor)
139
+
140
+ if is_select_like:
141
+ fetched_data = cursor.fetchall()
142
+ dict_data, column_names = collect_rows(cast("list[Any] | None", fetched_data), cursor.description)
143
+
144
+ return self.create_execution_result(
145
+ cursor,
146
+ selected_data=dict_data,
147
+ column_names=column_names,
148
+ data_row_count=len(dict_data),
149
+ is_select_result=True,
150
+ )
151
+
152
+ row_count = resolve_rowcount(cursor)
153
+
154
+ return self.create_execution_result(cursor, rowcount_override=row_count)
155
+
156
+ def dispatch_execute_many(self, cursor: Any, statement: SQL) -> "ExecutionResult":
157
+ """Execute SQL with multiple parameter sets using batch processing.
158
+
159
+ Uses DuckDB's executemany method for batch operations and calculates
160
+ row counts for both data modification and query operations.
161
+
162
+ Args:
163
+ cursor: DuckDB cursor object
164
+ statement: SQL statement with multiple parameter sets
165
+
166
+ Returns:
167
+ ExecutionResult with batch execution metadata
168
+ """
169
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
170
+
171
+ if prepared_parameters:
172
+ parameter_sets = cast("list[Any]", prepared_parameters)
173
+ cursor.executemany(sql, parameter_sets)
174
+
175
+ row_count = len(parameter_sets) if statement.is_modifying_operation() else resolve_rowcount(cursor)
176
+ else:
177
+ row_count = 0
178
+
179
+ return self.create_execution_result(cursor, rowcount_override=row_count, is_many_result=True)
180
+
181
+ def dispatch_execute_script(self, cursor: Any, statement: SQL) -> "ExecutionResult":
182
+ """Execute SQL script with statement splitting and parameter handling.
183
+
184
+ Parses multi-statement scripts and executes each statement sequentially
185
+ with the provided parameters.
186
+
187
+ Args:
188
+ cursor: DuckDB cursor object
189
+ statement: SQL statement with script content
190
+
191
+ Returns:
192
+ ExecutionResult with script execution metadata
193
+ """
194
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
195
+ statements = self.split_script_statements(sql, statement.statement_config, strip_trailing_semicolon=True)
196
+
197
+ successful_count = 0
198
+ last_result = None
199
+
200
+ for stmt in statements:
201
+ last_result = cursor.execute(stmt, normalize_execute_parameters(prepared_parameters))
202
+ successful_count += 1
203
+
204
+ return self.create_execution_result(
205
+ last_result, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
206
+ )
207
+
208
+ # ─────────────────────────────────────────────────────────────────────────────
209
+ # TRANSACTION MANAGEMENT
210
+ # ─────────────────────────────────────────────────────────────────────────────
211
+
212
+ def begin(self) -> None:
213
+ """Begin a database transaction."""
214
+ try:
215
+ self.connection.execute("BEGIN TRANSACTION")
216
+ except duckdb.Error as e:
217
+ msg = f"Failed to begin DuckDB transaction: {e}"
218
+ raise SQLSpecError(msg) from e
219
+
220
+ def commit(self) -> None:
221
+ """Commit the current transaction."""
222
+ try:
223
+ self.connection.commit()
224
+ except duckdb.Error as e:
225
+ msg = f"Failed to commit DuckDB transaction: {e}"
226
+ raise SQLSpecError(msg) from e
227
+
228
+ def rollback(self) -> None:
229
+ """Rollback the current transaction."""
230
+ try:
231
+ self.connection.rollback()
232
+ except duckdb.Error as e:
233
+ msg = f"Failed to rollback DuckDB transaction: {e}"
234
+ raise SQLSpecError(msg) from e
235
+
236
+ def with_cursor(self, connection: "DuckDBConnection") -> "DuckDBCursor":
237
+ """Create context manager for DuckDB cursor.
238
+
239
+ Args:
240
+ connection: DuckDB connection instance
241
+
242
+ Returns:
243
+ DuckDBCursor context manager instance
244
+ """
245
+ return DuckDBCursor(connection)
246
+
247
+ def handle_database_exceptions(self) -> "DuckDBExceptionHandler":
248
+ """Handle database-specific exceptions and wrap them appropriately.
249
+
250
+ Returns:
251
+ Exception handler with deferred exception pattern for mypyc compatibility.
252
+ """
253
+ return DuckDBExceptionHandler()
254
+
255
+ # ─────────────────────────────────────────────────────────────────────────────
256
+ # ARROW API METHODS
257
+ # ─────────────────────────────────────────────────────────────────────────────
258
+
259
+ def select_to_arrow(
260
+ self,
261
+ statement: "Statement | QueryBuilder",
262
+ /,
263
+ *parameters: "StatementParameters | StatementFilter",
264
+ statement_config: "StatementConfig | None" = None,
265
+ return_format: "ArrowReturnFormat" = "table",
266
+ native_only: bool = False,
267
+ batch_size: int | None = None,
268
+ arrow_schema: Any = None,
269
+ **kwargs: Any,
270
+ ) -> "ArrowResult":
271
+ """Execute query and return results as Apache Arrow (DuckDB native path).
272
+
273
+ DuckDB provides native Arrow support via cursor.arrow().
274
+ This is the fastest path due to DuckDB's columnar architecture.
275
+
276
+ Args:
277
+ statement: SQL statement, string, or QueryBuilder
278
+ *parameters: Query parameters or filters
279
+ statement_config: Optional statement configuration override
280
+ return_format: "table" for pyarrow.Table (default), "batch" for RecordBatch,
281
+ "batches" for list of RecordBatch, "reader" for RecordBatchReader
282
+ native_only: Ignored for DuckDB (always uses native path)
283
+ batch_size: Batch size hint (for future streaming implementation)
284
+ arrow_schema: Optional pyarrow.Schema for type casting
285
+ **kwargs: Additional keyword arguments
286
+
287
+ Returns:
288
+ ArrowResult with native Arrow data
289
+ Example:
290
+ >>> result = driver.select_to_arrow(
291
+ ... "SELECT * FROM users WHERE age > ?", 18
292
+ ... )
293
+ >>> df = result.to_pandas() # Fast zero-copy conversion
294
+ """
295
+ ensure_pyarrow()
296
+
297
+ # Prepare statement
298
+ config = statement_config or self.statement_config
299
+ prepared_statement = self.prepare_statement(statement, parameters, statement_config=config, kwargs=kwargs)
300
+
301
+ # Execute query and get native Arrow
302
+ with self.with_cursor(self.connection) as cursor, self.handle_database_exceptions():
303
+ if cursor is None:
304
+ msg = "Failed to create cursor"
305
+ raise DatabaseConnectionError(msg)
306
+
307
+ # Get compiled SQL and parameters
308
+ sql, driver_params = self._get_compiled_sql(prepared_statement, config)
309
+
310
+ # Execute query
311
+ cursor.execute(sql, driver_params or ())
312
+
313
+ # DuckDB native Arrow (zero-copy!)
314
+ arrow_reader = cursor.arrow()
315
+ arrow_table = arrow_reader.read_all()
316
+
317
+ return build_arrow_result_from_table(
318
+ prepared_statement,
319
+ arrow_table,
320
+ return_format=return_format,
321
+ batch_size=batch_size,
322
+ arrow_schema=arrow_schema,
323
+ )
324
+ msg = "Unreachable"
325
+ raise RuntimeError(msg) # pragma: no cover
326
+
327
+ # ─────────────────────────────────────────────────────────────────────────────
328
+ # STORAGE API METHODS
329
+ # ─────────────────────────────────────────────────────────────────────────────
330
+
331
+ def select_to_storage(
332
+ self,
333
+ statement: "Statement | QueryBuilder | SQL | str",
334
+ destination: "StorageDestination",
335
+ /,
336
+ *parameters: "StatementParameters | StatementFilter",
337
+ statement_config: "StatementConfig | None" = None,
338
+ partitioner: "dict[str, object] | None" = None,
339
+ format_hint: "StorageFormat | None" = None,
340
+ telemetry: "StorageTelemetry | None" = None,
341
+ **kwargs: Any,
342
+ ) -> "StorageBridgeJob":
343
+ """Persist DuckDB query output to a storage backend using Arrow fast paths."""
344
+
345
+ _ = kwargs
346
+ self._require_capability("arrow_export_enabled")
347
+ arrow_result = self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
348
+ sync_pipeline = self._storage_pipeline()
349
+ telemetry_payload = self._write_result_to_storage_sync(
350
+ arrow_result, destination, format_hint=format_hint, pipeline=sync_pipeline
351
+ )
352
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
353
+ return self._create_storage_job(telemetry_payload, telemetry)
354
+
355
+ def load_from_arrow(
356
+ self,
357
+ table: str,
358
+ source: "ArrowResult | Any",
359
+ *,
360
+ partitioner: "dict[str, object] | None" = None,
361
+ overwrite: bool = False,
362
+ telemetry: "StorageTelemetry | None" = None,
363
+ ) -> "StorageBridgeJob":
364
+ """Load Arrow data into DuckDB using temporary table registration."""
365
+
366
+ self._require_capability("arrow_import_enabled")
367
+ arrow_table = self._coerce_arrow_table(source)
368
+ temp_view = f"_sqlspec_arrow_{uuid4().hex}"
369
+ if overwrite:
370
+ self.connection.execute(f"TRUNCATE TABLE {table}")
371
+ self.connection.register(temp_view, arrow_table)
372
+ try:
373
+ self.connection.execute(f"INSERT INTO {table} SELECT * FROM {temp_view}")
374
+ finally:
375
+ with contextlib.suppress(Exception):
376
+ self.connection.unregister(temp_view)
377
+
378
+ telemetry_payload = self._build_ingest_telemetry(arrow_table)
379
+ telemetry_payload["destination"] = table
380
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
381
+ return self._create_storage_job(telemetry_payload, telemetry)
382
+
383
+ def load_from_storage(
384
+ self,
385
+ table: str,
386
+ source: "StorageDestination",
387
+ *,
388
+ file_format: "StorageFormat",
389
+ partitioner: "dict[str, object] | None" = None,
390
+ overwrite: bool = False,
391
+ ) -> "StorageBridgeJob":
392
+ """Read an artifact from storage and load it into DuckDB."""
393
+
394
+ arrow_table, inbound = self._read_arrow_from_storage_sync(source, file_format=file_format)
395
+ return self.load_from_arrow(table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound)
396
+
397
+ # ─────────────────────────────────────────────────────────────────────────────
398
+ # UTILITY METHODS
399
+ # ─────────────────────────────────────────────────────────────────────────────
400
+
401
+ @property
402
+ def data_dictionary(self) -> "DuckDBDataDictionary":
403
+ """Get the data dictionary for this driver.
404
+
405
+ Returns:
406
+ Data dictionary instance for metadata queries
407
+ """
408
+ if self._data_dictionary is None:
409
+ self._data_dictionary = DuckDBDataDictionary()
410
+ return self._data_dictionary
411
+
412
+ # ─────────────────────────────────────────────────────────────────────────────
413
+ # PRIVATE / INTERNAL METHODS
414
+ # ─────────────────────────────────────────────────────────────────────────────
415
+
416
+ def _connection_in_transaction(self) -> bool:
417
+ """Check if connection is in transaction.
418
+
419
+ DuckDB uses explicit BEGIN TRANSACTION and does not expose transaction state.
420
+
421
+ Returns:
422
+ False - DuckDB requires explicit transaction management.
423
+ """
424
+ return False
425
+
426
+
427
+ register_driver_profile("duckdb", driver_profile)
428
+
429
+
430
+ MODIFYING_OPERATIONS: "tuple[str, ...]" = ("INSERT", "UPDATE", "DELETE")
@@ -0,0 +1,5 @@
1
+ """Events helpers for the DuckDB adapter."""
2
+
3
+ from sqlspec.adapters.duckdb.events.store import DuckDBEventQueueStore
4
+
5
+ __all__ = ("DuckDBEventQueueStore",)
@@ -0,0 +1,57 @@
1
+ """DuckDB event queue store.
2
+
3
+ DuckDB uses native JSON type for efficient JSON storage and querying.
4
+ The TIMESTAMP type provides microsecond precision for event ordering.
5
+
6
+ Configuration (optional):
7
+ extension_config={
8
+ "events": {
9
+ "queue_table": "custom_event_queue", # Override default table name
10
+ }
11
+ }
12
+ """
13
+
14
+ from sqlspec.adapters.duckdb.config import DuckDBConfig
15
+ from sqlspec.extensions.events import BaseEventQueueStore
16
+
17
+ __all__ = ("DuckDBEventQueueStore",)
18
+
19
+
20
+ class DuckDBEventQueueStore(BaseEventQueueStore[DuckDBConfig]):
21
+ """DuckDB event queue store with native JSON support.
22
+
23
+ DuckDB supports native JSON type for efficient JSON storage and querying.
24
+ The table uses TIMESTAMP for event ordering with microsecond precision.
25
+
26
+ Args:
27
+ config: DuckDBConfig with optional extension_config["events"] settings.
28
+
29
+ Notes:
30
+ Configuration is read from config.extension_config["events"]:
31
+ - queue_table: Table name (default: "sqlspec_event_queue")
32
+
33
+ DuckDB does not support native pub/sub, so events use the table-backed
34
+ queue backend which provides durable, exactly-once delivery semantics.
35
+
36
+ Example:
37
+ from sqlspec.adapters.duckdb import DuckDBConfig
38
+ from sqlspec.adapters.duckdb.events import DuckDBEventQueueStore
39
+
40
+ config = DuckDBConfig(
41
+ connection_config={"database": "events.db"},
42
+ extension_config={"events": {"queue_table": "my_events"}}
43
+ )
44
+ store = DuckDBEventQueueStore(config)
45
+ for stmt in store.create_statements():
46
+ driver.execute_script(stmt)
47
+ """
48
+
49
+ __slots__ = ()
50
+
51
+ def _column_types(self) -> "tuple[str, str, str]":
52
+ """Return DuckDB-optimized column types.
53
+
54
+ Returns:
55
+ Tuple of (payload_type, metadata_type, timestamp_type).
56
+ """
57
+ return "JSON", "JSON", "TIMESTAMP"
@@ -0,0 +1,5 @@
1
+ """Litestar integration for DuckDB adapter."""
2
+
3
+ from sqlspec.adapters.duckdb.litestar.store import DuckdbStore
4
+
5
+ __all__ = ("DuckdbStore",)