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,499 @@
1
+ """Core parameter data structures and utilities."""
2
+
3
+ from collections.abc import Callable, Collection, Generator, Iterable, Mapping, Sequence
4
+ from datetime import date, datetime, time
5
+ from decimal import Decimal
6
+ from enum import Enum
7
+ from functools import singledispatch
8
+ from types import MappingProxyType
9
+ from typing import Any, Literal, TypeAlias
10
+
11
+ from mypy_extensions import mypyc_attr
12
+
13
+ __all__ = (
14
+ "ConvertedParameters",
15
+ "DriverParameterProfile",
16
+ "NamedParameterOutput",
17
+ "ParameterInfo",
18
+ "ParameterMapping",
19
+ "ParameterPayload",
20
+ "ParameterProcessingResult",
21
+ "ParameterProfile",
22
+ "ParameterSequence",
23
+ "ParameterStyle",
24
+ "ParameterStyleConfig",
25
+ "PositionalParameterOutput",
26
+ "TypedParameter",
27
+ "is_iterable_parameters",
28
+ "wrap_with_type",
29
+ )
30
+
31
+
32
+ ParameterMapping: TypeAlias = "Mapping[str, object]"
33
+ """Type alias for mapping-based parameter payloads."""
34
+
35
+
36
+ ParameterSequence: TypeAlias = "Sequence[object]"
37
+ """Type alias for sequence-based parameter payloads."""
38
+
39
+
40
+ ParameterPayload: TypeAlias = "ParameterMapping | ParameterSequence | object | None"
41
+ """Type alias for parameter payloads accepted by the processing pipeline."""
42
+
43
+
44
+ ConvertedParameters: TypeAlias = "dict[str, Any] | list[Any] | tuple[Any, ...] | None"
45
+ """Type alias for parameters after conversion to driver-consumable format.
46
+
47
+ This type represents the concrete output of parameter conversion functions.
48
+ Unlike :data:`ParameterPayload` (which represents inputs and can include abstract
49
+ Mapping/Sequence types), :data:`ConvertedParameters` only includes concrete types
50
+ that database drivers can directly consume.
51
+
52
+ The union includes:
53
+
54
+ - ``dict[str, Any]``: Named parameters (e.g., ``{"name": "Alice", "age": 30}``)
55
+ - ``list[Any]``: Positional parameters as list (e.g., ``["Alice", 30]``)
56
+ - ``tuple[Any, ...]``: Positional parameters as tuple (e.g., ``("Alice", 30)``)
57
+ - ``None``: When parameters are statically embedded in SQL string
58
+ """
59
+
60
+
61
+ PositionalParameterOutput: TypeAlias = "list[Any] | tuple[Any, ...]"
62
+ """Type alias for positional-only parameter outputs.
63
+
64
+ Used when a function is known to return only positional (not named) parameters.
65
+ This is narrower than :data:`ConvertedParameters` and excludes ``dict`` and ``None``.
66
+ """
67
+
68
+
69
+ NamedParameterOutput: TypeAlias = "dict[str, Any]"
70
+ """Type alias for named-only parameter outputs.
71
+
72
+ Used when a function is known to return only named (not positional) parameters.
73
+ This is narrower than :data:`ConvertedParameters` and excludes ``list``, ``tuple``, and ``None``.
74
+ """
75
+
76
+
77
+ @mypyc_attr(allow_interpreted_subclasses=False)
78
+ class ParameterStyle(str, Enum):
79
+ """Enumeration of supported SQL parameter placeholder styles."""
80
+
81
+ NONE = "none"
82
+ STATIC = "static"
83
+ QMARK = "qmark"
84
+ NUMERIC = "numeric"
85
+ NAMED_COLON = "named_colon"
86
+ POSITIONAL_COLON = "positional_colon"
87
+ NAMED_AT = "named_at"
88
+ NAMED_DOLLAR = "named_dollar"
89
+ NAMED_PYFORMAT = "pyformat_named"
90
+ POSITIONAL_PYFORMAT = "pyformat_positional"
91
+
92
+
93
+ @mypyc_attr(allow_interpreted_subclasses=False)
94
+ class TypedParameter:
95
+ """Wrapper that preserves original parameter type information."""
96
+
97
+ __slots__ = ("_hash", "original_type", "semantic_name", "value")
98
+
99
+ def __init__(self, value: Any, original_type: "type | None" = None, semantic_name: "str | None" = None) -> None:
100
+ self.value = value
101
+ self.original_type = original_type or type(value)
102
+ self.semantic_name = semantic_name
103
+ self._hash: int | None = None
104
+
105
+ def __hash__(self) -> int:
106
+ if self._hash is None:
107
+ value_id = id(self.value)
108
+ self._hash = hash((value_id, self.original_type, self.semantic_name))
109
+ return self._hash
110
+
111
+ def __eq__(self, other: object) -> bool:
112
+ if not isinstance(other, TypedParameter):
113
+ return False
114
+ return (
115
+ self.value == other.value
116
+ and self.original_type == other.original_type
117
+ and self.semantic_name == other.semantic_name
118
+ )
119
+
120
+ def __repr__(self) -> str:
121
+ name_part = f", semantic_name='{self.semantic_name}'" if self.semantic_name else ""
122
+ return f"TypedParameter({self.value!r}, original_type={self.original_type.__name__}{name_part})"
123
+
124
+
125
+ class _TupleAdapter:
126
+ __slots__ = ("_as_list", "_serializer")
127
+
128
+ def __init__(self, serializer: "Callable[[Any], str]", as_list: bool) -> None:
129
+ self._serializer = serializer
130
+ self._as_list = as_list
131
+
132
+ def __call__(self, value: Any) -> "Any":
133
+ if self._as_list:
134
+ return self._serializer(list(value))
135
+ return self._serializer(value)
136
+
137
+
138
+ @singledispatch
139
+ def _wrap_parameter_by_type(value: Any, semantic_name: "str | None" = None) -> Any:
140
+ return value
141
+
142
+
143
+ @_wrap_parameter_by_type.register
144
+ def _(value: bool, semantic_name: "str | None" = None) -> "TypedParameter":
145
+ return TypedParameter(value, bool, semantic_name)
146
+
147
+
148
+ @_wrap_parameter_by_type.register
149
+ def _(value: Decimal, semantic_name: "str | None" = None) -> "TypedParameter":
150
+ return TypedParameter(value, Decimal, semantic_name)
151
+
152
+
153
+ @_wrap_parameter_by_type.register
154
+ def _(value: datetime, semantic_name: "str | None" = None) -> "TypedParameter":
155
+ return TypedParameter(value, datetime, semantic_name)
156
+
157
+
158
+ @_wrap_parameter_by_type.register
159
+ def _(value: date, semantic_name: "str | None" = None) -> "TypedParameter":
160
+ return TypedParameter(value, date, semantic_name)
161
+
162
+
163
+ @_wrap_parameter_by_type.register
164
+ def _(value: time, semantic_name: "str | None" = None) -> "TypedParameter":
165
+ return TypedParameter(value, time, semantic_name)
166
+
167
+
168
+ @_wrap_parameter_by_type.register
169
+ def _(value: bytes, semantic_name: "str | None" = None) -> "TypedParameter":
170
+ return TypedParameter(value, bytes, semantic_name)
171
+
172
+
173
+ @mypyc_attr(allow_interpreted_subclasses=False)
174
+ class ParameterInfo:
175
+ """Metadata describing a single detected SQL parameter."""
176
+
177
+ __slots__ = ("name", "ordinal", "placeholder_text", "position", "style")
178
+
179
+ def __init__(
180
+ self, name: "str | None", style: "ParameterStyle", position: int, ordinal: int, placeholder_text: str
181
+ ) -> None:
182
+ self.name = name
183
+ self.style = style
184
+ self.position = position
185
+ self.ordinal = ordinal
186
+ self.placeholder_text = placeholder_text
187
+
188
+ def __repr__(self) -> str:
189
+ return (
190
+ "ParameterInfo("
191
+ f"name={self.name!r}, style={self.style!r}, position={self.position}, "
192
+ f"ordinal={self.ordinal}, placeholder_text={self.placeholder_text!r}"
193
+ ")"
194
+ )
195
+
196
+
197
+ @mypyc_attr(allow_interpreted_subclasses=False)
198
+ class ParameterStyleConfig:
199
+ """Configuration describing parameter behaviour for a statement."""
200
+
201
+ __slots__ = (
202
+ "allow_mixed_parameter_styles",
203
+ "ast_transformer",
204
+ "default_execution_parameter_style",
205
+ "default_parameter_style",
206
+ "has_native_list_expansion",
207
+ "json_deserializer",
208
+ "json_serializer",
209
+ "needs_static_script_compilation",
210
+ "output_transformer",
211
+ "preserve_original_params_for_many",
212
+ "preserve_parameter_format",
213
+ "strict_named_parameters",
214
+ "supported_execution_parameter_styles",
215
+ "supported_parameter_styles",
216
+ "type_coercion_map",
217
+ )
218
+
219
+ def __init__(
220
+ self,
221
+ default_parameter_style: "ParameterStyle",
222
+ supported_parameter_styles: "Collection[ParameterStyle] | None" = None,
223
+ supported_execution_parameter_styles: "Collection[ParameterStyle] | None" = None,
224
+ default_execution_parameter_style: "ParameterStyle | None" = None,
225
+ type_coercion_map: "Mapping[type, Callable[[Any], Any]] | None" = None,
226
+ has_native_list_expansion: bool = False,
227
+ needs_static_script_compilation: bool = False,
228
+ allow_mixed_parameter_styles: bool = False,
229
+ preserve_parameter_format: bool = True,
230
+ preserve_original_params_for_many: bool = False,
231
+ output_transformer: "Callable[[str, Any], tuple[str, Any]] | None" = None,
232
+ ast_transformer: "Callable[[Any, Any, ParameterProfile], tuple[Any, Any]] | None" = None,
233
+ json_serializer: "Callable[[Any], str] | None" = None,
234
+ json_deserializer: "Callable[[str], Any] | None" = None,
235
+ strict_named_parameters: bool = True,
236
+ ) -> None:
237
+ self.default_parameter_style = default_parameter_style
238
+ self.supported_parameter_styles = frozenset(supported_parameter_styles or (default_parameter_style,))
239
+ self.supported_execution_parameter_styles = (
240
+ frozenset(supported_execution_parameter_styles) if supported_execution_parameter_styles else None
241
+ )
242
+ self.default_execution_parameter_style = default_execution_parameter_style or default_parameter_style
243
+ self.type_coercion_map = dict(type_coercion_map or {})
244
+ self.has_native_list_expansion = has_native_list_expansion
245
+ self.output_transformer = output_transformer
246
+ self.ast_transformer = ast_transformer
247
+ self.needs_static_script_compilation = needs_static_script_compilation
248
+ self.allow_mixed_parameter_styles = allow_mixed_parameter_styles
249
+ self.preserve_parameter_format = preserve_parameter_format
250
+ self.preserve_original_params_for_many = preserve_original_params_for_many
251
+ self.strict_named_parameters = strict_named_parameters
252
+ self.json_serializer = json_serializer
253
+ self.json_deserializer = json_deserializer
254
+
255
+ def __hash__(self) -> int:
256
+ hash_components = (
257
+ self.default_parameter_style.value,
258
+ frozenset(style.value for style in self.supported_parameter_styles),
259
+ (
260
+ frozenset(style.value for style in self.supported_execution_parameter_styles)
261
+ if self.supported_execution_parameter_styles is not None
262
+ else None
263
+ ),
264
+ self.default_execution_parameter_style.value,
265
+ tuple(sorted(self.type_coercion_map.keys(), key=str)) if self.type_coercion_map else None,
266
+ self.has_native_list_expansion,
267
+ self.preserve_original_params_for_many,
268
+ bool(self.output_transformer),
269
+ self.needs_static_script_compilation,
270
+ self.allow_mixed_parameter_styles,
271
+ self.preserve_parameter_format,
272
+ self.strict_named_parameters,
273
+ bool(self.ast_transformer),
274
+ self.json_serializer,
275
+ self.json_deserializer,
276
+ )
277
+ return hash(hash_components)
278
+
279
+ def hash(self) -> int:
280
+ """Return the hash value for caching compatibility.
281
+
282
+ Returns:
283
+ Hash value matching :func:`hash` output for this config.
284
+ """
285
+
286
+ return hash(self)
287
+
288
+ def replace(self, **overrides: Any) -> "ParameterStyleConfig":
289
+ data: dict[str, Any] = {
290
+ "default_parameter_style": self.default_parameter_style,
291
+ "supported_parameter_styles": set(self.supported_parameter_styles),
292
+ "supported_execution_parameter_styles": (
293
+ set(self.supported_execution_parameter_styles)
294
+ if self.supported_execution_parameter_styles is not None
295
+ else None
296
+ ),
297
+ "default_execution_parameter_style": self.default_execution_parameter_style,
298
+ "type_coercion_map": dict(self.type_coercion_map),
299
+ "has_native_list_expansion": self.has_native_list_expansion,
300
+ "needs_static_script_compilation": self.needs_static_script_compilation,
301
+ "allow_mixed_parameter_styles": self.allow_mixed_parameter_styles,
302
+ "preserve_parameter_format": self.preserve_parameter_format,
303
+ "preserve_original_params_for_many": self.preserve_original_params_for_many,
304
+ "strict_named_parameters": self.strict_named_parameters,
305
+ "output_transformer": self.output_transformer,
306
+ "ast_transformer": self.ast_transformer,
307
+ "json_serializer": self.json_serializer,
308
+ "json_deserializer": self.json_deserializer,
309
+ }
310
+ data.update(overrides)
311
+ return ParameterStyleConfig(**data)
312
+
313
+ def with_json_serializers(
314
+ self,
315
+ serializer: "Callable[[Any], str]",
316
+ *,
317
+ tuple_strategy: "Literal['list', 'tuple']" = "list",
318
+ deserializer: "Callable[[str], Any] | None" = None,
319
+ ) -> "ParameterStyleConfig":
320
+ """Return a copy configured with JSON serializers for complex parameters."""
321
+
322
+ if tuple_strategy == "list":
323
+ tuple_adapter = _TupleAdapter(serializer, True)
324
+ elif tuple_strategy == "tuple":
325
+ tuple_adapter = _TupleAdapter(serializer, False)
326
+ else:
327
+ msg = f"Unsupported tuple_strategy: {tuple_strategy}"
328
+ raise ValueError(msg)
329
+
330
+ updated_type_map = dict(self.type_coercion_map)
331
+ updated_type_map[dict] = serializer
332
+ updated_type_map[list] = serializer
333
+ updated_type_map[tuple] = tuple_adapter
334
+
335
+ return self.replace(
336
+ type_coercion_map=updated_type_map,
337
+ json_serializer=serializer,
338
+ json_deserializer=deserializer or self.json_deserializer,
339
+ )
340
+
341
+
342
+ @mypyc_attr(allow_interpreted_subclasses=False)
343
+ class DriverParameterProfile:
344
+ """Immutable adapter profile describing parameter defaults."""
345
+
346
+ __slots__ = (
347
+ "allow_mixed_parameter_styles",
348
+ "custom_type_coercions",
349
+ "default_ast_transformer",
350
+ "default_dialect",
351
+ "default_execution_style",
352
+ "default_output_transformer",
353
+ "default_style",
354
+ "extras",
355
+ "has_native_list_expansion",
356
+ "json_serializer_strategy",
357
+ "name",
358
+ "needs_static_script_compilation",
359
+ "preserve_original_params_for_many",
360
+ "preserve_parameter_format",
361
+ "statement_kwargs",
362
+ "strict_named_parameters",
363
+ "supported_execution_styles",
364
+ "supported_styles",
365
+ )
366
+
367
+ def __init__(
368
+ self,
369
+ name: str,
370
+ default_style: "ParameterStyle",
371
+ supported_styles: "Collection[ParameterStyle]",
372
+ default_execution_style: "ParameterStyle",
373
+ supported_execution_styles: "Collection[ParameterStyle] | None",
374
+ has_native_list_expansion: bool,
375
+ preserve_parameter_format: bool,
376
+ needs_static_script_compilation: bool,
377
+ allow_mixed_parameter_styles: bool,
378
+ preserve_original_params_for_many: bool,
379
+ json_serializer_strategy: "Literal['driver', 'helper', 'none']",
380
+ custom_type_coercions: "Mapping[type, Callable[[Any], Any]] | None" = None,
381
+ default_output_transformer: "Callable[[str, Any], tuple[str, Any]] | None" = None,
382
+ default_ast_transformer: "Callable[[Any, Any, ParameterProfile], tuple[Any, Any]] | None" = None,
383
+ extras: "Mapping[str, object] | None" = None,
384
+ default_dialect: "str | None" = None,
385
+ statement_kwargs: "Mapping[str, object] | None" = None,
386
+ strict_named_parameters: bool = True,
387
+ ) -> None:
388
+ self.name = name
389
+ self.default_style = default_style
390
+ self.supported_styles = frozenset(supported_styles)
391
+ self.default_execution_style = default_execution_style
392
+ self.supported_execution_styles = (
393
+ frozenset(supported_execution_styles) if supported_execution_styles is not None else None
394
+ )
395
+ self.has_native_list_expansion = has_native_list_expansion
396
+ self.preserve_parameter_format = preserve_parameter_format
397
+ self.needs_static_script_compilation = needs_static_script_compilation
398
+ self.allow_mixed_parameter_styles = allow_mixed_parameter_styles
399
+ self.preserve_original_params_for_many = preserve_original_params_for_many
400
+ self.strict_named_parameters = strict_named_parameters
401
+ self.json_serializer_strategy = json_serializer_strategy
402
+ self.custom_type_coercions = (
403
+ MappingProxyType(dict(custom_type_coercions)) if custom_type_coercions else MappingProxyType({})
404
+ )
405
+ self.default_output_transformer = default_output_transformer
406
+ self.default_ast_transformer = default_ast_transformer
407
+ self.extras = MappingProxyType(dict(extras)) if extras else MappingProxyType({})
408
+ self.default_dialect = default_dialect
409
+ self.statement_kwargs = MappingProxyType(dict(statement_kwargs)) if statement_kwargs else MappingProxyType({})
410
+
411
+
412
+ @mypyc_attr(allow_interpreted_subclasses=False)
413
+ class ParameterProfile:
414
+ """Aggregate metadata describing detected parameters."""
415
+
416
+ __slots__ = ("_parameters", "_placeholder_counts", "named_parameters", "reused_ordinals", "styles")
417
+
418
+ def __init__(self, parameters: "Sequence[ParameterInfo] | None" = None) -> None:
419
+ param_tuple: tuple[ParameterInfo, ...] = tuple(parameters) if parameters else ()
420
+ self._parameters = param_tuple
421
+ self.styles = tuple(sorted({param.style.value for param in param_tuple})) if param_tuple else ()
422
+ placeholder_counts: dict[str, int] = {}
423
+ reused_ordinals: list[int] = []
424
+ named_parameters: list[str] = []
425
+
426
+ for param in param_tuple:
427
+ placeholder = param.placeholder_text
428
+ current_count = placeholder_counts.get(placeholder, 0)
429
+ placeholder_counts[placeholder] = current_count + 1
430
+ if current_count:
431
+ reused_ordinals.append(param.ordinal)
432
+ if param.name is not None:
433
+ named_parameters.append(param.name)
434
+
435
+ self._placeholder_counts = placeholder_counts
436
+ self.reused_ordinals = tuple(reused_ordinals)
437
+ self.named_parameters = tuple(named_parameters)
438
+
439
+ @classmethod
440
+ def empty(cls) -> "ParameterProfile":
441
+ return cls(())
442
+
443
+ @property
444
+ def parameters(self) -> "tuple[ParameterInfo, ...]":
445
+ return self._parameters
446
+
447
+ @property
448
+ def total_count(self) -> int:
449
+ return len(self._parameters)
450
+
451
+ def placeholder_count(self, placeholder: str) -> int:
452
+ return self._placeholder_counts.get(placeholder, 0)
453
+
454
+ def is_empty(self) -> bool:
455
+ return not self._parameters
456
+
457
+
458
+ @mypyc_attr(allow_interpreted_subclasses=False)
459
+ class ParameterProcessingResult:
460
+ """Return container for parameter processing output."""
461
+
462
+ __slots__ = ("parameter_profile", "parameters", "sql", "sqlglot_sql")
463
+
464
+ def __init__(
465
+ self, sql: str, parameters: Any, parameter_profile: "ParameterProfile", sqlglot_sql: str | None = None
466
+ ) -> None:
467
+ self.sql = sql
468
+ self.parameters = parameters
469
+ self.parameter_profile = parameter_profile
470
+ self.sqlglot_sql = sqlglot_sql or sql
471
+
472
+ def __iter__(self) -> "Generator[str | Any, Any, None]":
473
+ yield self.sql
474
+ yield self.parameters
475
+
476
+ def __len__(self) -> int:
477
+ return 2
478
+
479
+ def __getitem__(self, index: int) -> Any:
480
+ if index == 0:
481
+ return self.sql
482
+ if index == 1:
483
+ return self.parameters
484
+ msg = "ParameterProcessingResult exposes exactly two positional items"
485
+ raise IndexError(msg)
486
+
487
+
488
+ def is_iterable_parameters(obj: Any) -> bool:
489
+ """Return True when the object behaves like an iterable parameter payload."""
490
+
491
+ return isinstance(obj, (list, tuple, set)) or (
492
+ isinstance(obj, Iterable) and not isinstance(obj, (str, bytes, Mapping))
493
+ )
494
+
495
+
496
+ def wrap_with_type(value: Any, semantic_name: "str | None" = None) -> Any:
497
+ """Wrap value with :class:`TypedParameter` if it benefits downstream processing."""
498
+
499
+ return _wrap_parameter_by_type(value, semantic_name)
@@ -0,0 +1,180 @@
1
+ """Parameter extraction utilities."""
2
+
3
+ import re
4
+ from collections import OrderedDict
5
+
6
+ from mypy_extensions import mypyc_attr
7
+
8
+ from sqlspec.core.parameters._types import ParameterInfo, ParameterStyle
9
+
10
+ __all__ = ("PARAMETER_REGEX", "ParameterValidator")
11
+
12
+ PARAMETER_REGEX = re.compile(
13
+ r"""
14
+ (?P<dquote>"(?:[^"\\]|\\.)*") |
15
+ (?P<squote>'(?:[^'\\]|\\.)*') |
16
+ (?P<dollar_quoted_string>\$(?P<dollar_quote_tag_inner>\w*)?\$[\s\S]*?\$\4\$) |
17
+ (?P<line_comment>--[^\r\n]*) |
18
+ (?P<block_comment>/\*(?:[^*]|\*(?!/))*\*/) |
19
+ (?P<pg_q_operator>\?\?|\?\||\?&) |
20
+ (?P<pg_cast>::(?P<cast_type>\w+)) |
21
+ (?P<sql_server_global>@@(?P<global_var_name>\w+)) |
22
+ (?P<pyformat_named>%\((?P<pyformat_name>\w+)\)s) |
23
+ (?P<pyformat_pos>%s) |
24
+ (?P<positional_colon>(?<![A-Za-z0-9_]):(?P<colon_num>\d+)) |
25
+ (?P<named_colon>(?<![A-Za-z0-9_]):(?P<colon_name>\w+)) |
26
+ (?P<named_at>(?<![A-Za-z0-9_])@(?!sqlspec_)(?P<at_name>\w+)) |
27
+ (?P<numeric>(?<![A-Za-z0-9_])\$(?P<numeric_num>\d+)) |
28
+ (?P<named_dollar_param>(?<![A-Za-z0-9_])\$(?P<dollar_param_name>\w+)) |
29
+ (?P<qmark>\?)
30
+ """,
31
+ re.VERBOSE | re.IGNORECASE | re.MULTILINE | re.DOTALL,
32
+ )
33
+
34
+
35
+ @mypyc_attr(allow_interpreted_subclasses=False)
36
+ class ParameterValidator:
37
+ """Extracts placeholder metadata and dialect compatibility information."""
38
+
39
+ __slots__ = ("_cache_hits", "_cache_max_size", "_cache_misses", "_parameter_cache")
40
+
41
+ def __init__(self, cache_max_size: int = 5000) -> None:
42
+ self._parameter_cache: OrderedDict[str, list[ParameterInfo]] = OrderedDict()
43
+ self._cache_max_size = max(cache_max_size, 0)
44
+ self._cache_hits = 0
45
+ self._cache_misses = 0
46
+
47
+ def set_cache_max_size(self, cache_max_size: int) -> None:
48
+ """Update the maximum cache size for parameter metadata."""
49
+ self._cache_max_size = max(cache_max_size, 0)
50
+ while len(self._parameter_cache) > self._cache_max_size:
51
+ self._parameter_cache.popitem(last=False)
52
+
53
+ def clear_cache(self) -> None:
54
+ """Clear cached parameter metadata and reset stats."""
55
+ self._parameter_cache.clear()
56
+ self._cache_hits = 0
57
+ self._cache_misses = 0
58
+
59
+ def cache_stats(self) -> "dict[str, int]":
60
+ """Return cache statistics."""
61
+ return {
62
+ "hits": self._cache_hits,
63
+ "misses": self._cache_misses,
64
+ "size": len(self._parameter_cache),
65
+ "max_size": self._cache_max_size,
66
+ }
67
+
68
+ def _extract_parameter_style(self, match: re.Match[str]) -> "tuple[ParameterStyle | None, str | None]":
69
+ """Map a regex match to a placeholder style and optional name."""
70
+ if match.group("qmark"):
71
+ return ParameterStyle.QMARK, None
72
+ if match.group("named_colon"):
73
+ return ParameterStyle.NAMED_COLON, match.group("colon_name")
74
+ if match.group("numeric"):
75
+ return ParameterStyle.NUMERIC, match.group("numeric_num")
76
+ if match.group("named_at"):
77
+ return ParameterStyle.NAMED_AT, match.group("at_name")
78
+ if match.group("pyformat_named"):
79
+ return ParameterStyle.NAMED_PYFORMAT, match.group("pyformat_name")
80
+ if match.group("pyformat_pos"):
81
+ return ParameterStyle.POSITIONAL_PYFORMAT, None
82
+ if match.group("positional_colon"):
83
+ return ParameterStyle.POSITIONAL_COLON, match.group("colon_num")
84
+ if match.group("named_dollar_param"):
85
+ return ParameterStyle.NAMED_DOLLAR, match.group("dollar_param_name")
86
+ return None, None
87
+
88
+ def extract_parameters(self, sql: str) -> "list[ParameterInfo]":
89
+ """Extract ordered parameter metadata from SQL text."""
90
+ if self._cache_max_size <= 0:
91
+ return self._extract_parameters_uncached(sql)
92
+
93
+ cached_result = self._parameter_cache.get(sql)
94
+ if cached_result is not None:
95
+ self._parameter_cache.move_to_end(sql)
96
+ self._cache_hits += 1
97
+ return cached_result
98
+ self._cache_misses += 1
99
+
100
+ if not any(c in sql for c in ("?", "%", ":", "@", "$")):
101
+ if len(self._parameter_cache) >= self._cache_max_size:
102
+ self._parameter_cache.popitem(last=False)
103
+ self._parameter_cache[sql] = []
104
+ return []
105
+
106
+ parameters: list[ParameterInfo] = []
107
+ ordinal = 0
108
+
109
+ skip_groups = (
110
+ "dquote",
111
+ "squote",
112
+ "dollar_quoted_string",
113
+ "line_comment",
114
+ "block_comment",
115
+ "pg_q_operator",
116
+ "pg_cast",
117
+ "sql_server_global",
118
+ )
119
+
120
+ for match in PARAMETER_REGEX.finditer(sql):
121
+ if any(match.group(group) for group in skip_groups):
122
+ continue
123
+ style, name = self._extract_parameter_style(match)
124
+ if style is None:
125
+ continue
126
+ placeholder_text = match.group(0)
127
+ parameters.append(ParameterInfo(name, style, match.start(), ordinal, placeholder_text))
128
+ ordinal += 1
129
+
130
+ if len(self._parameter_cache) >= self._cache_max_size:
131
+ self._parameter_cache.popitem(last=False)
132
+ self._parameter_cache[sql] = parameters
133
+ return parameters
134
+
135
+ def _extract_parameters_uncached(self, sql: str) -> "list[ParameterInfo]":
136
+ parameters: list[ParameterInfo] = []
137
+ ordinal = 0
138
+
139
+ skip_groups = (
140
+ "dquote",
141
+ "squote",
142
+ "dollar_quoted_string",
143
+ "line_comment",
144
+ "block_comment",
145
+ "pg_q_operator",
146
+ "pg_cast",
147
+ "sql_server_global",
148
+ )
149
+
150
+ if not any(c in sql for c in ("?", "%", ":", "@", "$")):
151
+ return []
152
+
153
+ for match in PARAMETER_REGEX.finditer(sql):
154
+ if any(match.group(group) for group in skip_groups):
155
+ continue
156
+ style, name = self._extract_parameter_style(match)
157
+ if style is None:
158
+ continue
159
+ placeholder_text = match.group(0)
160
+ parameters.append(ParameterInfo(name, style, match.start(), ordinal, placeholder_text))
161
+ ordinal += 1
162
+ return parameters
163
+
164
+ def get_sqlglot_incompatible_styles(self, dialect: str | None = None) -> "set[ParameterStyle]":
165
+ """Return placeholder styles incompatible with SQLGlot for the dialect."""
166
+ base_incompatible = {
167
+ ParameterStyle.NAMED_PYFORMAT,
168
+ ParameterStyle.POSITIONAL_PYFORMAT,
169
+ ParameterStyle.POSITIONAL_COLON,
170
+ }
171
+
172
+ if dialect and dialect.lower() in {"mysql", "mariadb"}:
173
+ return base_incompatible
174
+ if dialect and dialect.lower() in {"postgres", "postgresql"}:
175
+ return {ParameterStyle.POSITIONAL_COLON}
176
+ if dialect and dialect.lower() == "sqlite":
177
+ return {ParameterStyle.POSITIONAL_COLON}
178
+ if dialect and dialect.lower() in {"oracle", "bigquery"}:
179
+ return base_incompatible
180
+ return base_incompatible