sqlspec 0.69.0__py3-none-any.whl → 0.70.0__py3-none-any.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 (365) hide show
  1. sqlspec/__main__.py +2 -0
  2. sqlspec/_typing.py +10 -0
  3. sqlspec/adapters/adbc/__init__.py +2 -1
  4. sqlspec/adapters/adbc/_typing.py +48 -10
  5. sqlspec/adapters/adbc/adk/store.py +39 -30
  6. sqlspec/adapters/adbc/config.py +269 -80
  7. sqlspec/adapters/adbc/core.py +278 -58
  8. sqlspec/adapters/adbc/data_dictionary.py +106 -64
  9. sqlspec/adapters/adbc/driver.py +330 -80
  10. sqlspec/adapters/adbc/litestar/__init__.py +2 -2
  11. sqlspec/adapters/adbc/litestar/store.py +134 -96
  12. sqlspec/adapters/adbc/pool.py +237 -0
  13. sqlspec/adapters/adbc/type_converter.py +13 -1
  14. sqlspec/adapters/aiomysql/_typing.py +1 -2
  15. sqlspec/adapters/aiomysql/adk/store.py +47 -41
  16. sqlspec/adapters/aiomysql/config.py +54 -27
  17. sqlspec/adapters/aiomysql/core.py +485 -32
  18. sqlspec/adapters/aiomysql/driver.py +68 -85
  19. sqlspec/adapters/aiomysql/litestar/store.py +5 -8
  20. sqlspec/adapters/aiosqlite/adk/store.py +87 -26
  21. sqlspec/adapters/aiosqlite/config.py +63 -51
  22. sqlspec/adapters/aiosqlite/core.py +76 -46
  23. sqlspec/adapters/aiosqlite/data_dictionary.py +142 -22
  24. sqlspec/adapters/aiosqlite/driver.py +82 -250
  25. sqlspec/adapters/aiosqlite/litestar/store.py +7 -6
  26. sqlspec/adapters/aiosqlite/pool.py +1 -2
  27. sqlspec/adapters/aiosqlite/type_converter.py +0 -3
  28. sqlspec/adapters/arrow_odbc/_typing.py +3 -7
  29. sqlspec/adapters/arrow_odbc/adk/store.py +33 -57
  30. sqlspec/adapters/arrow_odbc/config.py +41 -12
  31. sqlspec/adapters/arrow_odbc/core.py +61 -4
  32. sqlspec/adapters/arrow_odbc/data_dictionary.py +14 -23
  33. sqlspec/adapters/arrow_odbc/driver.py +167 -57
  34. sqlspec/adapters/arrow_odbc/events/store.py +13 -20
  35. sqlspec/adapters/arrow_odbc/litestar/store.py +12 -33
  36. sqlspec/adapters/arrow_odbc/type_converter.py +7 -7
  37. sqlspec/adapters/asyncmy/_typing.py +2 -73
  38. sqlspec/adapters/asyncmy/adk/store.py +51 -44
  39. sqlspec/adapters/asyncmy/config.py +138 -40
  40. sqlspec/adapters/asyncmy/core.py +480 -37
  41. sqlspec/adapters/asyncmy/driver.py +104 -84
  42. sqlspec/adapters/asyncmy/litestar/store.py +5 -8
  43. sqlspec/adapters/asyncpg/adk/store.py +18 -35
  44. sqlspec/adapters/asyncpg/config.py +82 -94
  45. sqlspec/adapters/asyncpg/core.py +141 -89
  46. sqlspec/adapters/asyncpg/data_dictionary.py +52 -77
  47. sqlspec/adapters/asyncpg/driver.py +234 -99
  48. sqlspec/adapters/asyncpg/events/_hub.py +4 -12
  49. sqlspec/adapters/asyncpg/events/backend.py +35 -25
  50. sqlspec/adapters/asyncpg/events/store.py +2 -24
  51. sqlspec/adapters/asyncpg/litestar/store.py +11 -24
  52. sqlspec/adapters/bigquery/_typing.py +15 -4
  53. sqlspec/adapters/bigquery/adk/store.py +6 -20
  54. sqlspec/adapters/bigquery/config.py +51 -55
  55. sqlspec/adapters/bigquery/core.py +71 -13
  56. sqlspec/adapters/bigquery/data_dictionary.py +143 -0
  57. sqlspec/adapters/bigquery/driver.py +202 -60
  58. sqlspec/adapters/bigquery/events/store.py +3 -41
  59. sqlspec/adapters/bigquery/litestar/store.py +2 -40
  60. sqlspec/adapters/cockroach_asyncpg/adk/store.py +76 -56
  61. sqlspec/adapters/cockroach_asyncpg/config.py +61 -30
  62. sqlspec/adapters/cockroach_asyncpg/core.py +2 -2
  63. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +82 -91
  64. sqlspec/adapters/cockroach_asyncpg/driver.py +103 -13
  65. sqlspec/adapters/cockroach_psycopg/_typing.py +4 -4
  66. sqlspec/adapters/cockroach_psycopg/adk/store.py +137 -31
  67. sqlspec/adapters/cockroach_psycopg/config.py +77 -20
  68. sqlspec/adapters/cockroach_psycopg/core.py +2 -1
  69. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +102 -108
  70. sqlspec/adapters/cockroach_psycopg/driver.py +204 -44
  71. sqlspec/adapters/db2/_typing.py +26 -25
  72. sqlspec/adapters/db2/adk/store.py +84 -17
  73. sqlspec/adapters/db2/config.py +28 -47
  74. sqlspec/adapters/db2/core.py +7 -0
  75. sqlspec/adapters/db2/data_dictionary.py +20 -5
  76. sqlspec/adapters/db2/driver.py +56 -16
  77. sqlspec/adapters/db2/events/__init__.py +1 -2
  78. sqlspec/adapters/db2/litestar/__init__.py +1 -2
  79. sqlspec/adapters/db2/litestar/store.py +7 -2
  80. sqlspec/adapters/db2/migrations.py +59 -78
  81. sqlspec/adapters/db2/pool.py +104 -48
  82. sqlspec/adapters/duckdb/_typing.py +27 -0
  83. sqlspec/adapters/duckdb/adk/__init__.py +2 -2
  84. sqlspec/adapters/duckdb/adk/store.py +60 -23
  85. sqlspec/adapters/duckdb/config.py +57 -26
  86. sqlspec/adapters/duckdb/core.py +338 -29
  87. sqlspec/adapters/duckdb/data_dictionary.py +338 -12
  88. sqlspec/adapters/duckdb/driver.py +318 -83
  89. sqlspec/adapters/duckdb/litestar/__init__.py +2 -2
  90. sqlspec/adapters/duckdb/litestar/store.py +2 -2
  91. sqlspec/adapters/duckdb/pool.py +108 -18
  92. sqlspec/adapters/mssql_python/_typing.py +1 -2
  93. sqlspec/adapters/mssql_python/adk/store.py +30 -23
  94. sqlspec/adapters/mssql_python/config.py +59 -2
  95. sqlspec/adapters/mssql_python/core.py +67 -6
  96. sqlspec/adapters/mssql_python/data_dictionary.py +132 -20
  97. sqlspec/adapters/mssql_python/driver.py +226 -112
  98. sqlspec/adapters/mssql_python/litestar/store.py +8 -3
  99. sqlspec/adapters/mssql_python/migrations.py +13 -16
  100. sqlspec/adapters/mssql_python/pool.py +4 -1
  101. sqlspec/adapters/mssql_python/type_converter.py +6 -1
  102. sqlspec/adapters/mysqlconnector/_typing.py +33 -20
  103. sqlspec/adapters/mysqlconnector/adk/store.py +79 -49
  104. sqlspec/adapters/mysqlconnector/config.py +93 -39
  105. sqlspec/adapters/mysqlconnector/core.py +546 -60
  106. sqlspec/adapters/mysqlconnector/driver.py +155 -160
  107. sqlspec/adapters/mysqlconnector/litestar/store.py +8 -17
  108. sqlspec/adapters/oracledb/__init__.py +6 -4
  109. sqlspec/adapters/oracledb/_json_handlers.py +16 -80
  110. sqlspec/adapters/oracledb/_param_types.py +18 -0
  111. sqlspec/adapters/oracledb/_storage.py +11 -10
  112. sqlspec/adapters/oracledb/_uuid_handlers.py +8 -3
  113. sqlspec/adapters/oracledb/_vector_handlers.py +11 -12
  114. sqlspec/adapters/oracledb/adk/store.py +239 -136
  115. sqlspec/adapters/oracledb/config.py +306 -208
  116. sqlspec/adapters/oracledb/core.py +319 -124
  117. sqlspec/adapters/oracledb/data_dictionary.py +128 -143
  118. sqlspec/adapters/oracledb/driver.py +554 -226
  119. sqlspec/adapters/oracledb/events/_hub.py +2 -4
  120. sqlspec/adapters/oracledb/events/backend.py +11 -5
  121. sqlspec/adapters/oracledb/events/store.py +7 -3
  122. sqlspec/adapters/oracledb/litestar/store.py +195 -193
  123. sqlspec/adapters/oracledb/migrations.py +61 -23
  124. sqlspec/adapters/oracledb/type_converter.py +12 -10
  125. sqlspec/adapters/psqlpy/_typing.py +23 -48
  126. sqlspec/adapters/psqlpy/adk/store.py +88 -83
  127. sqlspec/adapters/psqlpy/config.py +80 -55
  128. sqlspec/adapters/psqlpy/core.py +100 -68
  129. sqlspec/adapters/psqlpy/data_dictionary.py +53 -79
  130. sqlspec/adapters/psqlpy/driver.py +181 -80
  131. sqlspec/adapters/psqlpy/events/_hub.py +3 -9
  132. sqlspec/adapters/psqlpy/events/backend.py +36 -25
  133. sqlspec/adapters/psqlpy/events/store.py +2 -24
  134. sqlspec/adapters/psqlpy/litestar/store.py +14 -27
  135. sqlspec/adapters/psqlpy/type_converter.py +9 -30
  136. sqlspec/adapters/psycopg/_typing.py +12 -6
  137. sqlspec/adapters/psycopg/adk/store.py +17 -35
  138. sqlspec/adapters/psycopg/config.py +239 -163
  139. sqlspec/adapters/psycopg/core.py +100 -38
  140. sqlspec/adapters/psycopg/data_dictionary.py +89 -116
  141. sqlspec/adapters/psycopg/driver.py +218 -125
  142. sqlspec/adapters/psycopg/events/_hub.py +5 -18
  143. sqlspec/adapters/psycopg/events/backend.py +36 -28
  144. sqlspec/adapters/psycopg/events/store.py +3 -25
  145. sqlspec/adapters/psycopg/litestar/store.py +162 -136
  146. sqlspec/adapters/psycopg/type_converter.py +6 -3
  147. sqlspec/adapters/pymssql/_typing.py +21 -17
  148. sqlspec/adapters/pymssql/adk/store.py +4 -0
  149. sqlspec/adapters/pymssql/config.py +32 -12
  150. sqlspec/adapters/pymssql/core.py +58 -6
  151. sqlspec/adapters/pymssql/data_dictionary.py +132 -20
  152. sqlspec/adapters/pymssql/driver.py +56 -4
  153. sqlspec/adapters/pymssql/litestar/store.py +1 -1
  154. sqlspec/adapters/pymssql/migrations.py +13 -16
  155. sqlspec/adapters/pymssql/pool.py +6 -2
  156. sqlspec/adapters/pymysql/_typing.py +1 -2
  157. sqlspec/adapters/pymysql/adk/store.py +39 -24
  158. sqlspec/adapters/pymysql/config.py +64 -26
  159. sqlspec/adapters/pymysql/core.py +518 -54
  160. sqlspec/adapters/pymysql/driver.py +72 -68
  161. sqlspec/adapters/pymysql/litestar/store.py +4 -7
  162. sqlspec/adapters/pymysql/pool.py +20 -7
  163. sqlspec/adapters/spanner/_typing.py +52 -142
  164. sqlspec/adapters/spanner/adk/artifact_store.py +8 -13
  165. sqlspec/adapters/spanner/config.py +134 -40
  166. sqlspec/adapters/spanner/core.py +190 -29
  167. sqlspec/adapters/spanner/data_dictionary.py +71 -54
  168. sqlspec/adapters/spanner/driver.py +187 -52
  169. sqlspec/adapters/spanner/events/store.py +46 -11
  170. sqlspec/adapters/spanner/litestar/store.py +82 -53
  171. sqlspec/adapters/spanner/type_converter.py +55 -35
  172. sqlspec/adapters/sqlanywhere/__init__.py +40 -0
  173. sqlspec/adapters/sqlanywhere/_typing.py +118 -0
  174. sqlspec/adapters/sqlanywhere/adk/__init__.py +5 -0
  175. sqlspec/adapters/sqlanywhere/adk/store.py +880 -0
  176. sqlspec/adapters/sqlanywhere/config.py +235 -0
  177. sqlspec/adapters/sqlanywhere/core.py +404 -0
  178. sqlspec/adapters/sqlanywhere/data_dictionary.py +282 -0
  179. sqlspec/adapters/sqlanywhere/driver.py +435 -0
  180. sqlspec/adapters/sqlanywhere/events/__init__.py +5 -0
  181. sqlspec/adapters/sqlanywhere/events/store.py +28 -0
  182. sqlspec/adapters/sqlanywhere/litestar/__init__.py +5 -0
  183. sqlspec/adapters/sqlanywhere/litestar/store.py +220 -0
  184. sqlspec/adapters/sqlanywhere/migrations.py +178 -0
  185. sqlspec/adapters/sqlanywhere/pool.py +236 -0
  186. sqlspec/adapters/sqlite/_typing.py +12 -3
  187. sqlspec/adapters/sqlite/adk/store.py +89 -17
  188. sqlspec/adapters/sqlite/config.py +47 -45
  189. sqlspec/adapters/sqlite/core.py +67 -40
  190. sqlspec/adapters/sqlite/data_dictionary.py +129 -19
  191. sqlspec/adapters/sqlite/driver.py +93 -235
  192. sqlspec/adapters/sqlite/litestar/__init__.py +2 -2
  193. sqlspec/adapters/sqlite/litestar/store.py +2 -2
  194. sqlspec/adapters/sqlite/pool.py +60 -12
  195. sqlspec/adapters/sqlite/type_converter.py +0 -3
  196. sqlspec/adapters/sybase/__init__.py +37 -0
  197. sqlspec/adapters/sybase/_typing.py +130 -0
  198. sqlspec/adapters/sybase/adk/__init__.py +5 -0
  199. sqlspec/adapters/sybase/adk/store.py +961 -0
  200. sqlspec/adapters/sybase/config.py +215 -0
  201. sqlspec/adapters/sybase/core.py +411 -0
  202. sqlspec/adapters/sybase/data_dictionary.py +281 -0
  203. sqlspec/adapters/sybase/driver.py +455 -0
  204. sqlspec/adapters/sybase/events/__init__.py +5 -0
  205. sqlspec/adapters/sybase/events/store.py +80 -0
  206. sqlspec/adapters/sybase/litestar/__init__.py +5 -0
  207. sqlspec/adapters/sybase/litestar/store.py +268 -0
  208. sqlspec/adapters/sybase/migrations.py +178 -0
  209. sqlspec/adapters/sybase/pool.py +262 -0
  210. sqlspec/base.py +2 -0
  211. sqlspec/builder/__init__.py +9 -0
  212. sqlspec/builder/_column.py +1 -5
  213. sqlspec/builder/_ddl.py +2675 -71
  214. sqlspec/builder/_factory.py +76 -2
  215. sqlspec/builder/_merge.py +1 -1
  216. sqlspec/builder/_parsing_utils.py +40 -5
  217. sqlspec/cli.py +456 -83
  218. sqlspec/config.py +47 -4
  219. sqlspec/core/__init__.py +10 -0
  220. sqlspec/core/cache.py +291 -3
  221. sqlspec/core/compiler.py +2 -1
  222. sqlspec/core/parameters/_declared.py +11 -0
  223. sqlspec/core/result/_base.py +28 -2
  224. sqlspec/core/sqlcommenter.py +8 -0
  225. sqlspec/core/statement.py +3 -2
  226. sqlspec/data_dictionary/__init__.py +4 -0
  227. sqlspec/data_dictionary/_registry.py +2 -0
  228. sqlspec/data_dictionary/_types.py +294 -56
  229. sqlspec/data_dictionary/dialects/__init__.py +4 -0
  230. sqlspec/data_dictionary/dialects/bigquery/config.py +33 -6
  231. sqlspec/data_dictionary/dialects/bigquery/sql/ddl.sql +40 -1
  232. sqlspec/data_dictionary/dialects/cockroachdb/__init__.py +9 -1
  233. sqlspec/data_dictionary/dialects/cockroachdb/config.py +22 -0
  234. sqlspec/data_dictionary/dialects/cockroachdb/sql/columns.sql +142 -48
  235. sqlspec/data_dictionary/dialects/cockroachdb/sql/constraints.sql +42 -18
  236. sqlspec/data_dictionary/dialects/cockroachdb/sql/foreign_keys.sql +6 -2
  237. sqlspec/data_dictionary/dialects/db2/sql/columns.sql +54 -22
  238. sqlspec/data_dictionary/dialects/db2/sql/schemas.sql +0 -4
  239. sqlspec/data_dictionary/dialects/db2/sql/tables.sql +0 -12
  240. sqlspec/data_dictionary/dialects/duckdb/sql/columns.sql +33 -18
  241. sqlspec/data_dictionary/dialects/duckdb/sql/ddl.sql +221 -0
  242. sqlspec/data_dictionary/dialects/duckdb/sql/foreign_keys.sql +10 -4
  243. sqlspec/data_dictionary/dialects/duckdb/sql/tables.sql +1 -0
  244. sqlspec/data_dictionary/dialects/duckdb/sql/types.sql +12 -0
  245. sqlspec/data_dictionary/dialects/mariadb/sql/columns.sql +6 -1
  246. sqlspec/data_dictionary/dialects/mariadb/sql/foreign_keys.sql +37 -23
  247. sqlspec/data_dictionary/dialects/mssql/config.py +33 -126
  248. sqlspec/data_dictionary/dialects/mssql/sql/columns.sql +51 -39
  249. sqlspec/data_dictionary/dialects/mssql/sql/constraints.sql +20 -2
  250. sqlspec/data_dictionary/dialects/mssql/sql/ddl.sql +40 -30
  251. sqlspec/data_dictionary/dialects/mysql/config.py +16 -1
  252. sqlspec/data_dictionary/dialects/mysql/dictionary.py +133 -66
  253. sqlspec/data_dictionary/dialects/mysql/sql/columns.sql +6 -1
  254. sqlspec/data_dictionary/dialects/mysql/sql/foreign_keys.sql +35 -21
  255. sqlspec/data_dictionary/dialects/mysql/sql/privileges.sql +2 -0
  256. sqlspec/data_dictionary/dialects/oracle/config.py +1 -1
  257. sqlspec/data_dictionary/dialects/oracle/sql/columns.sql +75 -18
  258. sqlspec/data_dictionary/dialects/oracle/sql/indexes.sql +16 -7
  259. sqlspec/data_dictionary/dialects/oracle/sql/version.sql +4 -6
  260. sqlspec/data_dictionary/dialects/postgres/__init__.py +11 -1
  261. sqlspec/data_dictionary/dialects/postgres/config.py +33 -0
  262. sqlspec/data_dictionary/dialects/postgres/sql/columns.sql +92 -31
  263. sqlspec/data_dictionary/dialects/postgres/sql/constraints.sql +22 -12
  264. sqlspec/data_dictionary/dialects/postgres/sql/ddl.sql +15 -4
  265. sqlspec/data_dictionary/dialects/postgres/sql/foreign_keys.sql +30 -2
  266. sqlspec/data_dictionary/dialects/postgres/sql/indexes.sql +14 -2
  267. sqlspec/data_dictionary/dialects/postgres/sql/sequences.sql +16 -2
  268. sqlspec/data_dictionary/dialects/postgres/sql/system.sql +1 -1
  269. sqlspec/data_dictionary/dialects/postgres/sql/types.sql +21 -0
  270. sqlspec/data_dictionary/dialects/spanner/config.py +1 -0
  271. sqlspec/data_dictionary/dialects/spanner/sql/columns.sql +51 -16
  272. sqlspec/data_dictionary/dialects/sqlanywhere/__init__.py +31 -0
  273. sqlspec/data_dictionary/dialects/sqlanywhere/config.py +191 -0
  274. sqlspec/data_dictionary/dialects/sqlanywhere/sql/columns.sql +97 -0
  275. sqlspec/data_dictionary/dialects/sqlanywhere/sql/constraints.sql +43 -0
  276. sqlspec/data_dictionary/dialects/sqlanywhere/sql/foreign_keys.sql +45 -0
  277. sqlspec/data_dictionary/dialects/sqlanywhere/sql/indexes.sql +39 -0
  278. sqlspec/data_dictionary/dialects/sqlanywhere/sql/objects.sql +18 -0
  279. sqlspec/data_dictionary/dialects/sqlanywhere/sql/schemas.sql +15 -0
  280. sqlspec/data_dictionary/dialects/sqlanywhere/sql/tables.sql +86 -0
  281. sqlspec/data_dictionary/dialects/sqlanywhere/sql/version.sql +3 -0
  282. sqlspec/data_dictionary/dialects/sqlanywhere/sql/views.sql +15 -0
  283. sqlspec/data_dictionary/dialects/sqlite/__init__.py +10 -1
  284. sqlspec/data_dictionary/dialects/sqlite/config.py +338 -1
  285. sqlspec/data_dictionary/dialects/sqlite/sql/columns.sql +24 -6
  286. sqlspec/data_dictionary/dialects/sqlite/sql/constraints.sql +47 -6
  287. sqlspec/data_dictionary/dialects/sqlite/sql/ddl.sql +29 -2
  288. sqlspec/data_dictionary/dialects/sqlite/sql/foreign_keys.sql +10 -2
  289. sqlspec/data_dictionary/dialects/sqlite/sql/indexes.sql +11 -6
  290. sqlspec/data_dictionary/dialects/sqlite/sql/tables.sql +15 -9
  291. sqlspec/data_dictionary/dialects/sybase/__init__.py +31 -0
  292. sqlspec/data_dictionary/dialects/sybase/config.py +187 -0
  293. sqlspec/data_dictionary/dialects/sybase/sql/columns.sql +123 -0
  294. sqlspec/data_dictionary/dialects/sybase/sql/constraints.sql +95 -0
  295. sqlspec/data_dictionary/dialects/sybase/sql/foreign_keys.sql +77 -0
  296. sqlspec/data_dictionary/dialects/sybase/sql/indexes.sql +51 -0
  297. sqlspec/data_dictionary/dialects/sybase/sql/objects.sql +21 -0
  298. sqlspec/data_dictionary/dialects/sybase/sql/schemas.sql +16 -0
  299. sqlspec/data_dictionary/dialects/sybase/sql/tables.sql +46 -0
  300. sqlspec/data_dictionary/dialects/sybase/sql/version.sql +3 -0
  301. sqlspec/data_dictionary/dialects/sybase/sql/views.sql +15 -0
  302. sqlspec/dialects/__init__.py +4 -1
  303. sqlspec/dialects/sybase/__init__.py +115 -0
  304. sqlspec/dialects/sybase/_generators.py +379 -0
  305. sqlspec/dialects/sybase/_parsers.py +225 -0
  306. sqlspec/dialects/sybase/_transforms.py +68 -0
  307. sqlspec/driver/__init__.py +1 -1
  308. sqlspec/driver/_async.py +695 -37
  309. sqlspec/driver/_common.py +1602 -14
  310. sqlspec/driver/_storage_helpers.py +1289 -62
  311. sqlspec/driver/_sync.py +693 -37
  312. sqlspec/exceptions.py +2 -0
  313. sqlspec/extensions/adk/_table_utils.py +16 -6
  314. sqlspec/extensions/adk/_types.py +13 -0
  315. sqlspec/extensions/adk/artifact/_types.py +9 -0
  316. sqlspec/extensions/adk/artifact/service.py +19 -19
  317. sqlspec/extensions/adk/maintenance.py +3 -0
  318. sqlspec/extensions/adk/memory/_types.py +13 -0
  319. sqlspec/extensions/adk/memory/store.py +4 -2
  320. sqlspec/extensions/adk/migrations/0002_create_mssql_python_memory.py +4 -8
  321. sqlspec/extensions/adk/store.py +8 -6
  322. sqlspec/extensions/fastapi/extension.py +3 -1
  323. sqlspec/extensions/flask/_state.py +1 -1
  324. sqlspec/extensions/flask/extension.py +1 -1
  325. sqlspec/extensions/litestar/_utils.py +2 -0
  326. sqlspec/extensions/litestar/handlers.py +12 -9
  327. sqlspec/extensions/litestar/plugin.py +2 -0
  328. sqlspec/extensions/sanic/_state.py +3 -1
  329. sqlspec/extensions/sanic/_utils.py +2 -0
  330. sqlspec/extensions/sanic/extension.py +3 -1
  331. sqlspec/extensions/starlette/_state.py +3 -1
  332. sqlspec/extensions/starlette/_utils.py +2 -0
  333. sqlspec/extensions/starlette/extension.py +3 -1
  334. sqlspec/extensions/starlette/middleware.py +2 -0
  335. sqlspec/migrations/__init__.py +3 -1
  336. sqlspec/migrations/base.py +31 -1
  337. sqlspec/migrations/commands.py +1551 -514
  338. sqlspec/migrations/runner.py +118 -3
  339. sqlspec/migrations/squash.py +2066 -115
  340. sqlspec/migrations/templates.py +60 -5
  341. sqlspec/migrations/tracker.py +96 -14
  342. sqlspec/migrations/utils.py +4 -2
  343. sqlspec/migrations/validation.py +34 -35
  344. sqlspec/protocols.py +18 -0
  345. sqlspec/storage/__init__.py +3 -0
  346. sqlspec/storage/_arrow_payload.py +69 -8
  347. sqlspec/storage/_arrow_stream.py +91 -5
  348. sqlspec/storage/backends/fsspec.py +5 -1
  349. sqlspec/storage/backends/local.py +7 -2
  350. sqlspec/storage/backends/obstore.py +35 -11
  351. sqlspec/storage/pipeline.py +229 -3
  352. sqlspec/typing.py +2 -0
  353. sqlspec/utils/arrow_helpers.py +935 -24
  354. sqlspec/utils/dispatch.py +5 -3
  355. sqlspec/utils/fixtures.py +1242 -253
  356. sqlspec/utils/schema.py +2 -11
  357. {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/METADATA +75 -53
  358. {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/RECORD +361 -307
  359. {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/entry_points.txt +2 -4
  360. sqlspec/adapters/db2/events/config.py +0 -9
  361. sqlspec/adapters/db2/litestar/config.py +0 -12
  362. sqlspec/adapters/mysql_common.py +0 -561
  363. sqlspec/driver/_query_cache.py +0 -250
  364. {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/WHEEL +0 -0
  365. {sqlspec-0.69.0.dist-info → sqlspec-0.70.0.dist-info}/licenses/LICENSE +0 -0
sqlspec/__main__.py CHANGED
@@ -1,3 +1,5 @@
1
+ """Command-line entry point for executing SQLSpec via ``python -m sqlspec``."""
2
+
1
3
  from sqlspec.cli import add_migration_commands as build_cli_interface
2
4
 
3
5
  __all__ = ("run_cli",)
sqlspec/_typing.py CHANGED
@@ -38,6 +38,7 @@ if TYPE_CHECKING:
38
38
  from pandas import DataFrame as PandasDataFrame
39
39
  from polars import DataFrame as PolarsDataFrame
40
40
  from prometheus_client import Counter, Gauge, Histogram
41
+ from pyarrow import ArrowException
41
42
  from pyarrow import RecordBatch as ArrowRecordBatch
42
43
  from pyarrow import RecordBatchReader as ArrowRecordBatchReader
43
44
  from pyarrow import Schema as ArrowSchema
@@ -67,6 +68,7 @@ __all__ = (
67
68
  "UNSET",
68
69
  "UNSET_STUB",
69
70
  "UUID_UTILS_INSTALLED",
71
+ "ArrowException",
70
72
  "ArrowRecordBatch",
71
73
  "ArrowRecordBatchReader",
72
74
  "ArrowRecordBatchReaderProtocol",
@@ -472,6 +474,13 @@ _ARROW_SCHEMA_SHIM = ArrowSchemaProtocol
472
474
  _ARROW_RECORD_BATCH_READER_SHIM = ArrowRecordBatchReaderProtocol
473
475
 
474
476
 
477
+ class ArrowExceptionStubError(Exception):
478
+ """Placeholder for ``pyarrow.ArrowException`` that no runtime error is an instance of."""
479
+
480
+
481
+ _ARROW_EXCEPTION_SHIM = ArrowExceptionStubError
482
+
483
+
475
484
  @runtime_checkable
476
485
  class PandasDataFrameProtocol(Protocol):
477
486
  """Typed shim for pandas.DataFrame."""
@@ -711,6 +720,7 @@ _CATTRS_UNSTRUCTURE_SHIM = cattrs_unstructure_stub
711
720
  _CATTRS_UNSTRUCTURE_SHIM.__name__ = "cattrs_unstructure"
712
721
  _CATTRS_UNSTRUCTURE_SHIM.__qualname__ = "cattrs_unstructure"
713
722
  _LAZY_EXPORTS: "dict[str, tuple[str, str | None, Any]]" = {
723
+ "ArrowException": ("pyarrow", "ArrowException", _ARROW_EXCEPTION_SHIM),
714
724
  "ArrowRecordBatch": ("pyarrow", "RecordBatch", _ARROW_RECORD_BATCH_SHIM),
715
725
  "ArrowRecordBatchReader": ("pyarrow", "RecordBatchReader", _ARROW_RECORD_BATCH_READER_SHIM),
716
726
  "ArrowSchema": ("pyarrow", "Schema", _ARROW_SCHEMA_SHIM),
@@ -1,7 +1,7 @@
1
1
  """ADBC adapter for SQLSpec."""
2
2
 
3
3
  from sqlspec.adapters.adbc._typing import AdbcConnection
4
- from sqlspec.adapters.adbc.config import AdbcConfig, AdbcConnectionParams, AdbcDriverFeatures
4
+ from sqlspec.adapters.adbc.config import AdbcConfig, AdbcConnectionParams, AdbcDriverFeatures, AdbcPoolConfig
5
5
  from sqlspec.adapters.adbc.driver import AdbcCursor, AdbcDriver, AdbcExceptionHandler
6
6
 
7
7
  __all__ = (
@@ -12,4 +12,5 @@ __all__ = (
12
12
  "AdbcDriver",
13
13
  "AdbcDriverFeatures",
14
14
  "AdbcExceptionHandler",
15
+ "AdbcPoolConfig",
15
16
  )
@@ -7,6 +7,7 @@ compilation to avoid ABI boundary issues.
7
7
  import contextlib
8
8
  from typing import TYPE_CHECKING, Any, TypeAlias
9
9
 
10
+ from adbc_driver_manager import AdbcStatusCode
10
11
  from adbc_driver_manager import Error as _AdbcNativeError
11
12
  from adbc_driver_manager import NotSupportedError as AdbcNotSupportedError
12
13
  from adbc_driver_manager import OperationalError as AdbcOperationalError
@@ -38,6 +39,7 @@ __all__ = (
38
39
  "AdbcOperationalError",
39
40
  "AdbcRawCursor",
40
41
  "AdbcSessionContext",
42
+ "AdbcStatusCode",
41
43
  )
42
44
 
43
45
 
@@ -75,6 +77,7 @@ class AdbcSessionContext:
75
77
  "_acquire_connection",
76
78
  "_connection",
77
79
  "_driver",
80
+ "_driver_class",
78
81
  "_driver_features",
79
82
  "_prepare_driver",
80
83
  "_release_connection",
@@ -88,34 +91,69 @@ class AdbcSessionContext:
88
91
  statement_config: "StatementConfig",
89
92
  driver_features: "dict[str, Any]",
90
93
  prepare_driver: "Callable[[AdbcDriver], AdbcDriver]",
94
+ driver_class: "type[AdbcDriver] | None" = None,
91
95
  ) -> None:
92
96
  self._acquire_connection = acquire_connection
93
97
  self._release_connection = release_connection
94
98
  self._statement_config = statement_config
95
99
  self._driver_features = driver_features
96
100
  self._prepare_driver = prepare_driver
101
+ self._driver_class = driver_class
97
102
  self._connection: Any = None
98
103
  self._driver: AdbcDriver | None = None
99
104
 
100
105
  def __enter__(self) -> "AdbcDriver":
101
- from sqlspec.adapters.adbc.driver import AdbcDriver
106
+ driver_class = self._driver_class
107
+ if driver_class is None:
108
+ from sqlspec.adapters.adbc.driver import AdbcDriver
109
+
110
+ driver_class = AdbcDriver
102
111
 
103
112
  self._connection = self._acquire_connection()
104
- resolved_dialect = resolve_dialect_name(self._statement_config.dialect) or None
105
- self._driver = AdbcDriver(
106
- connection=self._connection,
107
- statement_config=self._statement_config,
108
- driver_features=self._driver_features,
109
- dialect=resolved_dialect,
110
- )
111
- return self._prepare_driver(self._driver)
113
+ try:
114
+ resolved_dialect = resolve_dialect_name(self._statement_config.dialect) or None
115
+ self._driver = driver_class(
116
+ connection=self._connection,
117
+ statement_config=self._statement_config,
118
+ driver_features=self._driver_features,
119
+ dialect=resolved_dialect,
120
+ )
121
+ return self._prepare_driver(self._driver)
122
+ except BaseException as exc:
123
+ connection = self._connection
124
+ driver = self._driver
125
+ self._connection = None
126
+ self._driver = None
127
+ if driver is not None:
128
+ with contextlib.suppress(BaseException):
129
+ driver.close_streams()
130
+ with contextlib.suppress(BaseException):
131
+ self._release_connection(
132
+ connection, exc_type=type(exc), exc_val=exc, exc_tb=exc.__traceback__, driver=driver
133
+ )
134
+ raise
112
135
 
113
136
  def __exit__(
114
137
  self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
115
138
  ) -> "bool | None":
116
139
  if self._connection is not None:
117
- self._release_connection(self._connection, exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb)
140
+ connection = self._connection
141
+ driver = self._driver
118
142
  self._connection = None
143
+ self._driver = None
144
+ first_error: BaseException | None = None
145
+ if driver is not None:
146
+ try:
147
+ driver.close_streams()
148
+ except BaseException as exc:
149
+ first_error = exc
150
+ try:
151
+ self._release_connection(connection, exc_type=exc_type, exc_val=exc_val, exc_tb=exc_tb, driver=driver)
152
+ except BaseException as exc:
153
+ if first_error is None:
154
+ first_error = exc
155
+ if exc_type is None and first_error is not None:
156
+ raise first_error
119
157
  return None
120
158
 
121
159
 
@@ -8,11 +8,14 @@ from functools import lru_cache
8
8
  from typing import TYPE_CHECKING, Any, Final, Literal, NotRequired, cast
9
9
 
10
10
  from sqlspec.adapters.adbc.core import (
11
+ _DB2_INDEX_EXISTS_SQL,
12
+ _DB2_TABLE_EXISTS_SQL,
11
13
  driver_kind_from_driver_name,
12
14
  is_postgres_dialect,
13
15
  is_shared_object_driver,
14
16
  resolve_dialect_from_config,
15
17
  )
18
+ from sqlspec.adapters.adbc.core import split_db2_table_name as _split_db2_table_name
16
19
  from sqlspec.config import ADKConfig
17
20
  from sqlspec.core.parameters._validator import PARAMETER_REGEX
18
21
  from sqlspec.exceptions import ImproperConfigurationError
@@ -20,7 +23,6 @@ from sqlspec.extensions.adk import BaseSyncADKStore, StoredEvent, StoredSession,
20
23
  from sqlspec.extensions.adk.memory.store import BaseSyncADKMemoryStore
21
24
  from sqlspec.utils.logging import get_logger
22
25
  from sqlspec.utils.serializers import from_json, to_json
23
- from sqlspec.utils.text import normalize_identifier, split_qualified_identifier
24
26
 
25
27
  if TYPE_CHECKING:
26
28
  from collections.abc import Sequence
@@ -49,7 +51,7 @@ class AdbcADKConfig(ADKConfig):
49
51
  """Vector index type for PostgreSQL. Defaults to 'hnsw'."""
50
52
 
51
53
  scann_num_leaves: NotRequired[int]
52
- """Number of leaves for ScaNN index on PostgreSQL. Defaults to 50."""
54
+ """Number of leaves for ScaNN index on PostgreSQL. Defaults to 100."""
53
55
 
54
56
  scann_quantizer: NotRequired[Literal["SQ8", "FP32"]]
55
57
  """Quantizer for ScaNN index on PostgreSQL. Defaults to 'SQ8'."""
@@ -224,6 +226,7 @@ class AdbcADKStore(BaseSyncADKStore["AdbcConfig"]):
224
226
  """Set a metadata value."""
225
227
  self._set_metadata(key, value)
226
228
 
229
+ @property
227
230
  def dialect(self) -> str:
228
231
  """Return the detected database dialect."""
229
232
  return self._dialect
@@ -2194,7 +2197,23 @@ class AdbcADKMemoryStore(BaseSyncADKMemoryStore["AdbcConfig"]):
2194
2197
  with self._config.provide_connection() as conn:
2195
2198
  cursor = conn.cursor()
2196
2199
  try:
2197
- for entry in entries:
2200
+ entries_to_insert = entries
2201
+ if not use_returning:
2202
+ event_ids = [entry["event_id"] for entry in entries if "event_id" in entry]
2203
+ if event_ids:
2204
+ placeholders = ", ".join("?" for _ in event_ids)
2205
+ select_sql = f"SELECT event_id FROM {self._memory_table} WHERE event_id IN ({placeholders})"
2206
+ self._execute(cursor, select_sql, tuple(event_ids))
2207
+ existing_rows = cursor.fetchall()
2208
+ existing_event_ids = {row[0] for row in existing_rows}
2209
+ entries_to_insert = []
2210
+ for entry in entries:
2211
+ event_id = entry["event_id"]
2212
+ if event_id not in existing_event_ids:
2213
+ entries_to_insert.append(entry)
2214
+ existing_event_ids.add(event_id)
2215
+
2216
+ for entry in entries_to_insert:
2198
2217
  content_json = self._serialize_json_field(entry["content_json"])
2199
2218
  metadata_json = self._serialize_json_field(entry.get("metadata_json"))
2200
2219
  raw_emb = entry.get("embedding")
@@ -2272,19 +2291,25 @@ class AdbcADKMemoryStore(BaseSyncADKMemoryStore["AdbcConfig"]):
2272
2291
  else:
2273
2292
  try:
2274
2293
  self._execute(cursor, sql, params)
2275
- inserted_count += 1
2276
2294
  except Exception as exc:
2277
- exc_str = str(exc).lower()
2278
- if (
2279
- "unique" in exc_str
2280
- or "constraint" in exc_str
2281
- or "duplicate" in exc_str
2282
- or "ora-00001" in exc_str
2283
- or "sql0803n" in exc_str
2284
- or "23505" in exc_str
2295
+ error_message = str(exc).lower()
2296
+ if not (
2297
+ getattr(exc, "sqlstate", None) == "23505"
2298
+ or "unique" in error_message
2299
+ or "duplicate" in error_message
2300
+ or "ora-00001" in error_message
2301
+ or "sql0803n" in error_message
2285
2302
  ):
2286
- continue
2287
- raise
2303
+ raise
2304
+ self._execute(
2305
+ cursor,
2306
+ f"SELECT event_id FROM {self._memory_table} WHERE event_id = ?",
2307
+ (entry["event_id"],),
2308
+ )
2309
+ if cursor.fetchone() is None:
2310
+ raise
2311
+ continue
2312
+ inserted_count += 1
2288
2313
  conn.commit()
2289
2314
  except Exception:
2290
2315
  with contextlib.suppress(Exception):
@@ -2622,15 +2647,6 @@ def decode_adbc_pgvector(raw_embedding: Any) -> "list[float] | None":
2622
2647
  return [float(v) for v in raw_embedding]
2623
2648
 
2624
2649
 
2625
- _DB2_TABLE_EXISTS_SQL: Final = (
2626
- "SELECT 1 FROM SYSCAT.TABLES WHERE TABSCHEMA = COALESCE(CAST(? AS VARCHAR(128)), CURRENT SCHEMA) AND TABNAME = ?"
2627
- )
2628
- _DB2_INDEX_EXISTS_SQL: Final = (
2629
- "SELECT 1 FROM SYSCAT.INDEXES WHERE INDSCHEMA = COALESCE(CAST(? AS VARCHAR(128)), CURRENT SCHEMA) AND INDNAME = ?"
2630
- )
2631
- _MIN_QUALIFIED_PARTS: Final = 2
2632
-
2633
-
2634
2650
  @lru_cache(maxsize=256)
2635
2651
  def _postgresql_store_sql(sql: str) -> str:
2636
2652
  """Cache positional SQL conversion without changing quoted or commented text."""
@@ -2669,13 +2685,6 @@ def _metadata_key_column(dialect: str) -> str:
2669
2685
  return "key"
2670
2686
 
2671
2687
 
2672
- def _split_db2_table_name(table_name: str) -> "tuple[str | None, str]":
2673
- parts = [part.strip() for part in split_qualified_identifier(table_name, quote_chars='"') if part.strip()]
2674
- if len(parts) >= _MIN_QUALIFIED_PARTS:
2675
- return normalize_identifier(parts[-2], "db2"), normalize_identifier(parts[-1], "db2")
2676
- return None, normalize_identifier(parts[0] if parts else table_name, "db2")
2677
-
2678
-
2679
2688
  def _db2_table_exists(cursor: Any, table_name: str) -> bool:
2680
2689
  schema_name, catalog_table = _split_db2_table_name(table_name)
2681
2690
  cursor.execute(_DB2_TABLE_EXISTS_SQL, (schema_name, catalog_table))