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,543 @@
1
+ """Parameter style conversion utilities."""
2
+
3
+ from collections.abc import Callable, Mapping, Sequence
4
+ from typing import Any
5
+
6
+ from mypy_extensions import mypyc_attr
7
+
8
+ from sqlspec.core.parameters._types import (
9
+ ConvertedParameters,
10
+ NamedParameterOutput,
11
+ ParameterInfo,
12
+ ParameterMapping,
13
+ ParameterPayload,
14
+ ParameterSequence,
15
+ ParameterStyle,
16
+ PositionalParameterOutput,
17
+ )
18
+ from sqlspec.core.parameters._validator import ParameterValidator
19
+ from sqlspec.exceptions import SQLSpecError
20
+
21
+ __all__ = ("ParameterConverter",)
22
+
23
+
24
+ def _placeholder_qmark(_: Any) -> str:
25
+ return "?"
26
+
27
+
28
+ def _placeholder_numeric(index: Any) -> str:
29
+ return f"${int(index) + 1}"
30
+
31
+
32
+ def _placeholder_named_colon(name: Any) -> str:
33
+ return f":{name}"
34
+
35
+
36
+ def _placeholder_positional_colon(index: Any) -> str:
37
+ return f":{int(index) + 1}"
38
+
39
+
40
+ def _placeholder_named_at(name: Any) -> str:
41
+ return f"@{name}"
42
+
43
+
44
+ def _placeholder_named_dollar(name: Any) -> str:
45
+ return f"${name}"
46
+
47
+
48
+ def _placeholder_named_pyformat(name: Any) -> str:
49
+ return f"%({name})s"
50
+
51
+
52
+ def _placeholder_positional_pyformat(_: Any) -> str:
53
+ return "%s"
54
+
55
+
56
+ @mypyc_attr(allow_interpreted_subclasses=False)
57
+ class ParameterConverter:
58
+ """Parameter style conversion helper."""
59
+
60
+ __slots__ = ("_format_converters", "_placeholder_generators", "validator")
61
+
62
+ def __init__(self, validator: "ParameterValidator | None" = None) -> None:
63
+ self.validator = validator or ParameterValidator()
64
+
65
+ self._format_converters = {
66
+ ParameterStyle.POSITIONAL_COLON: self._convert_to_positional_colon_format,
67
+ ParameterStyle.NAMED_COLON: self._convert_to_named_colon_format,
68
+ ParameterStyle.NAMED_PYFORMAT: self._convert_to_named_pyformat_format,
69
+ ParameterStyle.QMARK: self._convert_to_positional_format,
70
+ ParameterStyle.NUMERIC: self._convert_to_positional_format,
71
+ ParameterStyle.POSITIONAL_PYFORMAT: self._convert_to_positional_format,
72
+ ParameterStyle.NAMED_AT: self._convert_to_named_colon_format,
73
+ ParameterStyle.NAMED_DOLLAR: self._convert_to_named_colon_format,
74
+ }
75
+
76
+ self._placeholder_generators: dict[ParameterStyle, Callable[[Any], str]] = {
77
+ ParameterStyle.QMARK: _placeholder_qmark,
78
+ ParameterStyle.NUMERIC: _placeholder_numeric,
79
+ ParameterStyle.NAMED_COLON: _placeholder_named_colon,
80
+ ParameterStyle.POSITIONAL_COLON: _placeholder_positional_colon,
81
+ ParameterStyle.NAMED_AT: _placeholder_named_at,
82
+ ParameterStyle.NAMED_DOLLAR: _placeholder_named_dollar,
83
+ ParameterStyle.NAMED_PYFORMAT: _placeholder_named_pyformat,
84
+ ParameterStyle.POSITIONAL_PYFORMAT: _placeholder_positional_pyformat,
85
+ }
86
+
87
+ def normalize_sql_for_parsing(
88
+ self, sql: str, dialect: str | None = None, param_info: "list[ParameterInfo] | None" = None
89
+ ) -> "tuple[str, list[ParameterInfo]]":
90
+ param_info = param_info or self.validator.extract_parameters(sql)
91
+
92
+ incompatible_styles = self.validator.get_sqlglot_incompatible_styles(dialect)
93
+ needs_conversion = any(p.style in incompatible_styles for p in param_info)
94
+
95
+ if not needs_conversion:
96
+ return sql, param_info
97
+
98
+ converted_sql = self._convert_to_sqlglot_compatible(sql, param_info, incompatible_styles)
99
+ return converted_sql, param_info
100
+
101
+ def _convert_to_sqlglot_compatible(
102
+ self, sql: str, param_info: "list[ParameterInfo]", incompatible_styles: "set[ParameterStyle]"
103
+ ) -> str:
104
+ converted_sql = sql
105
+ for param in reversed(param_info):
106
+ if param.style in incompatible_styles:
107
+ if (
108
+ param.style in {ParameterStyle.NAMED_COLON, ParameterStyle.NAMED_AT, ParameterStyle.NAMED_DOLLAR}
109
+ and param.name
110
+ and param.name.isidentifier()
111
+ ):
112
+ placeholder_name = param.name
113
+ else:
114
+ placeholder_name = f"param_{param.ordinal}"
115
+ canonical_placeholder = f":{placeholder_name}"
116
+ converted_sql = (
117
+ converted_sql[: param.position]
118
+ + canonical_placeholder
119
+ + converted_sql[param.position + len(param.placeholder_text) :]
120
+ )
121
+ return converted_sql
122
+
123
+ def convert_placeholder_style(
124
+ self,
125
+ sql: str,
126
+ parameters: "ParameterPayload",
127
+ target_style: "ParameterStyle",
128
+ is_many: bool = False,
129
+ *,
130
+ strict_named_parameters: bool = True,
131
+ ) -> "tuple[str, ConvertedParameters]":
132
+ param_info = self.validator.extract_parameters(sql)
133
+
134
+ if target_style == ParameterStyle.STATIC:
135
+ return self._embed_static_parameters(sql, parameters, param_info)
136
+
137
+ current_styles = {p.style for p in param_info}
138
+ if len(current_styles) == 1 and target_style in current_styles:
139
+ converted_parameters = self._convert_parameter_format(
140
+ parameters,
141
+ param_info,
142
+ target_style,
143
+ parameters,
144
+ preserve_parameter_format=True,
145
+ is_many=is_many,
146
+ strict_named_parameters=strict_named_parameters,
147
+ )
148
+ return sql, converted_parameters
149
+
150
+ converted_sql = self._convert_placeholders_to_style(sql, param_info, target_style)
151
+ converted_parameters = self._convert_parameter_format(
152
+ parameters,
153
+ param_info,
154
+ target_style,
155
+ parameters,
156
+ preserve_parameter_format=True,
157
+ is_many=is_many,
158
+ strict_named_parameters=strict_named_parameters,
159
+ )
160
+ return converted_sql, converted_parameters
161
+
162
+ def _convert_placeholders_to_style(
163
+ self, sql: str, param_info: "list[ParameterInfo]", target_style: "ParameterStyle"
164
+ ) -> str:
165
+ generator = self._placeholder_generators.get(target_style)
166
+ if generator is None:
167
+ msg = f"Unsupported target parameter style: {target_style}"
168
+ raise ValueError(msg)
169
+
170
+ param_styles = {p.style for p in param_info}
171
+ use_sequential_for_qmark = (
172
+ len(param_styles) == 1 and ParameterStyle.QMARK in param_styles and target_style == ParameterStyle.NUMERIC
173
+ )
174
+
175
+ unique_params: dict[str, int] = {}
176
+ for param in param_info:
177
+ param_key = (
178
+ f"{param.placeholder_text}_{param.ordinal}"
179
+ if use_sequential_for_qmark and param.style == ParameterStyle.QMARK
180
+ else param.placeholder_text
181
+ )
182
+ if param_key not in unique_params:
183
+ unique_params[param_key] = len(unique_params)
184
+
185
+ converted_sql = sql
186
+ placeholder_text_len_cache: dict[str, int] = {}
187
+ for param in reversed(param_info):
188
+ if param.placeholder_text not in placeholder_text_len_cache:
189
+ placeholder_text_len_cache[param.placeholder_text] = len(param.placeholder_text)
190
+ text_len = placeholder_text_len_cache[param.placeholder_text]
191
+
192
+ if target_style in {
193
+ ParameterStyle.QMARK,
194
+ ParameterStyle.NUMERIC,
195
+ ParameterStyle.POSITIONAL_PYFORMAT,
196
+ ParameterStyle.POSITIONAL_COLON,
197
+ }:
198
+ param_key = (
199
+ f"{param.placeholder_text}_{param.ordinal}"
200
+ if use_sequential_for_qmark and param.style == ParameterStyle.QMARK
201
+ else param.placeholder_text
202
+ )
203
+ new_placeholder = generator(unique_params[param_key])
204
+ else:
205
+ param_name = param.name or f"param_{param.ordinal}"
206
+ new_placeholder = generator(param_name)
207
+
208
+ converted_sql = (
209
+ converted_sql[: param.position] + new_placeholder + converted_sql[param.position + text_len :]
210
+ )
211
+
212
+ return converted_sql
213
+
214
+ def _convert_sequence_to_dict(
215
+ self, parameters: "ParameterSequence", param_info: "list[ParameterInfo]"
216
+ ) -> "NamedParameterOutput":
217
+ param_dict: dict[str, Any] = {}
218
+ for i, param in enumerate(param_info):
219
+ if i < len(parameters):
220
+ name = param.name or f"param_{param.ordinal}"
221
+ param_dict[name] = parameters[i]
222
+ return param_dict
223
+
224
+ def _extract_param_value_mixed_styles(
225
+ self, param: "ParameterInfo", parameters: "ParameterMapping", param_keys: "list[str]"
226
+ ) -> "tuple[object | None, bool]":
227
+ if param.name and param.name in parameters:
228
+ return parameters[param.name], True
229
+ if param.placeholder_text in parameters:
230
+ return parameters[param.placeholder_text], True
231
+
232
+ if (
233
+ param.style == ParameterStyle.NUMERIC
234
+ and param.name
235
+ and param.name.isdigit()
236
+ and param.ordinal < len(param_keys)
237
+ ):
238
+ key_to_use = param_keys[param.ordinal]
239
+ return parameters[key_to_use], True
240
+
241
+ if f"param_{param.ordinal}" in parameters:
242
+ return parameters[f"param_{param.ordinal}"], True
243
+
244
+ ordinal_key = str(param.ordinal + 1)
245
+ if ordinal_key in parameters:
246
+ return parameters[ordinal_key], True
247
+
248
+ try:
249
+ ordered_keys = list(parameters.keys())
250
+ except AttributeError:
251
+ ordered_keys = []
252
+ if ordered_keys and param.ordinal < len(ordered_keys):
253
+ key = ordered_keys[param.ordinal]
254
+ if key in parameters:
255
+ return parameters[key], True
256
+
257
+ return None, False
258
+
259
+ def _extract_param_value_single_style(
260
+ self, param: "ParameterInfo", parameters: "ParameterMapping"
261
+ ) -> "tuple[object | None, bool]":
262
+ if param.name and param.name in parameters:
263
+ return parameters[param.name], True
264
+ if param.placeholder_text in parameters:
265
+ return parameters[param.placeholder_text], True
266
+ if f"param_{param.ordinal}" in parameters:
267
+ return parameters[f"param_{param.ordinal}"], True
268
+
269
+ ordinal_key = str(param.ordinal + 1)
270
+ if ordinal_key in parameters:
271
+ return parameters[ordinal_key], True
272
+
273
+ try:
274
+ ordered_keys = list(parameters.keys())
275
+ except AttributeError:
276
+ ordered_keys = []
277
+ if ordered_keys and param.ordinal < len(ordered_keys):
278
+ key = ordered_keys[param.ordinal]
279
+ if key in parameters:
280
+ return parameters[key], True
281
+
282
+ return None, False
283
+
284
+ def _collect_missing_named_parameters(
285
+ self, param_info: "list[ParameterInfo]", parameters: "ParameterMapping"
286
+ ) -> "list[str]":
287
+ named_styles = {
288
+ ParameterStyle.NAMED_COLON,
289
+ ParameterStyle.NAMED_AT,
290
+ ParameterStyle.NAMED_DOLLAR,
291
+ ParameterStyle.NAMED_PYFORMAT,
292
+ }
293
+ missing: list[str] = []
294
+ for param in param_info:
295
+ if param.style not in named_styles or not param.name:
296
+ continue
297
+ if param.name in parameters or param.placeholder_text in parameters:
298
+ continue
299
+ missing.append(param.name)
300
+ return sorted(set(missing))
301
+
302
+ def _preserve_original_format(
303
+ self, param_values: "list[Any]", original_parameters: object
304
+ ) -> "PositionalParameterOutput":
305
+ if isinstance(original_parameters, tuple):
306
+ return tuple(param_values)
307
+ if isinstance(original_parameters, list):
308
+ return param_values
309
+ if isinstance(original_parameters, Mapping):
310
+ return tuple(param_values)
311
+ return tuple(param_values)
312
+
313
+ def _convert_parameter_format(
314
+ self,
315
+ parameters: "ParameterPayload",
316
+ param_info: "list[ParameterInfo]",
317
+ target_style: "ParameterStyle",
318
+ original_parameters: object | None = None,
319
+ preserve_parameter_format: bool = False,
320
+ is_many: bool = False,
321
+ *,
322
+ strict_named_parameters: bool = True,
323
+ ) -> "ConvertedParameters":
324
+ if not parameters or not param_info:
325
+ # When parameters is falsy, it's either None or empty - return None
326
+ if parameters is None:
327
+ return None
328
+ # For empty containers, convert to concrete type
329
+ if isinstance(parameters, Mapping):
330
+ return dict(parameters)
331
+ if isinstance(parameters, (list, tuple)):
332
+ return list(parameters) if isinstance(parameters, list) else tuple(parameters)
333
+ return None
334
+
335
+ if (
336
+ is_many
337
+ and isinstance(parameters, Sequence)
338
+ and not isinstance(parameters, (str, bytes, bytearray))
339
+ and parameters
340
+ and isinstance(parameters[0], Mapping)
341
+ ):
342
+ normalized_sets: list[Any] = [
343
+ self._convert_parameter_format(
344
+ param_set,
345
+ param_info,
346
+ target_style,
347
+ param_set,
348
+ preserve_parameter_format,
349
+ is_many=False,
350
+ strict_named_parameters=strict_named_parameters,
351
+ )
352
+ if isinstance(param_set, Mapping)
353
+ else param_set
354
+ for param_set in parameters
355
+ ]
356
+ if preserve_parameter_format and isinstance(parameters, tuple):
357
+ return tuple(normalized_sets)
358
+ return normalized_sets
359
+
360
+ is_named_style = target_style in {
361
+ ParameterStyle.NAMED_COLON,
362
+ ParameterStyle.NAMED_AT,
363
+ ParameterStyle.NAMED_DOLLAR,
364
+ ParameterStyle.NAMED_PYFORMAT,
365
+ }
366
+
367
+ if is_named_style:
368
+ if isinstance(parameters, Mapping):
369
+ return dict(parameters)
370
+ if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
371
+ return self._convert_sequence_to_dict(parameters, param_info)
372
+
373
+ elif isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
374
+ return list(parameters) if isinstance(parameters, list) else tuple(parameters)
375
+
376
+ elif isinstance(parameters, Mapping):
377
+ if strict_named_parameters:
378
+ missing_names = self._collect_missing_named_parameters(param_info, parameters)
379
+ if missing_names:
380
+ msg = f"Missing named parameter(s): {', '.join(missing_names)}"
381
+ raise SQLSpecError(msg)
382
+ param_values: list[Any] = []
383
+ parameter_styles = {p.style for p in param_info}
384
+ has_mixed_styles = len(parameter_styles) > 1
385
+
386
+ unique_params: dict[str, Any] = {}
387
+ param_order: list[str] = []
388
+
389
+ if has_mixed_styles:
390
+ param_keys = list(parameters.keys())
391
+ for param in param_info:
392
+ param_key = param.placeholder_text if param.name else f"{param.placeholder_text}_{param.ordinal}"
393
+ if param_key not in unique_params:
394
+ value, found = self._extract_param_value_mixed_styles(param, parameters, param_keys)
395
+ if found:
396
+ unique_params[param_key] = value
397
+ param_order.append(param_key)
398
+ else:
399
+ for param in param_info:
400
+ param_key = param.placeholder_text if param.name else f"{param.placeholder_text}_{param.ordinal}"
401
+ if param_key not in unique_params:
402
+ value, found = self._extract_param_value_single_style(param, parameters)
403
+ if found:
404
+ unique_params[param_key] = value
405
+ param_order.append(param_key)
406
+
407
+ needs_expansion = target_style in {
408
+ ParameterStyle.QMARK,
409
+ ParameterStyle.POSITIONAL_PYFORMAT,
410
+ ParameterStyle.POSITIONAL_COLON,
411
+ }
412
+
413
+ if needs_expansion:
414
+ param_values = []
415
+ for param in param_info:
416
+ param_key = param.placeholder_text if param.name else f"{param.placeholder_text}_{param.ordinal}"
417
+ if param_key in unique_params:
418
+ param_values.append(unique_params[param_key])
419
+ else:
420
+ param_values = [unique_params[param_key] for param_key in param_order]
421
+
422
+ if preserve_parameter_format and original_parameters is not None:
423
+ return self._preserve_original_format(param_values, original_parameters)
424
+
425
+ return param_values
426
+
427
+ # Fallback for non-standard parameters - return None
428
+ return None
429
+
430
+ def _embed_static_parameters(
431
+ self, sql: str, parameters: "ParameterPayload", param_info: "list[ParameterInfo]"
432
+ ) -> "tuple[str, None]":
433
+ if not param_info:
434
+ return sql, None
435
+
436
+ unique_params: dict[str, int] = {}
437
+ for param in param_info:
438
+ if param.style in {ParameterStyle.QMARK, ParameterStyle.POSITIONAL_PYFORMAT}:
439
+ param_key = f"{param.placeholder_text}_{param.ordinal}"
440
+ elif (param.style == ParameterStyle.NUMERIC and param.name) or param.name:
441
+ param_key = param.placeholder_text
442
+ else:
443
+ param_key = f"{param.placeholder_text}_{param.ordinal}"
444
+
445
+ if param_key not in unique_params:
446
+ unique_params[param_key] = len(unique_params)
447
+
448
+ static_sql = sql
449
+ for param in reversed(param_info):
450
+ param_value = self._get_parameter_value_with_reuse(parameters, param, unique_params)
451
+
452
+ if param_value is None:
453
+ literal = "NULL"
454
+ elif isinstance(param_value, str):
455
+ escaped = param_value.replace("'", "''")
456
+ literal = f"'{escaped}'"
457
+ elif isinstance(param_value, bool):
458
+ literal = "TRUE" if param_value else "FALSE"
459
+ elif isinstance(param_value, (int, float)):
460
+ literal = str(param_value)
461
+ else:
462
+ literal = f"'{param_value!s}'"
463
+
464
+ static_sql = (
465
+ static_sql[: param.position] + literal + static_sql[param.position + len(param.placeholder_text) :]
466
+ )
467
+
468
+ return static_sql, None
469
+
470
+ def _get_parameter_value(self, parameters: "ParameterPayload", param: "ParameterInfo") -> object | None:
471
+ if isinstance(parameters, Mapping):
472
+ if param.name and param.name in parameters:
473
+ return parameters[param.name]
474
+ if f"param_{param.ordinal}" in parameters:
475
+ return parameters[f"param_{param.ordinal}"]
476
+ if str(param.ordinal + 1) in parameters:
477
+ return parameters[str(param.ordinal + 1)]
478
+ elif isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
479
+ if param.ordinal < len(parameters):
480
+ return parameters[param.ordinal]
481
+
482
+ return None
483
+
484
+ def _get_parameter_value_with_reuse(
485
+ self, parameters: "ParameterPayload", param: "ParameterInfo", unique_params: "dict[str, int]"
486
+ ) -> object | None:
487
+ if param.style in {ParameterStyle.QMARK, ParameterStyle.POSITIONAL_PYFORMAT}:
488
+ param_key = f"{param.placeholder_text}_{param.ordinal}"
489
+ elif (param.style == ParameterStyle.NUMERIC and param.name) or param.name:
490
+ param_key = param.placeholder_text
491
+ else:
492
+ param_key = f"{param.placeholder_text}_{param.ordinal}"
493
+
494
+ unique_ordinal = unique_params.get(param_key)
495
+ if unique_ordinal is None:
496
+ return None
497
+
498
+ if isinstance(parameters, Mapping):
499
+ if param.name and param.name in parameters:
500
+ return parameters[param.name]
501
+ if f"param_{unique_ordinal}" in parameters:
502
+ return parameters[f"param_{unique_ordinal}"]
503
+ if str(unique_ordinal + 1) in parameters:
504
+ return parameters[str(unique_ordinal + 1)]
505
+ elif isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
506
+ if unique_ordinal < len(parameters):
507
+ return parameters[unique_ordinal]
508
+
509
+ return None
510
+
511
+ def _convert_to_positional_format(
512
+ self, parameters: "ParameterPayload", param_info: "list[ParameterInfo]"
513
+ ) -> "ConvertedParameters":
514
+ return self._convert_parameter_format(
515
+ parameters, param_info, ParameterStyle.QMARK, parameters, preserve_parameter_format=False
516
+ )
517
+
518
+ def _convert_to_named_colon_format(
519
+ self, parameters: "ParameterPayload", param_info: "list[ParameterInfo]"
520
+ ) -> "ConvertedParameters":
521
+ return self._convert_parameter_format(
522
+ parameters, param_info, ParameterStyle.NAMED_COLON, parameters, preserve_parameter_format=False
523
+ )
524
+
525
+ def _convert_to_positional_colon_format(
526
+ self, parameters: "ParameterPayload", param_info: "list[ParameterInfo]"
527
+ ) -> "NamedParameterOutput":
528
+ if isinstance(parameters, Mapping):
529
+ return dict(parameters)
530
+
531
+ param_dict: dict[str, Any] = {}
532
+ if isinstance(parameters, Sequence) and not isinstance(parameters, (str, bytes)):
533
+ for index, value in enumerate(parameters):
534
+ param_dict[str(index + 1)] = value
535
+
536
+ return param_dict
537
+
538
+ def _convert_to_named_pyformat_format(
539
+ self, parameters: "ParameterPayload", param_info: "list[ParameterInfo]"
540
+ ) -> "ConvertedParameters":
541
+ return self._convert_parameter_format(
542
+ parameters, param_info, ParameterStyle.NAMED_PYFORMAT, parameters, preserve_parameter_format=False
543
+ )