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,206 @@
1
+ """Driver parameter profile registry and StatementConfig factory."""
2
+
3
+ from collections.abc import Callable, Mapping
4
+ from typing import TYPE_CHECKING, Any, Literal, cast
5
+
6
+ import sqlspec.exceptions
7
+ from sqlspec.core.parameters._types import DriverParameterProfile, ParameterStyleConfig
8
+ from sqlspec.utils.serializers import from_json, to_json
9
+
10
+ if TYPE_CHECKING:
11
+ from sqlspec.core.statement import StatementConfig
12
+
13
+ __all__ = (
14
+ "DRIVER_PARAMETER_PROFILES",
15
+ "build_statement_config_from_profile",
16
+ "get_driver_profile",
17
+ "register_driver_profile",
18
+ )
19
+
20
+ _DEFAULT_JSON_SERIALIZER: Callable[[Any], str] = to_json
21
+ _DEFAULT_JSON_DESERIALIZER: Callable[[str], Any] = from_json
22
+
23
+ DRIVER_PARAMETER_PROFILES: "dict[str, DriverParameterProfile]" = {}
24
+
25
+
26
+ def get_driver_profile(adapter_key: str) -> "DriverParameterProfile":
27
+ """Return the registered parameter profile for the specified adapter.
28
+
29
+ Args:
30
+ adapter_key: Adapter identifier (case-insensitive).
31
+
32
+ Returns:
33
+ Registered :class:`DriverParameterProfile` instance.
34
+
35
+ Raises:
36
+ ImproperConfigurationError: If the adapter does not have a profile.
37
+ """
38
+ key = adapter_key.lower()
39
+ try:
40
+ return DRIVER_PARAMETER_PROFILES[key]
41
+ except KeyError as exc:
42
+ msg = f"No driver parameter profile registered for adapter '{adapter_key}'."
43
+ raise sqlspec.exceptions.ImproperConfigurationError(msg) from exc
44
+
45
+
46
+ def register_driver_profile(
47
+ adapter_key: str, profile: "DriverParameterProfile", *, allow_override: bool = False
48
+ ) -> None:
49
+ """Register a driver profile under the canonical adapter key.
50
+
51
+ Args:
52
+ adapter_key: Adapter identifier (case-insensitive).
53
+ profile: Profile describing parameter behaviour.
54
+ allow_override: Whether to replace an existing entry.
55
+
56
+ Raises:
57
+ ImproperConfigurationError: If attempting to register a duplicate profile.
58
+ """
59
+
60
+ key = adapter_key.lower()
61
+ if not allow_override and key in DRIVER_PARAMETER_PROFILES:
62
+ msg = f"Profile already registered for adapter '{adapter_key}'."
63
+ raise sqlspec.exceptions.ImproperConfigurationError(msg)
64
+ DRIVER_PARAMETER_PROFILES[key] = profile
65
+
66
+
67
+ def _build_parameter_style_config_from_profile(
68
+ profile: "DriverParameterProfile",
69
+ parameter_overrides: "dict[str, Any] | None",
70
+ json_serializer: "Callable[[Any], str] | None",
71
+ json_deserializer: "Callable[[str], Any] | None",
72
+ ) -> "ParameterStyleConfig":
73
+ """Build a :class:`ParameterStyleConfig` instance from a driver profile.
74
+
75
+ Args:
76
+ profile: Source driver profile.
77
+ parameter_overrides: Optional overrides applied before instantiation.
78
+ json_serializer: Adapter-provided JSON serializer.
79
+ json_deserializer: Adapter-provided JSON deserializer.
80
+
81
+ Returns:
82
+ Configured :class:`ParameterStyleConfig` ready for statement construction.
83
+ """
84
+ overrides = dict(parameter_overrides or {})
85
+ supported_styles_override = overrides.pop("supported_parameter_styles", None)
86
+ execution_styles_override = overrides.pop("supported_execution_parameter_styles", None)
87
+ type_coercion_override = overrides.pop("type_coercion_map", None)
88
+ json_serializer_override = overrides.pop("json_serializer", None)
89
+ json_deserializer_override = overrides.pop("json_deserializer", None)
90
+ tuple_strategy_override = overrides.pop("json_tuple_strategy", None)
91
+
92
+ supported_styles = (
93
+ set(supported_styles_override) if supported_styles_override is not None else set(profile.supported_styles)
94
+ )
95
+ if execution_styles_override is None:
96
+ execution_supported = (
97
+ set(profile.supported_execution_styles) if profile.supported_execution_styles is not None else None
98
+ )
99
+ else:
100
+ execution_supported = set(execution_styles_override) if execution_styles_override is not None else None
101
+
102
+ type_map = (
103
+ dict(type_coercion_override) if type_coercion_override is not None else dict(profile.custom_type_coercions)
104
+ )
105
+
106
+ parameter_kwargs: dict[str, Any] = {
107
+ "default_parameter_style": overrides.pop("default_parameter_style", profile.default_style),
108
+ "supported_parameter_styles": supported_styles,
109
+ "supported_execution_parameter_styles": execution_supported,
110
+ "default_execution_parameter_style": overrides.pop(
111
+ "default_execution_parameter_style", profile.default_execution_style
112
+ ),
113
+ "type_coercion_map": type_map,
114
+ "has_native_list_expansion": overrides.pop("has_native_list_expansion", profile.has_native_list_expansion),
115
+ "needs_static_script_compilation": overrides.pop(
116
+ "needs_static_script_compilation", profile.needs_static_script_compilation
117
+ ),
118
+ "allow_mixed_parameter_styles": overrides.pop(
119
+ "allow_mixed_parameter_styles", profile.allow_mixed_parameter_styles
120
+ ),
121
+ "preserve_parameter_format": overrides.pop("preserve_parameter_format", profile.preserve_parameter_format),
122
+ "preserve_original_params_for_many": overrides.pop(
123
+ "preserve_original_params_for_many", profile.preserve_original_params_for_many
124
+ ),
125
+ "strict_named_parameters": overrides.pop("strict_named_parameters", profile.strict_named_parameters),
126
+ "output_transformer": overrides.pop("output_transformer", profile.default_output_transformer),
127
+ "ast_transformer": overrides.pop("ast_transformer", profile.default_ast_transformer),
128
+ }
129
+
130
+ parameter_kwargs = {k: v for k, v in parameter_kwargs.items() if v is not None}
131
+
132
+ strategy = profile.json_serializer_strategy
133
+ serializer_value = json_serializer_override or json_serializer
134
+ deserializer_value = json_deserializer_override or json_deserializer
135
+
136
+ if serializer_value is None:
137
+ serializer_value = profile.extras.get("default_json_serializer", _DEFAULT_JSON_SERIALIZER)
138
+ if deserializer_value is None:
139
+ deserializer_value = profile.extras.get("default_json_deserializer", _DEFAULT_JSON_DESERIALIZER)
140
+
141
+ serializer = cast("Callable[[Any], str]", serializer_value)
142
+ deserializer = cast("Callable[[str], Any] | None", deserializer_value)
143
+
144
+ if strategy == "driver":
145
+ parameter_kwargs["json_serializer"] = serializer
146
+ parameter_kwargs["json_deserializer"] = deserializer
147
+
148
+ parameter_kwargs.update(overrides)
149
+ parameter_config = ParameterStyleConfig(**parameter_kwargs)
150
+
151
+ if strategy == "helper":
152
+ tuple_strategy = tuple_strategy_override or profile.extras.get("json_tuple_strategy", "list")
153
+ tuple_strategy_literal = cast("Literal['list', 'tuple']", tuple_strategy)
154
+ parameter_config = parameter_config.with_json_serializers(
155
+ serializer, tuple_strategy=tuple_strategy_literal, deserializer=deserializer
156
+ )
157
+ elif strategy == "driver":
158
+ parameter_config = parameter_config.replace(json_serializer=serializer, json_deserializer=deserializer)
159
+
160
+ type_overrides = profile.extras.get("type_coercion_overrides")
161
+ if type_overrides:
162
+ coercion_overrides = cast("Mapping[type, Callable[[Any], Any]]", type_overrides)
163
+ updated_map: dict[type, Callable[[Any], Any]] = {}
164
+ updated_map.update(parameter_config.type_coercion_map)
165
+ updated_map.update(coercion_overrides)
166
+ parameter_config = parameter_config.replace(type_coercion_map=updated_map)
167
+
168
+ return parameter_config
169
+
170
+
171
+ def build_statement_config_from_profile(
172
+ profile: "DriverParameterProfile",
173
+ *,
174
+ parameter_overrides: "dict[str, Any] | None" = None,
175
+ statement_overrides: "dict[str, Any] | None" = None,
176
+ json_serializer: "Callable[[Any], str] | None" = None,
177
+ json_deserializer: "Callable[[str], Any] | None" = None,
178
+ ) -> "StatementConfig":
179
+ """Construct a :class:`StatementConfig` seeded from a driver profile.
180
+
181
+ Args:
182
+ profile: Driver profile providing default parameter behaviour.
183
+ parameter_overrides: Optional overrides for parameter config fields.
184
+ statement_overrides: Optional overrides for resulting statement config.
185
+ json_serializer: Optional JSON serializer supplied by the adapter.
186
+ json_deserializer: Optional JSON deserializer supplied by the adapter.
187
+
188
+ Returns:
189
+ New :class:`StatementConfig` instance with merged configuration.
190
+ """
191
+ parameter_config = _build_parameter_style_config_from_profile(
192
+ profile, parameter_overrides, json_serializer, json_deserializer
193
+ )
194
+
195
+ from sqlspec.core.statement import StatementConfig as _StatementConfig
196
+
197
+ statement_kwargs: dict[str, Any] = {}
198
+ if profile.default_dialect is not None:
199
+ statement_kwargs["dialect"] = profile.default_dialect
200
+ if profile.statement_kwargs:
201
+ statement_kwargs.update(profile.statement_kwargs)
202
+ if statement_overrides:
203
+ statement_kwargs.update(statement_overrides)
204
+
205
+ filtered_statement_kwargs = {k: v for k, v in statement_kwargs.items() if v is not None}
206
+ return _StatementConfig(parameter_config=parameter_config, **filtered_statement_kwargs)
@@ -0,0 +1,292 @@
1
+ """AST transformer helpers for parameter processing."""
2
+
3
+ import bisect
4
+ from collections.abc import Callable, Mapping, Sequence
5
+ from typing import Any, cast
6
+
7
+ from sqlglot import exp as _exp
8
+
9
+ from sqlspec.core.parameters._alignment import (
10
+ collect_null_parameter_ordinals,
11
+ looks_like_execute_many,
12
+ normalize_parameter_key,
13
+ validate_parameter_alignment,
14
+ )
15
+ from sqlspec.core.parameters._types import ConvertedParameters, ParameterMapping, ParameterPayload, ParameterProfile
16
+ from sqlspec.core.parameters._validator import ParameterValidator
17
+ from sqlspec.utils.type_guards import get_value_attribute
18
+
19
+ __all__ = (
20
+ "build_literal_inlining_transform",
21
+ "build_null_pruning_transform",
22
+ "replace_null_parameters_with_literals",
23
+ "replace_placeholders_with_literals",
24
+ )
25
+
26
+ _AST_TRANSFORMER_VALIDATOR: "ParameterValidator" = ParameterValidator()
27
+
28
+
29
+ class _NullPruningTransform:
30
+ __slots__ = ("_dialect", "_validator")
31
+
32
+ def __init__(self, dialect: str, validator: "ParameterValidator | None") -> None:
33
+ self._dialect = dialect
34
+ self._validator = validator
35
+
36
+ def __call__(
37
+ self, expression: Any, parameters: "ParameterPayload", parameter_profile: "ParameterProfile"
38
+ ) -> "tuple[Any, ConvertedParameters]":
39
+ return replace_null_parameters_with_literals(
40
+ expression,
41
+ parameters,
42
+ dialect=self._dialect,
43
+ validator=self._validator,
44
+ parameter_profile=parameter_profile,
45
+ )
46
+
47
+
48
+ class _LiteralInliningTransform:
49
+ __slots__ = ("_json_serializer",)
50
+
51
+ def __init__(self, json_serializer: "Callable[[Any], str]") -> None:
52
+ self._json_serializer = json_serializer
53
+
54
+ def __call__(
55
+ self, expression: Any, parameters: "ParameterPayload", _parameter_profile: "ParameterProfile"
56
+ ) -> "tuple[Any, object]":
57
+ literal_expression = replace_placeholders_with_literals(
58
+ expression, parameters, json_serializer=self._json_serializer
59
+ )
60
+ return literal_expression, parameters
61
+
62
+
63
+ class _NullPlaceholderTransformer:
64
+ __slots__ = ("_null_positions", "_qmark_position", "_sorted_null_positions")
65
+
66
+ def __init__(self, null_positions: "set[int]", sorted_null_positions: "list[int]") -> None:
67
+ self._null_positions = null_positions
68
+ self._sorted_null_positions = sorted_null_positions
69
+ self._qmark_position = 0
70
+
71
+ def __call__(self, node: Any) -> Any:
72
+ if isinstance(node, _exp.Placeholder) and node.this is None:
73
+ current_position = self._qmark_position
74
+ self._qmark_position += 1
75
+ if current_position in self._null_positions:
76
+ return _exp.Null()
77
+ return node
78
+
79
+ if isinstance(node, _exp.Placeholder) and node.this is not None:
80
+ placeholder_text = str(node.this)
81
+ normalized_text = placeholder_text.lstrip("$")
82
+ if normalized_text.isdigit():
83
+ param_index = int(normalized_text) - 1
84
+ if param_index in self._null_positions:
85
+ return _exp.Null()
86
+ shift = bisect.bisect_left(self._sorted_null_positions, param_index)
87
+ new_param_num = param_index - shift + 1
88
+ return _exp.Placeholder(this=f"${new_param_num}")
89
+ return node
90
+
91
+ if isinstance(node, _exp.Parameter) and node.this is not None:
92
+ parameter_text = str(node.this)
93
+ if parameter_text.isdigit():
94
+ param_index = int(parameter_text) - 1
95
+ if param_index in self._null_positions:
96
+ return _exp.Null()
97
+ shift = bisect.bisect_left(self._sorted_null_positions, param_index)
98
+ new_param_num = param_index - shift + 1
99
+ return _exp.Parameter(this=str(new_param_num))
100
+ return node
101
+
102
+ return node
103
+
104
+
105
+ class _PlaceholderLiteralTransformer:
106
+ __slots__ = ("_json_serializer", "_parameters", "_placeholder_index")
107
+
108
+ def __init__(self, parameters: "ParameterPayload", json_serializer: "Callable[[Any], str]") -> None:
109
+ self._parameters = parameters
110
+ self._json_serializer = json_serializer
111
+ self._placeholder_index = 0
112
+
113
+ def _resolve_mapping_value(self, param_name: str, payload: "ParameterMapping") -> object | None:
114
+ candidate_names = (param_name, f"@{param_name}", f":{param_name}", f"${param_name}", f"param_{param_name}")
115
+ for candidate in candidate_names:
116
+ if candidate in payload:
117
+ return cast("object", get_value_attribute(payload[candidate]))
118
+ normalized = param_name.lstrip("@:$")
119
+ if normalized in payload:
120
+ return cast("object", get_value_attribute(payload[normalized]))
121
+ return None
122
+
123
+ def __call__(self, node: Any) -> Any:
124
+ if (
125
+ isinstance(node, _exp.Placeholder)
126
+ and isinstance(self._parameters, Sequence)
127
+ and not isinstance(self._parameters, (str, bytes, bytearray))
128
+ ):
129
+ current_index = self._placeholder_index
130
+ self._placeholder_index += 1
131
+ if current_index < len(self._parameters):
132
+ literal_value = get_value_attribute(self._parameters[current_index])
133
+ return _create_literal_expression(literal_value, self._json_serializer)
134
+ return node
135
+
136
+ if isinstance(node, _exp.Parameter):
137
+ param_name = str(node.this) if node.this is not None else ""
138
+
139
+ if isinstance(self._parameters, Mapping):
140
+ resolved_value = self._resolve_mapping_value(param_name, self._parameters)
141
+ if resolved_value is not None:
142
+ return _create_literal_expression(resolved_value, self._json_serializer)
143
+ return node
144
+
145
+ if isinstance(self._parameters, Sequence) and not isinstance(self._parameters, (str, bytes, bytearray)):
146
+ name = param_name
147
+ try:
148
+ if name.startswith("param_"):
149
+ index_value = int(name[6:])
150
+ if 0 <= index_value < len(self._parameters):
151
+ literal_value = get_value_attribute(self._parameters[index_value])
152
+ return _create_literal_expression(literal_value, self._json_serializer)
153
+ if name.isdigit():
154
+ index_value = int(name)
155
+ if 0 <= index_value < len(self._parameters):
156
+ literal_value = get_value_attribute(self._parameters[index_value])
157
+ return _create_literal_expression(literal_value, self._json_serializer)
158
+ except (ValueError, AttributeError):
159
+ return node
160
+ return node
161
+
162
+ return node
163
+
164
+
165
+ def build_null_pruning_transform(
166
+ *, dialect: str = "postgres", validator: "ParameterValidator | None" = None
167
+ ) -> "Callable[[Any, ParameterPayload, ParameterProfile], tuple[Any, ConvertedParameters]]":
168
+ """Return a callable that prunes NULL placeholders from an expression."""
169
+ return _NullPruningTransform(dialect, validator)
170
+
171
+
172
+ def build_literal_inlining_transform(
173
+ *, json_serializer: "Callable[[Any], str]"
174
+ ) -> "Callable[[Any, ParameterPayload, ParameterProfile], tuple[Any, object]]":
175
+ """Return a callable that replaces placeholders with SQL literals."""
176
+ return _LiteralInliningTransform(json_serializer)
177
+
178
+
179
+ def replace_null_parameters_with_literals(
180
+ expression: Any,
181
+ parameters: "ParameterPayload",
182
+ *,
183
+ dialect: str = "postgres",
184
+ validator: "ParameterValidator | None" = None,
185
+ parameter_profile: "ParameterProfile | None" = None,
186
+ ) -> "tuple[Any, ConvertedParameters]":
187
+ """Rewrite placeholders representing ``NULL`` values and prune parameters.
188
+
189
+ Args:
190
+ expression: SQLGlot expression tree to transform.
191
+ parameters: Parameter payload provided by the caller.
192
+ dialect: SQLGlot dialect for serializing the expression.
193
+ validator: Optional validator instance for parameter extraction.
194
+ parameter_profile: Optional parameter profile to reuse for validation.
195
+
196
+ Returns:
197
+ Tuple containing the transformed expression and updated parameters.
198
+ """
199
+ if not parameters:
200
+ if parameters is None:
201
+ return expression, None
202
+ if isinstance(parameters, dict):
203
+ return expression, parameters
204
+ if isinstance(parameters, (list, tuple)):
205
+ return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
206
+ return expression, None
207
+
208
+ if looks_like_execute_many(parameters):
209
+ # For execute_many, convert to concrete type
210
+ if isinstance(parameters, dict):
211
+ return expression, parameters
212
+ if isinstance(parameters, (list, tuple)):
213
+ return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
214
+ return expression, None
215
+
216
+ validator_instance = validator or _AST_TRANSFORMER_VALIDATOR
217
+ profile = parameter_profile
218
+ if profile is None:
219
+ parameter_info = validator_instance.extract_parameters(expression.sql(dialect=dialect))
220
+ profile = ParameterProfile(parameter_info)
221
+ validate_parameter_alignment(profile, parameters)
222
+
223
+ null_positions = collect_null_parameter_ordinals(parameters, profile)
224
+ if not null_positions:
225
+ # Convert to concrete type for return
226
+ if isinstance(parameters, dict):
227
+ return expression, parameters
228
+ if isinstance(parameters, (list, tuple)):
229
+ return expression, list(parameters) if isinstance(parameters, list) else tuple(parameters)
230
+ if isinstance(parameters, Mapping):
231
+ return expression, dict(parameters)
232
+ if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
233
+ return expression, list(parameters)
234
+ return expression, None
235
+
236
+ sorted_null_positions = sorted(null_positions)
237
+
238
+ transformer = _NullPlaceholderTransformer(null_positions, sorted_null_positions)
239
+ transformed_expression = expression.transform(transformer)
240
+
241
+ cleaned_parameters: ConvertedParameters
242
+ if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes, bytearray)):
243
+ cleaned_list = [value for index, value in enumerate(parameters) if index not in null_positions]
244
+ cleaned_parameters = tuple(cleaned_list) if isinstance(parameters, tuple) else cleaned_list
245
+ elif isinstance(parameters, Mapping):
246
+ cleaned_dict: dict[str, Any] = {}
247
+ next_numeric_index = 1
248
+
249
+ for key, value in parameters.items():
250
+ if value is None:
251
+ continue
252
+ key_kind, normalized_key = normalize_parameter_key(key)
253
+ if key_kind == "index" and isinstance(normalized_key, int):
254
+ cleaned_dict[str(next_numeric_index)] = value
255
+ next_numeric_index += 1
256
+ else:
257
+ cleaned_dict[str(normalized_key)] = value
258
+ cleaned_parameters = cleaned_dict
259
+ else:
260
+ cleaned_parameters = None
261
+
262
+ return transformed_expression, cleaned_parameters
263
+
264
+
265
+ def _create_literal_expression(value: Any, json_serializer: "Callable[[Any], str]") -> Any:
266
+ """Create a SQLGlot literal expression for the given value."""
267
+ if value is None:
268
+ return _exp.Null()
269
+ if isinstance(value, bool):
270
+ return _exp.Boolean(this=value)
271
+ if isinstance(value, (int, float)):
272
+ return _exp.Literal.number(str(value))
273
+ if isinstance(value, str):
274
+ return _exp.Literal.string(value)
275
+ if isinstance(value, (list, tuple)):
276
+ items = [_create_literal_expression(item, json_serializer) for item in value]
277
+ return _exp.Array(expressions=items)
278
+ if isinstance(value, dict):
279
+ json_value = json_serializer(value)
280
+ return _exp.Literal.string(json_value)
281
+ return _exp.Literal.string(str(value))
282
+
283
+
284
+ def replace_placeholders_with_literals(
285
+ expression: Any, parameters: "ParameterPayload", *, json_serializer: "Callable[[Any], str]"
286
+ ) -> Any:
287
+ """Replace placeholders in an expression tree with literal values."""
288
+ if not parameters:
289
+ return expression
290
+
291
+ transformer = _PlaceholderLiteralTransformer(parameters, json_serializer)
292
+ return expression.transform(transformer)