sqlspec 0.47.0__cp314-cp314-win_amd64.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 (621) hide show
  1. f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
  2. sqlspec/__init__.py +167 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_typing.py +714 -0
  6. sqlspec/adapters/__init__.py +0 -0
  7. sqlspec/adapters/adbc/__init__.py +13 -0
  8. sqlspec/adapters/adbc/_typing.py +106 -0
  9. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  10. sqlspec/adapters/adbc/adk/store.py +1280 -0
  11. sqlspec/adapters/adbc/config.py +378 -0
  12. sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
  13. sqlspec/adapters/adbc/core.py +922 -0
  14. sqlspec/adapters/adbc/data_dictionary.py +339 -0
  15. sqlspec/adapters/adbc/driver.py +534 -0
  16. sqlspec/adapters/adbc/events/__init__.py +5 -0
  17. sqlspec/adapters/adbc/events/store.py +285 -0
  18. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  19. sqlspec/adapters/adbc/litestar/store.py +534 -0
  20. sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
  21. sqlspec/adapters/adbc/type_converter.py +142 -0
  22. sqlspec/adapters/aiomysql/__init__.py +21 -0
  23. sqlspec/adapters/aiomysql/_typing.py +137 -0
  24. sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
  25. sqlspec/adapters/aiomysql/adk/store.py +678 -0
  26. sqlspec/adapters/aiomysql/config.py +305 -0
  27. sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
  28. sqlspec/adapters/aiomysql/core.py +536 -0
  29. sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
  30. sqlspec/adapters/aiomysql/driver.py +386 -0
  31. sqlspec/adapters/aiomysql/events/__init__.py +5 -0
  32. sqlspec/adapters/aiomysql/events/store.py +104 -0
  33. sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
  34. sqlspec/adapters/aiomysql/litestar/store.py +314 -0
  35. sqlspec/adapters/aiosqlite/__init__.py +26 -0
  36. sqlspec/adapters/aiosqlite/_typing.py +109 -0
  37. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  38. sqlspec/adapters/aiosqlite/adk/store.py +829 -0
  39. sqlspec/adapters/aiosqlite/config.py +315 -0
  40. sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
  41. sqlspec/adapters/aiosqlite/core.py +315 -0
  42. sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
  43. sqlspec/adapters/aiosqlite/driver.py +311 -0
  44. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  45. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  46. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  47. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  48. sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
  49. sqlspec/adapters/aiosqlite/pool.py +734 -0
  50. sqlspec/adapters/asyncmy/__init__.py +21 -0
  51. sqlspec/adapters/asyncmy/_typing.py +113 -0
  52. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncmy/adk/store.py +644 -0
  54. sqlspec/adapters/asyncmy/config.py +307 -0
  55. sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
  56. sqlspec/adapters/asyncmy/core.py +538 -0
  57. sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
  58. sqlspec/adapters/asyncmy/driver.py +391 -0
  59. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  60. sqlspec/adapters/asyncmy/events/store.py +104 -0
  61. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  62. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  63. sqlspec/adapters/asyncpg/__init__.py +26 -0
  64. sqlspec/adapters/asyncpg/_typing.py +103 -0
  65. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  66. sqlspec/adapters/asyncpg/adk/store.py +483 -0
  67. sqlspec/adapters/asyncpg/config.py +575 -0
  68. sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
  69. sqlspec/adapters/asyncpg/core.py +480 -0
  70. sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
  71. sqlspec/adapters/asyncpg/driver.py +487 -0
  72. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  73. sqlspec/adapters/asyncpg/events/_hub.py +181 -0
  74. sqlspec/adapters/asyncpg/events/backend.py +210 -0
  75. sqlspec/adapters/asyncpg/events/store.py +40 -0
  76. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  77. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  78. sqlspec/adapters/bigquery/__init__.py +15 -0
  79. sqlspec/adapters/bigquery/_typing.py +108 -0
  80. sqlspec/adapters/bigquery/config.py +362 -0
  81. sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
  82. sqlspec/adapters/bigquery/core.py +768 -0
  83. sqlspec/adapters/bigquery/data_dictionary.py +120 -0
  84. sqlspec/adapters/bigquery/driver.py +542 -0
  85. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  86. sqlspec/adapters/bigquery/events/store.py +139 -0
  87. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  88. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  89. sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
  90. sqlspec/adapters/bigquery/type_converter.py +107 -0
  91. sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
  92. sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
  93. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  94. sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
  95. sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
  96. sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
  97. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  98. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
  99. sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
  100. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  101. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  102. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  103. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  104. sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
  105. sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
  106. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  107. sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
  108. sqlspec/adapters/cockroach_psycopg/config.py +511 -0
  109. sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
  110. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  111. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
  112. sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
  113. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  114. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  115. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  116. sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
  117. sqlspec/adapters/duckdb/__init__.py +29 -0
  118. sqlspec/adapters/duckdb/_typing.py +104 -0
  119. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  120. sqlspec/adapters/duckdb/adk/store.py +935 -0
  121. sqlspec/adapters/duckdb/config.py +386 -0
  122. sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
  123. sqlspec/adapters/duckdb/core.py +332 -0
  124. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  125. sqlspec/adapters/duckdb/driver.py +426 -0
  126. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  127. sqlspec/adapters/duckdb/events/store.py +57 -0
  128. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  129. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  130. sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
  131. sqlspec/adapters/duckdb/pool.py +350 -0
  132. sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
  133. sqlspec/adapters/duckdb/type_converter.py +118 -0
  134. sqlspec/adapters/mysqlconnector/__init__.py +39 -0
  135. sqlspec/adapters/mysqlconnector/_typing.py +186 -0
  136. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  137. sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
  138. sqlspec/adapters/mysqlconnector/config.py +421 -0
  139. sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
  140. sqlspec/adapters/mysqlconnector/core.py +472 -0
  141. sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
  142. sqlspec/adapters/mysqlconnector/driver.py +516 -0
  143. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  144. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  145. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  146. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  147. sqlspec/adapters/oracledb/__init__.py +39 -0
  148. sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
  149. sqlspec/adapters/oracledb/_json_handlers.py +196 -0
  150. sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
  151. sqlspec/adapters/oracledb/_param_types.py +46 -0
  152. sqlspec/adapters/oracledb/_typing.py +258 -0
  153. sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
  154. sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
  155. sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
  156. sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
  157. sqlspec/adapters/oracledb/adk/__init__.py +21 -0
  158. sqlspec/adapters/oracledb/adk/store.py +2453 -0
  159. sqlspec/adapters/oracledb/config.py +575 -0
  160. sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
  161. sqlspec/adapters/oracledb/core.py +820 -0
  162. sqlspec/adapters/oracledb/data_dictionary.py +404 -0
  163. sqlspec/adapters/oracledb/driver.py +1277 -0
  164. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  165. sqlspec/adapters/oracledb/events/_hub.py +345 -0
  166. sqlspec/adapters/oracledb/events/backend.py +300 -0
  167. sqlspec/adapters/oracledb/events/store.py +420 -0
  168. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  169. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  170. sqlspec/adapters/oracledb/migrations.py +539 -0
  171. sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
  172. sqlspec/adapters/oracledb/type_converter.py +211 -0
  173. sqlspec/adapters/psqlpy/__init__.py +18 -0
  174. sqlspec/adapters/psqlpy/_typing.py +121 -0
  175. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  176. sqlspec/adapters/psqlpy/adk/store.py +591 -0
  177. sqlspec/adapters/psqlpy/config.py +376 -0
  178. sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
  179. sqlspec/adapters/psqlpy/core.py +694 -0
  180. sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
  181. sqlspec/adapters/psqlpy/driver.py +411 -0
  182. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  183. sqlspec/adapters/psqlpy/events/_hub.py +204 -0
  184. sqlspec/adapters/psqlpy/events/backend.py +210 -0
  185. sqlspec/adapters/psqlpy/events/store.py +20 -0
  186. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  187. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  188. sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
  189. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  190. sqlspec/adapters/psycopg/__init__.py +38 -0
  191. sqlspec/adapters/psycopg/_typing.py +218 -0
  192. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  193. sqlspec/adapters/psycopg/adk/store.py +1106 -0
  194. sqlspec/adapters/psycopg/config.py +695 -0
  195. sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
  196. sqlspec/adapters/psycopg/core.py +520 -0
  197. sqlspec/adapters/psycopg/data_dictionary.py +278 -0
  198. sqlspec/adapters/psycopg/driver.py +1033 -0
  199. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  200. sqlspec/adapters/psycopg/events/_hub.py +388 -0
  201. sqlspec/adapters/psycopg/events/backend.py +398 -0
  202. sqlspec/adapters/psycopg/events/store.py +42 -0
  203. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  204. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  205. sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
  206. sqlspec/adapters/psycopg/type_converter.py +93 -0
  207. sqlspec/adapters/pymysql/__init__.py +21 -0
  208. sqlspec/adapters/pymysql/_typing.py +92 -0
  209. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  210. sqlspec/adapters/pymysql/adk/store.py +657 -0
  211. sqlspec/adapters/pymysql/config.py +176 -0
  212. sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
  213. sqlspec/adapters/pymysql/core.py +469 -0
  214. sqlspec/adapters/pymysql/data_dictionary.py +120 -0
  215. sqlspec/adapters/pymysql/driver.py +271 -0
  216. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  217. sqlspec/adapters/pymysql/events/store.py +50 -0
  218. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  219. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  220. sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
  221. sqlspec/adapters/pymysql/pool.py +184 -0
  222. sqlspec/adapters/spanner/__init__.py +33 -0
  223. sqlspec/adapters/spanner/_typing.py +102 -0
  224. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  225. sqlspec/adapters/spanner/adk/store.py +758 -0
  226. sqlspec/adapters/spanner/config.py +355 -0
  227. sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
  228. sqlspec/adapters/spanner/core.py +263 -0
  229. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  230. sqlspec/adapters/spanner/driver.py +407 -0
  231. sqlspec/adapters/spanner/events/__init__.py +5 -0
  232. sqlspec/adapters/spanner/events/store.py +187 -0
  233. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  234. sqlspec/adapters/spanner/litestar/store.py +291 -0
  235. sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
  236. sqlspec/adapters/spanner/type_converter.py +342 -0
  237. sqlspec/adapters/sqlite/__init__.py +19 -0
  238. sqlspec/adapters/sqlite/_typing.py +123 -0
  239. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  240. sqlspec/adapters/sqlite/adk/store.py +992 -0
  241. sqlspec/adapters/sqlite/config.py +240 -0
  242. sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
  243. sqlspec/adapters/sqlite/core.py +357 -0
  244. sqlspec/adapters/sqlite/data_dictionary.py +198 -0
  245. sqlspec/adapters/sqlite/driver.py +527 -0
  246. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  247. sqlspec/adapters/sqlite/events/store.py +20 -0
  248. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  249. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  250. sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
  251. sqlspec/adapters/sqlite/pool.py +237 -0
  252. sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
  253. sqlspec/adapters/sqlite/type_converter.py +114 -0
  254. sqlspec/base.py +832 -0
  255. sqlspec/builder/__init__.py +181 -0
  256. sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
  257. sqlspec/builder/_base.py +1071 -0
  258. sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
  259. sqlspec/builder/_column.py +521 -0
  260. sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
  261. sqlspec/builder/_ddl.py +1691 -0
  262. sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
  263. sqlspec/builder/_delete.py +95 -0
  264. sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
  265. sqlspec/builder/_dml.py +386 -0
  266. sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
  267. sqlspec/builder/_explain.py +579 -0
  268. sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
  269. sqlspec/builder/_expression_wrappers.py +46 -0
  270. sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
  271. sqlspec/builder/_factory.py +1884 -0
  272. sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
  273. sqlspec/builder/_insert.py +405 -0
  274. sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
  275. sqlspec/builder/_join.py +489 -0
  276. sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
  277. sqlspec/builder/_merge.py +823 -0
  278. sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
  279. sqlspec/builder/_parsing_utils.py +295 -0
  280. sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
  281. sqlspec/builder/_select.py +1666 -0
  282. sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
  283. sqlspec/builder/_temporal.py +167 -0
  284. sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
  285. sqlspec/builder/_update.py +173 -0
  286. sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
  287. sqlspec/builder/_vector_distance.py +330 -0
  288. sqlspec/cli.py +1095 -0
  289. sqlspec/config.py +2383 -0
  290. sqlspec/core/__init__.py +372 -0
  291. sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
  292. sqlspec/core/_correlation.py +176 -0
  293. sqlspec/core/_pagination.py +42 -0
  294. sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
  295. sqlspec/core/_pool.py +76 -0
  296. sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
  297. sqlspec/core/cache.py +1085 -0
  298. sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
  299. sqlspec/core/compiler.py +1090 -0
  300. sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
  301. sqlspec/core/config_runtime.py +174 -0
  302. sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
  303. sqlspec/core/explain.py +275 -0
  304. sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
  305. sqlspec/core/filters.py +969 -0
  306. sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
  307. sqlspec/core/hashing.py +266 -0
  308. sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
  309. sqlspec/core/metrics.py +83 -0
  310. sqlspec/core/parameters/__init__.py +72 -0
  311. sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
  312. sqlspec/core/parameters/_alignment.py +283 -0
  313. sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
  314. sqlspec/core/parameters/_converter.py +554 -0
  315. sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
  316. sqlspec/core/parameters/_processor.py +1182 -0
  317. sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
  318. sqlspec/core/parameters/_registry.py +206 -0
  319. sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
  320. sqlspec/core/parameters/_transformers.py +324 -0
  321. sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
  322. sqlspec/core/parameters/_types.py +536 -0
  323. sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
  324. sqlspec/core/parameters/_validator.py +171 -0
  325. sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
  326. sqlspec/core/pipeline.py +333 -0
  327. sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
  328. sqlspec/core/query_modifiers.py +508 -0
  329. sqlspec/core/result/__init__.py +25 -0
  330. sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
  331. sqlspec/core/result/_base.py +1232 -0
  332. sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
  333. sqlspec/core/result/_io.py +28 -0
  334. sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
  335. sqlspec/core/splitter.py +1021 -0
  336. sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
  337. sqlspec/core/sqlcommenter.py +249 -0
  338. sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
  339. sqlspec/core/stack.py +163 -0
  340. sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
  341. sqlspec/core/statement.py +1865 -0
  342. sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
  343. sqlspec/core/type_converter.py +340 -0
  344. sqlspec/data_dictionary/__init__.py +22 -0
  345. sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
  346. sqlspec/data_dictionary/_loader.py +138 -0
  347. sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
  348. sqlspec/data_dictionary/_registry.py +74 -0
  349. sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
  350. sqlspec/data_dictionary/_types.py +121 -0
  351. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  352. sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
  353. sqlspec/data_dictionary/dialects/bigquery.py +81 -0
  354. sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
  355. sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
  356. sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
  357. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  358. sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
  359. sqlspec/data_dictionary/dialects/mysql.py +53 -0
  360. sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
  361. sqlspec/data_dictionary/dialects/oracle.py +197 -0
  362. sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
  363. sqlspec/data_dictionary/dialects/postgres.py +69 -0
  364. sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
  365. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  366. sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
  367. sqlspec/data_dictionary/dialects/sqlite.py +59 -0
  368. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  369. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  370. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  371. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  372. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  373. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  374. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  375. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  376. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  377. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  378. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  379. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  380. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  381. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  382. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  383. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  384. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  385. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  386. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  387. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  388. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  389. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  390. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  391. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  392. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  393. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  394. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  395. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  396. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  397. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  398. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  399. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  400. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  401. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  402. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  403. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  404. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  405. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  406. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  407. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  408. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  409. sqlspec/dialects/__init__.py +22 -0
  410. sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
  411. sqlspec/dialects/_compat.py +14 -0
  412. sqlspec/dialects/postgres/__init__.py +9 -0
  413. sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
  414. sqlspec/dialects/postgres/_generators.py +57 -0
  415. sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
  416. sqlspec/dialects/postgres/_operators.py +81 -0
  417. sqlspec/dialects/postgres/_paradedb.py +50 -0
  418. sqlspec/dialects/postgres/_pgvector.py +36 -0
  419. sqlspec/dialects/spanner/__init__.py +6 -0
  420. sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
  421. sqlspec/dialects/spanner/_generators.py +206 -0
  422. sqlspec/dialects/spanner/_spangres.py +77 -0
  423. sqlspec/dialects/spanner/_spanner.py +179 -0
  424. sqlspec/driver/__init__.py +49 -0
  425. sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
  426. sqlspec/driver/_async.py +1830 -0
  427. sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
  428. sqlspec/driver/_common.py +2292 -0
  429. sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
  430. sqlspec/driver/_exception_handler.py +108 -0
  431. sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
  432. sqlspec/driver/_query_cache.py +96 -0
  433. sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
  434. sqlspec/driver/_sql_helpers.py +139 -0
  435. sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
  436. sqlspec/driver/_storage_helpers.py +153 -0
  437. sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
  438. sqlspec/driver/_sync.py +1817 -0
  439. sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
  440. sqlspec/exceptions.py +480 -0
  441. sqlspec/extensions/__init__.py +0 -0
  442. sqlspec/extensions/adk/__init__.py +84 -0
  443. sqlspec/extensions/adk/_config_utils.py +199 -0
  444. sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
  445. sqlspec/extensions/adk/_types.py +41 -0
  446. sqlspec/extensions/adk/artifact/__init__.py +57 -0
  447. sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
  448. sqlspec/extensions/adk/artifact/_types.py +32 -0
  449. sqlspec/extensions/adk/artifact/service.py +508 -0
  450. sqlspec/extensions/adk/artifact/store.py +361 -0
  451. sqlspec/extensions/adk/converters.py +212 -0
  452. sqlspec/extensions/adk/memory/__init__.py +69 -0
  453. sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
  454. sqlspec/extensions/adk/memory/_types.py +30 -0
  455. sqlspec/extensions/adk/memory/converters.py +225 -0
  456. sqlspec/extensions/adk/memory/service.py +316 -0
  457. sqlspec/extensions/adk/memory/store.py +525 -0
  458. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
  459. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  460. sqlspec/extensions/adk/service.py +279 -0
  461. sqlspec/extensions/adk/store.py +590 -0
  462. sqlspec/extensions/events/__init__.py +51 -0
  463. sqlspec/extensions/events/_channel.py +703 -0
  464. sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
  465. sqlspec/extensions/events/_hints.py +45 -0
  466. sqlspec/extensions/events/_models.py +23 -0
  467. sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
  468. sqlspec/extensions/events/_payload.py +69 -0
  469. sqlspec/extensions/events/_protocols.py +134 -0
  470. sqlspec/extensions/events/_queue.py +462 -0
  471. sqlspec/extensions/events/_store.py +209 -0
  472. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  473. sqlspec/extensions/events/migrations/__init__.py +3 -0
  474. sqlspec/extensions/fastapi/__init__.py +22 -0
  475. sqlspec/extensions/fastapi/extension.py +391 -0
  476. sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
  477. sqlspec/extensions/fastapi/providers.py +712 -0
  478. sqlspec/extensions/flask/__init__.py +38 -0
  479. sqlspec/extensions/flask/_state.py +87 -0
  480. sqlspec/extensions/flask/_utils.py +71 -0
  481. sqlspec/extensions/flask/extension.py +539 -0
  482. sqlspec/extensions/litestar/__init__.py +31 -0
  483. sqlspec/extensions/litestar/_utils.py +52 -0
  484. sqlspec/extensions/litestar/channels.py +165 -0
  485. sqlspec/extensions/litestar/cli.py +102 -0
  486. sqlspec/extensions/litestar/config.py +90 -0
  487. sqlspec/extensions/litestar/handlers.py +316 -0
  488. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  489. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  490. sqlspec/extensions/litestar/plugin.py +1066 -0
  491. sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
  492. sqlspec/extensions/litestar/providers.py +784 -0
  493. sqlspec/extensions/litestar/store.py +298 -0
  494. sqlspec/extensions/otel/__init__.py +58 -0
  495. sqlspec/extensions/prometheus/__init__.py +113 -0
  496. sqlspec/extensions/sanic/__init__.py +19 -0
  497. sqlspec/extensions/sanic/_state.py +43 -0
  498. sqlspec/extensions/sanic/_utils.py +127 -0
  499. sqlspec/extensions/sanic/extension.py +647 -0
  500. sqlspec/extensions/starlette/__init__.py +22 -0
  501. sqlspec/extensions/starlette/_state.py +42 -0
  502. sqlspec/extensions/starlette/_utils.py +96 -0
  503. sqlspec/extensions/starlette/extension.py +374 -0
  504. sqlspec/extensions/starlette/middleware.py +281 -0
  505. sqlspec/loader.cp314-win_amd64.pyd +0 -0
  506. sqlspec/loader.py +727 -0
  507. sqlspec/migrations/__init__.py +39 -0
  508. sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
  509. sqlspec/migrations/base.py +862 -0
  510. sqlspec/migrations/commands.py +2151 -0
  511. sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
  512. sqlspec/migrations/context.py +157 -0
  513. sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
  514. sqlspec/migrations/fix.py +204 -0
  515. sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
  516. sqlspec/migrations/loaders.py +443 -0
  517. sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
  518. sqlspec/migrations/runner.py +1195 -0
  519. sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
  520. sqlspec/migrations/squash.py +490 -0
  521. sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
  522. sqlspec/migrations/templates.py +234 -0
  523. sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
  524. sqlspec/migrations/tracker.py +792 -0
  525. sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
  526. sqlspec/migrations/utils.py +256 -0
  527. sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
  528. sqlspec/migrations/validation.py +359 -0
  529. sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
  530. sqlspec/migrations/version.py +446 -0
  531. sqlspec/observability/__init__.py +57 -0
  532. sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
  533. sqlspec/observability/_common.py +77 -0
  534. sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
  535. sqlspec/observability/_config.py +364 -0
  536. sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
  537. sqlspec/observability/_diagnostics.py +74 -0
  538. sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
  539. sqlspec/observability/_dispatcher.py +200 -0
  540. sqlspec/observability/_formatters/__init__.py +13 -0
  541. sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
  542. sqlspec/observability/_formatters/_aws.py +102 -0
  543. sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
  544. sqlspec/observability/_formatters/_azure.py +96 -0
  545. sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
  546. sqlspec/observability/_formatters/_base.py +57 -0
  547. sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
  548. sqlspec/observability/_formatters/_gcp.py +131 -0
  549. sqlspec/observability/_formatting.py +58 -0
  550. sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
  551. sqlspec/observability/_observer.py +361 -0
  552. sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
  553. sqlspec/observability/_runtime.py +461 -0
  554. sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
  555. sqlspec/observability/_sampling.py +188 -0
  556. sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
  557. sqlspec/observability/_spans.py +161 -0
  558. sqlspec/protocols.py +955 -0
  559. sqlspec/py.typed +0 -0
  560. sqlspec/service.py +433 -0
  561. sqlspec/storage/__init__.py +48 -0
  562. sqlspec/storage/_arrow_payload.py +68 -0
  563. sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
  564. sqlspec/storage/_paths.py +58 -0
  565. sqlspec/storage/_utils.py +46 -0
  566. sqlspec/storage/backends/__init__.py +1 -0
  567. sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
  568. sqlspec/storage/backends/base.py +374 -0
  569. sqlspec/storage/backends/fsspec.py +574 -0
  570. sqlspec/storage/backends/local.py +468 -0
  571. sqlspec/storage/backends/obstore.py +956 -0
  572. sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
  573. sqlspec/storage/errors.py +102 -0
  574. sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
  575. sqlspec/storage/pipeline.py +628 -0
  576. sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
  577. sqlspec/storage/registry.py +329 -0
  578. sqlspec/typing.py +405 -0
  579. sqlspec/utils/__init__.py +7 -0
  580. sqlspec/utils/arrow_helpers.py +384 -0
  581. sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
  582. sqlspec/utils/config_tools.py +314 -0
  583. sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
  584. sqlspec/utils/correlation.py +134 -0
  585. sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
  586. sqlspec/utils/deprecation.py +157 -0
  587. sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
  588. sqlspec/utils/dispatch.py +101 -0
  589. sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
  590. sqlspec/utils/fixtures.py +260 -0
  591. sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
  592. sqlspec/utils/logging.py +251 -0
  593. sqlspec/utils/module_loader.py +306 -0
  594. sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
  595. sqlspec/utils/portal.py +377 -0
  596. sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
  597. sqlspec/utils/schema.py +1040 -0
  598. sqlspec/utils/serializers/__init__.py +30 -0
  599. sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
  600. sqlspec/utils/serializers/_json.py +415 -0
  601. sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
  602. sqlspec/utils/serializers/_numpy.py +65 -0
  603. sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
  604. sqlspec/utils/serializers/_schema.py +285 -0
  605. sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
  606. sqlspec/utils/singleton.py +41 -0
  607. sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
  608. sqlspec/utils/sync_tools.py +316 -0
  609. sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
  610. sqlspec/utils/text.py +109 -0
  611. sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
  612. sqlspec/utils/type_converters.py +216 -0
  613. sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
  614. sqlspec/utils/type_guards.py +1508 -0
  615. sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
  616. sqlspec/utils/uuids.py +241 -0
  617. sqlspec-0.47.0.dist-info/METADATA +202 -0
  618. sqlspec-0.47.0.dist-info/RECORD +621 -0
  619. sqlspec-0.47.0.dist-info/WHEEL +4 -0
  620. sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
  621. sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,536 @@
1
+ """aiomysql adapter compiled helpers."""
2
+
3
+ from collections.abc import Callable, Sized
4
+ from typing import TYPE_CHECKING, Any
5
+
6
+ from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
7
+ from sqlspec.exceptions import (
8
+ CheckViolationError,
9
+ ConnectionTimeoutError,
10
+ DatabaseConnectionError,
11
+ DataError,
12
+ DeadlockError,
13
+ ForeignKeyViolationError,
14
+ IntegrityError,
15
+ NotNullViolationError,
16
+ PermissionDeniedError,
17
+ QueryTimeoutError,
18
+ SQLParsingError,
19
+ SQLSpecError,
20
+ TransactionError,
21
+ UniqueViolationError,
22
+ )
23
+ from sqlspec.utils.serializers import from_json, to_json
24
+ from sqlspec.utils.type_converters import build_uuid_coercions
25
+ from sqlspec.utils.type_guards import has_cursor_metadata, has_lastrowid, has_rowcount
26
+
27
+ if TYPE_CHECKING:
28
+ from collections.abc import Mapping, Sequence
29
+
30
+ __all__ = (
31
+ "apply_driver_features",
32
+ "build_insert_statement",
33
+ "build_profile",
34
+ "build_statement_config",
35
+ "collect_rows",
36
+ "create_mapped_exception",
37
+ "default_statement_config",
38
+ "detect_json_columns",
39
+ "detect_json_columns_from_description",
40
+ "driver_profile",
41
+ "format_identifier",
42
+ "normalize_execute_many_parameters",
43
+ "normalize_execute_parameters",
44
+ "normalize_lastrowid",
45
+ "resolve_column_names",
46
+ "resolve_many_rowcount",
47
+ "resolve_rowcount",
48
+ )
49
+
50
+ # MySQL error codes for constraint violations
51
+ MYSQL_ER_DUP_ENTRY = 1062
52
+ MYSQL_ER_NO_DEFAULT_FOR_FIELD = 1364
53
+ MYSQL_ER_CHECK_CONSTRAINT_VIOLATED = 3819
54
+
55
+ # MySQL error codes for permission/access errors
56
+ MYSQL_ER_DBACCESS_DENIED = 1044
57
+ MYSQL_ER_ACCESS_DENIED = 1045
58
+ MYSQL_ER_TABLEACCESS_DENIED = 1142
59
+
60
+ # MySQL error codes for transaction errors
61
+ MYSQL_ER_LOCK_WAIT_TIMEOUT = 1205
62
+ MYSQL_ER_LOCK_DEADLOCK = 1213
63
+
64
+ # MySQL error codes for connection errors
65
+ MYSQL_CR_CONNECTION_ERROR = 2002
66
+ MYSQL_CR_CONN_HOST_ERROR = 2003
67
+ MYSQL_CR_UNKNOWN_HOST = 2005
68
+ MYSQL_CR_SERVER_GONE_ERROR = 2006
69
+ MYSQL_CR_SERVER_LOST = 2013
70
+ MYSQL_SYNTAX_ERROR_MIN = 1064
71
+ MYSQL_SYNTAX_ERROR_MAX_EXCLUSIVE = 1100
72
+
73
+ _MYSQL_MIGRATION_ERROR_CODES = frozenset((1061, 1091))
74
+ _MYSQL_SQLSTATE_EXACT_DISPATCH: dict[str, tuple[type[SQLSpecError], str]] = {
75
+ "23505": (UniqueViolationError, "unique constraint violation"),
76
+ "23503": (ForeignKeyViolationError, "foreign key constraint violation"),
77
+ "23502": (NotNullViolationError, "not-null constraint violation"),
78
+ "23514": (CheckViolationError, "check constraint violation"),
79
+ }
80
+ _MYSQL_SQLSTATE_PREFIX_DISPATCH: dict[str, tuple[type[SQLSpecError], str]] = {
81
+ "23": (IntegrityError, "integrity constraint violation"),
82
+ "28": (PermissionDeniedError, "authorization error"),
83
+ "40": (TransactionError, "transaction error"),
84
+ "42": (SQLParsingError, "SQL syntax error"),
85
+ "08": (DatabaseConnectionError, "connection error"),
86
+ "22": (DataError, "data error"),
87
+ }
88
+ _MYSQL_CONSTRAINT_ERROR_DISPATCH: dict[int, tuple[type[SQLSpecError], str]] = {
89
+ MYSQL_ER_DUP_ENTRY: (UniqueViolationError, "unique constraint violation"),
90
+ 1216: (ForeignKeyViolationError, "foreign key constraint violation"),
91
+ 1217: (ForeignKeyViolationError, "foreign key constraint violation"),
92
+ 1451: (ForeignKeyViolationError, "foreign key constraint violation"),
93
+ 1452: (ForeignKeyViolationError, "foreign key constraint violation"),
94
+ 1048: (NotNullViolationError, "not-null constraint violation"),
95
+ MYSQL_ER_NO_DEFAULT_FOR_FIELD: (NotNullViolationError, "not-null constraint violation"),
96
+ MYSQL_ER_CHECK_CONSTRAINT_VIOLATED: (CheckViolationError, "check constraint violation"),
97
+ }
98
+ _MYSQL_ACCESS_ERROR_DISPATCH: dict[int, tuple[type[SQLSpecError], str]] = {
99
+ MYSQL_ER_DBACCESS_DENIED: (PermissionDeniedError, "access denied"),
100
+ MYSQL_ER_ACCESS_DENIED: (PermissionDeniedError, "access denied"),
101
+ MYSQL_ER_TABLEACCESS_DENIED: (PermissionDeniedError, "access denied"),
102
+ }
103
+ _MYSQL_TRANSACTION_ERROR_DISPATCH: dict[int, tuple[type[SQLSpecError], str]] = {
104
+ MYSQL_ER_LOCK_DEADLOCK: (DeadlockError, "deadlock detected"),
105
+ MYSQL_ER_LOCK_WAIT_TIMEOUT: (QueryTimeoutError, "lock wait timeout"),
106
+ }
107
+ _MYSQL_CONNECTION_ERROR_DISPATCH: dict[int, tuple[type[SQLSpecError], str]] = {
108
+ MYSQL_CR_SERVER_LOST: (ConnectionTimeoutError, "connection lost"),
109
+ MYSQL_CR_CONNECTION_ERROR: (DatabaseConnectionError, "connection error"),
110
+ MYSQL_CR_CONN_HOST_ERROR: (DatabaseConnectionError, "connection error"),
111
+ MYSQL_CR_UNKNOWN_HOST: (DatabaseConnectionError, "connection error"),
112
+ MYSQL_CR_SERVER_GONE_ERROR: (DatabaseConnectionError, "connection error"),
113
+ }
114
+
115
+
116
+ def _bool_to_int(value: bool) -> int:
117
+ return int(value)
118
+
119
+
120
+ def _quote_mysql_identifier(identifier: str) -> str:
121
+ normalized = identifier.replace("`", "``")
122
+ return f"`{normalized}`"
123
+
124
+
125
+ def format_identifier(identifier: str) -> str:
126
+ cleaned = identifier.strip()
127
+ if not cleaned:
128
+ msg = "Table name must not be empty"
129
+ raise SQLSpecError(msg)
130
+ parts = [part for part in cleaned.split(".") if part]
131
+ formatted = ".".join(_quote_mysql_identifier(part) for part in parts)
132
+ return formatted or _quote_mysql_identifier(cleaned)
133
+
134
+
135
+ def build_insert_statement(table: str, columns: "list[str]") -> str:
136
+ column_clause = ", ".join(_quote_mysql_identifier(column) for column in columns)
137
+ placeholders = ", ".join("%s" for _ in columns)
138
+ return f"INSERT INTO {format_identifier(table)} ({column_clause}) VALUES ({placeholders})"
139
+
140
+
141
+ def normalize_execute_parameters(parameters: Any) -> Any:
142
+ """Normalize parameters for aiomysql execute calls.
143
+
144
+ Args:
145
+ parameters: Prepared parameters payload.
146
+
147
+ Returns:
148
+ Normalized parameters payload.
149
+ """
150
+ return parameters or None
151
+
152
+
153
+ def normalize_execute_many_parameters(parameters: Any) -> Any:
154
+ """Normalize parameters for aiomysql executemany calls.
155
+
156
+ Args:
157
+ parameters: Prepared parameters payload.
158
+
159
+ Returns:
160
+ Normalized parameters payload.
161
+
162
+ Raises:
163
+ ValueError: When parameters are missing for executemany.
164
+ """
165
+ if not parameters:
166
+ msg = "execute_many requires parameters"
167
+ raise ValueError(msg)
168
+ return parameters
169
+
170
+
171
+ def build_profile() -> "DriverParameterProfile":
172
+ """Create the aiomysql driver parameter profile."""
173
+ coercions: dict[type, Callable[[Any], Any]] = {bool: _bool_to_int, **build_uuid_coercions()}
174
+ return DriverParameterProfile(
175
+ name="aiomysql",
176
+ default_style=ParameterStyle.QMARK,
177
+ supported_styles={ParameterStyle.QMARK},
178
+ default_execution_style=ParameterStyle.POSITIONAL_PYFORMAT,
179
+ supported_execution_styles={ParameterStyle.POSITIONAL_PYFORMAT},
180
+ has_native_list_expansion=False,
181
+ preserve_parameter_format=True,
182
+ needs_static_script_compilation=True,
183
+ allow_mixed_parameter_styles=False,
184
+ preserve_original_params_for_many=False,
185
+ json_serializer_strategy="helper",
186
+ custom_type_coercions=coercions,
187
+ default_dialect="mysql",
188
+ )
189
+
190
+
191
+ driver_profile = build_profile()
192
+
193
+
194
+ def build_statement_config(
195
+ *, json_serializer: "Callable[[Any], str] | None" = None, json_deserializer: "Callable[[str], Any] | None" = None
196
+ ) -> "StatementConfig":
197
+ """Construct the aiomysql statement configuration with optional JSON codecs."""
198
+ serializer = json_serializer or to_json
199
+ deserializer = json_deserializer or from_json
200
+ profile = driver_profile
201
+ return build_statement_config_from_profile(
202
+ profile, statement_overrides={"dialect": "mysql"}, json_serializer=serializer, json_deserializer=deserializer
203
+ )
204
+
205
+
206
+ default_statement_config = build_statement_config()
207
+
208
+
209
+ def apply_driver_features(
210
+ statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
211
+ ) -> "tuple[StatementConfig, dict[str, Any]]":
212
+ """Apply aiomysql driver feature defaults to statement config."""
213
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
214
+ json_serializer = features.setdefault("json_serializer", to_json)
215
+ json_deserializer = features.setdefault("json_deserializer", from_json)
216
+
217
+ if json_serializer is not None:
218
+ parameter_config = statement_config.parameter_config.with_json_serializers(
219
+ json_serializer, deserializer=json_deserializer
220
+ )
221
+ statement_config = statement_config.replace(parameter_config=parameter_config)
222
+
223
+ return statement_config, features
224
+
225
+
226
+ def _create_mysql_error(
227
+ error: Any, sqlstate: "str | None", code: "int | None", error_class: type[SQLSpecError], description: str
228
+ ) -> SQLSpecError:
229
+ """Create a MySQL error instance without raising it."""
230
+ code_str = f"[{sqlstate or code}]" if sqlstate or code else ""
231
+ msg = f"MySQL {description} {code_str}: {error}" if code_str else f"MySQL {description}: {error}"
232
+ exc = error_class(msg)
233
+ exc.__cause__ = error
234
+ return exc
235
+
236
+
237
+ def create_mapped_exception(error: Any, *, logger: Any | None = None) -> "SQLSpecError | bool":
238
+ """Map aiomysql exceptions to SQLSpec errors.
239
+
240
+ aiomysql re-exports PyMySQL's error hierarchy (pymysql.err.*), so MySQL
241
+ error codes and SQLSTATE values are identical to asyncmy — only the Python
242
+ exception class import paths differ.
243
+
244
+ Mapping priority:
245
+ 1. Specific error codes (most reliable for MySQL)
246
+ 2. SQLSTATE codes (where available)
247
+ 3. Generic error code ranges
248
+ 4. Default SQLSpecError fallback
249
+
250
+ Args:
251
+ error: The aiomysql/pymysql exception to map
252
+ logger: Optional logger for migration warnings
253
+
254
+ Returns:
255
+ True to suppress expected migration errors, or a SQLSpec exception
256
+ """
257
+ error_args = getattr(error, "args", ())
258
+ error_code = error_args[0] if error_args and isinstance(error_args[0], int) else None
259
+ sqlstate_attr = getattr(error, "sqlstate", None)
260
+ sqlstate = sqlstate_attr if isinstance(sqlstate_attr, str) else None
261
+ sqlstate_prefix = sqlstate[:2] if isinstance(sqlstate, str) and sqlstate else None
262
+
263
+ # Migration-specific errors to suppress
264
+ if error_code in _MYSQL_MIGRATION_ERROR_CODES:
265
+ if logger is not None:
266
+ logger.warning("aiomysql MySQL expected migration error (ignoring): %s", error)
267
+ return True
268
+
269
+ dispatch = _MYSQL_SQLSTATE_EXACT_DISPATCH.get(sqlstate) if sqlstate is not None else None
270
+ if dispatch is not None:
271
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
272
+
273
+ dispatch = _MYSQL_CONSTRAINT_ERROR_DISPATCH.get(error_code) if error_code is not None else None
274
+ if dispatch is not None:
275
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
276
+
277
+ if sqlstate_prefix == "23":
278
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["23"]
279
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
280
+
281
+ dispatch = _MYSQL_ACCESS_ERROR_DISPATCH.get(error_code) if error_code is not None else None
282
+ if dispatch is not None:
283
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
284
+ if sqlstate_prefix == "28":
285
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["28"]
286
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
287
+
288
+ dispatch = _MYSQL_TRANSACTION_ERROR_DISPATCH.get(error_code) if error_code is not None else None
289
+ if dispatch is not None:
290
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
291
+ if sqlstate_prefix == "40":
292
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["40"]
293
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
294
+
295
+ if sqlstate_prefix == "42":
296
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["42"]
297
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
298
+ if isinstance(error_code, int) and MYSQL_SYNTAX_ERROR_MIN <= error_code < MYSQL_SYNTAX_ERROR_MAX_EXCLUSIVE:
299
+ return _create_mysql_error(error, sqlstate, error_code, SQLParsingError, "SQL syntax error")
300
+
301
+ if sqlstate_prefix == "08":
302
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["08"]
303
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
304
+ dispatch = _MYSQL_CONNECTION_ERROR_DISPATCH.get(error_code) if error_code is not None else None
305
+ if dispatch is not None:
306
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
307
+
308
+ if sqlstate_prefix == "22":
309
+ dispatch = _MYSQL_SQLSTATE_PREFIX_DISPATCH["22"]
310
+ return _create_mysql_error(error, sqlstate, error_code, dispatch[0], dispatch[1])
311
+
312
+ return _create_mysql_error(error, sqlstate, error_code, SQLSpecError, "database error")
313
+
314
+
315
+ def resolve_column_names(description: "Sequence[Any] | None") -> "list[str]":
316
+ """Resolve ordered column names from cursor metadata."""
317
+ if not description:
318
+ return []
319
+ return [desc[0] for desc in description]
320
+
321
+
322
+ def detect_json_columns_from_description(
323
+ description: "Sequence[Any] | None", json_type_codes: "set[int]"
324
+ ) -> "list[int]":
325
+ """Identify JSON column indexes from pre-fetched cursor description metadata."""
326
+ if not description or not json_type_codes:
327
+ return []
328
+
329
+ json_indexes: list[int] = []
330
+ append = json_indexes.append
331
+ for index, column in enumerate(description):
332
+ if isinstance(column, (tuple, list)):
333
+ type_code = column[1] if len(column) > 1 else None
334
+ else:
335
+ type_code = getattr(column, "type_code", None)
336
+ if type_code in json_type_codes:
337
+ append(index)
338
+ return json_indexes
339
+
340
+
341
+ def detect_json_columns(
342
+ cursor: Any, json_type_codes: "set[int]", description: "Sequence[Any] | None" = None
343
+ ) -> "list[int]":
344
+ """Identify JSON column indexes from cursor metadata.
345
+
346
+ Args:
347
+ cursor: Database cursor with description metadata available.
348
+ json_type_codes: Set of type codes identifying JSON columns.
349
+ description: Optional pre-fetched cursor description metadata.
350
+
351
+ Returns:
352
+ List of index positions where JSON values are present.
353
+ """
354
+ if description is None:
355
+ if not has_cursor_metadata(cursor):
356
+ return []
357
+ description = cursor.description
358
+ return detect_json_columns_from_description(description, json_type_codes)
359
+
360
+
361
+ def _deserialize_json_dict_rows(
362
+ column_names: "list[str]",
363
+ rows: "list[dict[str, Any]]",
364
+ json_indexes: "list[int]",
365
+ deserializer: "Callable[[Any], Any]",
366
+ *,
367
+ logger: Any | None = None,
368
+ ) -> "list[dict[str, Any]]":
369
+ """Apply JSON deserialization to dict rows (DictCursor path).
370
+
371
+ Args:
372
+ column_names: Ordered column names from the cursor description.
373
+ rows: Result rows represented as dictionaries.
374
+ json_indexes: Column indexes to deserialize.
375
+ deserializer: Callable used to decode JSON values.
376
+ logger: Optional logger for debug output.
377
+
378
+ Returns:
379
+ Rows with JSON columns decoded when possible.
380
+ """
381
+ if not rows or not column_names or not json_indexes:
382
+ return rows
383
+
384
+ target_columns = [column_names[index] for index in json_indexes if index < len(column_names)]
385
+ if not target_columns:
386
+ return rows
387
+
388
+ for row in rows:
389
+ for column in target_columns:
390
+ if column not in row:
391
+ continue
392
+ raw_value = row[column]
393
+ if raw_value is None:
394
+ continue
395
+ if isinstance(raw_value, bytearray):
396
+ raw_value = bytes(raw_value)
397
+ if not isinstance(raw_value, (str, bytes)):
398
+ continue
399
+ try:
400
+ row[column] = deserializer(raw_value)
401
+ except Exception:
402
+ if logger is not None:
403
+ logger.debug("Failed to deserialize JSON column %s", column, exc_info=True)
404
+ return rows
405
+
406
+
407
+ def _deserialize_json_tuple_rows(
408
+ rows: "list[Any]", json_indexes: "list[int]", deserializer: "Callable[[Any], Any]", *, logger: Any | None = None
409
+ ) -> "list[Any]":
410
+ """Apply JSON deserialization to tuple rows using index-based access.
411
+
412
+ Args:
413
+ rows: Result rows as tuples.
414
+ json_indexes: Column indexes to deserialize.
415
+ deserializer: Callable used to decode JSON values.
416
+ logger: Optional logger for debug output.
417
+
418
+ Returns:
419
+ Rows with JSON columns decoded when possible.
420
+ """
421
+ if not rows or not json_indexes:
422
+ return rows
423
+
424
+ result: list[Any] = []
425
+ for row in rows:
426
+ row_list = list(row)
427
+ mutated = False
428
+ for idx in json_indexes:
429
+ if idx >= len(row_list):
430
+ continue
431
+ raw_value = row_list[idx]
432
+ if raw_value is None:
433
+ continue
434
+ if isinstance(raw_value, bytearray):
435
+ raw_value = bytes(raw_value)
436
+ if not isinstance(raw_value, (str, bytes)):
437
+ continue
438
+ try:
439
+ row_list[idx] = deserializer(raw_value)
440
+ mutated = True
441
+ except Exception:
442
+ if logger is not None:
443
+ logger.debug("Failed to deserialize JSON column index %d", idx, exc_info=True)
444
+ result.append(tuple(row_list) if mutated else row)
445
+ return result
446
+
447
+
448
+ def collect_rows(
449
+ fetched_data: "Sequence[Any] | None",
450
+ description: "Sequence[Any] | None",
451
+ json_indexes: "list[int]",
452
+ deserializer: "Callable[[Any], Any]",
453
+ *,
454
+ column_names: "list[str] | None" = None,
455
+ logger: Any | None = None,
456
+ ) -> "tuple[list[Any], list[str], str]":
457
+ """Collect aiomysql rows with JSON decoding, preserving raw format.
458
+
459
+ Args:
460
+ fetched_data: Rows returned from cursor.fetchall().
461
+ description: Cursor description metadata.
462
+ json_indexes: Column indexes containing JSON values.
463
+ deserializer: JSON deserializer function.
464
+ column_names: Optional precomputed ordered column names.
465
+ logger: Optional logger for debug output.
466
+
467
+ Returns:
468
+ Tuple of (rows, column_names, row_format).
469
+ """
470
+ if not description:
471
+ return [], [], "tuple"
472
+ resolved_column_names = resolve_column_names(description) if column_names is None else column_names
473
+ if not fetched_data:
474
+ return [], resolved_column_names, "tuple"
475
+
476
+ first_row = fetched_data[0]
477
+ if isinstance(first_row, dict):
478
+ if not json_indexes:
479
+ rows = fetched_data if isinstance(fetched_data, list) else list(fetched_data)
480
+ return rows, resolved_column_names, "dict"
481
+ rows = [dict(row) for row in fetched_data]
482
+ rows = _deserialize_json_dict_rows(resolved_column_names, rows, json_indexes, deserializer, logger=logger)
483
+ return rows, resolved_column_names, "dict"
484
+ rows = fetched_data if isinstance(fetched_data, list) else list(fetched_data)
485
+ if json_indexes:
486
+ rows = _deserialize_json_tuple_rows(rows, json_indexes, deserializer, logger=logger)
487
+ return rows, resolved_column_names, "tuple"
488
+
489
+
490
+ def resolve_rowcount(cursor: Any) -> int:
491
+ """Resolve rowcount from an aiomysql cursor.
492
+
493
+ Args:
494
+ cursor: aiomysql cursor with optional rowcount metadata.
495
+
496
+ Returns:
497
+ Rowcount value or 0 when unknown.
498
+ """
499
+ if not has_rowcount(cursor):
500
+ return 0
501
+ rowcount = cursor.rowcount
502
+ if isinstance(rowcount, int) and rowcount >= 0:
503
+ return rowcount
504
+ return 0
505
+
506
+
507
+ def resolve_many_rowcount(cursor: Any, parameters: Any, *, fallback_count: "int | None" = None) -> int:
508
+ """Resolve execute_many rowcount using cursor metadata with payload fallback."""
509
+ rowcount = resolve_rowcount(cursor)
510
+ if rowcount > 0:
511
+ return rowcount
512
+ if fallback_count is not None:
513
+ return fallback_count
514
+ if isinstance(parameters, Sized):
515
+ return len(parameters)
516
+ return 0
517
+
518
+
519
+ def normalize_lastrowid(cursor: Any) -> int | None:
520
+ """Normalize lastrowid for aiomysql when rowcount indicates success.
521
+
522
+ Args:
523
+ cursor: aiomysql cursor with optional lastrowid metadata.
524
+
525
+ Returns:
526
+ Last inserted id or None when unavailable.
527
+ """
528
+ if not has_rowcount(cursor):
529
+ return None
530
+ rowcount = cursor.rowcount
531
+ if not isinstance(rowcount, int) or rowcount <= 0:
532
+ return None
533
+ if not has_lastrowid(cursor):
534
+ return None
535
+ last_id = cursor.lastrowid
536
+ return last_id if isinstance(last_id, int) else None
@@ -0,0 +1,121 @@
1
+ """MySQL-specific data dictionary for metadata queries via aiomysql."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from mypy_extensions import mypyc_attr
6
+
7
+ from sqlspec.data_dictionary.dialects.mysql import resolve_mysql_json_type
8
+ from sqlspec.driver import AsyncDataDictionaryBase
9
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
10
+
11
+ if TYPE_CHECKING:
12
+ from sqlspec.adapters.aiomysql.driver import AiomysqlDriver
13
+
14
+ __all__ = ("AiomysqlDataDictionary",)
15
+
16
+
17
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
18
+ class AiomysqlDataDictionary(AsyncDataDictionaryBase):
19
+ """MySQL-specific async data dictionary."""
20
+
21
+ dialect: ClassVar[str] = "mysql"
22
+
23
+ def __init__(self) -> None:
24
+ super().__init__()
25
+
26
+ async def get_version(self, driver: "AiomysqlDriver") -> "VersionInfo | None":
27
+ """Get MySQL database version information."""
28
+ driver_id = id(driver)
29
+ # Inline cache check to avoid cross-module method call that causes mypyc segfault
30
+ if driver_id in self._version_fetch_attempted:
31
+ return self._version_cache.get(driver_id)
32
+
33
+ version_value = await 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
+ async def get_feature_flag(self, driver: "AiomysqlDriver", feature: str) -> bool:
50
+ """Check if MySQL database supports a specific feature."""
51
+ version_info = await self.get_version(driver)
52
+ return self.resolve_feature_flag(feature, version_info)
53
+
54
+ async def get_optimal_type(self, driver: "AiomysqlDriver", type_category: str) -> str:
55
+ """Get optimal MySQL type for a category."""
56
+ config = self.get_dialect_config()
57
+ version_info = await self.get_version(driver)
58
+
59
+ if type_category == "json":
60
+ return resolve_mysql_json_type(version_info)
61
+
62
+ return config.get_optimal_type(type_category)
63
+
64
+ async def get_tables(self, driver: "AiomysqlDriver", schema: "str | None" = None) -> "list[TableMetadata]":
65
+ """Get tables sorted by topological dependency order using the MySQL catalog."""
66
+ schema_name = self.resolve_schema(schema)
67
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
68
+ return await driver.select(
69
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
70
+ )
71
+
72
+ async def get_columns(
73
+ self, driver: "AiomysqlDriver", table: "str | None" = None, schema: "str | None" = None
74
+ ) -> "list[ColumnMetadata]":
75
+ """Get column information for a table or schema."""
76
+ schema_name = self.resolve_schema(schema)
77
+ if table is None:
78
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
79
+ return await driver.select(
80
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
81
+ )
82
+
83
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
84
+ return await driver.select(
85
+ self.get_query("columns_by_table"), table_name=table, schema_name=schema_name, schema_type=ColumnMetadata
86
+ )
87
+
88
+ async def get_indexes(
89
+ self, driver: "AiomysqlDriver", table: "str | None" = None, schema: "str | None" = None
90
+ ) -> "list[IndexMetadata]":
91
+ """Get index metadata for a table or schema."""
92
+ schema_name = self.resolve_schema(schema)
93
+ if table is None:
94
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
95
+ return await driver.select(
96
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
97
+ )
98
+
99
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
100
+ return await driver.select(
101
+ self.get_query("indexes_by_table"), table_name=table, schema_name=schema_name, schema_type=IndexMetadata
102
+ )
103
+
104
+ async def get_foreign_keys(
105
+ self, driver: "AiomysqlDriver", table: "str | None" = None, schema: "str | None" = None
106
+ ) -> "list[ForeignKeyMetadata]":
107
+ """Get foreign key metadata."""
108
+ schema_name = self.resolve_schema(schema)
109
+ if table is None:
110
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
111
+ return await driver.select(
112
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
113
+ )
114
+
115
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
116
+ return await driver.select(
117
+ self.get_query("foreign_keys_by_table"),
118
+ table_name=table,
119
+ schema_name=schema_name,
120
+ schema_type=ForeignKeyMetadata,
121
+ )