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,121 @@
1
+ """PostgreSQL-specific data dictionary for metadata queries via psqlpy."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from mypy_extensions import mypyc_attr
6
+
7
+ from sqlspec.data_dictionary.dialects.postgres import resolve_postgres_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.psqlpy.driver import PsqlpyDriver
13
+
14
+ __all__ = ("PsqlpyDataDictionary",)
15
+
16
+
17
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
18
+ class PsqlpyDataDictionary(AsyncDataDictionaryBase):
19
+ """PostgreSQL-specific async data dictionary via psqlpy."""
20
+
21
+ dialect: ClassVar[str] = "postgres"
22
+
23
+ def __init__(self) -> None:
24
+ super().__init__()
25
+
26
+ async def get_version(self, driver: "PsqlpyDriver") -> "VersionInfo | None":
27
+ """Get PostgreSQL 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
+ # Not cached, fetch from database
33
+
34
+ version_value = await driver.select_value(self.get_query("version"))
35
+ if not version_value:
36
+ self._log_version_unavailable(type(self).dialect, "missing")
37
+ self.cache_version(driver_id, None)
38
+ return None
39
+
40
+ version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
41
+ if version_info is None:
42
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
43
+ self.cache_version(driver_id, None)
44
+ return None
45
+
46
+ self._log_version_detected(type(self).dialect, version_info)
47
+ self.cache_version(driver_id, version_info)
48
+ return version_info
49
+
50
+ async def get_feature_flag(self, driver: "PsqlpyDriver", feature: str) -> bool:
51
+ """Check if PostgreSQL database supports a specific feature."""
52
+ version_info = await self.get_version(driver)
53
+ return self.resolve_feature_flag(feature, version_info)
54
+
55
+ async def get_optimal_type(self, driver: "PsqlpyDriver", type_category: str) -> str:
56
+ """Get optimal PostgreSQL type for a category."""
57
+ config = self.get_dialect_config()
58
+ version_info = await self.get_version(driver)
59
+
60
+ if type_category == "json":
61
+ return resolve_postgres_json_type(version_info)
62
+
63
+ return config.get_optimal_type(type_category)
64
+
65
+ async def get_tables(self, driver: "PsqlpyDriver", schema: "str | None" = None) -> "list[TableMetadata]":
66
+ """Get tables sorted by topological dependency order using Recursive CTE."""
67
+ schema_name = self.resolve_schema(schema)
68
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
69
+ return await driver.select(
70
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
71
+ )
72
+
73
+ async def get_columns(
74
+ self, driver: "PsqlpyDriver", 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 await 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 await driver.select(
86
+ self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
87
+ )
88
+
89
+ async def get_indexes(
90
+ self, driver: "PsqlpyDriver", 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 await 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 await driver.select(
102
+ self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
103
+ )
104
+
105
+ async def get_foreign_keys(
106
+ self, driver: "PsqlpyDriver", 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 await driver.select(
113
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
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
+ schema_name=schema_name,
119
+ table_name=table,
120
+ schema_type=ForeignKeyMetadata,
121
+ )
@@ -0,0 +1,411 @@
1
+ """Psqlpy driver implementation for PostgreSQL connectivity.
2
+
3
+ Provides parameter style conversion, type coercion, error handling,
4
+ and transaction management.
5
+ """
6
+
7
+ import inspect
8
+ from typing import TYPE_CHECKING, Any, cast
9
+
10
+ import psqlpy.exceptions
11
+
12
+ from sqlspec.adapters.psqlpy._typing import PsqlpyCursor, PsqlpySessionContext
13
+ from sqlspec.adapters.psqlpy.core import (
14
+ build_insert_statement,
15
+ coerce_numeric_for_write,
16
+ coerce_records_for_execute_many,
17
+ collect_rows,
18
+ create_mapped_exception,
19
+ default_statement_config,
20
+ driver_profile,
21
+ encode_records_for_binary_copy,
22
+ extract_rows_affected,
23
+ format_execute_many_parameters,
24
+ format_table_identifier,
25
+ get_parameter_casts,
26
+ normalize_scalar_parameter,
27
+ prepare_parameters_with_casts,
28
+ split_schema_and_table,
29
+ )
30
+ from sqlspec.adapters.psqlpy.data_dictionary import PsqlpyDataDictionary
31
+ from sqlspec.adapters.psqlpy.type_converter import PostgreSQLOutputConverter
32
+ from sqlspec.core import SQL, StatementConfig, get_cache_config, register_driver_profile
33
+ from sqlspec.driver import AsyncDriverAdapterBase, BaseAsyncExceptionHandler
34
+ from sqlspec.exceptions import SQLSpecError
35
+ from sqlspec.utils.logging import get_logger
36
+
37
+ if TYPE_CHECKING:
38
+ from collections.abc import Mapping, Sequence
39
+
40
+ from sqlspec.adapters.psqlpy._typing import PsqlpyConnection
41
+ from sqlspec.core import ArrowResult
42
+ from sqlspec.driver import ExecutionResult
43
+ from sqlspec.storage import StorageBridgeJob, StorageDestination, StorageFormat, StorageTelemetry
44
+
45
+ __all__ = ("PsqlpyCursor", "PsqlpyDriver", "PsqlpyExceptionHandler", "PsqlpySessionContext")
46
+
47
+ logger = get_logger("sqlspec.adapters.psqlpy")
48
+
49
+ _type_converter = PostgreSQLOutputConverter()
50
+
51
+
52
+ class PsqlpyExceptionHandler(BaseAsyncExceptionHandler):
53
+ """Async context manager for handling psqlpy database exceptions.
54
+
55
+ Maps PostgreSQL SQLSTATE error codes to specific SQLSpec exceptions
56
+ for better error handling in application code.
57
+
58
+ Uses deferred exception pattern for mypyc compatibility: exceptions
59
+ are stored in pending_exception rather than raised from __aexit__
60
+ to avoid ABI boundary violations with compiled code.
61
+ """
62
+
63
+ __slots__ = ()
64
+
65
+ def _handle_exception(self, exc_type: "type[BaseException] | None", exc_val: "BaseException") -> bool:
66
+ if exc_type is None:
67
+ return False
68
+ if issubclass(exc_type, (psqlpy.exceptions.DatabaseError, psqlpy.exceptions.Error)):
69
+ self.pending_exception = create_mapped_exception(exc_val)
70
+ return True
71
+ return False
72
+
73
+
74
+ class PsqlpyDriver(AsyncDriverAdapterBase):
75
+ """PostgreSQL driver implementation using psqlpy.
76
+
77
+ Provides parameter style conversion, type coercion, error handling,
78
+ and transaction management.
79
+ """
80
+
81
+ __slots__ = ("_data_dictionary",)
82
+ dialect = "postgres"
83
+
84
+ def __init__(
85
+ self,
86
+ connection: "PsqlpyConnection",
87
+ statement_config: "StatementConfig | None" = None,
88
+ driver_features: "dict[str, Any] | None" = None,
89
+ ) -> None:
90
+ if statement_config is None:
91
+ statement_config = default_statement_config.replace(
92
+ enable_caching=get_cache_config().compiled_cache_enabled
93
+ )
94
+
95
+ super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
96
+ self._data_dictionary: PsqlpyDataDictionary | None = None
97
+
98
+ # ─────────────────────────────────────────────────────────────────────────────
99
+ # CORE DISPATCH METHODS
100
+ # ─────────────────────────────────────────────────────────────────────────────
101
+
102
+ async def dispatch_execute(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
103
+ """Execute single SQL statement.
104
+
105
+ Args:
106
+ cursor: Psqlpy connection object
107
+ statement: SQL statement to execute
108
+
109
+ Returns:
110
+ ExecutionResult with execution metadata
111
+ """
112
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
113
+
114
+ driver_parameters = prepared_parameters
115
+ operation_type = statement.operation_type
116
+ should_coerce = operation_type != "SELECT"
117
+ effective_parameters = coerce_numeric_for_write(driver_parameters) if should_coerce else driver_parameters
118
+ params = cast("Sequence[Any] | Mapping[str, Any] | None", effective_parameters) or []
119
+
120
+ if statement.returns_rows():
121
+ query_result = await cursor.fetch(sql, params)
122
+ dict_rows, column_names = collect_rows(query_result)
123
+
124
+ return self.create_execution_result(
125
+ cursor,
126
+ selected_data=dict_rows,
127
+ column_names=column_names,
128
+ data_row_count=len(dict_rows),
129
+ is_select_result=True,
130
+ row_format="dict",
131
+ )
132
+
133
+ result = await cursor.execute(sql, params)
134
+ rows_affected = extract_rows_affected(result)
135
+
136
+ return self.create_execution_result(cursor, rowcount_override=rows_affected)
137
+
138
+ async def dispatch_execute_many(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
139
+ """Execute SQL with multiple parameter sets.
140
+
141
+ Args:
142
+ cursor: Psqlpy connection object
143
+ statement: SQL statement with multiple parameter sets
144
+
145
+ Returns:
146
+ ExecutionResult with batch execution metadata
147
+ """
148
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
149
+
150
+ if not prepared_parameters:
151
+ return self.create_execution_result(cursor, rowcount_override=0, is_many_result=True)
152
+
153
+ operation_type = statement.operation_type
154
+ should_coerce = operation_type != "SELECT"
155
+ formatted_parameters = format_execute_many_parameters(prepared_parameters, coerce_numeric=should_coerce)
156
+
157
+ await cursor.execute_many(sql, formatted_parameters)
158
+
159
+ rows_affected = len(formatted_parameters)
160
+
161
+ return self.create_execution_result(cursor, rowcount_override=rows_affected, is_many_result=True)
162
+
163
+ async def dispatch_execute_script(self, cursor: "PsqlpyConnection", statement: SQL) -> "ExecutionResult":
164
+ """Execute SQL script with statement splitting.
165
+
166
+ Args:
167
+ cursor: Psqlpy connection object
168
+ statement: SQL statement with script content
169
+
170
+ Returns:
171
+ ExecutionResult with script execution metadata
172
+
173
+ Notes:
174
+ Uses execute() with empty parameters for each statement instead of execute_batch().
175
+ execute_batch() uses simple query protocol which can break subsequent queries
176
+ that rely on extended protocol (e.g., information_schema queries with name type).
177
+ """
178
+ sql, prepared_parameters = self._get_compiled_sql(statement, self.statement_config)
179
+ prepared_parameters = cast("Sequence[Any] | Mapping[str, Any] | None", prepared_parameters)
180
+ statement_config = statement.statement_config
181
+ statements = self.split_script_statements(sql, statement_config, strip_trailing_semicolon=True)
182
+
183
+ successful_count = 0
184
+ last_result = None
185
+
186
+ for stmt in statements:
187
+ last_result = await cursor.execute(stmt, prepared_parameters or [])
188
+ successful_count += 1
189
+
190
+ return self.create_execution_result(
191
+ last_result, statement_count=len(statements), successful_statements=successful_count, is_script_result=True
192
+ )
193
+
194
+ # ─────────────────────────────────────────────────────────────────────────────
195
+ # TRANSACTION MANAGEMENT
196
+ # ─────────────────────────────────────────────────────────────────────────────
197
+
198
+ async def begin(self) -> None:
199
+ """Begin a database transaction."""
200
+ try:
201
+ await self.connection.execute("BEGIN")
202
+ except psqlpy.exceptions.DatabaseError as e:
203
+ msg = f"Failed to begin psqlpy transaction: {e}"
204
+ raise SQLSpecError(msg) from e
205
+
206
+ async def commit(self) -> None:
207
+ """Commit the current transaction."""
208
+ try:
209
+ await self.connection.execute("COMMIT")
210
+ except psqlpy.exceptions.DatabaseError as e:
211
+ msg = f"Failed to commit psqlpy transaction: {e}"
212
+ raise SQLSpecError(msg) from e
213
+
214
+ async def rollback(self) -> None:
215
+ """Rollback the current transaction."""
216
+ try:
217
+ await self.connection.execute("ROLLBACK")
218
+ except psqlpy.exceptions.DatabaseError as e:
219
+ msg = f"Failed to rollback psqlpy transaction: {e}"
220
+ raise SQLSpecError(msg) from e
221
+
222
+ def with_cursor(self, connection: "PsqlpyConnection") -> "PsqlpyCursor":
223
+ """Create context manager for psqlpy cursor.
224
+
225
+ Args:
226
+ connection: Psqlpy connection object
227
+
228
+ Returns:
229
+ PsqlpyCursor context manager
230
+ """
231
+ return PsqlpyCursor(connection)
232
+
233
+ def handle_database_exceptions(self) -> "PsqlpyExceptionHandler":
234
+ """Handle database-specific exceptions.
235
+
236
+ Returns:
237
+ Exception handler context manager
238
+ """
239
+ return PsqlpyExceptionHandler()
240
+
241
+ # ─────────────────────────────────────────────────────────────────────────────
242
+ # STORAGE API METHODS
243
+ # ─────────────────────────────────────────────────────────────────────────────
244
+
245
+ async def select_to_storage(
246
+ self,
247
+ statement: "SQL | str",
248
+ destination: "StorageDestination",
249
+ /,
250
+ *parameters: Any,
251
+ statement_config: "StatementConfig | None" = None,
252
+ partitioner: "dict[str, object] | None" = None,
253
+ format_hint: "StorageFormat | None" = None,
254
+ telemetry: "StorageTelemetry | None" = None,
255
+ **kwargs: Any,
256
+ ) -> "StorageBridgeJob":
257
+ """Execute a query and stream Arrow results to a storage backend."""
258
+
259
+ self._require_capability("arrow_export_enabled")
260
+ arrow_result = await self.select_to_arrow(statement, *parameters, statement_config=statement_config, **kwargs)
261
+ async_pipeline = self._storage_pipeline()
262
+ telemetry_payload = await self._write_result_to_storage_async(
263
+ arrow_result, destination, format_hint=format_hint, pipeline=async_pipeline
264
+ )
265
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
266
+ return self._create_storage_job(telemetry_payload, telemetry)
267
+
268
+ async def load_from_arrow(
269
+ self,
270
+ table: str,
271
+ source: "ArrowResult | Any",
272
+ *,
273
+ partitioner: "dict[str, object] | None" = None,
274
+ overwrite: bool = False,
275
+ telemetry: "StorageTelemetry | None" = None,
276
+ ) -> "StorageBridgeJob":
277
+ """Load Arrow-formatted data into PostgreSQL via psqlpy binary COPY."""
278
+
279
+ self._require_capability("arrow_import_enabled")
280
+ arrow_table = self._coerce_arrow_table(source)
281
+ if overwrite:
282
+ qualified = format_table_identifier(table)
283
+ exc_handler = self.handle_database_exceptions()
284
+ async with exc_handler, self.with_cursor(self.connection) as cursor:
285
+ await cursor.execute(f"TRUNCATE TABLE {qualified}")
286
+ if exc_handler.pending_exception is not None:
287
+ raise exc_handler.pending_exception from None
288
+
289
+ columns, records = self._arrow_table_to_rows(arrow_table)
290
+ if records:
291
+ schema_name, table_name = split_schema_and_table(table)
292
+ exc_handler = self.handle_database_exceptions()
293
+ async with exc_handler, self.with_cursor(self.connection) as cursor:
294
+ copy_kwargs: dict[str, Any] = {"columns": columns}
295
+ if schema_name:
296
+ copy_kwargs["schema_name"] = schema_name
297
+ try:
298
+ copy_payload = encode_records_for_binary_copy(records)
299
+ copy_operation = cursor.binary_copy_to_table(copy_payload, table_name, **copy_kwargs)
300
+ if inspect.isawaitable(copy_operation):
301
+ await copy_operation
302
+ except (TypeError, psqlpy.exceptions.DatabaseError) as exc:
303
+ logger.debug("Binary COPY not available for psqlpy; falling back to INSERT statements: %s", exc)
304
+ insert_sql = build_insert_statement(table, columns)
305
+ formatted_records = coerce_records_for_execute_many(records)
306
+ try:
307
+ insert_operation = cursor.execute_many(insert_sql, formatted_records)
308
+ if inspect.isawaitable(insert_operation):
309
+ await insert_operation
310
+ except (psqlpy.exceptions.DatabaseError, psqlpy.exceptions.Error) as fallback_exc:
311
+ if "PyJSON must be dict, list, or tuple" not in str(fallback_exc):
312
+ raise
313
+ formatted_records = coerce_records_for_execute_many(records, parse_json_text=True)
314
+ insert_operation = cursor.execute_many(insert_sql, formatted_records)
315
+ if inspect.isawaitable(insert_operation):
316
+ await insert_operation
317
+ if exc_handler.pending_exception is not None:
318
+ raise exc_handler.pending_exception from None
319
+
320
+ telemetry_payload = self._build_ingest_telemetry(arrow_table)
321
+ telemetry_payload["destination"] = table
322
+ self._attach_partition_telemetry(telemetry_payload, partitioner)
323
+ return self._create_storage_job(telemetry_payload, telemetry)
324
+
325
+ async def load_from_storage(
326
+ self,
327
+ table: str,
328
+ source: "StorageDestination",
329
+ *,
330
+ file_format: "StorageFormat",
331
+ partitioner: "dict[str, object] | None" = None,
332
+ overwrite: bool = False,
333
+ ) -> "StorageBridgeJob":
334
+ """Load staged artifacts from storage using the storage bridge pipeline."""
335
+
336
+ arrow_table, inbound = await self._read_arrow_from_storage_async(source, file_format=file_format)
337
+ return await self.load_from_arrow(
338
+ table, arrow_table, partitioner=partitioner, overwrite=overwrite, telemetry=inbound
339
+ )
340
+
341
+ # ─────────────────────────────────────────────────────────────────────────────
342
+ # UTILITY METHODS
343
+ # ─────────────────────────────────────────────────────────────────────────────
344
+
345
+ def prepare_driver_parameters(
346
+ self,
347
+ parameters: Any,
348
+ statement_config: "StatementConfig",
349
+ is_many: bool = False,
350
+ prepared_statement: Any | None = None,
351
+ ) -> Any:
352
+ """Prepare parameters with cast-aware type coercion for psqlpy.
353
+
354
+ Args:
355
+ parameters: Parameters in any format
356
+ statement_config: Statement configuration
357
+ is_many: Whether this is for execute_many operation
358
+ prepared_statement: Prepared statement containing the original SQL statement
359
+
360
+ Returns:
361
+ Parameters with cast-aware type coercion applied
362
+ """
363
+ enable_cast_detection = self.driver_features.get("enable_cast_detection", True)
364
+
365
+ if enable_cast_detection and prepared_statement and self.dialect in {"postgres", "postgresql"} and not is_many:
366
+ parameter_casts = get_parameter_casts(prepared_statement)
367
+ prepared = prepare_parameters_with_casts(parameters, parameter_casts, statement_config)
368
+ else:
369
+ prepared = super().prepare_driver_parameters(parameters, statement_config, is_many, prepared_statement)
370
+
371
+ if not is_many and isinstance(prepared, list):
372
+ prepared = tuple(prepared)
373
+
374
+ if not is_many and isinstance(prepared, tuple):
375
+ return tuple(normalize_scalar_parameter(item) for item in prepared)
376
+
377
+ return prepared
378
+
379
+ @property
380
+ def data_dictionary(self) -> "PsqlpyDataDictionary":
381
+ """Get the data dictionary for this driver.
382
+
383
+ Returns:
384
+ Data dictionary instance for metadata queries
385
+ """
386
+ if self._data_dictionary is None:
387
+ self._data_dictionary = PsqlpyDataDictionary()
388
+ return self._data_dictionary
389
+
390
+ # ─────────────────────────────────────────────────────────────────────────────
391
+ # PRIVATE/INTERNAL METHODS
392
+ # ─────────────────────────────────────────────────────────────────────────────
393
+
394
+ def collect_rows(self, cursor: "PsqlpyConnection", fetched: "list[Any]") -> "tuple[list[Any], list[str], int]":
395
+ """Collect psqlpy rows for the direct execution path.
396
+
397
+ The ``fetched`` argument may be a psqlpy query result or a plain list.
398
+ """
399
+ dict_rows, column_names = collect_rows(fetched)
400
+ return dict_rows, column_names, len(dict_rows)
401
+
402
+ def resolve_rowcount(self, cursor: "PsqlpyConnection") -> int:
403
+ """Resolve rowcount from psqlpy result for the direct execution path."""
404
+ return extract_rows_affected(cursor)
405
+
406
+ def _connection_in_transaction(self) -> bool:
407
+ """Check if connection is in transaction."""
408
+ return bool(self.connection.in_transaction())
409
+
410
+
411
+ register_driver_profile("psqlpy", driver_profile)
@@ -0,0 +1,6 @@
1
+ """Events helpers for the psqlpy adapter."""
2
+
3
+ from sqlspec.adapters.psqlpy.events.backend import PsqlpyEventsBackend, PsqlpyHybridEventsBackend, create_event_backend
4
+ from sqlspec.adapters.psqlpy.events.store import PsqlpyEventQueueStore
5
+
6
+ __all__ = ("PsqlpyEventQueueStore", "PsqlpyEventsBackend", "PsqlpyHybridEventsBackend", "create_event_backend")