sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,367 @@
1
+ """AsyncPG adapter compiled helpers."""
2
+
3
+ import datetime
4
+ import importlib
5
+ import re
6
+ from typing import TYPE_CHECKING, Any, Final, NamedTuple
7
+
8
+ import asyncpg
9
+
10
+ from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
11
+ from sqlspec.exceptions import (
12
+ CheckViolationError,
13
+ DatabaseConnectionError,
14
+ DataError,
15
+ ForeignKeyViolationError,
16
+ IntegrityError,
17
+ NotNullViolationError,
18
+ OperationalError,
19
+ SQLParsingError,
20
+ SQLSpecError,
21
+ TransactionError,
22
+ UniqueViolationError,
23
+ )
24
+ from sqlspec.typing import PGVECTOR_INSTALLED
25
+ from sqlspec.utils.logging import get_logger
26
+ from sqlspec.utils.serializers import from_json, to_json
27
+ from sqlspec.utils.type_guards import has_sqlstate
28
+
29
+ if TYPE_CHECKING:
30
+ from collections.abc import Callable, Mapping
31
+
32
+ from sqlspec.core import SQL, ParameterStyleConfig, StackOperation
33
+
34
+ __all__ = (
35
+ "NormalizedStackOperation",
36
+ "apply_driver_features",
37
+ "build_connection_config",
38
+ "build_profile",
39
+ "build_statement_config",
40
+ "collect_rows",
41
+ "configure_parameter_serializers",
42
+ "create_mapped_exception",
43
+ "default_statement_config",
44
+ "driver_profile",
45
+ "invoke_prepared_statement",
46
+ "parse_status",
47
+ "register_json_codecs",
48
+ "register_pgvector_support",
49
+ )
50
+
51
+ ASYNC_PG_STATUS_REGEX: "re.Pattern[str]" = re.compile(r"^([A-Z]+)(?:\s+(\d+))?\s+(\d+)$", re.IGNORECASE)
52
+ EXPECTED_REGEX_GROUPS = 3
53
+
54
+ logger = get_logger("sqlspec.adapters.asyncpg.core")
55
+ _PGVECTOR_MISSING_LOGGED = False
56
+
57
+
58
+ class NormalizedStackOperation(NamedTuple):
59
+ """Normalized execution metadata used for prepared stack operations."""
60
+
61
+ operation: "StackOperation"
62
+ statement: "SQL"
63
+ sql: str
64
+ parameters: "tuple[Any, ...] | dict[str, Any] | None"
65
+
66
+
67
+ PREPARED_STATEMENT_CACHE_SIZE: Final[int] = 32
68
+
69
+
70
+ def _convert_datetime_param(value: Any) -> Any:
71
+ """Convert datetime parameter, handling ISO strings."""
72
+
73
+ if isinstance(value, str):
74
+ return datetime.datetime.fromisoformat(value)
75
+ return value
76
+
77
+
78
+ def _convert_date_param(value: Any) -> Any:
79
+ """Convert date parameter, handling ISO strings."""
80
+
81
+ if isinstance(value, str):
82
+ return datetime.date.fromisoformat(value)
83
+ return value
84
+
85
+
86
+ def _convert_time_param(value: Any) -> Any:
87
+ """Convert time parameter, handling ISO strings."""
88
+
89
+ if isinstance(value, str):
90
+ return datetime.time.fromisoformat(value)
91
+ return value
92
+
93
+
94
+ def _build_asyncpg_custom_type_coercions() -> "dict[type, Callable[[Any], Any]]":
95
+ """Return custom type coercions for AsyncPG."""
96
+
97
+ return {
98
+ datetime.datetime: _convert_datetime_param,
99
+ datetime.date: _convert_date_param,
100
+ datetime.time: _convert_time_param,
101
+ }
102
+
103
+
104
+ def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str, Any]":
105
+ """Build connection configuration with non-null values only.
106
+
107
+ Args:
108
+ connection_config: Raw connection configuration mapping.
109
+
110
+ Returns:
111
+ Dictionary with connection parameters.
112
+ """
113
+ return {key: value for key, value in connection_config.items() if value is not None}
114
+
115
+
116
+ def build_profile() -> "DriverParameterProfile":
117
+ """Create the AsyncPG driver parameter profile."""
118
+
119
+ return DriverParameterProfile(
120
+ name="AsyncPG",
121
+ default_style=ParameterStyle.NUMERIC,
122
+ supported_styles={ParameterStyle.NUMERIC, ParameterStyle.POSITIONAL_PYFORMAT},
123
+ default_execution_style=ParameterStyle.NUMERIC,
124
+ supported_execution_styles={ParameterStyle.NUMERIC},
125
+ has_native_list_expansion=True,
126
+ preserve_parameter_format=True,
127
+ needs_static_script_compilation=False,
128
+ allow_mixed_parameter_styles=False,
129
+ preserve_original_params_for_many=False,
130
+ json_serializer_strategy="driver",
131
+ custom_type_coercions=_build_asyncpg_custom_type_coercions(),
132
+ default_dialect="postgres",
133
+ )
134
+
135
+
136
+ driver_profile = build_profile()
137
+
138
+
139
+ def configure_parameter_serializers(
140
+ parameter_config: "ParameterStyleConfig",
141
+ serializer: "Callable[[Any], str]",
142
+ *,
143
+ deserializer: "Callable[[str], Any] | None" = None,
144
+ ) -> "ParameterStyleConfig":
145
+ """Return a parameter configuration updated with AsyncPG JSON codecs."""
146
+
147
+ effective_deserializer = deserializer or parameter_config.json_deserializer or from_json
148
+ return parameter_config.replace(json_serializer=serializer, json_deserializer=effective_deserializer)
149
+
150
+
151
+ async def invoke_prepared_statement(
152
+ prepared: Any, parameters: "tuple[Any, ...] | dict[str, Any] | list[Any] | None", *, fetch: bool
153
+ ) -> Any:
154
+ """Invoke an AsyncPG prepared statement with optional parameters.
155
+
156
+ Args:
157
+ prepared: AsyncPG prepared statement object.
158
+ parameters: Prepared parameters payload.
159
+ fetch: Whether to fetch rows.
160
+
161
+ Returns:
162
+ Query result or status message.
163
+ """
164
+ if parameters is None:
165
+ if fetch:
166
+ return await prepared.fetch()
167
+ await prepared.fetch()
168
+ return prepared.get_statusmsg()
169
+
170
+ if isinstance(parameters, dict):
171
+ if fetch:
172
+ return await prepared.fetch(**parameters)
173
+ await prepared.fetch(**parameters)
174
+ return prepared.get_statusmsg()
175
+
176
+ if fetch:
177
+ return await prepared.fetch(*parameters)
178
+ await prepared.fetch(*parameters)
179
+ return prepared.get_statusmsg()
180
+
181
+
182
+ def build_statement_config(
183
+ *, json_serializer: "Callable[[Any], str] | None" = None, json_deserializer: "Callable[[str], Any] | None" = None
184
+ ) -> "StatementConfig":
185
+ """Construct the AsyncPG statement configuration with optional JSON codecs."""
186
+
187
+ effective_serializer = json_serializer or to_json
188
+ effective_deserializer = json_deserializer or from_json
189
+
190
+ profile = driver_profile
191
+ base_config = build_statement_config_from_profile(
192
+ profile,
193
+ statement_overrides={"dialect": "postgres"},
194
+ json_serializer=effective_serializer,
195
+ json_deserializer=effective_deserializer,
196
+ )
197
+
198
+ parameter_config = configure_parameter_serializers(
199
+ base_config.parameter_config, effective_serializer, deserializer=effective_deserializer
200
+ )
201
+
202
+ return base_config.replace(parameter_config=parameter_config)
203
+
204
+
205
+ default_statement_config = build_statement_config()
206
+
207
+
208
+ async def register_json_codecs(connection: Any, encoder: Any, decoder: Any) -> None:
209
+ """Register JSON type codecs on asyncpg connection."""
210
+ try:
211
+ await connection.set_type_codec("json", encoder=encoder, decoder=decoder, schema="pg_catalog")
212
+ await connection.set_type_codec("jsonb", encoder=encoder, decoder=decoder, schema="pg_catalog")
213
+ except Exception:
214
+ logger.exception("Failed to register JSON type codecs")
215
+
216
+
217
+ async def register_pgvector_support(connection: Any) -> None:
218
+ """Register pgvector extension support on asyncpg connection."""
219
+ if not PGVECTOR_INSTALLED:
220
+ global _PGVECTOR_MISSING_LOGGED
221
+ if not _PGVECTOR_MISSING_LOGGED:
222
+ logger.debug("pgvector not installed - skipping vector type support")
223
+ _PGVECTOR_MISSING_LOGGED = True
224
+ return
225
+
226
+ try:
227
+ pgvector_asyncpg = importlib.import_module("pgvector.asyncpg")
228
+ await pgvector_asyncpg.register_vector(connection)
229
+ except Exception:
230
+ logger.exception("Failed to register pgvector support")
231
+
232
+
233
+ def apply_driver_features(
234
+ statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
235
+ ) -> "tuple[StatementConfig, dict[str, Any]]":
236
+ """Apply AsyncPG driver feature defaults to statement config."""
237
+ processed_features: dict[str, Any] = dict(driver_features) if driver_features else {}
238
+
239
+ serializer = processed_features.setdefault("json_serializer", to_json)
240
+ deserializer = processed_features.setdefault("json_deserializer", from_json)
241
+ processed_features.setdefault("enable_json_codecs", True)
242
+ processed_features.setdefault("enable_pgvector", PGVECTOR_INSTALLED)
243
+ processed_features.setdefault("enable_cloud_sql", False)
244
+ processed_features.setdefault("enable_alloydb", False)
245
+
246
+ parameter_config = configure_parameter_serializers(
247
+ statement_config.parameter_config, serializer, deserializer=deserializer
248
+ )
249
+ statement_config = statement_config.replace(parameter_config=parameter_config)
250
+
251
+ return statement_config, processed_features
252
+
253
+
254
+ def parse_status(status: Any) -> int:
255
+ """Parse AsyncPG status string to extract row count.
256
+
257
+ AsyncPG returns status strings like "INSERT 0 1", "UPDATE 3", "DELETE 2"
258
+ for non-SELECT operations. This method extracts the affected row count.
259
+
260
+ Args:
261
+ status: Status string from AsyncPG operation.
262
+
263
+ Returns:
264
+ Number of affected rows, or 0 if cannot parse.
265
+ """
266
+ if not status or not isinstance(status, str):
267
+ return 0
268
+
269
+ match = ASYNC_PG_STATUS_REGEX.match(status.strip())
270
+ if match:
271
+ groups = match.groups()
272
+ if len(groups) >= EXPECTED_REGEX_GROUPS:
273
+ try:
274
+ return int(groups[-1])
275
+ except (ValueError, IndexError):
276
+ pass
277
+
278
+ return 0
279
+
280
+
281
+ def _create_postgres_error(
282
+ error: Any, code: "str | None", error_class: type[SQLSpecError], description: str
283
+ ) -> SQLSpecError:
284
+ """Create a SQLSpec exception from an asyncpg error.
285
+
286
+ Args:
287
+ error: The original asyncpg exception
288
+ code: PostgreSQL SQLSTATE error code
289
+ error_class: The SQLSpec exception class to instantiate
290
+ description: Human-readable description of the error type
291
+
292
+ Returns:
293
+ A new SQLSpec exception instance with the original as its cause
294
+ """
295
+ msg = f"PostgreSQL {description} [{code}]: {error}" if code else f"PostgreSQL {description}: {error}"
296
+ exc = error_class(msg)
297
+ exc.__cause__ = error
298
+ return exc
299
+
300
+
301
+ def create_mapped_exception(error: Any) -> SQLSpecError:
302
+ """Map asyncpg exceptions to SQLSpec exceptions.
303
+
304
+ This is a factory function that returns an exception instance rather than
305
+ raising. This pattern is more robust for use in __aexit__ handlers and
306
+ avoids issues with exception control flow in different Python versions.
307
+
308
+ Args:
309
+ error: The asyncpg exception to map
310
+
311
+ Returns:
312
+ A SQLSpec exception that wraps the original error
313
+ """
314
+ # Check specific exception types first
315
+ if isinstance(error, asyncpg.exceptions.UniqueViolationError):
316
+ return _create_postgres_error(error, "23505", UniqueViolationError, "unique constraint violation")
317
+ if isinstance(error, asyncpg.exceptions.ForeignKeyViolationError):
318
+ return _create_postgres_error(error, "23503", ForeignKeyViolationError, "foreign key constraint violation")
319
+ if isinstance(error, asyncpg.exceptions.NotNullViolationError):
320
+ return _create_postgres_error(error, "23502", NotNullViolationError, "not-null constraint violation")
321
+ if isinstance(error, asyncpg.exceptions.CheckViolationError):
322
+ return _create_postgres_error(error, "23514", CheckViolationError, "check constraint violation")
323
+ if isinstance(error, asyncpg.exceptions.PostgresSyntaxError):
324
+ return _create_postgres_error(error, "42601", SQLParsingError, "SQL syntax error")
325
+
326
+ # Fall back to SQLSTATE code mapping
327
+ error_code = error.sqlstate if has_sqlstate(error) and error.sqlstate is not None else None
328
+ if not error_code:
329
+ return _create_postgres_error(error, None, SQLSpecError, "database error")
330
+
331
+ if error_code == "23505":
332
+ return _create_postgres_error(error, error_code, UniqueViolationError, "unique constraint violation")
333
+ if error_code == "23503":
334
+ return _create_postgres_error(error, error_code, ForeignKeyViolationError, "foreign key constraint violation")
335
+ if error_code == "23502":
336
+ return _create_postgres_error(error, error_code, NotNullViolationError, "not-null constraint violation")
337
+ if error_code == "23514":
338
+ return _create_postgres_error(error, error_code, CheckViolationError, "check constraint violation")
339
+ if error_code.startswith("23"):
340
+ return _create_postgres_error(error, error_code, IntegrityError, "integrity constraint violation")
341
+ if error_code.startswith("42"):
342
+ return _create_postgres_error(error, error_code, SQLParsingError, "SQL syntax error")
343
+ if error_code.startswith("08"):
344
+ return _create_postgres_error(error, error_code, DatabaseConnectionError, "connection error")
345
+ if error_code.startswith("40"):
346
+ return _create_postgres_error(error, error_code, TransactionError, "transaction error")
347
+ if error_code.startswith("22"):
348
+ return _create_postgres_error(error, error_code, DataError, "data error")
349
+ if error_code.startswith(("53", "54", "55", "57", "58")):
350
+ return _create_postgres_error(error, error_code, OperationalError, "operational error")
351
+ return _create_postgres_error(error, error_code, SQLSpecError, "database error")
352
+
353
+
354
+ def collect_rows(records: "list[Any] | None") -> "tuple[list[dict[str, Any]], list[str]]":
355
+ """Collect AsyncPG records into dictionaries and column names.
356
+
357
+ Args:
358
+ records: Records returned from asyncpg fetch.
359
+
360
+ Returns:
361
+ Tuple of (rows, column_names).
362
+ """
363
+ if not records:
364
+ return [], []
365
+ rows = [dict(record) for record in records]
366
+ column_names = list(records[0].keys())
367
+ return rows, column_names
@@ -0,0 +1,162 @@
1
+ """PostgreSQL-specific data dictionary for metadata queries via asyncpg."""
2
+
3
+ from typing import TYPE_CHECKING, ClassVar
4
+
5
+ from sqlspec.driver import AsyncDataDictionaryBase
6
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
7
+
8
+ if TYPE_CHECKING:
9
+ from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
10
+
11
+ __all__ = ("AsyncpgDataDictionary",)
12
+
13
+
14
+ class AsyncpgDataDictionary(AsyncDataDictionaryBase):
15
+ """PostgreSQL-specific async data dictionary."""
16
+
17
+ dialect: ClassVar[str] = "postgres"
18
+
19
+ def __init__(self) -> None:
20
+ super().__init__()
21
+
22
+ def resolve_schema(self, schema: "str | None") -> "str | None":
23
+ """Return a schema name using dialect defaults when missing."""
24
+ if schema is not None:
25
+ return schema
26
+ return self.get_dialect_config().default_schema
27
+
28
+ async def get_version(self, driver: "AsyncpgDriver") -> "VersionInfo | None":
29
+ """Get PostgreSQL database version information.
30
+
31
+ Args:
32
+ driver: Async database driver instance.
33
+
34
+ Returns:
35
+ PostgreSQL version information or None if detection fails.
36
+
37
+ """
38
+ driver_id = id(driver)
39
+ # Inline cache check to avoid cross-module method call that causes mypyc segfault
40
+ if driver_id in self._version_fetch_attempted:
41
+ return self._version_cache.get(driver_id)
42
+ # Not cached, fetch from database
43
+
44
+ version_value = await driver.select_value_or_none(self.get_query("version"))
45
+ if not version_value:
46
+ self._log_version_unavailable(type(self).dialect, "missing")
47
+ self.cache_version(driver_id, None)
48
+ return None
49
+
50
+ config = self.get_dialect_config()
51
+ version_info = self.parse_version_with_pattern(config.version_pattern, str(version_value))
52
+ if version_info is None:
53
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
54
+ self.cache_version(driver_id, None)
55
+ return None
56
+
57
+ self._log_version_detected(type(self).dialect, version_info)
58
+ self.cache_version(id(driver), version_info)
59
+ return version_info
60
+
61
+ async def get_feature_flag(self, driver: "AsyncpgDriver", feature: str) -> bool:
62
+ """Check if PostgreSQL database supports a specific feature.
63
+
64
+ Args:
65
+ driver: Async database driver instance.
66
+ feature: Feature name to check.
67
+
68
+ Returns:
69
+ True if feature is supported, False otherwise.
70
+
71
+ """
72
+ version_info = await self.get_version(driver)
73
+ return self.resolve_feature_flag(feature, version_info)
74
+
75
+ async def get_optimal_type(self, driver: "AsyncpgDriver", type_category: str) -> str:
76
+ """Get optimal PostgreSQL type for a category.
77
+
78
+ Args:
79
+ driver: Async database driver instance.
80
+ type_category: Type category.
81
+
82
+ Returns:
83
+ PostgreSQL-specific type name.
84
+
85
+ """
86
+ config = self.get_dialect_config()
87
+ version_info = await self.get_version(driver)
88
+
89
+ if type_category == "json":
90
+ jsonb_version = config.get_feature_version("supports_jsonb")
91
+ json_version = config.get_feature_version("supports_json")
92
+ if version_info and jsonb_version and version_info >= jsonb_version:
93
+ return "JSONB"
94
+ if version_info and json_version and version_info >= json_version:
95
+ return "JSON"
96
+ return "TEXT"
97
+
98
+ return config.get_optimal_type(type_category)
99
+
100
+ def list_available_features(self) -> "list[str]":
101
+ """List available feature flags for this dialect."""
102
+ config = self.get_dialect_config()
103
+ features = set(config.feature_flags.keys()) | set(config.feature_versions.keys())
104
+ return sorted(features)
105
+
106
+ async def get_tables(self, driver: "AsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
107
+ """Get tables sorted by topological dependency order using Recursive CTE."""
108
+ schema_name = self.resolve_schema(schema)
109
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
110
+ return await driver.select(
111
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
112
+ )
113
+
114
+ async def get_columns(
115
+ self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
116
+ ) -> "list[ColumnMetadata]":
117
+ """Get column information for a table or schema."""
118
+ schema_name = self.resolve_schema(schema)
119
+ if table is None:
120
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
121
+ return await driver.select(
122
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
123
+ )
124
+
125
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
126
+ return await driver.select(
127
+ self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
128
+ )
129
+
130
+ async def get_indexes(
131
+ self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
132
+ ) -> "list[IndexMetadata]":
133
+ """Get index metadata for a table or schema."""
134
+ schema_name = self.resolve_schema(schema)
135
+ if table is None:
136
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
137
+ return await driver.select(
138
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
139
+ )
140
+
141
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
142
+ return await driver.select(
143
+ self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
144
+ )
145
+
146
+ async def get_foreign_keys(
147
+ self, driver: "AsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
148
+ ) -> "list[ForeignKeyMetadata]":
149
+ """Get foreign key metadata."""
150
+ schema_name = self.resolve_schema(schema)
151
+ if table is None:
152
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
153
+ return await driver.select(
154
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
155
+ )
156
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
157
+ return await driver.select(
158
+ self.get_query("foreign_keys_by_table"),
159
+ schema_name=schema_name,
160
+ table_name=table,
161
+ schema_type=ForeignKeyMetadata,
162
+ )