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,303 @@
1
+ """MysqlConnector adapter compiled helpers."""
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
6
+ from sqlspec.exceptions import (
7
+ CheckViolationError,
8
+ DatabaseConnectionError,
9
+ DataError,
10
+ ForeignKeyViolationError,
11
+ IntegrityError,
12
+ NotNullViolationError,
13
+ SQLParsingError,
14
+ SQLSpecError,
15
+ TransactionError,
16
+ UniqueViolationError,
17
+ )
18
+ from sqlspec.utils.serializers import from_json, to_json
19
+ from sqlspec.utils.type_guards import has_cursor_metadata, has_lastrowid, has_rowcount, has_sqlstate, has_type_code
20
+
21
+ if TYPE_CHECKING:
22
+ from collections.abc import Callable, Mapping, Sequence
23
+
24
+ __all__ = (
25
+ "apply_driver_features",
26
+ "build_insert_statement",
27
+ "build_profile",
28
+ "build_statement_config",
29
+ "collect_rows",
30
+ "create_mapped_exception",
31
+ "default_statement_config",
32
+ "detect_json_columns",
33
+ "driver_profile",
34
+ "format_identifier",
35
+ "normalize_execute_many_parameters",
36
+ "normalize_execute_parameters",
37
+ "normalize_lastrowid",
38
+ "resolve_rowcount",
39
+ )
40
+
41
+ MYSQL_ER_DUP_ENTRY = 1062
42
+ MYSQL_ER_NO_DEFAULT_FOR_FIELD = 1364
43
+ MYSQL_ER_CHECK_CONSTRAINT_VIOLATED = 3819
44
+
45
+
46
+ def _bool_to_int(value: bool) -> int:
47
+ return int(value)
48
+
49
+
50
+ def _quote_mysql_identifier(identifier: str) -> str:
51
+ normalized = identifier.replace("`", "``")
52
+ return f"`{normalized}`"
53
+
54
+
55
+ def format_identifier(identifier: str) -> str:
56
+ cleaned = identifier.strip()
57
+ if not cleaned:
58
+ msg = "Table name must not be empty"
59
+ raise SQLSpecError(msg)
60
+ parts = [part for part in cleaned.split(".") if part]
61
+ formatted = ".".join(_quote_mysql_identifier(part) for part in parts)
62
+ return formatted or _quote_mysql_identifier(cleaned)
63
+
64
+
65
+ def build_insert_statement(table: str, columns: "list[str]") -> str:
66
+ column_clause = ", ".join(_quote_mysql_identifier(column) for column in columns)
67
+ placeholders = ", ".join("%s" for _ in columns)
68
+ return f"INSERT INTO {format_identifier(table)} ({column_clause}) VALUES ({placeholders})"
69
+
70
+
71
+ def normalize_execute_parameters(parameters: Any) -> Any:
72
+ """Normalize parameters for mysql-connector execute calls."""
73
+ return parameters or None
74
+
75
+
76
+ def normalize_execute_many_parameters(parameters: Any) -> Any:
77
+ """Normalize parameters for mysql-connector executemany calls."""
78
+ if not parameters:
79
+ msg = "execute_many requires parameters"
80
+ raise ValueError(msg)
81
+ return parameters
82
+
83
+
84
+ def build_profile() -> "DriverParameterProfile":
85
+ """Create the mysql-connector driver parameter profile."""
86
+
87
+ return DriverParameterProfile(
88
+ name="mysql-connector",
89
+ default_style=ParameterStyle.QMARK,
90
+ supported_styles={ParameterStyle.QMARK, ParameterStyle.POSITIONAL_PYFORMAT},
91
+ default_execution_style=ParameterStyle.POSITIONAL_PYFORMAT,
92
+ supported_execution_styles={ParameterStyle.POSITIONAL_PYFORMAT},
93
+ has_native_list_expansion=False,
94
+ preserve_parameter_format=True,
95
+ needs_static_script_compilation=True,
96
+ allow_mixed_parameter_styles=False,
97
+ preserve_original_params_for_many=False,
98
+ json_serializer_strategy="helper",
99
+ custom_type_coercions={bool: _bool_to_int},
100
+ default_dialect="mysql",
101
+ )
102
+
103
+
104
+ driver_profile = build_profile()
105
+
106
+
107
+ def build_statement_config(
108
+ *, json_serializer: "Callable[[Any], str] | None" = None, json_deserializer: "Callable[[str], Any] | None" = None
109
+ ) -> "StatementConfig":
110
+ """Construct the mysql-connector statement configuration with optional JSON codecs."""
111
+ serializer = json_serializer or to_json
112
+ deserializer = json_deserializer or from_json
113
+ profile = driver_profile
114
+ return build_statement_config_from_profile(
115
+ profile, statement_overrides={"dialect": "mysql"}, json_serializer=serializer, json_deserializer=deserializer
116
+ )
117
+
118
+
119
+ default_statement_config = build_statement_config()
120
+
121
+
122
+ def apply_driver_features(
123
+ statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
124
+ ) -> "tuple[StatementConfig, dict[str, Any]]":
125
+ """Apply mysql-connector driver feature defaults to statement config."""
126
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
127
+ json_serializer = features.setdefault("json_serializer", to_json)
128
+ json_deserializer = features.setdefault("json_deserializer", from_json)
129
+
130
+ if json_serializer is not None:
131
+ parameter_config = statement_config.parameter_config.with_json_serializers(
132
+ json_serializer, deserializer=json_deserializer
133
+ )
134
+ statement_config = statement_config.replace(parameter_config=parameter_config)
135
+
136
+ return statement_config, features
137
+
138
+
139
+ def _create_mysql_error(
140
+ error: Any, sqlstate: "str | None", code: "int | None", error_class: type[SQLSpecError], description: str
141
+ ) -> SQLSpecError:
142
+ """Create a MySQL error instance without raising it."""
143
+ code_str = f"[{sqlstate or code}]" if sqlstate or code else ""
144
+ msg = f"MySQL {description} {code_str}: {error}" if code_str else f"MySQL {description}: {error}"
145
+ exc = error_class(msg)
146
+ exc.__cause__ = error
147
+ return exc
148
+
149
+
150
+ def create_mapped_exception(error: Any, *, logger: Any | None = None) -> "SQLSpecError | bool":
151
+ """Map mysql-connector exceptions to SQLSpec errors.
152
+
153
+ This is a factory function that returns an exception instance rather than
154
+ raising. This pattern is more robust for use in __exit__ handlers and
155
+ avoids issues with exception control flow in different Python versions.
156
+
157
+ Args:
158
+ error: The mysql-connector exception to map
159
+ logger: Optional logger for migration warnings
160
+
161
+ Returns:
162
+ True to suppress expected migration errors, or a SQLSpec exception
163
+ """
164
+ error_code = getattr(error, "errno", None)
165
+ if error_code is None and hasattr(error, "args") and error.args:
166
+ value = error.args[0]
167
+ if isinstance(value, int):
168
+ error_code = value
169
+ sqlstate = error.sqlstate if has_sqlstate(error) and error.sqlstate is not None else None
170
+
171
+ if error_code in {1061, 1091}:
172
+ if logger is not None:
173
+ logger.warning("MysqlConnector MySQL expected migration error (ignoring): %s", error)
174
+ return True
175
+
176
+ if sqlstate == "23505" or error_code == MYSQL_ER_DUP_ENTRY:
177
+ return _create_mysql_error(error, sqlstate, error_code, UniqueViolationError, "unique constraint violation")
178
+ if sqlstate == "23503" or error_code in {1216, 1217, 1451, 1452}:
179
+ return _create_mysql_error(
180
+ error, sqlstate, error_code, ForeignKeyViolationError, "foreign key constraint violation"
181
+ )
182
+ if sqlstate == "23502" or error_code in {1048, MYSQL_ER_NO_DEFAULT_FOR_FIELD}:
183
+ return _create_mysql_error(error, sqlstate, error_code, NotNullViolationError, "not-null constraint violation")
184
+ if sqlstate == "23514" or error_code == MYSQL_ER_CHECK_CONSTRAINT_VIOLATED:
185
+ return _create_mysql_error(error, sqlstate, error_code, CheckViolationError, "check constraint violation")
186
+ if sqlstate and sqlstate.startswith("23"):
187
+ return _create_mysql_error(error, sqlstate, error_code, IntegrityError, "integrity constraint violation")
188
+ if sqlstate and sqlstate.startswith("42"):
189
+ return _create_mysql_error(error, sqlstate, error_code, SQLParsingError, "SQL syntax error")
190
+ if sqlstate and sqlstate.startswith("08"):
191
+ return _create_mysql_error(error, sqlstate, error_code, DatabaseConnectionError, "connection error")
192
+ if sqlstate and sqlstate.startswith("40"):
193
+ return _create_mysql_error(error, sqlstate, error_code, TransactionError, "transaction error")
194
+ if sqlstate and sqlstate.startswith("22"):
195
+ return _create_mysql_error(error, sqlstate, error_code, DataError, "data error")
196
+ if error_code in {2002, 2003, 2005, 2006, 2013}:
197
+ return _create_mysql_error(error, sqlstate, error_code, DatabaseConnectionError, "connection error")
198
+ if error_code in {1205, 1213}:
199
+ return _create_mysql_error(error, sqlstate, error_code, TransactionError, "transaction error")
200
+ if error_code in range(1064, 1100):
201
+ return _create_mysql_error(error, sqlstate, error_code, SQLParsingError, "SQL syntax error")
202
+ return _create_mysql_error(error, sqlstate, error_code, SQLSpecError, "database error")
203
+
204
+
205
+ def detect_json_columns(cursor: Any, json_type_codes: "set[int]") -> "list[int]":
206
+ """Identify JSON column indexes from cursor metadata."""
207
+ if not has_cursor_metadata(cursor):
208
+ return []
209
+ description = cursor.description
210
+ if not description or not json_type_codes:
211
+ return []
212
+
213
+ json_indexes: list[int] = []
214
+ for index, column in enumerate(description):
215
+ if has_type_code(column):
216
+ type_code = column.type_code
217
+ elif isinstance(column, (tuple, list)) and len(column) > 1:
218
+ type_code = column[1]
219
+ else:
220
+ type_code = None
221
+ if type_code in json_type_codes:
222
+ json_indexes.append(index)
223
+ return json_indexes
224
+
225
+
226
+ def _deserialize_mysqlconnector_json_rows(
227
+ column_names: "list[str]",
228
+ rows: "list[dict[str, Any]]",
229
+ json_indexes: "list[int]",
230
+ deserializer: "Callable[[Any], Any]",
231
+ *,
232
+ logger: Any | None = None,
233
+ ) -> "list[dict[str, Any]]":
234
+ """Apply JSON deserialization to selected columns."""
235
+ if not rows or not column_names or not json_indexes:
236
+ return rows
237
+
238
+ target_columns = [column_names[index] for index in json_indexes if index < len(column_names)]
239
+ if not target_columns:
240
+ return rows
241
+
242
+ for row in rows:
243
+ for column in target_columns:
244
+ if column not in row:
245
+ continue
246
+ raw_value = row[column]
247
+ if raw_value is None:
248
+ continue
249
+ if isinstance(raw_value, bytearray):
250
+ raw_value = bytes(raw_value)
251
+ if not isinstance(raw_value, (str, bytes)):
252
+ continue
253
+ try:
254
+ row[column] = deserializer(raw_value)
255
+ except Exception:
256
+ if logger is not None:
257
+ logger.debug("Failed to deserialize JSON column %s", column, exc_info=True)
258
+ return rows
259
+
260
+
261
+ def collect_rows(
262
+ fetched_data: "Sequence[Any] | None",
263
+ description: "Sequence[Any] | None",
264
+ json_indexes: "list[int]",
265
+ deserializer: "Callable[[Any], Any]",
266
+ *,
267
+ logger: Any | None = None,
268
+ ) -> "tuple[list[dict[str, Any]], list[str]]":
269
+ """Collect mysql-connector rows into dictionaries with JSON decoding."""
270
+ if not description:
271
+ return [], []
272
+ column_names = [desc[0] for desc in description]
273
+ if not fetched_data:
274
+ return [], column_names
275
+ if not isinstance(fetched_data[0], dict):
276
+ rows = [dict(zip(column_names, row, strict=False)) for row in fetched_data]
277
+ else:
278
+ rows = [dict(row) for row in fetched_data]
279
+ rows = _deserialize_mysqlconnector_json_rows(column_names, rows, json_indexes, deserializer, logger=logger)
280
+ return rows, column_names
281
+
282
+
283
+ def resolve_rowcount(cursor: Any) -> int:
284
+ """Resolve rowcount from a mysql-connector cursor."""
285
+ if not has_rowcount(cursor):
286
+ return 0
287
+ rowcount = cursor.rowcount
288
+ if isinstance(rowcount, int) and rowcount >= 0:
289
+ return rowcount
290
+ return 0
291
+
292
+
293
+ def normalize_lastrowid(cursor: Any) -> int | None:
294
+ """Normalize lastrowid for mysql-connector when rowcount indicates success."""
295
+ if not has_rowcount(cursor):
296
+ return None
297
+ rowcount = cursor.rowcount
298
+ if not isinstance(rowcount, int) or rowcount <= 0:
299
+ return None
300
+ if not has_lastrowid(cursor):
301
+ return None
302
+ last_id = cursor.lastrowid
303
+ return last_id if isinstance(last_id, int) else None
@@ -0,0 +1,235 @@
1
+ """MySQL-specific data dictionary for metadata queries via mysql-connector."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from mypy_extensions import mypyc_attr
6
+
7
+ from sqlspec.driver import AsyncDataDictionaryBase, SyncDataDictionaryBase
8
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
9
+
10
+ if TYPE_CHECKING:
11
+ from sqlspec.adapters.mysqlconnector.driver import MysqlConnectorAsyncDriver, MysqlConnectorSyncDriver
12
+
13
+ __all__ = ("MysqlConnectorAsyncDataDictionary", "MysqlConnectorSyncDataDictionary")
14
+
15
+
16
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
17
+ class MysqlConnectorSyncDataDictionary(SyncDataDictionaryBase):
18
+ """MySQL-specific sync data dictionary."""
19
+
20
+ dialect: ClassVar[str] = "mysql"
21
+
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+
25
+ def get_version(self, driver: "MysqlConnectorSyncDriver") -> "VersionInfo | None":
26
+ """Get MySQL database version information."""
27
+ driver_id = id(driver)
28
+ # Inline cache check to avoid cross-module method call that causes mypyc segfault
29
+ if driver_id in self._version_fetch_attempted:
30
+ return self._version_cache.get(driver_id)
31
+ # Not cached, fetch from database
32
+
33
+ version_value = driver.select_value_or_none(self.get_query("version"))
34
+ if not version_value:
35
+ self._log_version_unavailable(type(self).dialect, "missing")
36
+ self.cache_version(driver_id, None)
37
+ return None
38
+
39
+ version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
40
+ if version_info is None:
41
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
42
+ self.cache_version(driver_id, None)
43
+ return None
44
+
45
+ self._log_version_detected(type(self).dialect, version_info)
46
+ self.cache_version(driver_id, version_info)
47
+ return version_info
48
+
49
+ def get_feature_flag(self, driver: "MysqlConnectorSyncDriver", feature: str) -> bool:
50
+ """Check if MySQL database supports a specific feature."""
51
+ version_info = self.get_version(driver)
52
+ return self.resolve_feature_flag(feature, version_info)
53
+
54
+ def get_optimal_type(self, driver: "MysqlConnectorSyncDriver", type_category: str) -> str:
55
+ """Get optimal MySQL type for a category."""
56
+ config = self.get_dialect_config()
57
+ version_info = self.get_version(driver)
58
+
59
+ if type_category == "json":
60
+ json_version = config.get_feature_version("supports_json")
61
+ if version_info and json_version and version_info >= json_version:
62
+ return "JSON"
63
+ return "TEXT"
64
+
65
+ return config.get_optimal_type(type_category)
66
+
67
+ def get_tables(self, driver: "MysqlConnectorSyncDriver", schema: "str | None" = None) -> "list[TableMetadata]":
68
+ """Get tables sorted by topological dependency order using the MySQL catalog."""
69
+ schema_name = self.resolve_schema(schema)
70
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
71
+ return driver.select(self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata)
72
+
73
+ def get_columns(
74
+ self, driver: "MysqlConnectorSyncDriver", table: "str | None" = None, schema: "str | None" = None
75
+ ) -> "list[ColumnMetadata]":
76
+ """Get column information for a table or schema."""
77
+ schema_name = self.resolve_schema(schema)
78
+ if table is None:
79
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
80
+ return driver.select(
81
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
82
+ )
83
+
84
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
85
+ return driver.select(
86
+ self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
87
+ )
88
+
89
+ def get_indexes(
90
+ self, driver: "MysqlConnectorSyncDriver", table: "str | None" = None, schema: "str | None" = None
91
+ ) -> "list[IndexMetadata]":
92
+ """Get index metadata for a table or schema."""
93
+ schema_name = self.resolve_schema(schema)
94
+ if table is None:
95
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
96
+ return driver.select(
97
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
98
+ )
99
+
100
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
101
+ return driver.select(
102
+ self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
103
+ )
104
+
105
+ def get_foreign_keys(
106
+ self, driver: "MysqlConnectorSyncDriver", table: "str | None" = None, schema: "str | None" = None
107
+ ) -> "list[ForeignKeyMetadata]":
108
+ """Get foreign key metadata."""
109
+ schema_name = self.resolve_schema(schema)
110
+ if table is None:
111
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
112
+ return driver.select(
113
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
114
+ )
115
+
116
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
117
+ return driver.select(
118
+ self.get_query("foreign_keys_by_table"),
119
+ table_name=table,
120
+ schema_name=schema_name,
121
+ schema_type=ForeignKeyMetadata,
122
+ )
123
+
124
+
125
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
126
+ class MysqlConnectorAsyncDataDictionary(AsyncDataDictionaryBase):
127
+ """MySQL-specific async data dictionary."""
128
+
129
+ dialect: ClassVar[str] = "mysql"
130
+
131
+ def __init__(self) -> None:
132
+ super().__init__()
133
+
134
+ async def get_version(self, driver: "MysqlConnectorAsyncDriver") -> "VersionInfo | None":
135
+ """Get MySQL database version information."""
136
+ driver_id = id(driver)
137
+ # Inline cache check to avoid cross-module method call that causes mypyc segfault
138
+ if driver_id in self._version_fetch_attempted:
139
+ return self._version_cache.get(driver_id)
140
+ # Not cached, fetch from database
141
+
142
+ version_value = await driver.select_value_or_none(self.get_query("version"))
143
+ if not version_value:
144
+ self._log_version_unavailable(type(self).dialect, "missing")
145
+ self.cache_version(driver_id, None)
146
+ return None
147
+
148
+ version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
149
+ if version_info is None:
150
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
151
+ self.cache_version(driver_id, None)
152
+ return None
153
+
154
+ self._log_version_detected(type(self).dialect, version_info)
155
+ self.cache_version(driver_id, version_info)
156
+ return version_info
157
+
158
+ async def get_feature_flag(self, driver: "MysqlConnectorAsyncDriver", feature: str) -> bool:
159
+ """Check if MySQL database supports a specific feature."""
160
+ version_info = await self.get_version(driver)
161
+ return self.resolve_feature_flag(feature, version_info)
162
+
163
+ async def get_optimal_type(self, driver: "MysqlConnectorAsyncDriver", type_category: str) -> str:
164
+ """Get optimal MySQL type for a category."""
165
+ config = self.get_dialect_config()
166
+ version_info = await self.get_version(driver)
167
+
168
+ if type_category == "json":
169
+ json_version = config.get_feature_version("supports_json")
170
+ if version_info and json_version and version_info >= json_version:
171
+ return "JSON"
172
+ return "TEXT"
173
+
174
+ return config.get_optimal_type(type_category)
175
+
176
+ async def get_tables(
177
+ self, driver: "MysqlConnectorAsyncDriver", schema: "str | None" = None
178
+ ) -> "list[TableMetadata]":
179
+ """Get tables sorted by topological dependency order using the MySQL catalog."""
180
+ schema_name = self.resolve_schema(schema)
181
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
182
+ return await driver.select(
183
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
184
+ )
185
+
186
+ async def get_columns(
187
+ self, driver: "MysqlConnectorAsyncDriver", table: "str | None" = None, schema: "str | None" = None
188
+ ) -> "list[ColumnMetadata]":
189
+ """Get column information for a table or schema."""
190
+ schema_name = self.resolve_schema(schema)
191
+ if table is None:
192
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
193
+ return await driver.select(
194
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
195
+ )
196
+
197
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
198
+ return await driver.select(
199
+ self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
200
+ )
201
+
202
+ async def get_indexes(
203
+ self, driver: "MysqlConnectorAsyncDriver", table: "str | None" = None, schema: "str | None" = None
204
+ ) -> "list[IndexMetadata]":
205
+ """Get index metadata for a table or schema."""
206
+ schema_name = self.resolve_schema(schema)
207
+ if table is None:
208
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
209
+ return await driver.select(
210
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
211
+ )
212
+
213
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
214
+ return await driver.select(
215
+ self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
216
+ )
217
+
218
+ async def get_foreign_keys(
219
+ self, driver: "MysqlConnectorAsyncDriver", table: "str | None" = None, schema: "str | None" = None
220
+ ) -> "list[ForeignKeyMetadata]":
221
+ """Get foreign key metadata."""
222
+ schema_name = self.resolve_schema(schema)
223
+ if table is None:
224
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
225
+ return await driver.select(
226
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
227
+ )
228
+
229
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
230
+ return await driver.select(
231
+ self.get_query("foreign_keys_by_table"),
232
+ table_name=table,
233
+ schema_name=schema_name,
234
+ schema_type=ForeignKeyMetadata,
235
+ )