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,480 @@
1
+ """psqlpy adapter compiled helpers."""
2
+
3
+ import datetime
4
+ import decimal
5
+ import io
6
+ import re
7
+ import uuid
8
+ from typing import TYPE_CHECKING, Any, Final
9
+
10
+ from sqlspec.core import DriverParameterProfile, ParameterStyle, StatementConfig, build_statement_config_from_profile
11
+ from sqlspec.exceptions import (
12
+ CheckViolationError,
13
+ DatabaseConnectionError,
14
+ ForeignKeyViolationError,
15
+ IntegrityError,
16
+ NotNullViolationError,
17
+ SQLParsingError,
18
+ SQLSpecError,
19
+ TransactionError,
20
+ UniqueViolationError,
21
+ )
22
+ from sqlspec.typing import PGVECTOR_INSTALLED, Empty
23
+ from sqlspec.utils.logging import get_logger
24
+ from sqlspec.utils.serializers import to_json
25
+ from sqlspec.utils.type_converters import build_nested_decimal_normalizer
26
+ from sqlspec.utils.type_guards import has_query_result_metadata
27
+
28
+ if TYPE_CHECKING:
29
+ from collections.abc import Callable, Mapping
30
+
31
+ from sqlspec.core import SQL, ParameterStyleConfig, StatementConfig
32
+
33
+ __all__ = (
34
+ "apply_driver_features",
35
+ "build_connection_config",
36
+ "build_insert_statement",
37
+ "build_profile",
38
+ "build_statement_config",
39
+ "coerce_numeric_for_write",
40
+ "coerce_records_for_execute_many",
41
+ "collect_rows",
42
+ "create_mapped_exception",
43
+ "default_statement_config",
44
+ "driver_profile",
45
+ "encode_records_for_binary_copy",
46
+ "extract_rows_affected",
47
+ "format_table_identifier",
48
+ "get_parameter_casts",
49
+ "normalize_scalar_parameter",
50
+ "prepare_parameters_with_casts",
51
+ "split_schema_and_table",
52
+ )
53
+
54
+
55
+ _JSON_CASTS: Final[frozenset[str]] = frozenset({"JSON", "JSONB"})
56
+ _TIMESTAMP_CASTS: Final[frozenset[str]] = frozenset({
57
+ "TIMESTAMP",
58
+ "TIMESTAMPTZ",
59
+ "TIMESTAMP WITH TIME ZONE",
60
+ "TIMESTAMP WITHOUT TIME ZONE",
61
+ })
62
+ _UUID_CASTS: Final[frozenset[str]] = frozenset({"UUID"})
63
+ _DECIMAL_NORMALIZER = build_nested_decimal_normalizer(mode="float")
64
+ _JSONB_TYPE: "type[Any] | None" = None
65
+ _JSONB_RESOLVED: bool = False
66
+ PSQLPY_STATUS_REGEX: "re.Pattern[str]" = re.compile(r"^([A-Z]+)(?:\s+(\d+))?\s+(\d+)$", re.IGNORECASE)
67
+
68
+ logger = get_logger("sqlspec.adapters.psqlpy.core")
69
+
70
+
71
+ def _get_jsonb_type() -> "type[Any] | None":
72
+ global _JSONB_TYPE, _JSONB_RESOLVED
73
+ if _JSONB_RESOLVED:
74
+ return _JSONB_TYPE
75
+ try:
76
+ from psqlpy.extra_types import JSONB
77
+ except ImportError:
78
+ _JSONB_TYPE = None
79
+ else:
80
+ _JSONB_TYPE = JSONB
81
+ _JSONB_RESOLVED = True
82
+ return _JSONB_TYPE
83
+
84
+
85
+ def _coerce_json_parameter(value: Any, cast_type: str, serializer: "Callable[[Any], str]") -> Any:
86
+ """Serialize JSON parameters according to the detected cast type."""
87
+
88
+ if value is None:
89
+ return None
90
+ jsonb_type = _get_jsonb_type()
91
+ if cast_type == "JSONB":
92
+ if jsonb_type is not None and isinstance(value, jsonb_type):
93
+ return value
94
+ if jsonb_type is not None:
95
+ if isinstance(value, dict):
96
+ return jsonb_type(value)
97
+ if isinstance(value, (list, tuple)):
98
+ return jsonb_type(list(value))
99
+ if isinstance(value, tuple):
100
+ return list(value)
101
+ if jsonb_type is not None and isinstance(value, jsonb_type):
102
+ return value
103
+ if isinstance(value, (dict, list, str)):
104
+ return value
105
+ try:
106
+ serialized_value = serializer(value)
107
+ except Exception as error:
108
+ msg = "Failed to serialize JSON parameter for psqlpy."
109
+ raise SQLSpecError(msg) from error
110
+ return serialized_value
111
+
112
+
113
+ def _coerce_uuid_parameter(value: Any) -> Any:
114
+ """Convert UUID-compatible parameters to ``uuid.UUID`` instances."""
115
+
116
+ if isinstance(value, uuid.UUID):
117
+ return value
118
+ if isinstance(value, str):
119
+ try:
120
+ return uuid.UUID(value)
121
+ except ValueError as error:
122
+ msg = "Invalid UUID parameter for psqlpy."
123
+ raise SQLSpecError(msg) from error
124
+ return value
125
+
126
+
127
+ def _coerce_timestamp_parameter(value: Any) -> Any:
128
+ """Convert ISO-formatted timestamp strings to ``datetime.datetime``."""
129
+
130
+ if isinstance(value, datetime.datetime):
131
+ return value
132
+ if isinstance(value, str):
133
+ normalized_value = value[:-1] + "+00:00" if value.endswith("Z") else value
134
+ try:
135
+ return datetime.datetime.fromisoformat(normalized_value)
136
+ except ValueError as error:
137
+ msg = "Invalid ISO timestamp parameter for psqlpy."
138
+ raise SQLSpecError(msg) from error
139
+ return value
140
+
141
+
142
+ def _coerce_parameter_for_cast(value: Any, cast_type: str, serializer: "Callable[[Any], str]") -> Any:
143
+ """Apply cast-aware coercion for psqlpy parameters."""
144
+
145
+ upper_cast = cast_type.upper()
146
+ if upper_cast in _JSON_CASTS:
147
+ return _coerce_json_parameter(value, upper_cast, serializer)
148
+ if upper_cast in _UUID_CASTS:
149
+ return _coerce_uuid_parameter(value)
150
+ if upper_cast in _TIMESTAMP_CASTS:
151
+ return _coerce_timestamp_parameter(value)
152
+ return value
153
+
154
+
155
+ def _prepare_dict_parameter(value: "dict[str, Any]") -> "dict[str, Any]":
156
+ normalized = _DECIMAL_NORMALIZER(value)
157
+ return normalized if isinstance(normalized, dict) else value
158
+
159
+
160
+ def _prepare_list_parameter(value: "list[Any]") -> "list[Any]":
161
+ return [_DECIMAL_NORMALIZER(item) for item in value]
162
+
163
+
164
+ def _prepare_tuple_parameter(value: "tuple[Any, ...]") -> "tuple[Any, ...]":
165
+ return tuple(_DECIMAL_NORMALIZER(item) for item in value)
166
+
167
+
168
+ def build_profile() -> "DriverParameterProfile":
169
+ """Create the psqlpy driver parameter profile."""
170
+
171
+ return DriverParameterProfile(
172
+ name="Psqlpy",
173
+ default_style=ParameterStyle.NUMERIC,
174
+ supported_styles={ParameterStyle.NUMERIC, ParameterStyle.NAMED_DOLLAR, ParameterStyle.QMARK},
175
+ default_execution_style=ParameterStyle.NUMERIC,
176
+ supported_execution_styles={ParameterStyle.NUMERIC},
177
+ has_native_list_expansion=False,
178
+ preserve_parameter_format=True,
179
+ needs_static_script_compilation=False,
180
+ allow_mixed_parameter_styles=False,
181
+ preserve_original_params_for_many=False,
182
+ json_serializer_strategy="helper",
183
+ custom_type_coercions={decimal.Decimal: float},
184
+ default_dialect="postgres",
185
+ )
186
+
187
+
188
+ driver_profile = build_profile()
189
+
190
+
191
+ def _build_psqlpy_parameter_config(
192
+ profile: "DriverParameterProfile", serializer: "Callable[[Any], str]"
193
+ ) -> "ParameterStyleConfig":
194
+ """Construct parameter configuration for psqlpy.
195
+
196
+ Args:
197
+ profile: Driver parameter profile to extend.
198
+ serializer: JSON serializer for parameter coercion.
199
+
200
+ Returns:
201
+ ParameterStyleConfig with updated type coercions.
202
+ """
203
+
204
+ base_config = build_statement_config_from_profile(profile, json_serializer=serializer).parameter_config
205
+
206
+ updated_type_map = dict(base_config.type_coercion_map)
207
+ updated_type_map[dict] = _prepare_dict_parameter
208
+ updated_type_map[list] = _prepare_list_parameter
209
+ updated_type_map[tuple] = _prepare_tuple_parameter
210
+
211
+ return base_config.replace(type_coercion_map=updated_type_map)
212
+
213
+
214
+ def build_statement_config(*, json_serializer: "Callable[[Any], str] | None" = None) -> "StatementConfig":
215
+ """Construct the psqlpy statement configuration with optional JSON codecs."""
216
+ serializer = json_serializer or to_json
217
+ profile = driver_profile
218
+ parameter_config = _build_psqlpy_parameter_config(profile, serializer)
219
+ base_config = build_statement_config_from_profile(profile, json_serializer=serializer)
220
+ return base_config.replace(parameter_config=parameter_config)
221
+
222
+
223
+ default_statement_config = build_statement_config()
224
+
225
+
226
+ def build_connection_config(connection_config: "Mapping[str, Any]") -> "dict[str, Any]":
227
+ """Build connection configuration with non-null values only.
228
+
229
+ Args:
230
+ connection_config: Raw connection configuration mapping.
231
+
232
+ Returns:
233
+ Dictionary with connection parameters.
234
+ """
235
+ return {key: value for key, value in connection_config.items() if value is not None}
236
+
237
+
238
+ def apply_driver_features(
239
+ statement_config: "StatementConfig", driver_features: "Mapping[str, Any] | None"
240
+ ) -> "tuple[StatementConfig, dict[str, Any]]":
241
+ """Apply psqlpy driver feature defaults to statement config."""
242
+ features: dict[str, Any] = dict(driver_features) if driver_features else {}
243
+ serializer = features.get("json_serializer", to_json)
244
+ features.setdefault("json_serializer", serializer)
245
+ features.setdefault("enable_pgvector", PGVECTOR_INSTALLED)
246
+
247
+ parameter_config = _build_psqlpy_parameter_config(driver_profile, serializer)
248
+ statement_config = statement_config.replace(parameter_config=parameter_config)
249
+
250
+ return statement_config, features
251
+
252
+
253
+ def collect_rows(query_result: Any | None) -> "tuple[list[dict[str, Any]], list[str]]":
254
+ """Collect psqlpy rows and column names.
255
+
256
+ Args:
257
+ query_result: Result returned from cursor.fetch().
258
+
259
+ Returns:
260
+ Tuple of (rows, column_names).
261
+ """
262
+ dict_rows: list[dict[str, Any]] = query_result.result() if query_result else []
263
+ column_names = list(dict_rows[0].keys()) if dict_rows else []
264
+ return dict_rows, column_names
265
+
266
+
267
+ def normalize_scalar_parameter(value: Any) -> Any:
268
+ return value
269
+
270
+
271
+ def coerce_numeric_for_write(value: Any) -> Any:
272
+ if isinstance(value, float):
273
+ return decimal.Decimal(str(value))
274
+ if isinstance(value, decimal.Decimal):
275
+ return value
276
+ if isinstance(value, list):
277
+ return [coerce_numeric_for_write(item) for item in value]
278
+ if isinstance(value, tuple):
279
+ coerced = [coerce_numeric_for_write(item) for item in value]
280
+ return tuple(coerced)
281
+ if isinstance(value, dict):
282
+ return {key: coerce_numeric_for_write(item) for key, item in value.items()}
283
+ return value
284
+
285
+
286
+ def _escape_copy_text(value: str) -> str:
287
+ return value.replace("\\", "\\\\").replace("\t", "\\t").replace("\n", "\\n").replace("\r", "\\r")
288
+
289
+
290
+ def _format_copy_value(value: Any) -> str:
291
+ if value is None:
292
+ return r"\N"
293
+ if isinstance(value, bool):
294
+ return "t" if value else "f"
295
+ if isinstance(value, (datetime.date, datetime.datetime, datetime.time)):
296
+ return value.isoformat()
297
+ if isinstance(value, (list, tuple, dict)):
298
+ return to_json(value)
299
+ if isinstance(value, (bytes, bytearray)):
300
+ return value.decode("utf-8")
301
+ return str(coerce_numeric_for_write(value))
302
+
303
+
304
+ def encode_records_for_binary_copy(records: "list[tuple[Any, ...]]") -> bytes:
305
+ """Encode row tuples into a bytes payload compatible with binary_copy_to_table."""
306
+
307
+ buffer = io.StringIO()
308
+ for record in records:
309
+ encoded_columns = [_escape_copy_text(_format_copy_value(value)) for value in record]
310
+ buffer.write("\t".join(encoded_columns))
311
+ buffer.write("\n")
312
+ return buffer.getvalue().encode("utf-8")
313
+
314
+
315
+ def split_schema_and_table(identifier: str) -> "tuple[str | None, str]":
316
+ cleaned = identifier.strip()
317
+ if not cleaned:
318
+ msg = "Table name must not be empty"
319
+ raise SQLSpecError(msg)
320
+ if "." not in cleaned:
321
+ return None, cleaned.strip('"')
322
+ parts = [part for part in cleaned.split(".") if part]
323
+ if len(parts) == 1:
324
+ return None, parts[0].strip('"')
325
+ schema_name = ".".join(parts[:-1]).strip('"')
326
+ table_name = parts[-1].strip('"')
327
+ if not table_name:
328
+ msg = "Table name must not be empty"
329
+ raise SQLSpecError(msg)
330
+ return schema_name or None, table_name
331
+
332
+
333
+ def _parse_psqlpy_command_tag(tag: str) -> int:
334
+ """Parse PostgreSQL command tag to extract rows affected.
335
+
336
+ Args:
337
+ tag: PostgreSQL command tag string.
338
+
339
+ Returns:
340
+ Number of rows affected, -1 if unable to parse.
341
+ """
342
+ if not tag:
343
+ return -1
344
+
345
+ match = PSQLPY_STATUS_REGEX.match(tag.strip())
346
+ if match:
347
+ command = match.group(1).upper()
348
+ if command == "INSERT" and match.group(3):
349
+ return int(match.group(3))
350
+ if command in {"UPDATE", "DELETE"} and match.group(3):
351
+ return int(match.group(3))
352
+ return -1
353
+
354
+
355
+ def extract_rows_affected(result: Any) -> int:
356
+ """Extract rows affected from psqlpy results."""
357
+ try:
358
+ if has_query_result_metadata(result):
359
+ if result.tag:
360
+ return _parse_psqlpy_command_tag(result.tag)
361
+ if result.status:
362
+ return _parse_psqlpy_command_tag(result.status)
363
+ if isinstance(result, str):
364
+ return _parse_psqlpy_command_tag(result)
365
+ except Exception as error:
366
+ logger.debug("Failed to parse psqlpy command tag: %s", error)
367
+ return -1
368
+
369
+
370
+ def get_parameter_casts(statement: "SQL") -> "dict[int, str]":
371
+ """Get parameter cast metadata from compiled statements."""
372
+ processed_state = statement.get_processed_state()
373
+ if processed_state is not Empty:
374
+ return processed_state.parameter_casts or {}
375
+ return {}
376
+
377
+
378
+ def prepare_parameters_with_casts(
379
+ parameters: Any, parameter_casts: "dict[int, str]", statement_config: "StatementConfig"
380
+ ) -> Any:
381
+ """Prepare parameters with cast-aware type coercion."""
382
+ if isinstance(parameters, (list, tuple)):
383
+ result: list[Any] = []
384
+ serializer = statement_config.parameter_config.json_serializer or to_json
385
+ type_map = statement_config.parameter_config.type_coercion_map
386
+ for idx, param in enumerate(parameters, start=1):
387
+ cast_type = parameter_casts.get(idx, "")
388
+ prepared_value = param
389
+ if type_map:
390
+ for type_check, converter in type_map.items():
391
+ if isinstance(prepared_value, type_check):
392
+ prepared_value = converter(prepared_value)
393
+ break
394
+ if cast_type:
395
+ prepared_value = _coerce_parameter_for_cast(prepared_value, cast_type, serializer)
396
+ result.append(prepared_value)
397
+ return tuple(result) if isinstance(parameters, tuple) else result
398
+ return parameters
399
+
400
+
401
+ def _create_postgres_error(error: Any, error_class: type[SQLSpecError], description: str) -> SQLSpecError:
402
+ """Create a SQLSpec exception from a psqlpy error.
403
+
404
+ Args:
405
+ error: The original psqlpy exception
406
+ error_class: The SQLSpec exception class to instantiate
407
+ description: Human-readable description of the error type
408
+
409
+ Returns:
410
+ A new SQLSpec exception instance with the original as its cause
411
+ """
412
+ msg = f"PostgreSQL {description}: {error}"
413
+ exc = error_class(msg)
414
+ exc.__cause__ = error
415
+ return exc
416
+
417
+
418
+ def create_mapped_exception(error: Any) -> SQLSpecError:
419
+ """Map psqlpy exceptions to SQLSpec exceptions.
420
+
421
+ This is a factory function that returns an exception instance rather than
422
+ raising. This pattern is more robust for use in __exit__ handlers and
423
+ avoids issues with exception control flow in different Python versions.
424
+
425
+ Args:
426
+ error: The psqlpy exception to map
427
+
428
+ Returns:
429
+ A SQLSpec exception that wraps the original error
430
+ """
431
+ error_msg = str(error).lower()
432
+
433
+ if "unique" in error_msg or "duplicate key" in error_msg:
434
+ return _create_postgres_error(error, UniqueViolationError, "unique constraint violation")
435
+ if "foreign key" in error_msg or "violates foreign key" in error_msg:
436
+ return _create_postgres_error(error, ForeignKeyViolationError, "foreign key constraint violation")
437
+ if "not null" in error_msg or ("null value" in error_msg and "violates not-null" in error_msg):
438
+ return _create_postgres_error(error, NotNullViolationError, "not-null constraint violation")
439
+ if "check constraint" in error_msg or "violates check constraint" in error_msg:
440
+ return _create_postgres_error(error, CheckViolationError, "check constraint violation")
441
+ if "constraint" in error_msg:
442
+ return _create_postgres_error(error, IntegrityError, "integrity constraint violation")
443
+ if "syntax error" in error_msg or "parse" in error_msg:
444
+ return _create_postgres_error(error, SQLParsingError, "SQL syntax error")
445
+ if "connection" in error_msg or "could not connect" in error_msg:
446
+ return _create_postgres_error(error, DatabaseConnectionError, "connection error")
447
+ if "deadlock" in error_msg or "serialization failure" in error_msg:
448
+ return _create_postgres_error(error, TransactionError, "transaction error")
449
+ return _create_postgres_error(error, SQLSpecError, "database error")
450
+
451
+
452
+ def _quote_identifier(identifier: str) -> str:
453
+ normalized = identifier.replace('"', '""')
454
+ return f'"{normalized}"'
455
+
456
+
457
+ def format_table_identifier(identifier: str) -> str:
458
+ schema_name, table_name = split_schema_and_table(identifier)
459
+ if schema_name:
460
+ return f"{_quote_identifier(schema_name)}.{_quote_identifier(table_name)}"
461
+ return _quote_identifier(table_name)
462
+
463
+
464
+ def build_insert_statement(table: str, columns: "list[str]") -> str:
465
+ column_clause = ", ".join(_quote_identifier(column) for column in columns)
466
+ placeholders = ", ".join(f"${index}" for index in range(1, len(columns) + 1))
467
+ return f"INSERT INTO {format_table_identifier(table)} ({column_clause}) VALUES ({placeholders})"
468
+
469
+
470
+ def coerce_records_for_execute_many(records: "list[tuple[Any, ...]]") -> "list[list[Any]]":
471
+ formatted_records: list[list[Any]] = []
472
+ for record in records:
473
+ coerced = coerce_numeric_for_write(record)
474
+ if isinstance(coerced, tuple):
475
+ formatted_records.append(list(coerced))
476
+ elif isinstance(coerced, list):
477
+ formatted_records.append(coerced)
478
+ else:
479
+ formatted_records.append([coerced])
480
+ return formatted_records
@@ -0,0 +1,126 @@
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.driver import AsyncDataDictionaryBase
8
+ from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
9
+
10
+ if TYPE_CHECKING:
11
+ from sqlspec.adapters.psqlpy.driver import PsqlpyDriver
12
+
13
+ __all__ = ("PsqlpyDataDictionary",)
14
+
15
+
16
+ @mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
17
+ class PsqlpyDataDictionary(AsyncDataDictionaryBase):
18
+ """PostgreSQL-specific async data dictionary via psqlpy."""
19
+
20
+ dialect: ClassVar[str] = "postgres"
21
+
22
+ def __init__(self) -> None:
23
+ super().__init__()
24
+
25
+ async def get_version(self, driver: "PsqlpyDriver") -> "VersionInfo | None":
26
+ """Get PostgreSQL database version information."""
27
+ driver_id = id(driver)
28
+ # Inline cache check to avoid cross-module method call that causes mypyc segfault
29
+ if driver_id in self._version_fetch_attempted:
30
+ return self._version_cache.get(driver_id)
31
+ # Not cached, fetch from database
32
+
33
+ version_value = await driver.select_value(self.get_query("version"))
34
+ if not version_value:
35
+ self._log_version_unavailable(type(self).dialect, "missing")
36
+ self.cache_version(driver_id, None)
37
+ return None
38
+
39
+ version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
40
+ if version_info is None:
41
+ self._log_version_unavailable(type(self).dialect, "parse_failed")
42
+ self.cache_version(driver_id, None)
43
+ return None
44
+
45
+ self._log_version_detected(type(self).dialect, version_info)
46
+ self.cache_version(driver_id, version_info)
47
+ return version_info
48
+
49
+ async def get_feature_flag(self, driver: "PsqlpyDriver", feature: str) -> bool:
50
+ """Check if PostgreSQL database supports a specific feature."""
51
+ version_info = await self.get_version(driver)
52
+ return self.resolve_feature_flag(feature, version_info)
53
+
54
+ async def get_optimal_type(self, driver: "PsqlpyDriver", type_category: str) -> str:
55
+ """Get optimal PostgreSQL type for a category."""
56
+ config = self.get_dialect_config()
57
+ version_info = await self.get_version(driver)
58
+
59
+ if type_category == "json":
60
+ jsonb_version = config.get_feature_version("supports_jsonb")
61
+ json_version = config.get_feature_version("supports_json")
62
+ if version_info and jsonb_version and version_info >= jsonb_version:
63
+ return "JSONB"
64
+ if version_info and json_version and version_info >= json_version:
65
+ return "JSON"
66
+ return "TEXT"
67
+
68
+ return config.get_optimal_type(type_category)
69
+
70
+ async def get_tables(self, driver: "PsqlpyDriver", schema: "str | None" = None) -> "list[TableMetadata]":
71
+ """Get tables sorted by topological dependency order using Recursive CTE."""
72
+ schema_name = self.resolve_schema(schema)
73
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
74
+ return await driver.select(
75
+ self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
76
+ )
77
+
78
+ async def get_columns(
79
+ self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
80
+ ) -> "list[ColumnMetadata]":
81
+ """Get column information for a table or schema."""
82
+ schema_name = self.resolve_schema(schema)
83
+ if table is None:
84
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
85
+ return await driver.select(
86
+ self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
87
+ )
88
+
89
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
90
+ return await driver.select(
91
+ self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
92
+ )
93
+
94
+ async def get_indexes(
95
+ self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
96
+ ) -> "list[IndexMetadata]":
97
+ """Get index metadata for a table or schema."""
98
+ schema_name = self.resolve_schema(schema)
99
+ if table is None:
100
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
101
+ return await driver.select(
102
+ self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
103
+ )
104
+
105
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
106
+ return await driver.select(
107
+ self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
108
+ )
109
+
110
+ async def get_foreign_keys(
111
+ self, driver: "PsqlpyDriver", table: "str | None" = None, schema: "str | None" = None
112
+ ) -> "list[ForeignKeyMetadata]":
113
+ """Get foreign key metadata."""
114
+ schema_name = self.resolve_schema(schema)
115
+ if table is None:
116
+ self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
117
+ return await driver.select(
118
+ self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
119
+ )
120
+ self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
121
+ return await driver.select(
122
+ self.get_query("foreign_keys_by_table"),
123
+ schema_name=schema_name,
124
+ table_name=table,
125
+ schema_type=ForeignKeyMetadata,
126
+ )