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,463 @@
1
+ """DuckDB database configuration with connection pooling."""
2
+
3
+ from collections.abc import Callable, Sequence
4
+ from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
5
+
6
+ from typing_extensions import NotRequired
7
+
8
+ from sqlspec.adapters.duckdb._typing import DuckDBConnection
9
+ from sqlspec.adapters.duckdb.core import (
10
+ apply_driver_features,
11
+ build_connection_config,
12
+ build_statement_config,
13
+ default_statement_config,
14
+ )
15
+ from sqlspec.adapters.duckdb.driver import DuckDBCursor, DuckDBDriver, DuckDBExceptionHandler, DuckDBSessionContext
16
+ from sqlspec.adapters.duckdb.pool import DuckDBConnectionPool
17
+ from sqlspec.config import ExtensionConfigs, SyncDatabaseConfig
18
+ from sqlspec.extensions.events import EventRuntimeHints
19
+ from sqlspec.observability import ObservabilityConfig
20
+ from sqlspec.utils.config_tools import normalize_connection_config
21
+ from sqlspec.utils.serializers import to_json
22
+
23
+ if TYPE_CHECKING:
24
+ from collections.abc import Callable
25
+
26
+ from sqlspec.core import StatementConfig
27
+ __all__ = (
28
+ "DuckDBConfig",
29
+ "DuckDBConnectionParams",
30
+ "DuckDBDriverFeatures",
31
+ "DuckDBExtensionConfig",
32
+ "DuckDBPoolParams",
33
+ "DuckDBSecretConfig",
34
+ )
35
+ EXTENSION_FLAG_KEYS: "tuple[str, ...]" = (
36
+ "allow_community_extensions",
37
+ "allow_unsigned_extensions",
38
+ "enable_external_access",
39
+ )
40
+
41
+
42
+ class DuckDBConnectionParams(TypedDict):
43
+ """DuckDB connection parameters.
44
+
45
+ Mirrors the keyword arguments accepted by duckdb.connect so callers can drive every DuckDB
46
+ configuration switch directly through SQLSpec. All keys are optional and forwarded verbatim
47
+ to DuckDB, either as top-level parameters or via the nested ``config`` dictionary when DuckDB
48
+ expects them there.
49
+ """
50
+
51
+ database: NotRequired[str]
52
+ read_only: NotRequired[bool]
53
+ config: NotRequired["dict[str, Any]"]
54
+ memory_limit: NotRequired[str]
55
+ threads: NotRequired[int]
56
+ temp_directory: NotRequired[str]
57
+ max_temp_directory_size: NotRequired[str]
58
+ autoload_known_extensions: NotRequired[bool]
59
+ autoinstall_known_extensions: NotRequired[bool]
60
+ allow_community_extensions: NotRequired[bool]
61
+ allow_unsigned_extensions: NotRequired[bool]
62
+ extension_directory: NotRequired[str]
63
+ custom_extension_repository: NotRequired[str]
64
+ autoinstall_extension_repository: NotRequired[str]
65
+ allow_persistent_secrets: NotRequired[bool]
66
+ enable_external_access: NotRequired[bool]
67
+ secret_directory: NotRequired[str]
68
+ enable_object_cache: NotRequired[bool]
69
+ parquet_metadata_cache: NotRequired[str]
70
+ enable_external_file_cache: NotRequired[bool]
71
+ checkpoint_threshold: NotRequired[str]
72
+ enable_progress_bar: NotRequired[bool]
73
+ progress_bar_time: NotRequired[float]
74
+ enable_logging: NotRequired[bool]
75
+ log_query_path: NotRequired[str]
76
+ logging_level: NotRequired[str]
77
+ preserve_insertion_order: NotRequired[bool]
78
+ default_null_order: NotRequired[str]
79
+ default_order: NotRequired[str]
80
+ ieee_floating_point_ops: NotRequired[bool]
81
+ binary_as_string: NotRequired[bool]
82
+ arrow_large_buffer_size: NotRequired[bool]
83
+ errors_as_json: NotRequired[bool]
84
+ extra: NotRequired["dict[str, Any]"]
85
+
86
+
87
+ class DuckDBPoolParams(DuckDBConnectionParams):
88
+ """Complete pool configuration for DuckDB adapter.
89
+
90
+ Extends DuckDBConnectionParams with pool sizing and lifecycle settings so SQLSpec can manage
91
+ per-thread DuckDB connections safely while honoring DuckDB's thread-safety constraints.
92
+ """
93
+
94
+ pool_min_size: NotRequired[int]
95
+ pool_max_size: NotRequired[int]
96
+ pool_timeout: NotRequired[float]
97
+ pool_recycle_seconds: NotRequired[int]
98
+ health_check_interval: NotRequired[float]
99
+
100
+
101
+ class DuckDBExtensionConfig(TypedDict):
102
+ """DuckDB extension configuration for auto-management."""
103
+
104
+ name: str
105
+ """Name of the extension to install/load."""
106
+
107
+ version: NotRequired[str]
108
+ """Specific version of the extension."""
109
+
110
+ repository: NotRequired[str]
111
+ """Repository for the extension (core, community, or custom URL)."""
112
+
113
+ force_install: NotRequired[bool]
114
+ """Force reinstallation of the extension."""
115
+
116
+
117
+ class DuckDBSecretConfig(TypedDict):
118
+ """DuckDB secret configuration for AI/API integrations."""
119
+
120
+ secret_type: str
121
+ """Type of secret (e.g., 'openai', 'aws', 'azure', 'gcp')."""
122
+
123
+ name: str
124
+ """Name of the secret."""
125
+
126
+ value: "dict[str, Any]"
127
+ """Secret configuration values."""
128
+
129
+ scope: NotRequired[str]
130
+ """Scope of the secret (LOCAL or PERSISTENT)."""
131
+
132
+
133
+ class DuckDBDriverFeatures(TypedDict):
134
+ """TypedDict for DuckDB driver features configuration.
135
+
136
+ Attributes:
137
+ extensions: List of extensions to install/load on connection creation.
138
+ secrets: List of secrets to create for AI/API integrations.
139
+ on_connection_create: Callback executed when connection is created.
140
+ json_serializer: Custom JSON serializer for dict/list parameter conversion.
141
+ Defaults to sqlspec.utils.serializers.to_json if not provided.
142
+ enable_uuid_conversion: Enable automatic UUID string conversion.
143
+ When True (default), UUID strings are automatically converted to UUID objects.
144
+ When False, UUID strings are treated as regular strings.
145
+ extension_flags: Connection-level flags (e.g., allow_community_extensions) applied
146
+ via SET statements immediately after connection creation.
147
+ enable_events: Enable database event channel support.
148
+ Defaults to True when extension_config["events"] is configured.
149
+ Provides pub/sub capabilities via table-backed queue (DuckDB has no native pub/sub).
150
+ Requires extension_config["events"] for migration setup.
151
+ events_backend: Event channel backend selection.
152
+ Only option: "table_queue" (durable table-backed queue with retries and exactly-once delivery).
153
+ DuckDB does not have native pub/sub, so table_queue is the only backend.
154
+ Defaults to "table_queue".
155
+ """
156
+
157
+ extensions: NotRequired[Sequence[DuckDBExtensionConfig]]
158
+ secrets: NotRequired[Sequence[DuckDBSecretConfig]]
159
+ on_connection_create: NotRequired["Callable[[DuckDBConnection], DuckDBConnection | None]"]
160
+ json_serializer: NotRequired["Callable[[Any], str]"]
161
+ enable_uuid_conversion: NotRequired[bool]
162
+ extension_flags: NotRequired["dict[str, Any]"]
163
+ enable_events: NotRequired[bool]
164
+ events_backend: NotRequired[str]
165
+
166
+
167
+ class DuckDBConnectionContext:
168
+ """Context manager for DuckDB connections."""
169
+
170
+ __slots__ = ("_config", "_ctx")
171
+
172
+ def __init__(self, config: "DuckDBConfig") -> None:
173
+ self._config = config
174
+ self._ctx: Any = None
175
+
176
+ def __enter__(self) -> DuckDBConnection:
177
+ pool = self._config.provide_pool()
178
+ self._ctx = pool.get_connection()
179
+ return cast("DuckDBConnection", self._ctx.__enter__())
180
+
181
+ def __exit__(
182
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
183
+ ) -> bool | None:
184
+ if self._ctx:
185
+ return cast("bool | None", self._ctx.__exit__(exc_type, exc_val, exc_tb))
186
+ return None
187
+
188
+
189
+ class _DuckDBConnectionHook:
190
+ __slots__ = ("_hook",)
191
+
192
+ def __init__(self, hook: "Callable[[Any], None]") -> None:
193
+ self._hook = hook
194
+
195
+ def __call__(self, context: "dict[str, Any]") -> None:
196
+ connection = context.get("connection")
197
+ if connection is None:
198
+ return
199
+ self._hook(connection)
200
+
201
+
202
+ class _DuckDBSessionConnectionHandler:
203
+ __slots__ = ("_config", "_ctx")
204
+
205
+ def __init__(self, config: "DuckDBConfig") -> None:
206
+ self._config = config
207
+ self._ctx: Any = None
208
+
209
+ def acquire_connection(self) -> "DuckDBConnection":
210
+ pool = self._config.provide_pool()
211
+ self._ctx = pool.get_connection()
212
+ return cast("DuckDBConnection", self._ctx.__enter__())
213
+
214
+ def release_connection(self, _conn: "DuckDBConnection") -> None:
215
+ if self._ctx is None:
216
+ return
217
+ self._ctx.__exit__(None, None, None)
218
+ self._ctx = None
219
+
220
+
221
+ class DuckDBConfig(SyncDatabaseConfig[DuckDBConnection, DuckDBConnectionPool, DuckDBDriver]):
222
+ """DuckDB configuration with connection pooling.
223
+
224
+ This configuration supports DuckDB's features including:
225
+
226
+ - Connection pooling
227
+ - Extension management and installation
228
+ - Secret management for API integrations
229
+ - Auto configuration settings
230
+ - Arrow integration
231
+ - Direct file querying capabilities
232
+ - Configurable type handlers for JSON serialization and UUID conversion
233
+
234
+ DuckDB Connection Pool Configuration:
235
+ - Default pool size is 1-4 connections (DuckDB uses single connection by default)
236
+ - Connection recycling is set to 24 hours by default (set to 0 to disable)
237
+ - Shared memory databases use `:memory:shared_db` for proper concurrency
238
+
239
+ Type Handler Configuration via driver_features:
240
+ - `json_serializer`: Custom JSON serializer for dict/list parameters.
241
+ Defaults to `sqlspec.utils.serializers.to_json` if not provided.
242
+ Example: `json_serializer=msgspec.json.encode(...).decode('utf-8')`
243
+
244
+ - `enable_uuid_conversion`: Enable automatic UUID string conversion (default: True).
245
+ When True, UUID strings in query results are automatically converted to UUID objects.
246
+ When False, UUID strings are treated as regular strings.
247
+
248
+ Example:
249
+ >>> import msgspec
250
+ >>> from sqlspec.adapters.duckdb import DuckDBConfig
251
+ >>>
252
+ >>> # Custom JSON serializer
253
+ >>> def custom_json(obj):
254
+ ... return msgspec.json.encode(obj).decode("utf-8")
255
+ >>>
256
+ >>> config = DuckDBConfig(
257
+ ... connection_config={"database": ":memory:"},
258
+ ... driver_features={
259
+ ... "json_serializer": custom_json,
260
+ ... "enable_uuid_conversion": False,
261
+ ... },
262
+ ... )
263
+ """
264
+
265
+ driver_type: "ClassVar[type[DuckDBDriver]]" = DuckDBDriver
266
+ connection_type: "ClassVar[type[DuckDBConnection]]" = DuckDBConnection
267
+ supports_transactional_ddl: "ClassVar[bool]" = True
268
+ supports_native_arrow_export: "ClassVar[bool]" = True
269
+ supports_native_arrow_import: "ClassVar[bool]" = True
270
+ supports_native_parquet_export: "ClassVar[bool]" = True
271
+ supports_native_parquet_import: "ClassVar[bool]" = True
272
+ storage_partition_strategies: "ClassVar[tuple[str, ...]]" = ("fixed", "rows_per_chunk", "manifest")
273
+
274
+ def __init__(
275
+ self,
276
+ *,
277
+ connection_config: "DuckDBPoolParams | dict[str, Any] | None" = None,
278
+ connection_instance: "DuckDBConnectionPool | None" = None,
279
+ migration_config: "dict[str, Any] | None" = None,
280
+ statement_config: "StatementConfig | None" = None,
281
+ driver_features: "DuckDBDriverFeatures | dict[str, Any] | None" = None,
282
+ bind_key: "str | None" = None,
283
+ extension_config: "ExtensionConfigs | None" = None,
284
+ observability_config: "ObservabilityConfig | None" = None,
285
+ **kwargs: Any,
286
+ ) -> None:
287
+ """Initialize DuckDB configuration.
288
+
289
+ Args:
290
+ connection_config: Connection and pool configuration parameters
291
+ connection_instance: Pre-created pool instance
292
+ migration_config: Migration configuration
293
+ statement_config: Statement configuration override
294
+ driver_features: DuckDB-specific driver features including json_serializer
295
+ and enable_uuid_conversion options
296
+ bind_key: Optional unique identifier for this configuration
297
+ extension_config: Extension-specific configuration (e.g., Litestar plugin settings)
298
+ observability_config: Adapter-level observability overrides for lifecycle hooks and observers
299
+ **kwargs: Additional keyword arguments passed to the base configuration.
300
+ """
301
+ connection_config = normalize_connection_config(connection_config)
302
+ connection_config.setdefault("database", ":memory:shared_db")
303
+
304
+ if connection_config.get("database") in {":memory:", ""}:
305
+ connection_config["database"] = ":memory:shared_db"
306
+
307
+ extension_flags: dict[str, Any] = {}
308
+ for key in tuple(connection_config.keys()):
309
+ if key in EXTENSION_FLAG_KEYS:
310
+ extension_flags[key] = connection_config.pop(key)
311
+
312
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
313
+ user_connection_hook = cast("Callable[[Any], None] | None", features.pop("on_connection_create", None))
314
+ features.setdefault("enable_uuid_conversion", True)
315
+ serializer = features.setdefault("json_serializer", to_json)
316
+
317
+ if extension_flags:
318
+ existing_flags = cast("dict[str, Any]", features.get("extension_flags", {}))
319
+ merged_flags = {**existing_flags, **extension_flags}
320
+ features["extension_flags"] = merged_flags
321
+
322
+ local_observability = observability_config
323
+ if user_connection_hook is not None:
324
+ lifecycle_override = ObservabilityConfig(
325
+ lifecycle={"on_connection_create": [_DuckDBConnectionHook(user_connection_hook)]}
326
+ )
327
+ local_observability = ObservabilityConfig.merge(local_observability, lifecycle_override)
328
+
329
+ statement_config = statement_config or build_statement_config(
330
+ json_serializer=cast("Callable[[Any], str]", serializer)
331
+ )
332
+ statement_config = apply_driver_features(statement_config, features)
333
+
334
+ super().__init__(
335
+ bind_key=bind_key,
336
+ connection_config=connection_config,
337
+ connection_instance=connection_instance,
338
+ migration_config=migration_config,
339
+ statement_config=statement_config,
340
+ driver_features=features,
341
+ extension_config=extension_config,
342
+ observability_config=local_observability,
343
+ **kwargs,
344
+ )
345
+
346
+ def _create_pool(self) -> DuckDBConnectionPool:
347
+ """Create connection pool from configuration."""
348
+ connection_config = build_connection_config(self.connection_config)
349
+
350
+ extensions = self.driver_features.get("extensions", None)
351
+ secrets = self.driver_features.get("secrets", None)
352
+ extension_flags = self.driver_features.get("extension_flags", None)
353
+ extensions_dicts = [dict(ext) for ext in extensions] if extensions else None
354
+ secrets_dicts = [dict(secret) for secret in secrets] if secrets else None
355
+ extension_flags_dict = dict(extension_flags) if extension_flags else None
356
+
357
+ pool_recycle_seconds = self.connection_config.get("pool_recycle_seconds")
358
+ health_check_interval = self.connection_config.get("health_check_interval")
359
+ pool_kwargs: dict[str, Any] = {}
360
+ if pool_recycle_seconds is not None:
361
+ pool_kwargs["pool_recycle_seconds"] = pool_recycle_seconds
362
+ if health_check_interval is not None:
363
+ pool_kwargs["health_check_interval"] = health_check_interval
364
+
365
+ return DuckDBConnectionPool(
366
+ connection_config=connection_config,
367
+ extensions=extensions_dicts,
368
+ extension_flags=extension_flags_dict,
369
+ secrets=secrets_dicts,
370
+ **pool_kwargs,
371
+ )
372
+
373
+ def _close_pool(self) -> None:
374
+ """Close the connection pool."""
375
+ if self.connection_instance:
376
+ self.connection_instance.close()
377
+
378
+ def create_connection(self) -> DuckDBConnection:
379
+ """Get a DuckDB connection from the pool.
380
+
381
+ This method ensures the pool is created and returns a connection
382
+ from the pool. The connection is checked out from the pool and must
383
+ be properly managed by the caller.
384
+
385
+ Returns:
386
+ DuckDBConnection: A connection from the pool
387
+
388
+ Note:
389
+ For automatic connection management, prefer using provide_connection()
390
+ or provide_session() which handle returning connections to the pool.
391
+ The caller is responsible for returning the connection to the pool
392
+ using pool.release(connection) when done.
393
+ """
394
+ pool = self.provide_pool()
395
+
396
+ return pool.acquire()
397
+
398
+ def provide_connection(self, *args: Any, **kwargs: Any) -> "DuckDBConnectionContext":
399
+ """Provide a pooled DuckDB connection context manager.
400
+
401
+ Args:
402
+ *args: Additional arguments.
403
+ **kwargs: Additional keyword arguments.
404
+
405
+ Returns:
406
+ A DuckDB connection context manager.
407
+ """
408
+ return DuckDBConnectionContext(self)
409
+
410
+ def provide_session(
411
+ self, *_args: Any, statement_config: "StatementConfig | None" = None, **_kwargs: Any
412
+ ) -> "DuckDBSessionContext":
413
+ """Provide a DuckDB driver session context manager.
414
+
415
+ Args:
416
+ *_args: Additional arguments.
417
+ statement_config: Optional statement configuration override.
418
+ **_kwargs: Additional keyword arguments.
419
+
420
+ Returns:
421
+ A DuckDB driver session context manager.
422
+ """
423
+ handler = _DuckDBSessionConnectionHandler(self)
424
+
425
+ return DuckDBSessionContext(
426
+ acquire_connection=handler.acquire_connection,
427
+ release_connection=handler.release_connection,
428
+ statement_config=statement_config or self.statement_config or default_statement_config,
429
+ driver_features=self.driver_features,
430
+ prepare_driver=self._prepare_driver,
431
+ )
432
+
433
+ def get_signature_namespace(self) -> "dict[str, Any]":
434
+ """Get the signature namespace for DuckDB types.
435
+
436
+ This provides all DuckDB-specific types that Litestar needs to recognize
437
+ to avoid serialization attempts.
438
+
439
+ Returns:
440
+ Dictionary mapping type names to types.
441
+ """
442
+
443
+ namespace = super().get_signature_namespace()
444
+ namespace.update({
445
+ "DuckDBConnectionContext": DuckDBConnectionContext,
446
+ "DuckDBConnection": DuckDBConnection,
447
+ "DuckDBConnectionParams": DuckDBConnectionParams,
448
+ "DuckDBConnectionPool": DuckDBConnectionPool,
449
+ "DuckDBCursor": DuckDBCursor,
450
+ "DuckDBDriver": DuckDBDriver,
451
+ "DuckDBDriverFeatures": DuckDBDriverFeatures,
452
+ "DuckDBExceptionHandler": DuckDBExceptionHandler,
453
+ "DuckDBExtensionConfig": DuckDBExtensionConfig,
454
+ "DuckDBPoolParams": DuckDBPoolParams,
455
+ "DuckDBSecretConfig": DuckDBSecretConfig,
456
+ "DuckDBSessionContext": DuckDBSessionContext,
457
+ })
458
+ return namespace
459
+
460
+ def get_event_runtime_hints(self) -> "EventRuntimeHints":
461
+ """Return polling defaults optimized for DuckDB."""
462
+
463
+ return EventRuntimeHints(poll_interval=0.15, lease_seconds=15)